#include #include public Plugin:myinfo = { name = "Anti Tank Bug", author = "Eyal282 ( FuckTheSchool )", description = "Prevents Tank incapacitated bug that prevents tank from dying if he was healed some how ( this plugin probably only valid for servers with !buy )", version = "1.0", url = "<- URL ->" } public OnPluginStart() { // The cvar to enable the plugin. 0 = Disabled. 1 = Enabled and kill the tank when he has 0 HP. Other values = Enabled and revive the tank that got 0 HP ( Best one because if the bug occurs, the tank did !buy heal and failed to go back but lost his points ). CreateConVar("l4d2_anti_tank_bug", "2"); // Hook the event for when a player gets incapacitated ( called for tank start of death as well ) HookEvent("player_incapacitated", Event_Incap, EventHookMode_Post); } public Action: Event_Incap(Handle hEvent, const char[] name, bool dontBroadcast) { // Is the cvar enabled? if(GetConVarInt(FindConVar("l4d2_anti_tank_bug")) == 0) return Plugin_Continue; // Get the client ID of the incapacitated player. new Tank = GetClientOfUserId(GetEventInt(hEvent, "userid")); // Is it a human player? if(IsFakeClient(Tank)) return Plugin_Continue; // Is he an infected? Because the event only calls on tanks and survivors, we can already assume it's a tank. if(GetClientTeam(Tank) != 3) return Plugin_Continue; // 7.0 seconds are enough to determine if the tank is bugged or died properly. CreateTimer(7.0, Check_Bug, GetClientUserId(Tank)); return Plugin_Continue; } public Action:Check_Bug(Handle Timer, int UserId) { new Tank = GetClientOfUserId(UserId); // Is he connected? if(!IsClientInGame(Tank)) return Plugin_Continue; // Is he alive or the bug never occured? else if(!IsPlayerAlive(Tank)) return Plugin_Continue; // Is he an infected? else if(GetClientTeam(Tank) != 3) return Plugin_Continue; // Is he a tank? He had 0.5 seconds to do !buy hunter or something. else if(GetEntProp(Tank, Prop_Send, "m_zombieClass") != 8) return Plugin_Continue; // The console variable is set to 1. Killing the Tank. if(GetConVarInt(FindConVar("l4d2_anti_tank_bug")) == 1) { // Kill the tank ForcePlayerSuicide(Tank); // Tell the Tank that he died because he was bugged. PrintToChat(Tank, "You were killed due to Tank bug immortality."); } // The console variable is above 1 ( already checked if 0 ). Reviving the Tank. else { new Float:AbsOrigin[3]; new Float:EyeAngles[3]; // Get the Tank's current location. GetClientAbsOrigin(Tank, AbsOrigin); // Get the location the tank was looking at. GetClientEyeAngles(Tank, EyeAngles); // Kill the tank ForcePlayerSuicide(Tank); // Check the current flags of the command z_spawn_old new flags = GetCommandFlags("z_spawn_old"); // Make the game think z_spawn_old is not a cheat command. The flags earlier are to maintain all current flags. SetCommandFlags("z_spawn_old", flags & ~FCVAR_CHEAT); // Force the Tank to write z_spawn_old Tank which revives him as a tank. FakeClientCommand(Tank, "z_spawn_old Tank"); // Give the flags back to the command z_spawn_old ( if not done then everybody can do z_spawn_old which is bad ). SetCommandFlags("z_spawn_old", flags); // Teleport the Tank to his old position with the same way he looked at. TeleportEntity(Tank, AbsOrigin, EyeAngles, NULL_VECTOR); // Tell the Tank that he was "revived" to continue punching the survivors since he probably did !buy heal on himself. PrintToChat(Tank, "You were revived due to Tank bug immortality."); } return Plugin_Continue; }