diff options
Diffstat (limited to 'game/server/tf/entity_forcerespawn.cpp')
| -rw-r--r-- | game/server/tf/entity_forcerespawn.cpp | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/game/server/tf/entity_forcerespawn.cpp b/game/server/tf/entity_forcerespawn.cpp new file mode 100644 index 0000000..d62a198 --- /dev/null +++ b/game/server/tf/entity_forcerespawn.cpp @@ -0,0 +1,143 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#include "cbase.h" +#include "tf/tf_shareddefs.h" +#include "entity_forcerespawn.h" +#include "tf_player.h" +#include "tf_gamerules.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +//============================================================================= +// +// CTFReset tables. +// +BEGIN_DATADESC( CTFForceRespawn ) + +// Inputs. +DEFINE_INPUTFUNC( FIELD_VOID, "ForceRespawn", InputForceRespawn ), +DEFINE_INPUTFUNC( FIELD_VOID, "ForceRespawnSwitchTeams", InputForceRespawnSwitchTeams ), +DEFINE_INPUTFUNC( FIELD_INTEGER, "ForceTeamRespawn", InputForceTeamRespawn ), + +// Outputs. +DEFINE_OUTPUT( m_outputOnForceRespawn, "OnForceRespawn" ), + +END_DATADESC() + + +LINK_ENTITY_TO_CLASS( game_forcerespawn, CTFForceRespawn ); + +//----------------------------------------------------------------------------- +// Purpose: Constructor. +//----------------------------------------------------------------------------- +CTFForceRespawn::CTFForceRespawn() +{ + +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFForceRespawn::ForceRespawn( bool bSwitchTeams, int nTeam /* = TEAM_UNASSIGNED */, bool bRemoveEverything /* = true */ ) +{ + int i = 0; + + if ( bRemoveEverything && TFGameRules() ) + { + TFGameRules()->RemoveAllProjectilesAndBuildings(); + } + + // respawn the players + for ( i = 1 ; i <= gpGlobals->maxClients ; i++ ) + { + CTFPlayer *pPlayer = ToTFPlayer( UTIL_PlayerByIndex( i ) ); + if ( pPlayer ) + { + // Ignore players who aren't on an active team + if ( pPlayer->GetTeamNumber() != TF_TEAM_RED && pPlayer->GetTeamNumber() != TF_TEAM_BLUE ) + { + // Let the player spawn immediately when they do pick a class + pPlayer->AllowInstantSpawn(); + continue; + } + + if ( bSwitchTeams ) + { + if ( pPlayer->GetTeamNumber() == TF_TEAM_RED ) + { + pPlayer->ForceChangeTeam( TF_TEAM_BLUE, true ); + } + else if ( pPlayer->GetTeamNumber() == TF_TEAM_BLUE ) + { + pPlayer->ForceChangeTeam( TF_TEAM_RED, true ); + } + } + + // Ignore players who haven't picked a class yet + if ( !pPlayer->GetPlayerClass() || pPlayer->GetPlayerClass()->GetClassIndex() == TF_CLASS_UNDEFINED ) + { + // Allow them to spawn instantly when they do choose + pPlayer->AllowInstantSpawn(); + continue; + } + + if ( nTeam != TEAM_UNASSIGNED ) + { + // Ignore players who aren't on the team we're trying to respawn + if ( pPlayer->GetTeamNumber() != nTeam ) + { + continue; + } + else + { + // Ignore players on the team that aren't dead + if ( pPlayer->IsAlive() ) + continue; + } + } + + pPlayer->ForceRespawn(); + } + } + + // remove any dropped weapons/ammo packs + CBaseEntity *pEnt = NULL; + while ( (pEnt = gEntList.FindEntityByClassname( pEnt, "tf_ammo_pack" )) != NULL ) + { + UTIL_Remove( pEnt ); + } + + // Output. + m_outputOnForceRespawn.FireOutput( this, this ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFForceRespawn::InputForceRespawn( inputdata_t &inputdata ) +{ + ForceRespawn( false ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFForceRespawn::InputForceRespawnSwitchTeams( inputdata_t &inputdata ) +{ + ForceRespawn( true ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFForceRespawn::InputForceTeamRespawn( inputdata_t &inputdata ) +{ + int nTeam = inputdata.value.Int(); + ForceRespawn( false, nTeam, false ); +} + |