diff --git a/scripting/eventqueuefix.sp b/scripting/eventqueuefix.sp index 1d21e65..dbbbaa4 100644 --- a/scripting/eventqueuefix.sp +++ b/scripting/eventqueuefix.sp @@ -13,6 +13,7 @@ #include #include #include +#include #pragma semicolon 1 @@ -33,17 +34,6 @@ bool g_bLateLoad; Handle g_hFindEntityByName; int g_iRefOffset; -enum struct event_t -{ - char target[64]; - char targetInput[64]; - char variantValue[64]; - float delay; - int activator; - int caller; - int outputID; -} - enum struct entity_t { int caller; @@ -67,6 +57,11 @@ public void OnPluginStart() public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { + CreateNative("GetClientEvents", Native_GetClientEvents); + CreateNative("SetClientEvents", Native_SetClientEvents); + + MarkNativeAsOptional("GetClientEvents"); + MarkNativeAsOptional("SetClientEvents"); g_bLateLoad = late; return APLRes_Success; @@ -389,4 +384,37 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 g_aPlayerEvents[client].SetArray(i, event); } } +} + +public any Native_GetClientEvents(Handle plugin, int numParams) +{ + int client = GetNativeCell(1); + if(!IsValidClient(client)) + return false; + + eventpack_t ep; + ep.playerEvents = view_as(CloneHandle(g_aPlayerEvents[client].Clone())); + ep.outputWaits = view_as(CloneHandle(g_aOutputWait[client].Clone())); + + SetNativeArray(2, ep, sizeof(eventpack_t)); + return true; +} + +public any Native_SetClientEvents(Handle plugin, int numParams) +{ + int client = GetNativeCell(1); + if(!IsValidClient(client)) + return false; + + eventpack_t ep; + GetNativeArray(2, ep, sizeof(eventpack_t)); + + delete g_aPlayerEvents[client]; + + ArrayList playerEvents = view_as(CloneHandle(ep.playerEvents)); + + g_aPlayerEvents[client] = playerEvents.Clone(); + delete playerEvents; + + return true; } \ No newline at end of file diff --git a/scripting/include/eventqueuefix.inc b/scripting/include/eventqueuefix.inc new file mode 100644 index 0000000..71e38d3 --- /dev/null +++ b/scripting/include/eventqueuefix.inc @@ -0,0 +1,42 @@ +#if defined _eventqueuefix_included + #endinput +#endif +#define _eventqueuefix_included + +enum struct event_t +{ + char target[64]; + char targetInput[64]; + char variantValue[64]; + float delay; + int activator; + int caller; + int outputID; +} + +enum struct eventpack_t +{ + ArrayList playerEvents; + ArrayList outputWaits; +} + +/* + * Gets the current pending events for a client. + * + * @param client Client index. + * @param eventpack Struct containg arrays for pending events and trigger cooldowns. + * + * @return True if successful, false otherwise. + */ +native any GetClientEvents(int client, any[] eventpack); + +/* + * Sets the current pending events for a client. + * + * @param client Client index. + * @param eventpack Struct containg arrays for pending events and trigger cooldowns. + * + * @return True if successful, false otherwise. + */ +native any SetClientEvents(int client, any[] eventpack); +