Skip to content

Commit

Permalink
Fix Match Stats Tracking Improperly (#898)
Browse files Browse the repository at this point in the history
Previously would incorrectly count each round in round based modes as individual games duplicating and stacking stats for those modes in the process.

This commit changes where the hook happens. Ensures the stats will register only once and only when the match really ends, still disconsidering Epilogue state.
  • Loading branch information
Zanieon authored Oct 30, 2024
1 parent 9beff34 commit 9b83a63
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 54 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -226,37 +226,7 @@ void function SetWinner( int team, string winningReason = "", string losingReaso
SetGameState( eGameState.WinnerDetermined )
ScoreEvent_MatchComplete( team )

array<entity> players = GetPlayerArray()
int functionref( entity, entity ) compareFunc = GameMode_GetScoreCompareFunc( GAMETYPE )
if ( compareFunc != null )
{
players.sort( compareFunc )
int playerCount = players.len()
int currentPlace = 1
for ( int i = 0; i < 3; i++ )
{
if ( i >= playerCount )
continue

if ( i > 0 && compareFunc( players[i - 1], players[i] ) != 0 )
currentPlace += 1

switch( currentPlace )
{
case 1:
UpdatePlayerStat( players[i], "game_stats", "mvp" )
UpdatePlayerStat( players[i], "game_stats", "mvp_total" )
UpdatePlayerStat( players[i], "game_stats", "top3OnTeam" )
break
case 2:
UpdatePlayerStat( players[i], "game_stats", "top3OnTeam" )
break
case 3:
UpdatePlayerStat( players[i], "game_stats", "top3OnTeam" )
break
}
}
}
RegisterMatchStats_OnMatchComplete()
}
}
}
Expand Down
44 changes: 21 additions & 23 deletions Northstar.CustomServers/mod/scripts/vscripts/mp/_stats.nut
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ global function UpdateTitanCoreEarnedStat
global function PreScoreEventUpdateStats
global function PostScoreEventUpdateStats
global function Stats_OnPlayerDidDamage
global function RegisterMatchStats_OnMatchComplete

struct {
table< string, array<string> > refs
Expand All @@ -36,7 +37,6 @@ void function Stats_Init()
AddCallback_OnPlayerRespawned( OnPlayerRespawned )
AddCallback_OnClientConnected( OnClientConnected )
AddCallback_OnClientDisconnected( OnClientDisconnected )
AddCallback_GameStateEnter( eGameState.WinnerDetermined, OnWinnerDetermined )

thread HandleDistanceAndTimeStats_Threaded()
thread SaveStatsPeriodically_Threaded()
Expand Down Expand Up @@ -813,7 +813,7 @@ void function OnPlayerRespawned( entity player )
thread SetLastPosForDistanceStatValid_Threaded( player, true )
}

void function OnWinnerDetermined()
void function RegisterMatchStats_OnMatchComplete()
{
// award players for match completed, wins, and losses
foreach ( entity player in GetPlayerArray() )
Expand Down Expand Up @@ -888,30 +888,28 @@ void function OnWinnerDetermined()
player.SetPersistentVar( "kdratio_lifetime_pvp", kdratio_lifetimepvp )
}

// award mvp and top 3 in each team
if ( !IsFFAGame() )
array<entity> players = GetPlayerArray()
players.sort( GetScoreboardCompareFunc() )
int playerCount = players.len()
int currentPlace = 1
for ( int i = 0; i < 3; i++ )
{
string gamemode = GameRules_GetGameMode()
int functionref( entity, entity ) compareFunc = GameMode_GetScoreCompareFunc( gamemode )

for( int team = 0; team < MAX_TEAMS; team++ )
if ( i >= playerCount )
continue

int functionref( entity, entity ) compareFunc = GetScoreboardCompareFunc()
if ( i > 0 && compareFunc( players[i - 1], players[i] ) != 0 )
currentPlace += 1
switch( currentPlace )
{
array<entity> players = GetPlayerArrayOfTeam( team )
if ( compareFunc == null )
{
printt( "gamemode doesn't have a compare func to get the top 3" )
return
}
players.sort( compareFunc )
int maxAwards = int( min( players.len(), 3 ) )
for ( int i = 0; i < maxAwards; i++ )
{
if ( i == 0 )
Stats_IncrementStat( players[ i ], "game_stats", "mvp", "", 1.0 )
Stats_IncrementStat( players[ i ], "game_stats", "top3OnTeam", "", 1.0 )
}
case 1: // MVP have two parallel stats which one registers MVP for the map played and the other goes to the player's stats menu as a total MVP times
UpdatePlayerStat( players[i], "game_stats", "mvp" )
UpdatePlayerStat( players[i], "game_stats", "mvp_total" )
case 2:
case 3:
UpdatePlayerStat( players[i], "game_stats", "top3OnTeam" ) // Ingame this is the "Times Top 3" for the whole match, not per team
break
}

}
}

Expand Down

0 comments on commit 9b83a63

Please sign in to comment.