diff --git a/addons/sourcemod/plugins/optional/l4d2_magnum_incap.smx b/addons/sourcemod/plugins/optional/l4d2_magnum_incap.smx index f76298936..e7c5e06a6 100644 Binary files a/addons/sourcemod/plugins/optional/l4d2_magnum_incap.smx and b/addons/sourcemod/plugins/optional/l4d2_magnum_incap.smx differ diff --git a/addons/sourcemod/scripting/l4d2_magnum_incap.sp b/addons/sourcemod/scripting/l4d2_magnum_incap.sp index f7fa9e37b..5a118c016 100644 --- a/addons/sourcemod/scripting/l4d2_magnum_incap.sp +++ b/addons/sourcemod/scripting/l4d2_magnum_incap.sp @@ -2,50 +2,32 @@ #pragma newdecls required #include +#include #define L4D2UTIL_STOCKS_ONLY 1 #include #define DEBUG 0 +int g_iOffs_m_hSecondaryWeaponRestore; ConVar g_hReplaceMagnum = null; -bool g_bHasDeagle[MAXPLAYERS + 1]; public Plugin myinfo = { name = "Magnum incap remover", - author = "robex, Sir", + author = "robex, Sir, Forgetest", description = "Replace magnum with regular pistols when incapped.", - version = "0.4.1", + version = "0.5.0", url = "https://github.com/SirPlease/L4D2-Competitive-Rework" }; public void OnPluginStart() { + g_iOffs_m_hSecondaryWeaponRestore = FindSendPropInfo("CTerrorPlayer", "m_iVersusTeam") - 20; + g_hReplaceMagnum = CreateConVar("l4d2_replace_magnum_incap", "1.0", "Replace magnum with single (1) or double (2) pistols when incapacitated. 0 to disable."); HookEvent("player_incapacitated", PlayerIncap_Event); - HookEvent("revive_success", ReviveSuccess_Event); - HookEvent("round_start", RoundStart_Event); - HookEvent("bot_player_replace", Replaced_Event); - HookEvent("player_bot_replace", Replaced_Event); -} - -void RoundStart_Event(Event hEvent, char[] name, bool dontBroadcast) -{ - for (int i = 1; i <= MaxClients; i++) - { - g_bHasDeagle[i] = false; - } -} - -void Replaced_Event(Event hEvent, char[] name, bool dontBroadcast) -{ - bool bBotReplaced = (!strncmp(name, "b", 1)); - int replaced = bBotReplaced ? GetClientOfUserId(hEvent.GetInt("bot")) : GetClientOfUserId(hEvent.GetInt("player")); - int replacer = bBotReplaced ? GetClientOfUserId(hEvent.GetInt("player")) : GetClientOfUserId(hEvent.GetInt("bot")); - - g_bHasDeagle[replacer] = g_bHasDeagle[replaced]; } void PlayerIncap_Event(Event hEvent, char[] name, bool dontBroadcast) @@ -57,46 +39,34 @@ void PlayerIncap_Event(Event hEvent, char[] name, bool dontBroadcast) // This also fires on Tank Death, so check for client team to prevent issues down the line. if (GetClientTeam(client) != 2) { return; } - char sWeaponName[ENTITY_MAX_NAME_LENGTH]; int secWeaponIndex = GetPlayerWeaponSlot(client, L4D2WeaponSlot_Secondary); + if (secWeaponIndex == -1) + return; + + char sWeaponName[ENTITY_MAX_NAME_LENGTH]; GetEdictClassname(secWeaponIndex, sWeaponName, sizeof(sWeaponName)); #if DEBUG PrintToChatAll("client %d -> weapon %s", client, sWeaponName); #endif - int secWeapId = WeaponNameToId(sWeaponName); - if (secWeapId == WEPID_PISTOL_MAGNUM) { + if (!strcmp(sWeaponName, "weapon_pistol_magnum") && GetPlayerSecondaryWeaponRestore(client) == -1) { RemovePlayerItem(client, secWeaponIndex); - RemoveEntity(secWeaponIndex); + SetPlayerSecondaryWeaponRestore(client, secWeaponIndex); GivePlayerItem(client, "weapon_pistol"); if (GetConVarInt(g_hReplaceMagnum) > 1) { GivePlayerItem(client, "weapon_pistol"); } - g_bHasDeagle[client] = true; - } else { - g_bHasDeagle[client] = false; } } -void ReviveSuccess_Event(Event hEvent, char[] name, bool dontBroadcast) +int GetPlayerSecondaryWeaponRestore(int client) { - if (GetConVarInt(g_hReplaceMagnum) < 1) { return; } - - int client = GetClientOfUserId(hEvent.GetInt("subject")); - -#if DEBUG - PrintToChatAll("client %d revived, g_bHasDeagle: %s", client, g_bHasDeagle[client] ? "True" : "False"); -#endif - - if (g_bHasDeagle[client]) { - int secWeaponIndex = GetPlayerWeaponSlot(client, L4D2WeaponSlot_Secondary); - - RemovePlayerItem(client, secWeaponIndex); - RemoveEntity(secWeaponIndex); - - GivePlayerItem(client, "weapon_pistol_magnum"); - g_bHasDeagle[client] = false; // Gets set on incap anywoo. - } + return GetEntDataEnt2(client, g_iOffs_m_hSecondaryWeaponRestore); } + +void SetPlayerSecondaryWeaponRestore(int client, int weapon) +{ + SetEntDataEnt2(client, g_iOffs_m_hSecondaryWeaponRestore, weapon); +} \ No newline at end of file