aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBobTheBob <32057864+BobTheBob9@users.noreply.github.com>2022-01-01 00:54:31 +0000
committerBobTheBob <32057864+BobTheBob9@users.noreply.github.com>2022-01-01 00:54:31 +0000
commit923ee83f5fa3759f67d331fd693712bd3e91bff7 (patch)
tree4b2b15138ae0042ca99a7a5824a724159ad17239
parent0def62c5e540b531a466fc659809c1054ff598ca (diff)
downloadNorthstarMods-923ee83f5fa3759f67d331fd693712bd3e91bff7.tar.gz
NorthstarMods-923ee83f5fa3759f67d331fd693712bd3e91bff7.zip
fix race condition with games being won in a death callback for roundwinning killreplays
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut53
1 files changed, 46 insertions, 7 deletions
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut
index 63ecbf68..598b4522 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut
@@ -39,7 +39,9 @@ struct {
bool roundWinningKillReplayTrackPilotKills = true
bool roundWinningKillReplayTrackTitanKills = false
-
+
+ bool gameWonThisFrame
+ bool hasKillForGameWonThisFrame
float roundWinningKillReplayTime
entity roundWinningKillReplayVictim
entity roundWinningKillReplayAttacker
@@ -282,7 +284,7 @@ void function GameStateEnter_WinnerDetermined_Threaded()
entity replayAttacker = file.roundWinningKillReplayAttacker
bool doReplay = Replay_IsEnabled() && IsRoundWinningKillReplayEnabled() && IsValid( replayAttacker )
- && Time() - file.roundWinningKillReplayTime <= ROUND_WINNING_KILL_REPLAY_LENGTH_OF_REPLAY
+ && Time() - file.roundWinningKillReplayTime <= ROUND_WINNING_KILL_REPLAY_LENGTH_OF_REPLAY && winningTeam != TEAM_UNASSIGNED
float replayLength = 2.0 // extra delay if no replay
if ( doReplay )
@@ -541,12 +543,22 @@ void function ForceFadeToBlack( entity player )
void function OnPlayerKilled( entity victim, entity attacker, var damageInfo )
{
if ( !GamePlayingOrSuddenDeath() )
- return
+ {
+ if ( file.gameWonThisFrame )
+ {
+ if ( file.hasKillForGameWonThisFrame )
+ return
+ }
+ else
+ return
+ }
// set round winning killreplay info here if we're tracking pilot kills
// todo: make this not count environmental deaths like falls, unsure how to prevent this
if ( file.roundWinningKillReplayTrackPilotKills && victim != attacker && attacker != svGlobal.worldspawn && IsValid( attacker ) )
{
+ if ( file.gameWonThisFrame )
+ file.hasKillForGameWonThisFrame = true
file.roundWinningKillReplayTime = Time()
file.roundWinningKillReplayVictim = victim
file.roundWinningKillReplayAttacker = attacker
@@ -555,6 +567,12 @@ void function OnPlayerKilled( entity victim, entity attacker, var damageInfo )
file.roundWinningKillReplayHealthFrac = GetHealthFrac( attacker )
}
+ if ( ( Riff_EliminationMode() == eEliminationMode.Titans || Riff_EliminationMode() == eEliminationMode.PilotsTitans ) && victim.IsTitan() ) // need an extra check for this
+ OnTitanKilled( victim, damageInfo )
+
+ if ( !GamePlayingOrSuddenDeath() )
+ return
+
// note: pilotstitans is just win if enemy team runs out of either pilots or titans
if ( IsPilotEliminationBased() || GetGameState() == eGameState.SuddenDeath )
{
@@ -579,21 +597,28 @@ void function OnPlayerKilled( entity victim, entity attacker, var damageInfo )
SetWinner( GetOtherTeam( victim.GetTeam() ), "#GAMEMODE_ENEMY_PILOTS_ELIMINATED", "#GAMEMODE_FRIENDLY_PILOTS_ELIMINATED" )
}
}
-
- if ( ( Riff_EliminationMode() == eEliminationMode.Titans || Riff_EliminationMode() == eEliminationMode.PilotsTitans ) && victim.IsTitan() ) // need an extra check for this
- OnTitanKilled( victim, damageInfo )
}
void function OnTitanKilled( entity victim, var damageInfo )
{
if ( !GamePlayingOrSuddenDeath() )
- return
+ {
+ if ( file.gameWonThisFrame )
+ {
+ if ( file.hasKillForGameWonThisFrame )
+ return
+ }
+ else
+ return
+ }
// set round winning killreplay info here if we're tracking titan kills
// todo: make this not count environmental deaths like falls, unsure how to prevent this
entity attacker = DamageInfo_GetAttacker( damageInfo )
if ( file.roundWinningKillReplayTrackTitanKills && victim != attacker && attacker != svGlobal.worldspawn && IsValid( attacker ) )
{
+ if ( file.gameWonThisFrame )
+ file.hasKillForGameWonThisFrame = true
file.roundWinningKillReplayTime = Time()
file.roundWinningKillReplayVictim = victim
file.roundWinningKillReplayAttacker = attacker
@@ -601,6 +626,9 @@ void function OnTitanKilled( entity victim, var damageInfo )
file.roundWinningKillReplayTimeOfDeath = Time()
file.roundWinningKillReplayHealthFrac = GetHealthFrac( attacker )
}
+
+ if ( !GamePlayingOrSuddenDeath() )
+ return
// note: pilotstitans is just win if enemy team runs out of either pilots or titans
if ( IsTitanEliminationBased() )
@@ -706,12 +734,16 @@ void function SetRoundWinningKillReplayAttacker( entity attacker )
file.roundWinningKillReplayTime = Time()
file.roundWinningKillReplayHealthFrac = GetHealthFrac( attacker )
file.roundWinningKillReplayAttacker = attacker
+ file.roundWinningKillReplayTimeOfDeath = Time()
}
void function SetWinner( int team, string winningReason = "", string losingReason = "" )
{
SetServerVar( "winningTeam", team )
+ file.gameWonThisFrame = true
+ thread UpdateGameWonThisFrameNextFrame()
+
if ( winningReason.len() == 0 )
file.announceRoundWinnerWinningSubstr = 0
else
@@ -739,6 +771,13 @@ void function SetWinner( int team, string winningReason = "", string losingReaso
}
}
+void function UpdateGameWonThisFrameNextFrame()
+{
+ WaitFrame()
+ file.gameWonThisFrame = false
+ file.hasKillForGameWonThisFrame = false
+}
+
void function AddTeamScore( int team, int amount )
{
GameRules_SetTeamScore( team, GameRules_GetTeamScore( team ) + amount )