Team Fortress 2 Source Code as on 22/4/2020
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.
|
|
//========= 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 ); }
|