diff options
author | WlodekM <[email protected]> | 2024-06-16 10:35:45 +0300 |
---|---|---|
committer | WlodekM <[email protected]> | 2024-06-16 10:35:45 +0300 |
commit | abef6da56913f1c55528103e60a50451a39628b1 (patch) | |
tree | b3c8092471ecbb73e568cd0d336efa0e7871ee8d /src/Event.h |
initial commit
Diffstat (limited to 'src/Event.h')
-rw-r--r-- | src/Event.h | 222 |
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 |