aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Miller <william-millennium@hotmail.com>2024-10-30 19:40:11 -0300
committerGitHub <noreply@github.com>2024-10-30 23:40:11 +0100
commit9b83a632621264e28dd1724b90d381727c83d941 (patch)
tree4b7cedd87e18c60382c4e9d7ec9a9a33533cd78d
parent9beff344f5c71856e27c8a18e97e42fc92bb793d (diff)
downloadNorthstarMods-9b83a632621264e28dd1724b90d381727c83d941.tar.gz
NorthstarMods-9b83a632621264e28dd1724b90d381727c83d941.zip
Fix Match Stats Tracking Improperly (#898)
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.
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut32
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/_stats.nut44
2 files changed, 22 insertions, 54 deletions
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut
index 0c66f5a9..17323c38 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut
@@ -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()
}
}
}
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/_stats.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/_stats.nut
index 74a9088b..84b09ec8 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/_stats.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/_stats.nut
@@ -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
@@ -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()
@@ -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() )
@@ -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
}
-
}
}