summaryrefslogtreecommitdiff
path: root/game/server/tf/func_regenerate.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/tf/func_regenerate.cpp')
-rw-r--r--game/server/tf/func_regenerate.cpp222
1 files changed, 222 insertions, 0 deletions
diff --git a/game/server/tf/func_regenerate.cpp b/game/server/tf/func_regenerate.cpp
new file mode 100644
index 0000000..82dc938
--- /dev/null
+++ b/game/server/tf/func_regenerate.cpp
@@ -0,0 +1,222 @@
+//========= 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 );
+ }
+} \ No newline at end of file