You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
3.9 KiB
143 lines
3.9 KiB
//========= 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 ); |
|
} |
|
|
|
|