//#define DEBUG //#define CSGO_WIN #define PLUGIN_NAME "EventQueue fix" #define PLUGIN_AUTHOR "carnifex" #define PLUGIN_DESCRIPTION "" #define PLUGIN_VERSION "1.0" #define PLUGIN_URL "" #include #include #include #include #include #pragma semicolon 1 // How many bits to use to encode an edict. #define MAX_EDICT_BITS 11 // # of bits needed to represent max edicts // Max # of edicts in a level #define MAX_EDICTS (1<(g_iRefOffset), NumberType_Int32); if(m_RefEHandle == INVALID_EHANDLE_INDEX) return INVALID_EHANDLE_INDEX; // https://github.com/perilouswithadollarsign/cstrike15_src/blob/29e4c1fda9698d5cebcdaf1a0de4b829fa149bf8/public/basehandle.h#L137 int entry_idx = m_RefEHandle & ENT_ENTRY_MASK; if(entry_idx >= MAX_EDICTS) return m_RefEHandle | (1 << 31); return entry_idx; } public MRESReturn DHook_AddEventThree(Handle hParams) { event_t event; DHookGetParamString(hParams, 1, event.target, 64); DHookGetParamString(hParams, 2, event.targetInput, 64); DHookGetParamObjectPtrString(hParams, 3, 0, ObjectValueType_String, event.variantValue, sizeof(event.variantValue)); event.delay = DHookGetParam(hParams, 4); event.activator = EntityToBCompatRef(view_as
(DHookGetParam(hParams, 5))); event.caller = DHookGetParam(hParams, 6); event.outputID = DHookGetParam(hParams, 7); #if defined DEBUG PrintToChatAll("AddEventThree: %s, %s, %s, %f, %i, %i, %i", event.target, event.targetInput, event.variantValue, event.delay, event.activator, event.caller, event.outputID); #endif if((event.activator < 65 && event.activator > 0)) { g_aPlayerEvents[event.activator].PushArray(event); return MRES_Supercede; } return MRES_Ignored; } public Action OnTrigger(const char[] output, int caller, int activator, float delay) { if(activator <= MAXPLAYERS && activator > 0) { float m_flWait = GetEntPropFloat(caller, Prop_Data, "m_flWait"); bool bFound; entity_t ent; for(int i = 0; i < g_aOutputWait[activator].Length; i++) { g_aOutputWait[activator].GetArray(i, ent); if(caller == ent.caller) { bFound = true; break; } } if(!bFound) { ent.caller = caller; ent.waitTime = m_flWait; g_aOutputWait[activator].PushArray(ent); return Plugin_Continue; } else { return Plugin_Handled; } } return Plugin_Continue; } int FindEntityByName(int startEntity, char[] targetname, int searchingEnt, int activator, int caller) { Address targetEntityAddr = SDKCall(g_hFindEntityByName, startEntity, targetname, searchingEnt, activator, caller, 0); if(targetEntityAddr == Address_Null) return -1; return EntRefToEntIndex(EntityToBCompatRef(targetEntityAddr)); } public void ServiceEvent(event_t event) { SetVariantString(event.variantValue); int targetEntity = -1; // In the context of the event, the searching entity is also the caller while ((targetEntity = FindEntityByName(targetEntity, event.target, event.caller, event.activator, event.caller)) != -1) { AcceptEntityInput(targetEntity, event.targetInput, event.activator, event.caller, event.outputID); #if defined DEBUG PrintToChat(event.activator, "Performing output: %s, %i, %i, %s %s, %i, %f", event.target, targetEntity, event.caller, event.targetInput, event.variantValue, event.outputID, GetGameTime()); #endif } } public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon, int &subtype, int &cmdnum, int &tickcount, int &seed, int mouse[2]) { float timescale = Shavit_GetClientTimescale(client) != -1.0 ? Shavit_GetClientTimescale(client) : Shavit_GetStyleSettingFloat(Shavit_GetBhopStyle(client), "speed"); for(int i = 0; i < g_aOutputWait[client].Length; i++) { entity_t ent; g_aOutputWait[client].GetArray(i, ent); if(ent.waitTime <= GetTickInterval() * timescale) { g_aOutputWait[client].Erase(i); i--; } else { ent.waitTime -= GetTickInterval() * timescale; g_aOutputWait[client].SetArray(i, ent); } } for(int i = 0; i < g_aPlayerEvents[client].Length; i++) { event_t event; g_aPlayerEvents[client].GetArray(i, event); if(event.delay <= GetTickInterval() * timescale) { ServiceEvent(event); g_aPlayerEvents[client].Erase(i); i--; } else { event.delay -= GetTickInterval() * timescale; g_aPlayerEvents[client].SetArray(i, event); } } }