gamemode fixes

pull/15/head
Diavolo 2023-12-25 11:26:35 +01:00
parent 9696e39099
commit 7744518f3c
No known key found for this signature in database
GPG Key ID: FA77F074E98D98A5
3 changed files with 252 additions and 277 deletions

View File

@ -33,10 +33,13 @@ getLosingPlayers()
} }
givePlayerScore( event, player, victim, overridePointsPopup ) givePlayerScore( event, player, victim, overrideCheckPlayerScoreLimitSoon, overridePointsPopup )
{ {
if ( isDefined( level.nukeIncoming ) ) if ( isDefined( level.nukeIncoming ) )
return; return;
if ( !isDefined( overrideCheckPlayerScoreLimitSoon ) )
overrideCheckPlayerScoreLimitSoon = false;
if ( !isDefined( overridePointsPopup ) ) if ( !isDefined( overridePointsPopup ) )
overridePointsPopup = false; overridePointsPopup = false;
@ -58,7 +61,11 @@ givePlayerScore( event, player, victim, overridePointsPopup )
if ( !level.teambased ) if ( !level.teambased )
thread sendUpdatedDMScores(); thread sendUpdatedDMScores();
player maps\mp\gametypes\_gamelogic::checkPlayerScoreLimitSoon(); // player score and team score aren't always the same values towards winning the match
// checkScoreLimit() checks team score correctly, checkPlayerScoreLimitSoon() uses player score
if ( !overrideCheckPlayerScoreLimitSoon )
player maps\mp\gametypes\_gamelogic::checkPlayerScoreLimitSoon();
scoreEndedMatch = player maps\mp\gametypes\_gamelogic::checkScoreLimit(); scoreEndedMatch = player maps\mp\gametypes\_gamelogic::checkScoreLimit();
if ( scoreEndedMatch && event == "kill" ) if ( scoreEndedMatch && event == "kill" )

View File

@ -189,11 +189,10 @@ waitLoadoutDone()
self waittill( "spawned_player" ); self waittill( "spawned_player" );
self _setPerk( "specialty_bling" );
self giveNextGun( true ); self giveNextGun( true );
} }
onPlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration ) onPlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration, lifeId )
{ {
if ( sMeansOfDeath == "MOD_FALLING" || ( isDefined( attacker ) && isPlayer( attacker ) ) ) if ( sMeansOfDeath == "MOD_FALLING" || ( isDefined( attacker ) && isPlayer( attacker ) ) )
{ {

View File

@ -21,12 +21,13 @@ main()
// don't sit there waiting for both teams to contain players, // don't sit there waiting for both teams to contain players,
// as everyone starts a survivor // as everyone starts a survivor
level.prematchWaitForTeams = false; level.prematchWaitForTeams = false;
level.onPrecacheGameType = ::onPrecacheGameType; level.onPrecacheGameType = ::onPrecacheGameType;
level.onStartGameType = ::onStartGameType; level.onStartGameType = ::onStartGameType;
level.onSpawnPlayer = ::onSpawnPlayer; level.onSpawnPlayer = ::onSpawnPlayer;
level.getSpawnPoint = ::getSpawnPoint; level.getSpawnPoint = ::getSpawnPoint;
level.onPlayerKilled = ::onPlayerKilled; level.onPlayerKilled = ::onPlayerKilled;
level.onTimeLimit = ::onTimeLimit; level.onDeadEvent = ::onDeadEvent;
level.onTimeLimit = ::onTimeLimit;
level.infect_perks = []; level.infect_perks = [];
level.infect_perks[level.infect_perks.size] = "specialty_marathon"; level.infect_perks[level.infect_perks.size] = "specialty_marathon";
@ -54,21 +55,29 @@ determineWinningTeam()
onPrecacheGameType() onPrecacheGameType()
{ {
precachestring( &"MP_CONSCRIPTION_STARTS_IN" ); precacheString( &"MP_CONSCRIPTION_STARTS_IN" );
} }
onStartGameType() onStartGameType()
{ {
setclientnamemode( "auto_change" ); setClientNameMode("auto_change");
setObjectiveText( "allies", &"OBJECTIVES_INFECT" );
setObjectiveText( "axis", &"OBJECTIVES_INFECT" );
setObjectiveScoreText( "allies", &"OBJECTIVES_INFECT_SCORE" ); setObjectiveText( "allies", &"OBJECTIVES_INFECT" );
setObjectiveScoreText( "axis", &"OBJECTIVES_INFECT_SCORE" ); setObjectiveText( "axis", &"OBJECTIVES_INFECT" );
if ( level.splitscreen )
{
setObjectiveScoreText( "allies", &"OBJECTIVES_INFECT" );
setObjectiveScoreText( "axis", &"OBJECTIVES_INFECT" );
}
else
{
setObjectiveScoreText( "allies", &"OBJECTIVES_INFECT_SCORE" );
setObjectiveScoreText( "axis", &"OBJECTIVES_INFECT_SCORE" );
}
setObjectiveHintText( "allies", &"OBJECTIVES_INFECT_HINT" );
setObjectiveHintText( "axis", &"OBJECTIVES_INFECT_HINT" );
setObjectiveHintText( "allies", &"OBJECTIVES_INFECT_HINT" );
setObjectiveHintText( "axis", &"OBJECTIVES_INFECT_HINT" );
level.spawnMins = ( 0, 0, 0 ); level.spawnMins = ( 0, 0, 0 );
level.spawnMaxs = ( 0, 0, 0 ); level.spawnMaxs = ( 0, 0, 0 );
maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_tdm_spawn" ); maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_tdm_spawn" );
@ -85,7 +94,7 @@ onStartGameType()
maps\mp\gametypes\_rank::registerScoreInfo( "kill", 50 ); maps\mp\gametypes\_rank::registerScoreInfo( "kill", 50 );
maps\mp\gametypes\_rank::registerScoreInfo( "draft_rogue", 200 ); maps\mp\gametypes\_rank::registerScoreInfo( "draft_rogue", 200 );
maps\mp\gametypes\_rank::registerScoreInfo( "survivor", 50 ); maps\mp\gametypes\_rank::registerScoreInfo( "survivor", 50 );
level.QuickMessageToAll = true; level.QuickMessageToAll = true;
level.blockWeaponDrops = true; level.blockWeaponDrops = true;
level.infect_allowSuicide = false; level.infect_allowSuicide = false;
@ -98,19 +107,18 @@ onStartGameType()
level.infect_timerDisplay.label = &"MP_DRAFT_STARTS_IN"; level.infect_timerDisplay.label = &"MP_DRAFT_STARTS_IN";
level.infect_timerDisplay.alpha = 0; level.infect_timerDisplay.alpha = 0;
level.infect_timerDisplay.archived = false; level.infect_timerDisplay.archived = false;
level.infect_timerDisplay.hideWhenInMenu = true; level.infect_timerDisplay.hideWhenInMenu = true;
level.infect_choseFirstInfected = false; level.infect_choseFirstInfected = false;
level.infect_choosingFirstInfected = false; level.infect_choosingFirstInfected = false;
level.infect_awardedFinalSurvivor = false; level.infect_awardedFinalSurvivor = false;
level.infect_countdownInProgress = false;
level.infect_teamScores["axis"] = 0; level.infect_teamScores["axis"] = 0;
level.infect_teamScores["allies"] = 0; level.infect_teamScores["allies"] = 0;
level.infect_players = []; level.infect_players = [];
level thread onPlayerConnect(); level thread onPlayerConnect();
level thread watchInfectForfeit(); level thread watchInfectForfeit();
} }
onPlayerConnect() onPlayerConnect()
@ -118,50 +126,40 @@ onPlayerConnect()
for (;;) for (;;)
{ {
level waittill( "connected", player ); level waittill( "connected", player );
player.infect_firstSpawn = true; player.infect_firstSpawn = true;
player.infected_Rejoined = false;
player.infect_JoinedAtStart = true;
if( gameFlag( "prematch_done" ) ) if ( gameFlag( "prematch_done" ) )
{ player.infect_joinedatstart = false;
player.infect_JoinedAtStart = false; else
} player.infect_joinedatstart = true;
// infected who quit and rejoined same game
if( IsDefined( level.infect_players[player.name] ) ) if ( isDefined( level.infect_players[player.name] ) )
{ player.infect_rejoined = true;
player.infected_Rejoined = true;
}
} }
} }
getSpawnPoint() getSpawnPoint()
{ {
// first time here? // first time here?
if ( self.infect_firstSpawn ) if ( self.infect_firstSpawn )
{ {
self.infect_firstSpawn = false; self.infect_firstSpawn = false;
// everyone is a gamemode class in infect, no class selection // everyone is a gamemode class in infect, no class selection
self.pers["class"] = "gamemode"; self.pers["class"] = "gamemode";
self.pers["lastClass"] = ""; self.pers["lastClass"] = "";
self.class = self.pers["class"]; self.class = self.pers["class"];
self.lastClass = self.pers["lastClass"]; self.lastClass = self.pers["lastClass"];
// survivors are allies if ( isDefined( self.infect_rejoined ) )
teamChoice = "allies"; maps\mp\gametypes\_menus::addToTeam( "axis", true );
else
// everyone starts as survivors, unless an infected quit and rejoined same game maps\mp\gametypes\_menus::addToTeam( "allies", true );
if( self.infected_Rejoined )
{
teamChoice = "axis";
}
self maps\mp\gametypes\_menus::addToTeam( teamChoice, true );
thread onPlayerDisconnect(); thread onPlayerDisconnect();
}
}
if ( level.inGracePeriod ) if ( level.inGracePeriod )
{ {
spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_tdm_spawn" ); spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_tdm_spawn" );
@ -172,64 +170,59 @@ getSpawnPoint()
spawnPoints = maps\mp\gametypes\_spawnlogic::getTeamSpawnPoints( self.pers["team"] ); spawnPoints = maps\mp\gametypes\_spawnlogic::getTeamSpawnPoints( self.pers["team"] );
spawnPoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( spawnPoints ); spawnPoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( spawnPoints );
} }
return spawnPoint; return spawnPoint;
} }
onSpawnPlayer() onSpawnPlayer()
{ {
self.teamChangedThisFrame = undefined; self.teamchangedthisframe = undefined;
self.infect_spawnPos = self.origin; self.infect_spawnpos = self.origin;
// resynch teams
updateTeamScores(); updateTeamScores();
// let the first spawned player kick this off // let the first spawned player kick this off
if ( !level.infect_choosingFirstInfected ) if ( !level.infect_choosingFirstInfected )
{ {
level.infect_choosingFirstInfected = true; level.infect_choosingFirstInfected = true;
level thread chooseFirstInfected(); level thread chooseFirstInfected();
} }
// infected who quit and rejoined same game? if ( isDefined( self.infect_rejoined ) )
if( self.infected_Rejoined )
{ {
self.infect_rejoined = undefined; self.infect_rejoined = undefined;
// stop initial infect countdown (if quit/join player was initial and a new coutdown is underway) if ( !level.infect_allowsuicide )
if ( !level.infect_allowSuicide ) {
{ level notify( "infect_stopCountdown" );
level notify( "infect_stopCountdown" ); level.infect_choseFirstInfected = 1;
level.infect_choseFirstInfected = true; level.infect_allowsuicide = 1;
level.infect_allowSuicide = true;
foreach( player in level.players )
{
if ( isDefined( player.infect_isBeingChosen ) )
player.infect_isBeingChosen = undefined;
}
}
// if an initial was already chosen while they were gone and they are still initial, set them to normal foreach ( player in level.players )
foreach( player in level.players ) {
{ if ( isDefined( player.infect_isBeingChosen ) )
if ( isDefined( player.isInitialInfected ) ) player.infect_isBeingChosen = undefined;
player thread setInitialToNormalInfected(); }
} }
// if they're the only infected, then set them as initial infected foreach ( player in level.players )
if ( level.infect_teamScores["axis"] == 1 ) {
self.isInitialInfected = true; if ( isDefined( player.isInitialInfected ) )
player thread setInitialToNormalInfected();
}
if ( level.infect_teamscores["axis"] == 1 )
self.isInitialInfected = 1;
} }
// onSpawnPlayer() is called before giveLoadout() // onSpawnPlayer() is called before giveLoadout()
// set self.pers["gamemodeLoadout"] for giveLoadout() to use // set self.pers["gamemodeLoadout"] for giveLoadout() to use
if ( isDefined( self.isInitialInfected ) ) if ( isDefined( self.isInitialInfected ) )
self.pers["gamemodeLoadout"] = level.infect_loadouts["axis_initial"]; self.pers["gamemodeLoadout"] = level.infect_loadouts["axis_initial"];
else else
self.pers["gamemodeLoadout"] = level.infect_loadouts[self.pers["team"]]; self.pers["gamemodeLoadout"] = level.infect_loadouts[self.pers["team"]];
self thread onSpawnFinished();
thread onSpawnFinished();
level notify ( "spawned_player" ); level notify ( "spawned_player" );
} }
@ -320,63 +313,53 @@ setInfectedMsg()
chooseFirstInfected() chooseFirstInfected()
{ {
level endon( "game_ended" ); level endon( "game_ended" );
level endon( "infect_stopCountdown" ); level endon( "infect_stopCountdown" );
level.infect_allowSuicide = false; level.infect_allowsuicide = false;
gameFlagWait( "prematch_done" );
level.infect_timerDisplay.label = &"MP_DRAFT_STARTS_IN"; gameFlagWait( "prematch_done" );
level.infect_timerDisplay setTimer( 15 );
level.infect_timerDisplay.alpha = 1;
maps\mp\gametypes\_hostmigration::waitLongDurationWithHostMigrationPause( 15.0 ); level.infect_timerDisplay.label = &"MP_DRAFT_STARTS_IN";
level.infect_timerDisplay settimer( 8 );
level.infect_timerDisplay.alpha = 1;
level.infect_timerDisplay.alpha = 0; maps\mp\gametypes\_hostmigration::waitLongDurationWithHostMigrationPause( 8.0 );
possibleInfected = []; level.infect_timerDisplay.alpha = 0;
foreach( player in level.players ) level.players[randomint( level.players.size )] setFirstInfected( true );
{
if ( player.team == "spectator" )
continue;
if ( !player.hasSpawned )
continue;
possibleInfected[possibleInfected.size] = player;
}
firstInfectedPlayer = possibleInfected[ randomInt( possibleInfected.size ) ];
firstInfectedPlayer setFirstInfected( true );
} }
setFirstInfected( wasChosen ) setFirstInfected( wasChosen )
{ {
self endon( "disconnect" ); self endon( "disconnect" );
if ( wasChosen )
self.infect_isBeingChosen = true;
if ( wasChosen )
self.infect_isBeingChosen = true;
// wait alive // wait alive
while( !isReallyAlive( self ) || self isUsingRemote() ) while ( !isReallyAlive( self ) || isUsingRemote() )
wait( 0.05 ); wait 0.05;
// remove placement item if carrying // remove placement item if carrying
if ( IsDefined( self.isCarrying ) && self.isCarrying == true ) if ( isDefined( self.isCarrying ) && self.isCarrying == 1 )
{ {
self notify( "force_cancel_placement" ); self notify( "force_cancel_placement" );
wait( 0.05 ); wait 0.05;
} }
// not while mantling // not while mantling
while ( self IsMantling() ) while ( self IsMantling() )
wait( 0.05 ); wait( 0.05 );
// not while in air // not while in air
while ( !self isOnGround() && !self IsOnLadder() ) while ( !self isOnGround() && !self IsOnLadder() )
wait( 0.05 ); wait( 0.05 );
while ( !isAlive( self ) )
waitframe();
// move to other team // move to other team
if ( wasChosen ) if ( wasChosen )
{ {
@ -385,22 +368,21 @@ setFirstInfected( wasChosen )
self.infect_isBeingChosen = undefined; self.infect_isBeingChosen = undefined;
// resynch teams // resynch teams
level notify( "update_game_time" );
updateTeamScores(); updateTeamScores();
// allow suicides now // allow suicides now
level.infect_allowSuicide = true; level.infect_allowSuicide = true;
} }
// store initial // store initial
self.isInitialInfected = true; self.isInitialInfected = true;
// set the gamemodeloadout for giveLoadout() to use
self.pers["gamemodeLoadout"] = level.infect_loadouts["axis_initial"];
// set the gamemodeloadout for giveLoadout() to use
self.pers["gamemodeLoadout"] = level.infect_loadouts["axis_initial"];
// remove old TI if it exists // remove old TI if it exists
if ( isDefined ( self.setSpawnpoint ) ) if ( isDefined( self.setSpawnpoint ) )
self maps\mp\perks\_perkfunctions::deleteTI( self.setSpawnpoint ); maps\mp\perks\_perkfunctions::deleteTI( self.setSpawnpoint );
// set faux TI to respawn in place // set faux TI to respawn in place
spawnPoint = spawn( "script_model", self.origin ); spawnPoint = spawn( "script_model", self.origin );
@ -412,15 +394,14 @@ setFirstInfected( wasChosen )
// faux spawn // faux spawn
self notify( "faux_spawn" ); self notify( "faux_spawn" );
self.faux_spawn_stance = self getStance(); self.faux_spawn_stance = self getStance();
thread maps\mp\gametypes\_playerlogic::spawnPlayer( true ); self thread maps\mp\gametypes\_playerlogic::spawnPlayer( true );
// store infected // store infected
if ( wasChosen ) if ( wasChosen )
level.infect_players[self.name] = true; level.infect_players[self.name] = true;
// tell the world!
thread teamPlayerCardSplash( "callout_first_mercenary", self ); thread teamPlayerCardSplash( "callout_first_mercenary", self );
playSoundOnPlayers( "mp_enemy_obj_captured" ); playSoundOnPlayers( "mp_enemy_obj_captured" );
} }
setInitialToNormalInfected( gotKill ) setInitialToNormalInfected( gotKill )
@ -441,8 +422,8 @@ setInitialToNormalInfected( gotKill )
{ {
self notify( "force_cancel_placement" ); self notify( "force_cancel_placement" );
wait( 0.05 ); wait( 0.05 );
} }
// not while mantling // not while mantling
while ( self IsMantling() ) while ( self IsMantling() )
wait( 0.05 ); wait( 0.05 );
@ -450,18 +431,18 @@ setInitialToNormalInfected( gotKill )
// not while in air // not while in air
while ( !self isOnGround() ) while ( !self isOnGround() )
wait( 0.05 ); wait( 0.05 );
// Gotta check again, more time has passed, wait till we spawn if we died at the same time // Gotta check again, more time has passed, wait till we spawn if we died at the same time
while ( !isReallyAlive( self ) ) while ( !isReallyAlive( self ) )
wait( 0.05 ); wait( 0.05 );
// set the gamemodeloadout for giveLoadout() to use // set the gamemodeloadout for giveLoadout() to use
self.pers["gamemodeLoadout"] = level.infect_loadouts["axis"]; self.pers["gamemodeLoadout"] = level.infect_loadouts["axis"];
// remove old TI if it exists // remove old TI if it exists
if ( isDefined ( self.setSpawnpoint ) ) if ( isDefined ( self.setSpawnpoint ) )
self maps\mp\perks\_perkfunctions::deleteTI( self.setSpawnpoint ); self maps\mp\perks\_perkfunctions::deleteTI( self.setSpawnpoint );
// set faux TI to respawn in place // set faux TI to respawn in place
spawnPoint = spawn( "script_model", self.origin ); spawnPoint = spawn( "script_model", self.origin );
spawnPoint.angles = self.angles; spawnPoint.angles = self.angles;
@ -472,15 +453,15 @@ setInitialToNormalInfected( gotKill )
// faux spawn // faux spawn
self notify( "faux_spawn" ); self notify( "faux_spawn" );
self.faux_spawn_stance = self getStance(); self.faux_spawn_stance = self getStance();
thread maps\mp\gametypes\_playerlogic::spawnPlayer( true ); thread maps\mp\gametypes\_playerlogic::spawnPlayer( true );
} }
onPlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration )
onPlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration, lifeId )
{ {
processKill = false; processKill = false;
wasSuicide = false; wasSuicide = false;
if ( self.team == "allies" && isDefined( attacker ) ) if ( self.team == "allies" && isDefined( attacker ) )
{ {
if ( isPlayer( attacker ) && attacker != self ) if ( isPlayer( attacker ) && attacker != self )
@ -501,10 +482,10 @@ onPlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHi
self maps\mp\gametypes\_menus::addToTeam( "axis" ); self maps\mp\gametypes\_menus::addToTeam( "axis" );
// resynch teams // resynch teams
updateTeamScores(); updateTeamScores();
// store infected // store infected
level.infect_players[self.name] = true; level.infect_players[self.name] = true;
if ( wasSuicide ) if ( wasSuicide )
{ {
@ -518,37 +499,31 @@ onPlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHi
} }
} }
} }
else else if ( isDefined( attacker.isInitialInfected ) )
{
// set attacker to regular infected if they were the first infected // set attacker to regular infected if they were the first infected
if ( isDefined( attacker.isInitialInfected ) ) attacker thread setInitialToNormalInfected( true );
attacker thread setInitialToNormalInfected( true ); else
else {
{ // regular attacker reward
// regular attacker reward attacker thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_DRAFTED" );
attacker thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_DRAFTED" ); maps\mp\gametypes\_gamescore::givePlayerScore( "draft_rogue", attacker, self, true );
maps\mp\gametypes\_gamescore::givePlayerScore( "draft_rogue", attacker, self, true ); attacker thread maps\mp\gametypes\_rank::giveRankXP( "draft_rogue" );
attacker thread maps\mp\gametypes\_rank::giveRankXP( "draft_rogue" ); }
}
}
// generic messages/sounds, and reward survivors // generic messages/sounds, and reward survivors
if ( level.infect_teamScores["allies"] > 1 ) if ( level.infect_teamScores["allies"] > 1 )
{ {
playSoundOnPlayers( "mp_enemy_obj_captured", "allies" ); playSoundOnPlayers( "mp_enemy_obj_captured", "allies" );
playSoundOnPlayers( "mp_war_objective_taken", "axis" ); playSoundOnPlayers( "mp_war_objective_taken", "axis" );
thread teamPlayerCardSplash( "callout_got_drafted", self, "allies" ); thread teamPlayerCardSplash( "callout_got_drafted", self, "allies" );
if ( !wasSuicide ) if ( !wasSuicide )
{ {
thread teamPlayerCardSplash( "callout_drafted_rogue", attacker, "axis" ); thread teamPlayerCardSplash( "callout_drafted_rogue", attacker, "axis" );
foreach ( player in level.players ) foreach ( player in level.players )
{ {
if( !isReallyAlive( player ) || self.sessionstate == "spectator" ) if ( player.team == "allies" && player != self && distance( player.infect_spawnpos, player.origin ) > 32 )
continue;
if ( player.team == "allies" && player != self && distance( player.infect_spawnPos, player.origin ) > 32 )
{ {
player thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_SURVIVOR" ); player thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_SURVIVOR" );
maps\mp\gametypes\_gamescore::givePlayerScore( "survivor", player, undefined, true ); maps\mp\gametypes\_gamescore::givePlayerScore( "survivor", player, undefined, true );
@ -558,23 +533,18 @@ onPlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHi
} }
} }
// inform/reward last // inform/reward last
else if ( level.infect_teamScores["allies"] == 1 ) else if ( level.infect_teamScores["allies"] == 1 )
{ onFinalSurvivor();
onFinalSurvivor();
}
// infected win // infected win
else if ( level.infect_teamScores["allies"] == 0 ) else if ( level.infect_teamScores["allies"] == 0 )
{ onSurvivorsEliminated();
onSurvivorsEliminated();
}
} }
} }
onFinalSurvivor() onFinalSurvivor()
{ {
playSoundOnPlayers( "mp_obj_captured" ); playSoundOnPlayers( "mp_obj_captured" );
foreach ( player in level.players ) foreach ( player in level.players )
{ {
if( !isDefined(player) ) if( !isDefined(player) )
continue; continue;
@ -582,66 +552,63 @@ onFinalSurvivor()
if ( player.team == "allies" ) if ( player.team == "allies" )
{ {
player thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_FINAL_ROGUE" ); player thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_FINAL_ROGUE" );
if ( !level.infect_awardedFinalSurvivor ) if ( !level.infect_awardedFinalSurvivor )
{ {
if ( player.gameModeJoinedAtStart && isDefined( player.infect_spawnPos ) && distance( player.infect_spawnPos, player.origin ) > 32 ) if ( player.infect_joinedatstart && distance( player.infect_spawnpos, player.origin ) > 32 )
{ {
maps\mp\gametypes\_gamescore::givePlayerScore( "final_rogue", player, undefined, true ); maps\mp\gametypes\_gamescore::givePlayerScore( "final_rogue", player, undefined, true );
player thread maps\mp\gametypes\_rank::giveRankXP( "final_rogue" ); player thread maps\mp\gametypes\_rank::giveRankXP( "final_rogue" );
} }
level.infect_awardedFinalSurvivor = true; level.infect_awardedFinalSurvivor = true;
} }
thread teamplayercardsplash( "callout_final_rogue", player ); thread maps\mp\_utility::teamPlayerCardSplash( "callout_final_rogue", player );
if (matchMakingGame() )
level thread finalsurvivoruav( player );
if ( matchMakingGame() )
level thread finalSurvivorUAV( player );
break; break;
} }
} }
} }
finalSurvivorUAV( finalPlayer ) finalSurvivorUAV( finalPlayer )
{ {
level endon( "game_ended" ); level endon( "game_ended" );
finalPlayer endon( "disconnect" ); finalPlayer endon( "disconnect" );
finalPlayer endon( "eliminated" ); finalPlayer endon( "eliminated" );
level endon( "infect_lateJoiner" ); level endon( "infect_lateJoiner" );
level thread endUAVonLateJoiner( finalPlayer ); level thread endUAVonLateJoiner( finalPlayer );
removeUAV = false; removeUAV = false;
level.radarMode["axis"] = "normal_radar"; level.radarmode["axis"] = "normal_radar";
foreach ( player in level.players )
{ foreach ( player in level.players )
if ( player.team == "axis" ) {
player.radarMode = "normal_radar"; if ( player.team == "axis" )
} player.radarmode = "normal_radar";
}
//setTeamRadarStrength( "axis", 1 );
for (;;)
while( true ) {
{ prevPos = finalPlayer.origin;
prevPos = finalPlayer.origin; wait 4;
wait( 4 ); if ( removeUAV )
if ( removeUAV ) {
{ setTeamRadar( "axis", 0 );
setTeamRadar( "axis", 0 ); removeUAV = false;
removeUAV = false; }
}
wait 6;
wait( 6 );
if ( distance( prevPos, finalPlayer.origin ) < 200 ) if ( distance( prevPos, finalPlayer.origin ) < 200 )
{ {
setTeamRadar( "axis", 1 ); setTeamRadar( "axis", 1 );
removeUAV = true; removeUAV = true;
}
foreach ( player in level.players ) }
player playLocalSound( "recondrone_tag" );
}
}
} }
endUAVonLateJoiner( finalPlayer ) endUAVonLateJoiner( finalPlayer )
@ -649,32 +616,32 @@ endUAVonLateJoiner( finalPlayer )
level endon( "game_ended" ); level endon( "game_ended" );
finalPlayer endon( "disconnect" ); finalPlayer endon( "disconnect" );
finalPlayer endon( "eliminated" ); finalPlayer endon( "eliminated" );
while( true ) for (;;)
{ {
if ( level.infect_teamScores["allies"] > 1 ) if ( level.infect_teamScores["allies"] > 1 )
{ {
level notify( "infect_lateJoiner" ); level notify( "infect_lateJoiner" );
wait( 0.05 ); wait 0.05;
setTeamRadar( "axis", 0 ); setTeamRadar( "axis", 0 );
break; break;
} }
wait( 0.05 );
} wait 0.05;
}
} }
onPlayerDisconnect() onPlayerDisconnect()
{ {
level endon( "game_ended" ); level endon( "game_ended" );
self endon( "eliminated" ); self endon( "eliminated" );
self waittill( "disconnect" );
self waittill( "disconnect" );
// resynch teams // resynch teams
updateTeamScores(); updateTeamScores();
// team actions or win condition necessary? // team actions or win condition necessary?
if ( isDefined( self.infect_isBeingChosen ) || level.infect_choseFirstInfected ) if ( isDefined( self.infect_isBeingChosen ) || level.infect_choseFirstInfected )
{ {
if ( level.infect_teamScores["axis"] && level.infect_teamScores["allies"] ) if ( level.infect_teamScores["axis"] && level.infect_teamScores["allies"] )
{ {
@ -692,12 +659,12 @@ onPlayerDisconnect()
player setFirstInfected( false ); player setFirstInfected( false );
} }
} }
} }
else if ( level.infect_teamScores["allies"] == 0 ) else if ( level.infect_teamScores["allies"] == 0 )
{ {
// no more survivors, infected win // no more survivors, infected win
onSurvivorsEliminated(); onSurvivorsEliminated();
} }
else if ( level.infect_teamScores["axis"] == 0 ) else if ( level.infect_teamScores["axis"] == 0 )
{ {
if ( level.infect_teamScores["allies"] == 1 ) if ( level.infect_teamScores["allies"] == 1 )
@ -712,11 +679,10 @@ onPlayerDisconnect()
level.infect_choseFirstInfected = false; level.infect_choseFirstInfected = false;
level thread chooseFirstInfected(); level thread chooseFirstInfected();
} }
} }
} }
// clear this regardless on the way out
// clear this regardless on the way out self.isInitialInfected = undefined;
self.isInitialInfected = undefined;
} }
watchInfectForfeit() watchInfectForfeit()
@ -741,9 +707,8 @@ onDeadEvent( team )
onTimeLimit() onTimeLimit()
{ {
// survivors win
level.finalKillCam_winner = "allies"; level.finalKillCam_winner = "allies";
level thread maps\mp\gametypes\_gamelogic::endGame( "allies", game[ "end_reason" ][ "time_limit_reached" ] ); level thread maps\mp\gametypes\_gamelogic::endGame( "allies", game["strings"]["time_limit_reached"] );
} }
onSurvivorsEliminated() onSurvivorsEliminated()
@ -753,33 +718,37 @@ onSurvivorsEliminated()
level thread maps\mp\gametypes\_gamelogic::endGame( "axis", game[ "end_reason" ][ "allies_eliminated" ] ); level thread maps\mp\gametypes\_gamelogic::endGame( "axis", game[ "end_reason" ][ "allies_eliminated" ] );
} }
getTeamSize( team ) getNumInfected()
{ {
size = 0; numInfected = 0;
foreach ( player in level.players )
foreach( player in level.players )
{ {
// Make sure we don't check for spectators if ( isdefined( player.team ) && player.team == "axis" )
// Also need to check for if they are in killcam, because player session states are set to spectator when killcam happens numInfected++;
if ( player.sessionstate == "spectator" && !player.spectatekillcam )
continue;
if( player.team == team )
size++;
} }
return numInfected;
return size; }
getNumSurvivors()
{
numSurvivors = 0;
foreach ( player in level.players )
{
if ( isdefined( player.team ) && player.team == "allies" )
numSurvivors++;
}
return numSurvivors;
} }
updateTeamScores() updateTeamScores()
{ {
// survivors // survivors
level.infect_teamScores["allies"] = getTeamSize( "allies" ); level.infect_teamScores["allies"] = getNumSurvivors();
game["teamScores"]["allies"] = level.infect_teamScores["allies"]; game["teamScores"]["allies"] = level.infect_teamScores["allies"];
setTeamScore( "allies", level.infect_teamScores["allies"] ); setTeamScore( "allies", level.infect_teamScores["allies"] );
// infected // infected
level.infect_teamScores["axis"] = getTeamSize( "axis" ); level.infect_teamScores["axis"] = getNumInfected();
game["teamScores"]["axis"] = level.infect_teamScores["axis"]; game["teamScores"]["axis"] = level.infect_teamScores["axis"];
setTeamScore( "axis", level.infect_teamScores["axis"] ); setTeamScore( "axis", level.infect_teamScores["axis"] );
} }
@ -802,11 +771,11 @@ setSpecialLoadouts()
level.infect_loadouts["axis"]["loadoutKillstreak1"] = "none"; level.infect_loadouts["axis"]["loadoutKillstreak1"] = "none";
level.infect_loadouts["axis"]["loadoutKillstreak2"] = "none"; level.infect_loadouts["axis"]["loadoutKillstreak2"] = "none";
level.infect_loadouts["axis"]["loadoutKillstreak3"] = "none"; level.infect_loadouts["axis"]["loadoutKillstreak3"] = "none";
level.infect_loadouts["axis"]["loadoutDeathstreak"] = "specialty_grenadepulldeath"; level.infect_loadouts["axis"]["loadoutDeathstreak"] = "none";
level.infect_loadouts["axis_initial"]["loadoutPrimary"] = "scar"; level.infect_loadouts["axis_initial"]["loadoutPrimary"] = "throwingknife";
level.infect_loadouts["axis_initial"]["loadoutPrimaryAttachment"] = "reflex"; level.infect_loadouts["axis_initial"]["loadoutPrimaryAttachment"] = "none";
level.infect_loadouts["axis_initial"]["loadoutPrimaryAttachment2"] = "xmags"; level.infect_loadouts["axis_initial"]["loadoutPrimaryAttachment2"] = "none";
level.infect_loadouts["axis_initial"]["loadoutPrimaryCamo"] = "none"; level.infect_loadouts["axis_initial"]["loadoutPrimaryCamo"] = "none";
level.infect_loadouts["axis_initial"]["loadoutSecondary"] = "none"; level.infect_loadouts["axis_initial"]["loadoutSecondary"] = "none";
level.infect_loadouts["axis_initial"]["loadoutSecondaryAttachment"] = "none"; level.infect_loadouts["axis_initial"]["loadoutSecondaryAttachment"] = "none";
@ -820,7 +789,7 @@ setSpecialLoadouts()
level.infect_loadouts["axis_initial"]["loadoutKillstreak1"] = "none"; level.infect_loadouts["axis_initial"]["loadoutKillstreak1"] = "none";
level.infect_loadouts["axis_initial"]["loadoutKillstreak2"] = "none"; level.infect_loadouts["axis_initial"]["loadoutKillstreak2"] = "none";
level.infect_loadouts["axis_initial"]["loadoutKillstreak3"] = "none"; level.infect_loadouts["axis_initial"]["loadoutKillstreak3"] = "none";
level.infect_loadouts["axis_initial"]["loadoutDeathstreak"] = "specialty_grenadepulldeath"; level.infect_loadouts["axis_initial"]["loadoutDeathstreak"] = "none";
level.infect_loadouts["allies"]["loadoutPrimary"] = "spas12"; level.infect_loadouts["allies"]["loadoutPrimary"] = "spas12";
level.infect_loadouts["allies"]["loadoutPrimaryAttachment"] = "xmags"; level.infect_loadouts["allies"]["loadoutPrimaryAttachment"] = "xmags";