4ªU‡nutscripts/vscriptsstaggeringspecialsŠŸYÿ¨-ÿÿdirector_base_addonäži@ÿr6ÿÿtxt addoninfoÊSÿÇÿrÿÿ "AddonInfo" { addonSteamAppID 550 //L4D2 Don't Change addontitle "Staggering Melee SI" //Name for Addon Menu addonversion 1 addonauthor "Interneted" addonauthorSteamID "AUTHOT_STEAM_ID" //Optional. the number of your steam profile URL addonDescription "Staggering Melee SI" }IncludeScript( "staggeringspecials", getroottable() );printl("================================================="); printl("Executing Staggering Melee Specials by Interneted"); printl("================================================="); StaggeringSpecials <- { configs = ["chance", "cooldown"], specials = ["smoker", "spitter", "charger", "hunter", "jockey", "boomer", "tank", "witch"], Settings = {}, function ParseConfigFile() { local tData; local function Clamp(n, min, max) { return n <= min ? min : (n >= max ? max : n); } local function Clamp2(n, min) { return n <= min ? min : n; } local function SerializeSettings() { local sData = "{"; foreach(i, config in configs) { foreach(j, special in specials) { local value = config == "chance" ? 100 : 0.0; local setting = special + "_" + config; if(setting in Settings) { value = Settings[setting]; } else { Settings[setting] <- value; } sData = sData + "\n\t" + setting + " = " + value; } } sData = sData + "\n}"; StringToFile("staggeringspecials/settings.cfg", sData); } // Take the user's input and update the Settings table. if(tData = FileToString("staggeringspecials/settings.cfg")) { try { tData = compilestring("return " + tData)(); foreach(i, config in configs) { foreach(j, special in specials) { local setting = special + "_" + config; if(setting in tData) { try { local value = tData[setting]; value = config == "chance" ? Clamp(value.tointeger(), 0, 100) : Clamp2(value.tofloat(), 0.0); Settings[setting] <- value; } catch(e) {} } } } } catch (e) { } } SerializeSettings(); } infected_array = ["", "smoker", "boomer", "hunter", "spitter", "jockey", "charger", "witch", "tank", ""], function OnGameEvent_player_hurt(params) { if("userid" in params && "weapon" in params) { local infected = ("attacker" in params) ? GetPlayerFromUserID(params.attacker) : null; infected = ("attackerentid" in params) ? EntIndexToHScript(params.attackerentid) : null; local survivor = GetPlayerFromUserID(params.userid); local weapon = params.weapon; if(infected == null || survivor == null) { return; } if(!infected.IsValid() || !survivor.IsValid()) { return; } local type = infected.IsPlayer() ? infected.GetZombieType() : 0; type = infected.GetClassname() == "witch" ? 7 : type; if(survivor.IsSurvivor() && !survivor.IsDominatedBySpecialInfected() && weapon != "insect_swarm" && !survivor.IsStaggering() && !survivor.IsIncapacitated() && infected.ValidateScriptScope()) { local scope = infected.GetScriptScope(); if(!("staggeringspecials_last" in scope)) { scope.staggeringspecials_last <- -1.0; } local last_stagger = scope.staggeringspecials_last; local name = infected_array[type]; if(specials.find(name) != null) { if((Time() - last_stagger) >= Settings[name + "_cooldown"] || last_stagger < 0.0) { if(RandomInt(1, 100) <= Settings[name + "_chance"]) { survivor.Stagger(infected.GetOrigin()); scope.staggeringspecials_last <- Time(); } } } } } } function ResetCooldown(params) { if("userid" in params) { local infected = GetPlayerFromUserID(params.userid); if(infected == null) { return; } if(!infected.IsValid()) { return; } if(!infected.IsSurvivor() && infected.ValidateScriptScope()) { infected.GetScriptScope().staggeringspecials_last <- -1.0; } } } function OnGameEvent_player_death(params) { ResetCooldown(params); } function OnGameEvent_ghost_spawn_time(params) { ResetCooldown(params); } function OnGameEvent_player_team(params) { if("isbot" in params && "team" in params) { if(params.isbot == 0 && params.team == 3) { ResetCooldown(params); } } } // UPDATE 29/01/2026 function OnGameEvent_player_bot_replace(params) { if("player" in params && "bot" in params) { local player = GetPlayerFromUserID(params.player); local bot = GetPlayerFromUserID(params.bot); if(player == null || bot == null) { return; } if(!player.IsValid() || !bot.IsValid()) { return; } if(!bot.IsSurvivor() && player.ValidateScriptScope() && bot.ValidateScriptScope()) { local player_scope = player.GetScriptScope(); local bot_scope = bot.GetScriptScope(); // transfer info if("staggeringspecials_last" in player_scope) { bot_scope.staggeringspecials_last <- player_scope.staggeringspecials_last; } } } } } StaggeringSpecials.ParseConfigFile(); __CollectEventCallbacks(StaggeringSpecials, "OnGameEvent_", "GameEventCallbacks", RegisterScriptGameEventListener);