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.
222 lines
6.2 KiB
222 lines
6.2 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: CTF Regenerate Zone. |
|
// |
|
//=============================================================================// |
|
|
|
#include "cbase.h" |
|
#include "tf_player.h" |
|
#include "tf_item.h" |
|
#include "tf_team.h" |
|
#include "func_regenerate.h" |
|
#include "tf_gamerules.h" |
|
#include "eventqueue.h" |
|
|
|
LINK_ENTITY_TO_CLASS( func_regenerate, CRegenerateZone ); |
|
|
|
#define TF_REGENERATE_SOUND "Regenerate.Touch" |
|
#define TF_REGENERATE_NEXT_USE_TIME 3.0f |
|
|
|
//============================================================================= |
|
// |
|
// CTF Regenerate Zone tables. |
|
// |
|
|
|
BEGIN_DATADESC( CRegenerateZone ) |
|
DEFINE_FIELD( m_hAssociatedModel, FIELD_EHANDLE ), |
|
DEFINE_KEYFIELD( m_iszAssociatedModel, FIELD_STRING, "associatedmodel" ), |
|
|
|
// Functions. |
|
DEFINE_FUNCTION( Touch ), |
|
END_DATADESC(); |
|
|
|
//============================================================================= |
|
// |
|
// CTF Regenerate Zone functions. |
|
// |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
CRegenerateZone::CRegenerateZone() |
|
{ |
|
m_bDisabled = false; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Spawn function for the entity |
|
//----------------------------------------------------------------------------- |
|
void CRegenerateZone::Spawn( void ) |
|
{ |
|
Precache(); |
|
InitTrigger(); |
|
SetTouch( &CRegenerateZone::Touch ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Precache function for the entity |
|
//----------------------------------------------------------------------------- |
|
void CRegenerateZone::Precache( void ) |
|
{ |
|
PrecacheScriptSound( TF_REGENERATE_SOUND ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Precache function for the entity |
|
//----------------------------------------------------------------------------- |
|
void CRegenerateZone::Activate( void ) |
|
{ |
|
BaseClass::Activate(); |
|
|
|
if ( m_iszAssociatedModel != NULL_STRING ) |
|
{ |
|
CBaseEntity *pEnt = gEntList.FindEntityByName( NULL, STRING(m_iszAssociatedModel) ); |
|
if ( !pEnt ) |
|
{ |
|
Warning("%s(%s) unable to find associated model named '%s'.\n", GetClassname(), GetDebugName(), STRING(m_iszAssociatedModel) ); |
|
} |
|
else |
|
{ |
|
m_hAssociatedModel = dynamic_cast<CDynamicProp*>(pEnt); |
|
if ( !m_hAssociatedModel ) |
|
{ |
|
Warning("%s(%s) tried to use associated model named '%s', but it isn't a dynamic prop.\n", GetClassname(), GetDebugName(), STRING(m_iszAssociatedModel) ); |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
Warning("%s(%s) has no associated model.\n", GetClassname(), GetDebugName() ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CRegenerateZone::Touch( CBaseEntity *pOther ) |
|
{ |
|
if ( !IsDisabled() ) |
|
{ |
|
CTFPlayer *pPlayer = ToTFPlayer( pOther ); |
|
if ( pPlayer ) |
|
{ |
|
if ( pPlayer->GetNextRegenTime() > gpGlobals->curtime ) |
|
return; |
|
|
|
if ( pPlayer->IsTaunting() ) |
|
return; |
|
|
|
int iTeam = GetTeamNumber(); |
|
|
|
if ( TFGameRules()->State_Get() != GR_STATE_TEAM_WIN ) |
|
{ |
|
if ( iTeam && ( pPlayer->GetTeamNumber() != iTeam ) ) |
|
return; |
|
} |
|
else |
|
{ |
|
// no health for the losing team, but all zones work for the winning team |
|
if ( TFGameRules()->GetWinningTeam() != pPlayer->GetTeamNumber() ) |
|
return; |
|
} |
|
|
|
if ( TFGameRules()->InStalemate() ) |
|
return; |
|
|
|
Regenerate( pPlayer ); |
|
|
|
#ifdef STAGING_ONLY |
|
if ( TFGameRules() && TFGameRules()->IsBountyMode() ) |
|
{ |
|
pPlayer->m_Shared.SetInUpgradeZone( true ); |
|
} |
|
#endif // STAGING_ONLY |
|
} |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CRegenerateZone::EndTouch( CBaseEntity *pOther ) |
|
{ |
|
if ( pOther->IsPlayer() ) |
|
{ |
|
CTFPlayer *pTFPlayer = ToTFPlayer( pOther ); |
|
if ( pTFPlayer ) |
|
{ |
|
pTFPlayer->m_Shared.SetInUpgradeZone( false ); |
|
} |
|
} |
|
|
|
BaseClass::EndTouch( pOther ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CRegenerateZone::InputEnable( inputdata_t &inputdata ) |
|
{ |
|
SetDisabled( false ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CRegenerateZone::InputDisable( inputdata_t &inputdata ) |
|
{ |
|
SetDisabled( true ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
bool CRegenerateZone::IsDisabled( void ) |
|
{ |
|
return m_bDisabled; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CRegenerateZone::InputToggle( inputdata_t &inputdata ) |
|
{ |
|
if ( m_bDisabled ) |
|
{ |
|
SetDisabled( false ); |
|
} |
|
else |
|
{ |
|
SetDisabled( true ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CRegenerateZone::SetDisabled( bool bDisabled ) |
|
{ |
|
m_bDisabled = bDisabled; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CRegenerateZone::Regenerate( CTFPlayer *pPlayer ) |
|
{ |
|
pPlayer->Regenerate(); |
|
pPlayer->SetNextRegenTime( gpGlobals->curtime + TF_REGENERATE_NEXT_USE_TIME ); |
|
|
|
CSingleUserRecipientFilter filter( pPlayer ); |
|
EmitSound( filter, pPlayer->entindex(), TF_REGENERATE_SOUND ); |
|
|
|
if ( m_hAssociatedModel ) |
|
{ |
|
variant_t tmpVar; |
|
tmpVar.SetString( MAKE_STRING("open") ); |
|
m_hAssociatedModel->AcceptInput( "SetAnimation", this, this, tmpVar, 0 ); |
|
|
|
tmpVar.SetString( MAKE_STRING("close") ); |
|
g_EventQueue.AddEvent( m_hAssociatedModel, "SetAnimation", tmpVar, TF_REGENERATE_NEXT_USE_TIME - 1.0, this, this ); |
|
} |
|
} |