mirror of
https://github.com/nillerusr/source-engine.git
synced 2025-01-07 16:06:41 +00:00
218 lines
6.2 KiB
C++
218 lines
6.2 KiB
C++
//========= 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 );
|
|
}
|
|
|