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.
116 lines
3.3 KiB
116 lines
3.3 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose: Medic's portable power generator (Buff Station)
|
||
|
//
|
||
|
//=============================================================================//
|
||
|
|
||
|
#include "tf_obj.h"
|
||
|
|
||
|
//=============================================================================
|
||
|
//
|
||
|
// Portable Power Generator Class (Buff Station)
|
||
|
//
|
||
|
class CObjectBuffStation : public CBaseObject
|
||
|
{
|
||
|
|
||
|
DECLARE_CLASS( CObjectBuffStation, CBaseObject );
|
||
|
|
||
|
public:
|
||
|
|
||
|
DECLARE_DATADESC();
|
||
|
DECLARE_SERVERCLASS();
|
||
|
|
||
|
CObjectBuffStation();
|
||
|
|
||
|
static CObjectBuffStation *Create(const Vector &vOrigin, const QAngle &vAngles);
|
||
|
|
||
|
void Spawn();
|
||
|
void Precache();
|
||
|
void SetupTeamModel( void );
|
||
|
void GetControlPanelInfo( int nPanelIndex, const char *&pPanelName );
|
||
|
void DestroyObject( void );
|
||
|
void OnGoInactive( void );
|
||
|
bool CalculatePlacement( CBaseTFPlayer *pPlayer );
|
||
|
void FinishedBuilding( void );
|
||
|
|
||
|
// Attach/Detach
|
||
|
void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
|
||
|
bool ClientCommand( CBaseTFPlayer *pPlayer, const CCommand &args );
|
||
|
|
||
|
// EMP
|
||
|
bool CanTakeEMPDamage( void ) { return true; }
|
||
|
|
||
|
// Buff
|
||
|
void DeBuffObject( CBaseObject *pObject );
|
||
|
void BuffNearbyObjects( CBaseObject *pObjectToTarget, bool bPlacing );
|
||
|
void CheckBuffConnection( CBaseObject *pObject );
|
||
|
|
||
|
virtual void OnActivityChanged( Activity act );
|
||
|
private:
|
||
|
|
||
|
void InitAttachmentData( void );
|
||
|
CRopeKeyframe *CreateRope( CBaseTFPlayer *pPlayer, int iAttachPoint );
|
||
|
CRopeKeyframe *CreateRope( CBaseObject *pObject, int iAttachPoint, int iObjectAttachPoint );
|
||
|
|
||
|
// Attach/Detach
|
||
|
bool IsPlayerAttached( CBaseTFPlayer *pPlayer );
|
||
|
bool IsObjectAttached( CBaseObject *pObject );
|
||
|
|
||
|
void AttachPlayer( CBaseTFPlayer *pPlayer );
|
||
|
void DetachPlayer( CBaseTFPlayer *pPlayer );
|
||
|
void DetachPlayerByIndex( int nIndex );
|
||
|
void AttachObject( CBaseObject *pObject, bool bPlacing );
|
||
|
void DetachObject( CBaseObject *pObject );
|
||
|
void DetachObjectByIndex( int nIndex );
|
||
|
|
||
|
void UpdatePlayerAttachment( CBaseTFPlayer *pPlayer );
|
||
|
|
||
|
void SwapObjectAttachment( int nIndex );
|
||
|
|
||
|
// Input handlers
|
||
|
void InputPlayerSpawned( inputdata_t &inputdata );
|
||
|
void InputPlayerAttachedToGenerator( inputdata_t &inputdata );
|
||
|
|
||
|
// Buff Helpers
|
||
|
bool IsWithinBuffRange( CBaseObject *pObject );
|
||
|
CBaseObject *GetBuffedObject( int iIndex );
|
||
|
|
||
|
// Think
|
||
|
void BoostPlayerThink( void );
|
||
|
void BoostObjectThink( void );
|
||
|
|
||
|
private:
|
||
|
|
||
|
struct AttachInfo_t
|
||
|
{
|
||
|
CDamageModifier m_DamageModifier;
|
||
|
CHandle<CRopeKeyframe> m_hRope;
|
||
|
int m_iAttachPoint;
|
||
|
};
|
||
|
|
||
|
typedef CHandle<CBaseTFPlayer> CPlayerHandle;
|
||
|
CNetworkArray( CPlayerHandle, m_hPlayers, BUFF_STATION_MAX_PLAYERS );
|
||
|
|
||
|
CNetworkVar( int, m_nPlayerCount );
|
||
|
AttachInfo_t m_aPlayerAttachInfo[BUFF_STATION_MAX_PLAYERS];
|
||
|
|
||
|
typedef CHandle<CBaseObject> CObjectHandle;
|
||
|
CNetworkArray( CObjectHandle, m_hObjects, BUFF_STATION_MAX_OBJECTS );
|
||
|
|
||
|
CNetworkVar( int, m_nObjectCount );
|
||
|
AttachInfo_t m_aObjectAttachInfo[BUFF_STATION_MAX_OBJECTS];
|
||
|
|
||
|
bool m_bBuilding;
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
//-----------------------------------------------------------------------------
|
||
|
inline CBaseObject *CObjectBuffStation::GetBuffedObject( int iIndex )
|
||
|
{
|
||
|
if ( ( iIndex >= 0 ) && ( iIndex < m_nObjectCount ) )
|
||
|
{
|
||
|
return m_hObjects[iIndex].Get();
|
||
|
}
|
||
|
|
||
|
return NULL;
|
||
|
}
|