Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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

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;
}