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.c |
initial commit
Diffstat (limited to 'src/Event.c')
-rw-r--r-- | src/Event.c | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/src/Event.c b/src/Event.c new file mode 100644 index 0000000..1c0d976 --- /dev/null +++ b/src/Event.c @@ -0,0 +1,201 @@ +#include "Event.h" +#include "Logger.h" + +int EventAPIVersion = 3; +struct _EntityEventsList EntityEvents; +struct _TabListEventsList TabListEvents; +struct _TextureEventsList TextureEvents; +struct _GfxEventsList GfxEvents; +struct _UserEventsList UserEvents; +struct _BlockEventsList BlockEvents; +struct _WorldEventsList WorldEvents; +struct _ChatEventsList ChatEvents; +struct _WindowEventsList WindowEvents; +struct _InputEventsList InputEvents; +struct _PointerEventsList PointerEvents; +struct _ControllerEventsList ControllerEvents; +struct _NetEventsList NetEvents; + +void Event_Register(struct Event_Void* handlers, void* obj, Event_Void_Callback handler) { + int i; + for (i = 0; i < handlers->Count; i++) { + /* Attempting to register the same handler twice is usually caused by a bug */ + if (handlers->Handlers[i] == handler && handlers->Objs[i] == obj) { + Logger_Abort("Attempt to register event handler that was already registered"); + } + } + + if (handlers->Count == EVENT_MAX_CALLBACKS) { + Logger_Abort("Unable to register another event handler"); + } else { + handlers->Handlers[handlers->Count] = handler; + handlers->Objs[handlers->Count] = obj; + handlers->Count++; + } +} + +void Event_Unregister(struct Event_Void* handlers, void* obj, Event_Void_Callback handler) { + int i, j; + for (i = 0; i < handlers->Count; i++) { + if (handlers->Handlers[i] != handler || handlers->Objs[i] != obj) continue; + + /* Remove this handler from the list, by shifting all following handlers left */ + for (j = i; j < handlers->Count - 1; j++) { + handlers->Handlers[j] = handlers->Handlers[j + 1]; + handlers->Objs[j] = handlers->Objs[j + 1]; + } + + handlers->Count--; + handlers->Handlers[handlers->Count] = NULL; + handlers->Objs[handlers->Count] = NULL; + return; + } +} + +void Event_UnregisterAll(void) { + /* NOTE: This MUST be kept in sync with Event.h list of events */ + EntityEvents.Added.Count = 0; + EntityEvents.Removed.Count = 0; + + TabListEvents.Added.Count = 0; + TabListEvents.Changed.Count = 0; + TabListEvents.Removed.Count = 0; + + TextureEvents.AtlasChanged.Count = 0; + TextureEvents.PackChanged.Count = 0; + TextureEvents.FileChanged.Count = 0; + + GfxEvents.ViewDistanceChanged.Count = 0; + GfxEvents.LowVRAMDetected.Count = 0; + GfxEvents.ProjectionChanged.Count = 0; + GfxEvents.ContextLost.Count = 0; + GfxEvents.ContextRecreated.Count = 0; + + UserEvents.BlockChanged.Count = 0; + UserEvents.HackPermsChanged.Count = 0; + UserEvents.HeldBlockChanged.Count = 0; + + BlockEvents.PermissionsChanged.Count = 0; + BlockEvents.BlockDefChanged.Count = 0; + + WorldEvents.NewMap.Count = 0; + WorldEvents.Loading.Count = 0; + WorldEvents.MapLoaded.Count = 0; + WorldEvents.EnvVarChanged.Count = 0; + WorldEvents.LightingModeChanged.Count = 0; + + ChatEvents.FontChanged.Count = 0; + ChatEvents.ChatReceived.Count = 0; + ChatEvents.ChatSending.Count = 0; + ChatEvents.ColCodeChanged.Count = 0; + + WindowEvents.RedrawNeeded.Count = 0; + WindowEvents.Resized.Count = 0; + WindowEvents.Closing.Count = 0; + WindowEvents.FocusChanged.Count = 0; + WindowEvents.StateChanged.Count = 0; + WindowEvents.Created.Count = 0; + WindowEvents.InactiveChanged.Count = 0; + WindowEvents.Redrawing.Count = 0; + + InputEvents.Press.Count = 0; + InputEvents.Down.Count = 0; + InputEvents.Up.Count = 0; + InputEvents.Wheel.Count = 0; + InputEvents.TextChanged.Count = 0; + + PointerEvents.Moved.Count = 0; + PointerEvents.Down.Count = 0; + PointerEvents.Up.Count = 0; + PointerEvents.RawMoved.Count = 0; + + ControllerEvents.AxisUpdate.Count = 0; + + NetEvents.Connected.Count = 0; + NetEvents.Disconnected.Count = 0; + NetEvents.PluginMessageReceived.Count = 0; +} + +void Event_RaiseVoid(struct Event_Void* handlers) { + int i; + for (i = 0; i < handlers->Count; i++) { + handlers->Handlers[i](handlers->Objs[i]); + } +} + +void Event_RaiseInt(struct Event_Int* handlers, int arg) { + int i; + for (i = 0; i < handlers->Count; i++) { + handlers->Handlers[i](handlers->Objs[i], arg); + } +} + +void Event_RaiseFloat(struct Event_Float* handlers, float arg) { + int i; + for (i = 0; i < handlers->Count; i++) { + handlers->Handlers[i](handlers->Objs[i], arg); + } +} + +void Event_RaiseEntry(struct Event_Entry* handlers, struct Stream* stream, const cc_string* name) { + int i; + for (i = 0; i < handlers->Count; i++) { + handlers->Handlers[i](handlers->Objs[i], stream, name); + } +} + +void Event_RaiseBlock(struct Event_Block* handlers, IVec3 coords, BlockID oldBlock, BlockID block) { + int i; + for (i = 0; i < handlers->Count; i++) { + handlers->Handlers[i](handlers->Objs[i], coords, oldBlock, block); + } +} + +void Event_RaiseChat(struct Event_Chat* handlers, const cc_string* msg, int msgType) { + int i; + for (i = 0; i < handlers->Count; i++) { + handlers->Handlers[i](handlers->Objs[i], msg, msgType); + } +} + +void Event_RaiseInput(struct Event_Input* handlers, int key, cc_bool repeating) { + int i; + for (i = 0; i < handlers->Count; i++) { + handlers->Handlers[i](handlers->Objs[i], key, repeating); + } +} + +void Event_RaiseString(struct Event_String* handlers, const cc_string* str) { + int i; + for (i = 0; i < handlers->Count; i++) { + handlers->Handlers[i](handlers->Objs[i], str); + } +} + +void Event_RaiseRawMove(struct Event_RawMove* handlers, float xDelta, float yDelta) { + int i; + for (i = 0; i < handlers->Count; i++) { + handlers->Handlers[i](handlers->Objs[i], xDelta, yDelta); + } +} + +void Event_RaisePadAxis(struct Event_PadAxis* handlers, int port, int axis, float x, float y) { + int i; + for (i = 0; i < handlers->Count; i++) { + handlers->Handlers[i](handlers->Objs[i], port, axis, x, y); + } +} + +void Event_RaisePluginMessage(struct Event_PluginMessage* handlers, cc_uint8 channel, cc_uint8* data) { + int i; + for (i = 0; i < handlers->Count; i++) { + handlers->Handlers[i](handlers->Objs[i], channel, data); + } +} + +void Event_RaiseLightingMode(struct Event_LightingMode* handlers, cc_uint8 oldMode, cc_bool fromServer) { + int i; + for (i = 0; i < handlers->Count; i++) { + handlers->Handlers[i](handlers->Objs[i], oldMode, fromServer); + } +} \ No newline at end of file |