summaryrefslogtreecommitdiff
path: root/game/client/tf2/c_tfteam.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/client/tf2/c_tfteam.cpp')
-rw-r--r--game/client/tf2/c_tfteam.cpp217
1 files changed, 217 insertions, 0 deletions
diff --git a/game/client/tf2/c_tfteam.cpp b/game/client/tf2/c_tfteam.cpp
new file mode 100644
index 0000000..b1adecd
--- /dev/null
+++ b/game/client/tf2/c_tfteam.cpp
@@ -0,0 +1,217 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Client side C_TFTeam class
+//
+// $NoKeywords: $
+//=============================================================================//
+#include "cbase.h"
+#include "c_tfteam.h"
+#include "c_basetfplayer.h"
+#include "engine/IEngineSound.h"
+#include "hud.h"
+#include "recvproxy.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+
+#define ATTACK_NOTIFICATION_TIME 10.0f
+
+#define MESSAGESTRINGID_RESOURCESHARVESTED (IMessageChars::MESSAGESTRINGID_BASE+0)
+
+//-----------------------------------------------------------------------------
+// Purpose: RecvProxy that converts the Team's object UtlVector to entindexes
+//-----------------------------------------------------------------------------
+void RecvProxy_ObjectList( const CRecvProxyData *pData, void *pStruct, void *pOut )
+{
+ C_TFTeam *pTeam = (C_TFTeam*)pStruct;
+ CBaseHandle *pHandle = (CBaseHandle*)(&(pTeam->m_aObjects[ pData->m_iElement ]));
+ RecvProxy_IntToEHandle( pData, pStruct, pHandle );
+}
+
+
+void RecvProxyArrayLength_TeamObjects( void *pStruct, int objectID, int currentArrayLength )
+{
+ C_TFTeam *pTeam = (C_TFTeam*)pStruct;
+
+ if ( pTeam->m_aObjects.Count() != currentArrayLength )
+ {
+ pTeam->m_aObjects.SetSize( currentArrayLength );
+ }
+}
+
+
+IMPLEMENT_CLIENTCLASS_DT(C_TFTeam, DT_TFTeam, CTFTeam)
+ RecvPropFloat( RECVINFO(m_fResources) ),
+ RecvPropFloat( RECVINFO(m_fPotentialResources) ),
+ RecvPropInt( RECVINFO(m_bHaveZone) ),
+
+ RecvPropArray2(
+ RecvProxyArrayLength_TeamObjects,
+ RecvPropInt( "object_array_element", 0, SIZEOF_IGNORE, 0, RecvProxy_ObjectList ),
+ MAX_OBJECTS_PER_TEAM,
+ 0,
+ "object_array"
+ ),
+END_RECV_TABLE()
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+C_TFTeam::C_TFTeam()
+{
+ m_LastAttackNotificationTime = -10000;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+C_TFTeam::~C_TFTeam()
+{
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_TFTeam::NotifyBaseUnderAttack( const Vector &vecPosition, bool bPlaySound, bool bForce )
+{
+ float currentTime = gpGlobals->curtime;
+ if ( bForce || (currentTime - m_LastAttackNotificationTime > ATTACK_NOTIFICATION_TIME) )
+ {
+ m_LastAttackNotificationTime = currentTime;
+
+ if (GetLocalTeam() == this)
+ {
+ // Play a sound.
+ if (bPlaySound)
+ {
+ CLocalPlayerFilter filter;
+ C_BaseEntity::EmitSound( filter, SOUND_FROM_LOCAL_PLAYER, "TFTeam.NotifyBaseUnderAttack" );
+ }
+
+ MinimapCreateTempTrace( "minimap_under_attack", MINIMAP_PERSONAL_ORDERS, vecPosition );
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+float C_TFTeam::GetTeamResources( void )
+{
+ return m_fResources;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+float C_TFTeam::GetPotentialTeamResources( void )
+{
+ return m_fPotentialResources;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Return true if this team controls a zone of the specified resource type
+//-----------------------------------------------------------------------------
+bool C_TFTeam::GetHaveZone( void )
+{
+ return m_bHaveZone;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int C_TFTeam::GetNumObjects( int iObjectType )
+{
+ // Asking for a count of a specific object type?
+ if ( iObjectType > 0 )
+ {
+ int iCount = 0;
+ for ( int i = 0; i < GetNumObjects(); i++ )
+ {
+ CBaseObject *pObject = GetObject(i);
+ if ( pObject && pObject->GetType() == iObjectType )
+ {
+ iCount++;
+ }
+ }
+ return iCount;
+ }
+
+ return m_aObjects.Count();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+C_BaseObject *C_TFTeam::GetObject( int iIndex )
+{
+ Assert( iIndex >= 0 && iIndex < m_aObjects.Size() );
+ return static_cast<C_BaseObject*>((C_BaseEntity*)m_aObjects[iIndex]);
+}
+
+bool C_TFTeam::IsObjectValid( int iIndex )
+{
+ Assert( iIndex >= 0 && iIndex < m_aObjects.Size() );
+ return ((C_BaseEntity const*)m_aObjects[iIndex] != NULL);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Receive a spawn message from the server
+//-----------------------------------------------------------------------------
+void C_TFTeam::ReceiveMessage( int classID, bf_read &msg )
+{
+ if ( classID != GetClientClass()->m_ClassID )
+ {
+ // message is for subclass
+ BaseClass::ReceiveMessage( classID, msg );
+ return;
+ }
+
+ int iAmount = msg.ReadLong();
+
+ int iYPos;
+
+ // Use appropriate string based on client's team
+ char sResourceString[256];
+ if ( GetLocalTeam() == this )
+ {
+ itoa(iAmount, sResourceString, 10 );
+ Q_strncat( sResourceString, " RESOURCES HARVESTED!", sizeof(sResourceString), COPY_ALL_CHARACTERS );
+ iYPos = ScreenHeight() / 4;
+ }
+ else
+ {
+ char sAmount[256];
+ itoa(iAmount, sAmount, 10 );
+ Q_strncpy( sResourceString, "ENEMY TEAM HAS HARVESTED ", sizeof(sResourceString) );
+ Q_strncat( sResourceString, sAmount, sizeof(sResourceString), COPY_ALL_CHARACTERS );
+ Q_strncat( sResourceString, " RESOURCES!", sizeof(sResourceString), COPY_ALL_CHARACTERS );
+ iYPos = (ScreenHeight() / 4) + 32;
+ }
+
+ // Clear out any old strings with this ID.
+ messagechars->RemoveStringsByID( MESSAGESTRINGID_RESOURCESHARVESTED );
+
+ // Print the string
+ int width, height;
+ messagechars->GetStringLength( g_hFontTrebuchet24, &width, &height, sResourceString );
+ messagechars->DrawStringForTime(
+ 5.0,
+ g_hFontTrebuchet24,
+ (ScreenWidth() - width) / 2,
+ iYPos,
+ 192,
+ 192,
+ 192,
+ 255,
+ sResourceString,
+ MESSAGESTRINGID_RESOURCESHARVESTED );
+}
+