diff --git a/dlls/cstrike/cstrike/CstrikeHacks.cpp b/dlls/cstrike/cstrike/CstrikeHacks.cpp index f761def3..92fcf643 100644 --- a/dlls/cstrike/cstrike/CstrikeHacks.cpp +++ b/dlls/cstrike/cstrike/CstrikeHacks.cpp @@ -97,7 +97,7 @@ DETOUR_DECL_STATIC1(C_ClientCommand, void, edict_t*, pEdict) // void ClientComma // Purpose is to retrieve an item id based on alias name or selected item from menu, // to be used in OnBuy* forwards. - if (command && *command) + if ((g_CSBuyAttemptCmdFwd != -1 || g_CSBuyCmdFwd != -1) && command && *command) { // Just for safety. command = UTIL_StringToLower((char *)command); @@ -161,7 +161,7 @@ DETOUR_DECL_STATIC1(C_ClientCommand, void, edict_t*, pEdict) // void ClientComma int client = ENTINDEX(pEdict); - if (*g_UseBotArgs) + if (g_CSCliCmdFwd != -1 && *g_UseBotArgs) { const char *args = *g_BotArgs; @@ -171,7 +171,10 @@ DETOUR_DECL_STATIC1(C_ClientCommand, void, edict_t*, pEdict) // void ClientComma } } - if (g_CurrentItemId && MF_IsPlayerAlive(client) && MF_ExecuteForward(g_CSBuyAttemptCmdFwd, static_cast(client), static_cast(g_CurrentItemId)) > 0) + if (g_CSBuyAttemptCmdFwd != -1 && + g_CurrentItemId && + MF_IsPlayerAlive(client) && + MF_ExecuteForward(g_CSBuyAttemptCmdFwd, static_cast(client), static_cast(g_CurrentItemId)) > 0) { return; } @@ -263,6 +266,8 @@ void CtrlDetours_ClientCommand(bool set) { if (g_ClientCommandDetour) g_ClientCommandDetour->Destroy(); + + g_ItemAliasList.clear(); } } @@ -270,51 +275,6 @@ void ToggleDetour_ClientCommands(bool enable) { if (g_ClientCommandDetour) (enable) ? g_ClientCommandDetour->EnableDetour() : g_ClientCommandDetour->DisableDetour(); -} - - -void CtrlDetours_BuyCommands(bool set) -{ - if (set) - { - void *giveShieldAddress = UTIL_FindAddressFromEntry(CS_IDENT_GIVENSHIELD , CS_IDENT_HIDDEN_STATE); - void *giveNamedItemAddress = UTIL_FindAddressFromEntry(CS_IDENT_GIVENAMEDITEM, CS_IDENT_HIDDEN_STATE); - void *addAccountAddress = UTIL_FindAddressFromEntry(CS_IDENT_ADDACCOUNT , CS_IDENT_HIDDEN_STATE); - - g_GiveShieldDetour = DETOUR_CREATE_MEMBER_FIXED(GiveShield, giveShieldAddress); - g_GiveNamedItemDetour = DETOUR_CREATE_MEMBER_FIXED(GiveNamedItem, giveNamedItemAddress); - g_AddAccountDetour = DETOUR_CREATE_MEMBER_FIXED(AddAccount, addAccountAddress); - - if (g_GiveNamedItemDetour == NULL || g_AddAccountDetour == NULL) - { - MF_Log("No Buy Commands detours could be initialized - Disabled Buy forward."); - } - } - else - { - if (g_GiveShieldDetour) - g_GiveShieldDetour->Destroy(); - - if (g_GiveNamedItemDetour) - g_GiveNamedItemDetour->Destroy(); - - if (g_AddAccountDetour) - g_AddAccountDetour->Destroy(); - - g_ItemAliasList.clear(); - } -} - -void ToggleDetour_BuyCommands(bool enable) -{ - if (g_GiveShieldDetour) - (enable) ? g_GiveShieldDetour->EnableDetour() : g_GiveShieldDetour->DisableDetour(); - - if (g_GiveNamedItemDetour) - (enable) ? g_GiveNamedItemDetour->EnableDetour() : g_GiveNamedItemDetour->DisableDetour(); - - if (g_AddAccountDetour) - (enable) ? g_AddAccountDetour->EnableDetour() : g_AddAccountDetour->DisableDetour(); if (enable) { @@ -368,4 +328,49 @@ void ToggleDetour_BuyCommands(bool enable) { g_ItemAliasList.clear(); } +} + + +void CtrlDetours_BuyCommands(bool set) +{ + if (set) + { + void *giveShieldAddress = UTIL_FindAddressFromEntry(CS_IDENT_GIVENSHIELD , CS_IDENT_HIDDEN_STATE); + void *giveNamedItemAddress = UTIL_FindAddressFromEntry(CS_IDENT_GIVENAMEDITEM, CS_IDENT_HIDDEN_STATE); + void *addAccountAddress = UTIL_FindAddressFromEntry(CS_IDENT_ADDACCOUNT , CS_IDENT_HIDDEN_STATE); + + g_GiveShieldDetour = DETOUR_CREATE_MEMBER_FIXED(GiveShield, giveShieldAddress); + g_GiveNamedItemDetour = DETOUR_CREATE_MEMBER_FIXED(GiveNamedItem, giveNamedItemAddress); + g_AddAccountDetour = DETOUR_CREATE_MEMBER_FIXED(AddAccount, addAccountAddress); + + if (g_GiveNamedItemDetour == NULL || g_AddAccountDetour == NULL) + { + MF_Log("No Buy Commands detours could be initialized - Disabled Buy forward."); + } + } + else + { + if (g_GiveShieldDetour) + g_GiveShieldDetour->Destroy(); + + if (g_GiveNamedItemDetour) + g_GiveNamedItemDetour->Destroy(); + + if (g_AddAccountDetour) + g_AddAccountDetour->Destroy(); + + g_ItemAliasList.clear(); + } +} + +void ToggleDetour_BuyCommands(bool enable) +{ + if (g_GiveShieldDetour) + (enable) ? g_GiveShieldDetour->EnableDetour() : g_GiveShieldDetour->DisableDetour(); + + if (g_GiveNamedItemDetour) + (enable) ? g_GiveNamedItemDetour->EnableDetour() : g_GiveNamedItemDetour->DisableDetour(); + + if (g_AddAccountDetour) + (enable) ? g_AddAccountDetour->EnableDetour() : g_AddAccountDetour->DisableDetour(); } \ No newline at end of file diff --git a/dlls/cstrike/cstrike/amxx_api.cpp b/dlls/cstrike/cstrike/amxx_api.cpp index e647add2..07326782 100644 --- a/dlls/cstrike/cstrike/amxx_api.cpp +++ b/dlls/cstrike/cstrike/amxx_api.cpp @@ -63,12 +63,21 @@ void OnAmxxAttach() void OnPluginsLoaded() { - g_CSCliCmdFwd = MF_RegisterForward("CS_InternalCommand", ET_STOP, FP_CELL, FP_STRING, FP_DONE); - g_CSBuyCmdFwd = MF_RegisterForward("CS_OnBuy", ET_STOP, FP_CELL, FP_CELL, FP_DONE); - g_CSBuyAttemptCmdFwd = MF_RegisterForward("CS_OnBuyAttempt", ET_STOP, FP_CELL, FP_CELL, FP_DONE); + g_CSCliCmdFwd = MF_RegisterForward("CS_InternalCommand", ET_STOP, FP_CELL, FP_STRING, FP_DONE); + g_CSBuyCmdFwd = MF_RegisterForward("CS_OnBuy" , ET_STOP, FP_CELL, FP_CELL, FP_DONE); + g_CSBuyAttemptCmdFwd = MF_RegisterForward("CS_OnBuyAttempt" , ET_STOP, FP_CELL, FP_CELL, FP_DONE); - ToggleDetour_ClientCommands(UTIL_CheckForPublic("CS_InternalCommand")); - ToggleDetour_BuyCommands(UTIL_CheckForPublic("CS_OnBuy") || UTIL_CheckForPublic("CS_OnBuyAttempt")); + // Checking whether such public forwards are used in plugins. + // Resetting variable to -1 to avoid running unnecessary code in ClientCommand. + + if (!UTIL_CheckForPublic("CS_InternalCommand")) { g_CSCliCmdFwd = -1; } + if (!UTIL_CheckForPublic("CS_OnBuy")) { g_CSBuyCmdFwd = -1; } + if (!UTIL_CheckForPublic("CS_OnBuyAttempt")) { g_CSBuyAttemptCmdFwd = -1; } + + // And enable/disable detours when necessary. + + ToggleDetour_ClientCommands(g_CSCliCmdFwd != -1 || g_CSBuyCmdFwd != -1 || g_CSBuyCmdFwd != -1); + ToggleDetour_BuyCommands(g_CSBuyCmdFwd != -1); } void OnAmxxDetach()