summary refs log tree commit diff
path: root/src/Event.h
diff options
context:
space:
mode:
authorWlodekM <[email protected]>2024-06-16 10:35:45 +0300
committerWlodekM <[email protected]>2024-06-16 10:35:45 +0300
commitabef6da56913f1c55528103e60a50451a39628b1 (patch)
treeb3c8092471ecbb73e568cd0d336efa0e7871ee8d /src/Event.h
initial commit
Diffstat (limited to 'src/Event.h')
-rw-r--r--src/Event.h222
1 files changed, 222 insertions, 0 deletions
diff --git a/src/Event.h b/src/Event.h
new file mode 100644
index 0000000..f33ab4b
--- /dev/null
+++ b/src/Event.h
@@ -0,0 +1,222 @@
+#ifndef CC_EVENT_H
+#define CC_EVENT_H
+#include "Vectors.h"
+/* Helper methods for using events, and contains all events.
+   Copyright 2014-2023 ClassiCube | Licensed under BSD-3
+*/
+
+/* Max callbacks that can be registered for an event. */
+#define EVENT_MAX_CALLBACKS 32
+struct Stream;
+
+typedef void (*Event_Void_Callback)(void* obj);
+struct Event_Void {
+	Event_Void_Callback Handlers[EVENT_MAX_CALLBACKS]; 
+	void* Objs[EVENT_MAX_CALLBACKS]; int Count;
+};
+
+typedef void (*Event_Int_Callback)(void* obj, int argument);
+struct Event_Int {
+	Event_Int_Callback Handlers[EVENT_MAX_CALLBACKS];
+	void* Objs[EVENT_MAX_CALLBACKS]; int Count;
+};
+
+typedef void (*Event_Float_Callback)(void* obj, float argument);
+struct Event_Float {
+	Event_Float_Callback Handlers[EVENT_MAX_CALLBACKS];
+	void* Objs[EVENT_MAX_CALLBACKS]; int Count;
+};
+
+typedef void (*Event_Entry_Callback)(void* obj, struct Stream* stream, const cc_string* name);
+struct Event_Entry {
+	Event_Entry_Callback Handlers[EVENT_MAX_CALLBACKS];
+	void* Objs[EVENT_MAX_CALLBACKS]; int Count;
+};
+
+typedef void (*Event_Block_Callback)(void* obj, IVec3 coords, BlockID oldBlock, BlockID block);
+struct Event_Block {
+	Event_Block_Callback Handlers[EVENT_MAX_CALLBACKS];
+	void* Objs[EVENT_MAX_CALLBACKS]; int Count;
+};
+
+typedef void (*Event_Chat_Callback)(void* obj, const cc_string* msg, int msgType);
+struct Event_Chat {
+	Event_Chat_Callback Handlers[EVENT_MAX_CALLBACKS];
+	void* Objs[EVENT_MAX_CALLBACKS]; int Count;
+};
+
+typedef void (*Event_Input_Callback)(void* obj, int key, cc_bool repeating);
+struct Event_Input {
+	Event_Input_Callback Handlers[EVENT_MAX_CALLBACKS];
+	void* Objs[EVENT_MAX_CALLBACKS]; int Count;
+};
+
+typedef void (*Event_String_Callback)(void* obj, const cc_string* str);
+struct Event_String {
+	Event_String_Callback Handlers[EVENT_MAX_CALLBACKS];
+	void* Objs[EVENT_MAX_CALLBACKS]; int Count;
+};
+
+typedef void (*Event_RawMove_Callback)(void* obj, float xDelta, float yDelta);
+struct Event_RawMove {
+	Event_RawMove_Callback Handlers[EVENT_MAX_CALLBACKS];
+	void* Objs[EVENT_MAX_CALLBACKS]; int Count;
+};
+
+typedef void (*Event_PadAxis_Callback)(void* obj, int port, int axis, float x, float y);
+struct Event_PadAxis {
+	Event_PadAxis_Callback Handlers[EVENT_MAX_CALLBACKS];
+	void* Objs[EVENT_MAX_CALLBACKS]; int Count;
+};
+
+/* "data" will be 64 bytes in length. */
+typedef void (*Event_PluginMessage_Callback)(void* obj, cc_uint8 channel, cc_uint8* data);
+struct Event_PluginMessage {
+	Event_PluginMessage_Callback Handlers[EVENT_MAX_CALLBACKS]; 
+	void* Objs[EVENT_MAX_CALLBACKS]; int Count;
+};
+
+typedef void (*Event_LightingMode_Callback)(void* obj, cc_uint8 oldMode, cc_bool fromServer);
+struct Event_LightingMode {
+	Event_LightingMode_Callback Handlers[EVENT_MAX_CALLBACKS];
+	void* Objs[EVENT_MAX_CALLBACKS]; int Count;
+};
+
+/* Registers a callback function for the given event. */
+/* NOTE: Trying to register a callback twice or over EVENT_MAX_CALLBACKS callbacks will terminate the game. */
+CC_API void Event_Register(struct Event_Void* handlers,   void* obj, Event_Void_Callback handler);
+/* Unregisters a callback function for the given event. */
+CC_API void Event_Unregister(struct Event_Void* handlers, void* obj, Event_Void_Callback handler);
+#define Event_Register_(handlers,   obj, handler) Event_Register((struct Event_Void*)(handlers),   obj, (Event_Void_Callback)(handler))
+#define Event_Unregister_(handlers, obj, handler) Event_Unregister((struct Event_Void*)(handlers), obj, (Event_Void_Callback)(handler))
+
+/* Calls all registered callback for an event with no arguments. */
+CC_API void Event_RaiseVoid(struct Event_Void* handlers);
+/* Calls all registered callback for an event which has an int argument. */
+/* NOTE: The actual argument "type" may be char, Key, cc_uint8 etc */
+CC_API void Event_RaiseInt(struct Event_Int* handlers, int arg);
+/* Calls all registered callbacks for an event which has a float argument. */
+CC_API void Event_RaiseFloat(struct Event_Float* handlers, float arg);
+
+/* Calls all registered callbacks for an event which has data stream and name arguments. */
+void Event_RaiseEntry(struct Event_Entry* handlers, struct Stream* stream, const cc_string* name);
+/* Calls all registered callbacks for an event which takes block change arguments. */
+/* These are the coordinates/location of the change, block there before, block there now. */
+void Event_RaiseBlock(struct Event_Block* handlers, IVec3 coords, BlockID oldBlock, BlockID block);
+/* Calls all registered callbacks for an event which has chat message type and contents. */
+/* See MsgType enum in Chat.h for what types of messages there are. */
+void Event_RaiseChat(struct Event_Chat* handlers, const cc_string* msg, int msgType);
+/* Calls all registered callbacks for an event which has keyboard key/mouse button. */
+/* repeating is whether the key/button was already pressed down. (i.e. user is holding down key) */
+void Event_RaiseInput(struct Event_Input* handlers, int key, cc_bool repeating);
+/* Calls all registered callbacks for an event which has a string argument. */
+void Event_RaiseString(struct Event_String* handlers, const cc_string* str);
+/* Calls all registered callbacks for an event which has raw pointer movement arguments. */
+void Event_RaiseRawMove(struct Event_RawMove* handlers, float xDelta, float yDelta);
+/* Calls all registered callbacks for an event which has pad axis arguments. */
+void Event_RaisePadAxis(struct Event_PadAxis* handlers, int port, int axis, float x, float y);
+/* Calls all registered callbacks for an event which has a channel and a 64 byte data argument. */
+void Event_RaisePluginMessage(struct Event_PluginMessage* handlers, cc_uint8 channel, cc_uint8* data);
+/* Calls all registered callbacks for an event called when the Lighting_LightingMode is changed */
+void Event_RaiseLightingMode(struct Event_LightingMode* handlers, cc_uint8 oldMode, cc_bool fromServer);
+
+void Event_UnregisterAll(void);
+/* NOTE: Event_UnregisterAll MUST be updated when events lists are changed */
+
+/* Event API version supported by the client */
+/*  Version 1 - Added NetEvents.PluginMessageReceived */
+/*  Version 2 - Added WindowEvents.Redrawing */
+/*  Version 3 - Changed InputEvent.Press from code page 437 to unicode character */
+/* You MUST CHECK the event API version before attempting to use the events listed above, */
+/*  as otherwise if the player is using an older client that lacks some of the above events, */
+/*  you will be calling Event_Register on random data instead of the expected EventsList struct */
+CC_VAR extern int EventAPIVersion;
+
+CC_VAR extern struct _EntityEventsList {
+	struct Event_Int Added;    /* Entity is spawned in the current world */
+	struct Event_Int Removed;  /* Entity is despawned from the current world */
+} EntityEvents;
+
+CC_VAR extern struct _TabListEventsList {
+	struct Event_Int Added;   /* Tab list entry is created */
+	struct Event_Int Changed; /* Tab list entry is modified */
+	struct Event_Int Removed; /* Tab list entry is removed */
+} TabListEvents;
+
+CC_VAR extern struct _TextureEventsList {
+	struct Event_Void  AtlasChanged; /* Terrain atlas (terrain.png) is changed */
+	struct Event_Void  PackChanged;  /* Texture pack is changed */
+	struct Event_Entry FileChanged;  /* File in a texture pack is changed (terrain.png, rain.png) */
+} TextureEvents;
+
+CC_VAR extern struct _GfxEventsList {
+	struct Event_Void ViewDistanceChanged; /* View/fog distance is changed */
+	struct Event_Void LowVRAMDetected;     /* Insufficient VRAM detected, need to free some GPU resources */
+	struct Event_Void ProjectionChanged;   /* Projection matrix has changed */
+	struct Event_Void ContextLost;         /* Context is destroyed after having been previously created */
+	struct Event_Void ContextRecreated;    /* Context is recreated after having been previously lost */
+} GfxEvents;
+
+CC_VAR extern struct _UserEventsList {
+	struct Event_Block BlockChanged;      /* User changes a block */
+	struct Event_Void  HackPermsChanged;  /* Hack permissions of the player changes */
+	struct Event_Void  HeldBlockChanged;  /* Held block in hotbar changes */
+	struct Event_Void  HacksStateChanged; /* Hack states changed (e.g. stops flying) */
+} UserEvents;
+
+CC_VAR extern struct _BlockEventsList {
+	struct Event_Void PermissionsChanged; /* Block permissions (can place/delete) for a block changes */
+	struct Event_Void BlockDefChanged;    /* Block definition is changed or removed */
+} BlockEvents;
+
+CC_VAR extern struct _WorldEventsList {
+	struct Event_Void  NewMap;        /* Player begins loading a new world */
+	struct Event_Float Loading;       /* Portion of world is decompressed/generated (Arg is progress from 0-1) */
+	struct Event_Void  MapLoaded;     /* New world has finished loading, player can now interact with it */
+	struct Event_Int   EnvVarChanged; /* World environment variable changed by player/CPE/WoM config */
+	struct Event_LightingMode LightingModeChanged; /* Lighting mode changed. */
+} WorldEvents;
+
+CC_VAR extern struct _ChatEventsList {
+	struct Event_Void FontChanged;   /* User changes whether system chat font used, and when the bitmapped font texture changes */
+	struct Event_Chat ChatReceived;  /* Raised when message is being added to chat */
+	struct Event_Chat ChatSending;   /* Raised when user sends a message */
+	struct Event_Int  ColCodeChanged; /* Raised when a colour code changes */
+} ChatEvents;
+
+CC_VAR extern struct _WindowEventsList {
+	struct Event_Void RedrawNeeded; /* Window contents invalidated and will need to be redrawn */
+	struct Event_Void Resized;      /* Window is resized */
+	struct Event_Void Closing;      /* Window is about to close (should free resources/save state/etc here) */
+	struct Event_Void FocusChanged; /* Focus of the window changed */
+	struct Event_Void StateChanged; /* State of the window changed (e.g. minimised, fullscreen) */
+	struct Event_Void Created;      /* Window has been created, Window_Handle is valid now. */
+	struct Event_Void InactiveChanged; /* Inactive/background state of the window changed */
+	struct Event_Void Redrawing;    /* Window contents should be redrawn (as they are about to be displayed) */
+} WindowEvents;
+
+CC_VAR extern struct _InputEventsList {
+	struct Event_Int    Press; /* Key input character is typed. Arg is a unicode character */
+	struct Event_Input  Down;  /* Key or button is pressed. Arg is a member of Key enumeration */
+	struct Event_Int    Up;    /* Key or button is released. Arg is a member of Key enumeration */
+	struct Event_Float  Wheel; /* Mouse wheel is moved/scrolled (Arg is wheel delta) */
+	struct Event_String TextChanged; /* Text in the on-screen input keyboard changed (for Mobile) */
+} InputEvents;
+
+CC_VAR extern struct _PointerEventsList {
+	struct Event_Int        Moved; /* Pointer position changed (Arg is index) */
+	struct Event_Int         Down; /* Left mouse or touch is pressed (Arg is index) */
+	struct Event_Int         Up;   /* Left mouse or touch is released (Arg is index) */
+	struct Event_RawMove RawMoved; /* Raw pointer position changed (Arg is delta) */
+} PointerEvents;
+
+CC_VAR extern struct _ControllerEventsList {
+	struct Event_PadAxis AxisUpdate; /* Raw analog controller movement */
+} ControllerEvents;
+
+CC_VAR extern struct _NetEventsList {
+	struct Event_Void Connected;    /* Connection to a server was established */
+	struct Event_Void Disconnected; /* Connection to the server was lost */
+	struct Event_PluginMessage PluginMessageReceived; /* Received a PluginMessage packet from the server */
+} NetEvents;
+#endif