/* * Author: Needles * https://steamcommunity.com/profiles/76561198026257137/ */ printl("*** DEATH_TRACKER"); ::DeathTracker <- {}; ::DeathTracker.deathTrackerMap <- {}; // Steamid -> Tracker ::DeathTracker.event_deadPlayerRespawn <- ::Events.Event(); function DeathTracker::AddTracker(player) { local originOfDeath = Vector(0.0, 0.0, 0.0); local anglesOfDeath = QAngle(0.0, 0.0, 0.0); if (::Players.IsPlayerValid(player) == true) { originOfDeath = player.GetOrigin(); anglesOfDeath = player.GetAbsAngles(); } local steamid = ::Players.GetPlayerSteamID(player); ::DeathTracker.deathTrackerMap[steamid] <- { steamid = steamid, originOfDeath = originOfDeath, anglesOfDeath = anglesOfDeath, timeOfDeath = Time(), tagList = [], }; ::Debug.Print("*** DEATH_TRACKER - Added tracker for steamid " + steamid); } function DeathTracker::RemoveTracker(steamid) { if (steamid in ::DeathTracker.deathTrackerMap) { ::Debug.Print("*** DEATH_TRACKER - Removed tracker for steamid " + steamid); ::DeathTracker.deathTrackerMap.rawdelete(steamid); } } function DeathTracker::Clear() { ::DeathTracker.deathTrackerMap.clear(); } function DeathTracker::AddTag(steamid, tag) { if (!(steamid in ::DeathTracker.deathTrackerMap)) return; local death = ::DeathTracker.deathTrackerMap[steamid]; if (death.tagList.find(tag) == null) { ::Debug.Print("*** DEATH_TRACKER - Appending tag " + tag + " to steamid " + steamid); death.tagList.append(tag); } } function DeathTracker::HasTag(steamid, tag) { if (!(steamid in ::DeathTracker.deathTrackerMap)) return false; if (::DeathTracker.deathTrackerMap[steamid].tagList.find(tag) == null) return false; return true; } ::Events.GetGlobalEvent(EVENT.PLAYER_DEATH_POST).AddListener( function (params) { if (::Players.IsPlayerValid(params.player) == false) return; if (::Players.IsPlayerBot(params.player) == true) return; ::DeathTracker.AddTracker(params.player); } ); ::Events.GetGlobalEvent(EVENT.PLAYER_SPAWN_POST).AddListener( function (params) { // Spawning on an unasigned/spectator team will actually fire this event, so we need to validate the player if (::Players.IsPlayerValid(params.player) == false) return; if (::Players.IsPlayerBot(params.player) == true) return; local steamid = ::Players.GetPlayerSteamID(params.player); if (steamid in ::DeathTracker.deathTrackerMap) { ::Debug.Print("*** DEATH_TRACKER - Dead player with steamid " + steamid + " has respawned"); local death = ::DeathTracker.deathTrackerMap[steamid]; ::DeathTracker.event_deadPlayerRespawn.FireListeners(death); ::DeathTracker.RemoveTracker(steamid); } } );