summaryrefslogtreecommitdiff
path: root/game/server/tf2/orders.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/tf2/orders.cpp')
-rw-r--r--game/server/tf2/orders.cpp215
1 files changed, 215 insertions, 0 deletions
diff --git a/game/server/tf2/orders.cpp b/game/server/tf2/orders.cpp
new file mode 100644
index 0000000..3d3c906
--- /dev/null
+++ b/game/server/tf2/orders.cpp
@@ -0,0 +1,215 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Order handling
+//
+// $NoKeywords: $
+//=============================================================================//
+#include "cbase.h"
+#include "orders.h"
+#include "tf_player.h"
+#include "tf_func_resource.h"
+#include "tf_team.h"
+#include "tf_obj_resourcepump.h"
+
+
+IMPLEMENT_SERVERCLASS_ST(COrder, DT_Order)
+ SendPropInt( SENDINFO(m_iOrderType), 4, SPROP_UNSIGNED ),
+ SendPropInt( SENDINFO(m_iTargetEntIndex), 16, SPROP_UNSIGNED ),
+END_SEND_TABLE()
+
+LINK_ENTITY_TO_CLASS( tf_order, COrder );
+
+
+COrder::COrder()
+{
+ m_iOrderType = 0;
+ m_iTargetEntIndex = 0;
+ m_hTarget = NULL;
+ m_flDistanceToRemove = 0;
+ m_hOwningPlayer = NULL;
+ m_flDieTime = 0;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void COrder::UpdateOnRemove( void )
+{
+ DetachFromPlayer();
+ // Chain at end to mimic destructor unwind order
+ BaseClass::UpdateOnRemove();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Transmit weapon data
+//-----------------------------------------------------------------------------
+int COrder::ShouldTransmit( const CCheckTransmitInfo *pInfo )
+{
+ CBaseEntity* pRecipientEntity = CBaseEntity::Instance( pInfo->m_pClientEnt );
+
+ // If this is a personal order, only send to it's owner
+ if ( GetOwner() )
+ {
+ if ( GetOwner() == pRecipientEntity )
+ return FL_EDICT_ALWAYS;
+
+ return FL_EDICT_DONTSEND;
+ }
+
+ // Otherwise, only send to players on our team
+ if ( InSameTeam( pRecipientEntity ) )
+ return FL_EDICT_ALWAYS;
+
+ return FL_EDICT_DONTSEND;
+}
+
+
+void COrder::DetachFromPlayer()
+{
+ // Detach from our owner.
+ if ( m_hOwningPlayer )
+ {
+ m_hOwningPlayer->SetOrder( NULL );
+ m_hOwningPlayer = NULL;
+
+ if ( GetTeam() )
+ {
+ ((CTFTeam*)GetTeam())->RemoveOrder( this );
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int COrder::GetType( void )
+{
+ return m_iOrderType;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CBaseEntity *COrder::GetTargetEntity( void )
+{
+ return m_hTarget;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void COrder::SetType( int iOrderType )
+{
+ m_iOrderType = iOrderType;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void COrder::SetTarget( CBaseEntity *pTarget )
+{
+ m_hTarget = pTarget;
+ if ( m_hTarget )
+ {
+ m_iTargetEntIndex = m_hTarget->entindex();
+ }
+ else
+ {
+ m_iTargetEntIndex = 0;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void COrder::SetDistance( float flDistance )
+{
+ m_flDistanceToRemove = flDistance;
+}
+
+
+void COrder::SetLifetime( float flLifetime )
+{
+ m_flDieTime = gpGlobals->curtime + flLifetime;
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Purpose: for updates on the order. Return true if the order should be removed.
+//-----------------------------------------------------------------------------
+bool COrder::Update( void )
+{
+ // Orders with no targets & no owners don't go away on their own
+ if ( !GetOwner() )
+ return false;
+
+ // Has it timed out?
+ if( gpGlobals->curtime > m_flDieTime )
+ return true;
+
+ // Check to make sure we're still within the correct distance
+ if ( m_flDistanceToRemove )
+ {
+ CBaseEntity *pTarget = GetTargetEntity();
+ if ( pTarget )
+ {
+ // Have the player and the target moved away from each other?
+ if ( (m_hOwningPlayer->GetAbsOrigin() - pTarget->GetAbsOrigin()).Length() > (m_flDistanceToRemove * 1.25) )
+ return true;
+ }
+ }
+
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: An event for this order's target has arrived. Return true if this order should be removed.
+//-----------------------------------------------------------------------------
+bool COrder::UpdateOnEvent( COrderEvent_Base *pEvent )
+{
+ // Default behavior is to get rid of the order if the object we're referencing
+ // gets destroyed.
+ if ( pEvent->GetType() == ORDER_EVENT_OBJECT_DESTROYED )
+ {
+ COrderEvent_ObjectDestroyed *pObjDestroyed = (COrderEvent_ObjectDestroyed*)pEvent;
+ if ( pObjDestroyed->m_pObject == GetTargetEntity() )
+ return true;
+ }
+
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CBaseTFPlayer *COrder::GetOwner( void )
+{
+ return m_hOwningPlayer;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void COrder::SetOwner( CBaseTFPlayer *pPlayer )
+{
+ // Null out our m_hOwningPlayer so we don't recurse infinitely.
+ CHandle<CBaseTFPlayer> hPlayer = m_hOwningPlayer;
+ m_hOwningPlayer = 0;
+
+ if ( hPlayer.Get() && (hPlayer != pPlayer) )
+ {
+ Assert( hPlayer->GetOrder() == this );
+ hPlayer->SetOrder( NULL );
+ }
+
+ m_hOwningPlayer = pPlayer;
+}
+
+
+
+
+
+