Add TacticalKillStatsTable back and make it work for all players on your team / Spectator player shows T1/2 losses separately

This commit is contained in:
2026-03-15 17:04:33 -05:00
parent 770a42b841
commit d2f3974c96
6 changed files with 252 additions and 1 deletions

View File

@@ -155,6 +155,19 @@ function SkirmishGameClass:GetTeam(id)
return self.Teams[id]
end
---Gets the Team of the Player ID.
---@param id integer Player ID.
---@return TeamStruct|nil
function SkirmishGameClass:GetTeamForPlayer(id)
local player = self.Players[id]
if not player then
return nil
end
return self.Teams[player.TeamId]
end
---Gets the Players for the Team ID.
---@param id integer Team ID
---@return PlayerClass[]
@@ -203,6 +216,113 @@ function SkirmishGameClass:CalculateTeamTotalIncome(id)
return totalIncome
end
--- ==================================================
--- Stat tables
--- ==================================================
---Updates the Tactical Kill Stats Table with the killed object.
---@param unit UnitClass The object that was killed.
---@param killer PlayerObject The player that killed the object.
function SkirmishGameClass:UpdateTacticalKillStatsTable(unit, killer)
if not TestValid(killer) then
return
end
-- Update Frags
local fragEntry = self.KillStatsTable[FragIndex]
if not fragEntry then
fragEntry = {}
self.KillStatsTable[FragIndex] = fragEntry
end
local killerId = killer.Get_ID()
if self.IsLocalSpectator then
local killerTeam = self:GetTeamForPlayer(killerId)
if killerTeam and killerTeam.Number == 1 then
-- For the spectator, let's show Team 1's kills on the left side
killerId = LocalPlayer.Get_ID()
end
end
local killerEntry = fragEntry[killerId]
if not killerEntry then
killerEntry = {}
fragEntry[killerId] = killerEntry
end
local killerObjEntry = killerEntry[unit.GameObjectType]
if not killerObjEntry then
killerObjEntry = {
kills = 1,
combat_power = unit.CombatRating,
build_cost = unit.BuildCost,
score_value = unit.ScoreValue
}
killerEntry[unit.GameObjectType] = killerObjEntry
else
killerObjEntry.kills = killerObjEntry.kills + 1
killerObjEntry.combat_power = killerObjEntry.combat_power + unit.CombatRating
killerObjEntry.build_cost = killerObjEntry.build_cost + unit.BuildCost
killerObjEntry.score_value = killerObjEntry.score_value + unit.ScoreValue
end
-- Update Deaths
local deathEntry = self.KillStatsTable[DeathIndex]
if not deathEntry then
deathEntry = {}
self.KillStatsTable[DeathIndex] = deathEntry
end
local ownerId = unit.OwnerId
if self.IsLocalSpectator then
local ownerTeam = self:GetTeamForPlayer(ownerId)
if ownerTeam and ownerTeam.Number == 1 then
-- For the spectator, let's show Team 1's lost units on the left side
ownerId = LocalPlayer.Get_ID()
end
else
-- Non-spectator: show all teammate deaths as local player's losses
local ownerTeam = self:GetTeamForPlayer(ownerId)
local localTeam = self:GetTeamForPlayer(LocalPlayer.Get_ID())
if ownerTeam and localTeam and ownerTeam.Id == localTeam.Id then
ownerId = LocalPlayer.Get_ID()
end
end
local ownerEntry = deathEntry[ownerId]
if not ownerEntry then
ownerEntry = {}
deathEntry[ownerId] = ownerEntry
end
local ownerObjEntry = ownerEntry[unit.GameObjectType]
if not ownerObjEntry then
ownerObjEntry = {
kills = 1,
combat_power = unit.CombatRating,
build_cost = unit.BuildCost,
score_value = unit.ScoreValue
}
ownerEntry[unit.GameObjectType] = ownerObjEntry
else
ownerObjEntry.kills = ownerObjEntry.kills + 1
ownerObjEntry.combat_power = ownerObjEntry.combat_power + unit.CombatRating
ownerObjEntry.build_cost = ownerObjEntry.build_cost + unit.BuildCost
ownerObjEntry.score_value = ownerObjEntry.score_value + unit.ScoreValue
end
end
-- ==================================================
-- Private functions
-- ==================================================