diff --git a/gamedata/eventfix.games.txt b/gamedata/eventfix.games.txt index 342a537..13ad6ed 100644 --- a/gamedata/eventfix.games.txt +++ b/gamedata/eventfix.games.txt @@ -30,6 +30,11 @@ "windows" "\x55\x8B\xEC\x53\x8B\x5D\x0C\x85\xDB\x74\x2A" "linux" "\x55\x89\xE5\x57\x56\x53\x83\xEC\x2C\x8B\x4D\x14" } + "ActivateMultiTrigger" + { + "windows" "\x55\x8B\xEC\x83\xEC\x14\x53\x56\x8B\xF1\x8B\x0D\x2A\x2A\x2A\x2A\x8B\x86\x2A\x2A\x2A\x2A\x57\x8D\xBE\x2A\x2A\x2A\x2A\x83\xF8\xFF" + "linux" "\x55\x89\xE5\x56\x53\x83\xEC\x50\x8B\x5D\x08\xC7\x44\x24\x2A\x2A\x2A\x2A\x2A\x8B\x75\x0C\x89\x1C\x24\xE8" + } } "Offsets" @@ -55,16 +60,20 @@ "Signatures" { "AddEventThree" - { - "windows" "\x55\x8B\xEC\x56\x57\x8B\xF9\xB9\x2A\x2A\x2A\x2A\x6A\x38\xE8\x2A\x2A\x2A\x2A\x8B\xF0\x85\xF6\x74\x2A\xC7\x46\x0C\xFF\xFF\xFF\xFF\xC7\x46\x10\xFF\xFF\xFF\xFF\xC7\x46\x18\xFF\xFF\xFF\xFF\xC7\x46\x1C\x00\x00\x00\x00\xC7\x46\x28\xFF\xFF\xFF\xFF\xC7\x46\x2C\x00\x00\x00\x00\xEB\x2A\x33\xF6\xA1\x2A\x2A\x2A\x2A\xF3\x0F\x10\x40\x0C" - "linux" "@_ZN11CEventQueue8AddEventEPKcS1_9variant_tfP11CBaseEntityS4_i" - } - + { + "windows" "\x55\x8B\xEC\x56\x57\x8B\xF9\xB9\x2A\x2A\x2A\x2A\x6A\x38\xE8\x2A\x2A\x2A\x2A\x8B\xF0\x85\xF6\x74\x2A\xC7\x46\x0C\xFF\xFF\xFF\xFF\xC7\x46\x10\xFF\xFF\xFF\xFF\xC7\x46\x18\xFF\xFF\xFF\xFF\xC7\x46\x1C\x00\x00\x00\x00\xC7\x46\x28\xFF\xFF\xFF\xFF\xC7\x46\x2C\x00\x00\x00\x00\xEB\x2A\x33\xF6\xA1\x2A\x2A\x2A\x2A\xF3\x0F\x10\x40\x0C" + "linux" "@_ZN11CEventQueue8AddEventEPKcS1_9variant_tfP11CBaseEntityS4_i" + } "FindEntityByName" { "windows" "\x55\x8B\xEC\x53\x8B\x5D\x0C\x56\x8B\xF1\x85\xDB\x74\x2A" "linux" "@_ZN17CGlobalEntityList16FindEntityByNameEP11CBaseEntityPKcS1_S1_S1_P17IEntityFindFilter" } + "ActivateMultiTrigger" + { + "windows" "\x55\x8B\xEC\x56\x6A\x00\x8B\xF1\xE8\x2A\x2A\x2A\x2A\xA1\x2A\x2A\x2A\x2A\xD9\x40\x0C\xD9\xC9" + "linux" "@_ZN16CTriggerMultiple20ActivateMultiTriggerEP11CBaseEntity" + } } "Offsets" diff --git a/scripting/eventqueuefix.sp b/scripting/eventqueuefix.sp index 3e04926..509adab 100644 --- a/scripting/eventqueuefix.sp +++ b/scripting/eventqueuefix.sp @@ -4,7 +4,7 @@ #define PLUGIN_NAME "EventQueue fix" #define PLUGIN_AUTHOR "carnifex" #define PLUGIN_DESCRIPTION "" -#define PLUGIN_VERSION "1.2.1" +#define PLUGIN_VERSION "1.3.0" #define PLUGIN_URL "" #include @@ -48,7 +48,6 @@ public Plugin myinfo = public void OnPluginStart() { LoadDHooks(); - HookEntityOutput("trigger_multiple", "OnTrigger", OnTrigger); } public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) @@ -62,7 +61,6 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max g_bLateLoad = late; - RegPluginLibrary("eventqueuefix"); return APLRes_Success; @@ -122,7 +120,7 @@ public void OnEntityCreated(int entity, const char[] classname) void LoadDHooks() { - GameData gamedataConf = LoadGameConfigFile("eventfix.games"); + GameData gamedataConf = new GameData("eventfix.games"); if(gamedataConf == null) { @@ -138,7 +136,8 @@ void LoadDHooks() else StartPrepSDKCall(SDKCall_EntityList); - PrepSDKCall_SetFromConf(gamedataConf, SDKConf_Signature, "FindEntityByName"); + if(!PrepSDKCall_SetFromConf(gamedataConf, SDKConf_Signature, "FindEntityByName")) + SetFailState("Faild to find FindEntityByName signature."); PrepSDKCall_SetReturnInfo(SDKType_PlainOldData, SDKPass_ByValue); PrepSDKCall_AddParameter(SDKType_CBaseEntity, SDKPass_Pointer, VDECODE_FLAG_ALLOWNULL | VDECODE_FLAG_ALLOWWORLD); PrepSDKCall_AddParameter(SDKType_String, SDKPass_Pointer); @@ -149,7 +148,8 @@ void LoadDHooks() g_hFindEntityByName = EndPrepSDKCall(); Handle addEventThree = DHookCreateDetour(Address_Null, CallConv_THISCALL, ReturnType_Void, ThisPointer_Ignore); - DHookSetFromConf(addEventThree, gamedataConf, SDKConf_Signature, "AddEventThree"); + if(!DHookSetFromConf(addEventThree, gamedataConf, SDKConf_Signature, "AddEventThree")) + SetFailState("Faild to find AddEventThree signature."); DHookAddParam(addEventThree, HookParamType_CharPtr); DHookAddParam(addEventThree, HookParamType_CharPtr); DHookAddParam(addEventThree, HookParamType_Object, 20, DHookPass_ByVal|DHookPass_ODTOR|DHookPass_OCTOR|DHookPass_OASSIGNOP); @@ -159,7 +159,14 @@ void LoadDHooks() DHookAddParam(addEventThree, HookParamType_Int); if(!DHookEnableDetour(addEventThree, false, DHook_AddEventThree)) SetFailState("Couldn't enable AddEventThree detour."); - + + Handle activateMultiTrigger = DHookCreateDetour(Address_Null, CallConv_THISCALL, ReturnType_Void, ThisPointer_CBaseEntity); + if(!DHookSetFromConf(activateMultiTrigger, gamedataConf, SDKConf_Signature, "ActivateMultiTrigger")) + SetFailState("Faild to find ActivateMultiTrigger signature."); + DHookAddParam(activateMultiTrigger, HookParamType_CBaseEntity); + if(!DHookEnableDetour(activateMultiTrigger, false, DHook_ActivateMultiTrigger)) + SetFailState("Couldn't enable ActivateMultiTrigger detour."); + delete gamedataConf; } @@ -204,7 +211,7 @@ public MRESReturn DHook_AddEventThree(Handle hParams) event.outputID = DHookGetParam(hParams, 7); #if defined DEBUG - PrintToChatAll("AddEventThree: %s, %s, %s, %f, %i, %i, %i, time: %f", event.target, event.targetInput, event.variantValue, event.delay, entIndex, EntRefToEntIndex(event.caller), event.outputID, GetGameTime()); + PrintToServer("[%i] AddEventThree: %s, %s, %s, %f, %i, %i, %i, time: %f", GetGameTickCount(), event.target, event.targetInput, event.variantValue, event.delay, entIndex, EntRefToEntIndex(event.caller), event.outputID, GetGameTime()); #endif g_aPlayerEvents[entIndex].PushArray(event); @@ -246,39 +253,39 @@ public void ResolveVariantValue(Handle ¶ms, event_t event) } } -public Action OnTrigger(const char[] output, int caller, int activator, float delay) +public MRESReturn DHook_ActivateMultiTrigger(int pThis, DHookParam hParams) { - if(activator <= MAXPLAYERS && activator > 0) + int client = hParams.Get(1); + + if(!(0 < client <= MaxClients) || !IsClientInGame(client) || IsFakeClient(client)) + return MRES_Ignored; + + float m_flWait = GetEntPropFloat(pThis, Prop_Data, "m_flWait"); + + bool bFound; + entity_t ent; + for(int i = 0; i < g_aOutputWait[client].Length; i++) { - float m_flWait = GetEntPropFloat(caller, Prop_Data, "m_flWait"); + g_aOutputWait[client].GetArray(i, ent); - bool bFound; - entity_t ent; - for(int i = 0; i < g_aOutputWait[activator].Length; i++) + if(pThis == EntRefToEntIndex(ent.caller)) { - g_aOutputWait[activator].GetArray(i, ent); - - if(caller == EntRefToEntIndex(ent.caller)) - { - bFound = true; - break; - } + bFound = true; + break; } - - if(!bFound) - { - ent.caller = EntIndexToEntRef(caller); - int ticks = RoundToCeil((m_flWait - FLT_EPSILON) / GetTickInterval()); - ent.waitTime = float(ticks); - g_aOutputWait[activator].PushArray(ent); - return Plugin_Continue; - } - else - { - return Plugin_Handled; - } - } - return Plugin_Continue; + } + + if(!bFound) + { + ent.caller = EntIndexToEntRef(pThis); + int ticks = RoundToCeil((m_flWait - FLT_EPSILON) / GetTickInterval()); + ent.waitTime = float(ticks); + g_aOutputWait[client].PushArray(ent); + SetEntProp(pThis, Prop_Data, "m_nNextThinkTick", 0); + return MRES_Ignored; + } + + return MRES_Supercede; } int FindEntityByName(int startEntity, char[] targetname, int searchingEnt, int activator, int caller) @@ -308,7 +315,7 @@ public void ServiceEvent(event_t event) AcceptEntityInput(targetEntity, event.targetInput, activator, caller, event.outputID); #if defined DEBUG - PrintToChat(activator, "Performing output: %s, %i, %i, %s %s, %i, %f", event.target, targetEntity, caller, event.targetInput, event.variantValue, event.outputID, GetGameTime()); + PrintToServer("[%i] Performing output: %s, %i, %i, %s %s, %i, %f", GetGameTickCount(), event.target, targetEntity, caller, event.targetInput, event.variantValue, event.outputID, GetGameTime()); #endif } }