4ªUsnutscripts/vscriptscorrspeedôÓ®rÿ ÿÿdirector_base_addon­àцÿ SÿÿsharedÉë&ÿ\ú ÿÿ::CorrSpeed <- { function clamp(x, lo, hi) { if (x < lo) return lo; if (x > hi) return hi; return x; } function lerp() return clamp(Shared.survivors.len(),1,4)/6.0+1/3.0 function OnGameEvent_player_left_safe_area(params) { Convars.SetValue("z_speed", Convars.GetFloat("z_speed") * lerp()) } } __CollectEventCallbacks(::CorrSpeed, "OnGameEvent_", "GameEventCallbacks", RegisterScriptGameEventListener) Convars.SetValue("z_discard_min_range", "500"); Convars.SetValue("z_discard_range", "1000");IncludeScript("shared", getroottable()) IncludeScript("corrspeed", getroottable())::Shared <- { survivors = {} survivorsBot = {} survivorsHuman = {} onWeaponChanges = {} onGameplayStarts = {} saveData = {} survivorsWeapon = {} isFirstMap = false thinkWeaponChange = null isSaveInitialized = false function inTable(value, table) { foreach (_, i in table) if (i==value) return true return false } function updateWeaponChange() { if (!Shared.onWeaponChanges) return 0.1 foreach (userid, player in Shared.survivors) { local next = player.GetActiveWeapon() if (!(userid in survivorsWeapon)) { survivorsWeapon[userid] <- next continue } local prev = survivorsWeapon[userid] if (next == prev) continue survivorsWeapon[userid] = next foreach (_, event in Shared.onWeaponChanges) event({userid = userid, player = player, prev = prev, next = next}) } return 0.1 } function init() { if (isSaveInitialized) return isSaveInitialized = true local tmpData = {} RestoreTable("shared", tmpData) SaveTable("shared", tmpData) if (!("firstmap" in tmpData) || tmpData["firstmap"]==Director.GetMapName()) {isFirstMap = true; printl("=== this is first map ===") } } function OnGameEvent_round_start_post_nav(params) { if (!thinkWeaponChange) thinkWeaponChange = Entities.FindByName(null, "thinkWeaponChange") if (!thinkWeaponChange) { thinkWeaponChange = SpawnEntityFromTable("info_target", {targetname="thinkWeaponChange"}) thinkWeaponChange.ValidateScriptScope() thinkWeaponChange.GetScriptScope()["update"] <- @() ::Shared.updateWeaponChange() AddThinkToEnt(thinkWeaponChange, "update") } RestoreTable("shared", saveData) if (!("firstmap" in saveData)) saveData["firstmap"] <- Director.GetMapName() } function OnGameEvent_round_end(params) { printl("===== Round End Reason: "+params.reason) if (params.reason != 3) SaveTable("shared", saveData) } function OnGameEvent_map_transition(params) { SaveTable("shared", saveData) } function OnGameEvent_player_spawn(params) { if (!("userid" in params)) return local player = GetPlayerFromUserID(params.userid) if (!player.IsSurvivor()) return survivors[params.userid] <- player if (IsPlayerABot(player)) survivorsBot[params.userid] <- player else survivorsHuman[params.userid] <- player } function OnGameEvent_player_disconnect(params) { if (!("userid" in params)) return survivors.rawdelete(params.userid) survivorsBot.rawdelete(params.userid) survivorsHuman.rawdelete(params.userid) } function OnGameEvent_player_bot_replace(params) { if (!("player" in params)) return if (!("bot" in params)) return local bot = GetPlayerFromUserID(params.bot) survivors.rawdelete(params.player) survivors[params.bot] <- bot survivorsHuman.rawdelete(params.player) survivorsBot[params.bot] <- bot } function OnGameEvent_bot_player_replace(params) { if (!("player" in params)) return if (!("bot" in params)) return local player = GetPlayerFromUserID(params.player) survivors.rawdelete(params.bot) survivors[params.player] <- player survivorsBot.rawdelete(params.bot) survivorsHuman[params.player] <- player } } __CollectEventCallbacks(::Shared, "OnGameEvent_", "GameEventCallbacks", RegisterScriptGameEventListener) Shared.init() ::RandomPick <- function(arr) return arr[RandomInt(0, arr.len()-1)]