247 lines
7.0 KiB
C++
247 lines
7.0 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose: Engineer's Sentrygun
|
|
//
|
|
// $NoKeywords: $
|
|
//=============================================================================//
|
|
|
|
#ifndef TF_OBJ_SENTRYGUN_H
|
|
#define TF_OBJ_SENTRYGUN_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "tf_obj.h"
|
|
#include "tf_projectile_rocket.h"
|
|
|
|
class CTFPlayer;
|
|
|
|
enum
|
|
{
|
|
SENTRY_LEVEL_1 = 0,
|
|
// SENTRY_LEVEL_1_UPGRADING,
|
|
SENTRY_LEVEL_2,
|
|
// SENTRY_LEVEL_2_UPGRADING,
|
|
SENTRY_LEVEL_3,
|
|
};
|
|
|
|
#define SF_SENTRY_UPGRADEABLE (LAST_SF_BASEOBJ<<1)
|
|
#define SF_SENTRY_INFINITE_AMMO (LAST_SF_BASEOBJ<<2)
|
|
|
|
#define SENTRYGUN_MAX_HEALTH 150
|
|
|
|
#define SENTRYGUN_MINI_MAX_HEALTH 100
|
|
|
|
#define SENTRY_MAX_RANGE 1100.0f // magic numbers are evil, people. adding this #define to demystify the value. (MSB 5/14/09)
|
|
#define SENTRY_MAX_RANGE_SQRD 1210000.0f
|
|
|
|
|
|
// ------------------------------------------------------------------------ //
|
|
// Sentrygun object that's built by the player
|
|
// ------------------------------------------------------------------------ //
|
|
class CObjectSentrygun : public CBaseObject
|
|
{
|
|
DECLARE_CLASS( CObjectSentrygun, CBaseObject );
|
|
|
|
public:
|
|
DECLARE_SERVERCLASS();
|
|
|
|
CObjectSentrygun();
|
|
|
|
static CObjectSentrygun* Create(const Vector &vOrigin, const QAngle &vAngles);
|
|
|
|
virtual void Spawn();
|
|
virtual void FirstSpawn();
|
|
virtual void Precache();
|
|
virtual void OnGoActive( void );
|
|
virtual int DrawDebugTextOverlays(void);
|
|
virtual int OnTakeDamage( const CTakeDamageInfo &info );
|
|
virtual void Killed( const CTakeDamageInfo &info );
|
|
virtual void SetModel( const char *pModel );
|
|
|
|
virtual bool StartBuilding( CBaseEntity *pBuilder );
|
|
virtual void SetStartBuildingModel( void );
|
|
virtual void StartPlacement( CTFPlayer *pPlayer );
|
|
|
|
// Engineer hit me with a wrench
|
|
virtual bool OnWrenchHit( CTFPlayer *pPlayer, CTFWrench *pWrench, Vector hitLoc );
|
|
virtual void OnStartDisabled( void );
|
|
virtual void OnEndDisabled( void );
|
|
|
|
virtual int GetTracerAttachment( void );
|
|
|
|
virtual bool IsUpgrading( void ) const { return m_iState == SENTRY_STATE_UPGRADING; }
|
|
|
|
virtual float GetTimeSinceLastFired( void ) const { return m_timeSinceLastFired.GetElapsedTime(); }
|
|
|
|
virtual const QAngle &GetTurretAngles( void ) const { return m_vecCurAngles; }
|
|
|
|
virtual void SetBuildingSize( void );
|
|
|
|
void ClearTarget( void ) { m_hEnemy = NULL; }
|
|
CBaseEntity *GetTarget( void ) { return m_hEnemy.Get(); }
|
|
void FireNextFrame( void ) { m_bFireNextFrame = true; }
|
|
void FireRocketNextFrame( void ) {m_bFireRocketNextFrame = true; }
|
|
|
|
void SetAutoAimTarget( CTFPlayer* pPlayer );
|
|
|
|
int GetFireAttachment( void );
|
|
|
|
void OnKilledEnemy(CBasePlayer* pVictim);
|
|
|
|
virtual void MakeMiniBuilding( CTFPlayer* pPlayer );
|
|
virtual void MakeCarriedObject( CTFPlayer *pCarrier );
|
|
void MakeScaledBuilding( CTFPlayer* pPlayer );
|
|
|
|
float GetPushMultiplier();
|
|
|
|
void EmitSentrySound( const char* soundname );
|
|
void EmitSentrySound( IRecipientFilter& filter, int iEntIndex, const char *soundname );
|
|
|
|
CTFPlayer * GetAssistingTeammate( float maxAssistDuration = -1.0f ) const;
|
|
|
|
virtual int GetBaseHealth( void ) { return SENTRYGUN_MAX_HEALTH; }
|
|
|
|
void SetShieldLevel( int nLevel, float flDuration ) { m_nShieldLevel = nLevel; m_flShieldFadeTime = gpGlobals->curtime + flDuration; }
|
|
|
|
virtual int GetMaxUpgradeLevel( void ) OVERRIDE;
|
|
|
|
virtual int GetMiniBuildingStartingHealth( void ) OVERRIDE { return SENTRYGUN_MINI_MAX_HEALTH; }
|
|
|
|
void RemoveAllAmmo();
|
|
|
|
virtual int GetMaxHealthForCurrentLevel( void );
|
|
virtual int GetUpgradeMetalRequired();
|
|
bool IsScaledSentry() { return m_flScaledSentry != 1.0f; }
|
|
|
|
virtual int GetShieldLevel() { return m_nShieldLevel; }
|
|
|
|
virtual bool IsTruceValidForEnt( void ) const OVERRIDE { return true; }
|
|
|
|
private:
|
|
Vector GetEnemyAimPosition( CBaseEntity* pEnemy ) const;
|
|
|
|
// Main think
|
|
void SentryThink( void );
|
|
|
|
// If the players hit us with a wrench, should we upgrade
|
|
bool CanBeUpgraded( CTFPlayer *pPlayer );
|
|
void StartUpgrading( void );
|
|
void FinishUpgrading( void );
|
|
|
|
// Target acquisition
|
|
bool FindTarget( void );
|
|
bool ValidTargetPlayer( CTFPlayer *pPlayer, const Vector &vecStart, const Vector &vecEnd );
|
|
bool ValidTargetObject( CBaseObject *pObject, const Vector &vecStart, const Vector &vecEnd );
|
|
bool ValidTargetBot( CBaseCombatCharacter *pBot, const Vector &vecStart, const Vector &vecEnd );
|
|
|
|
void FoundTarget( CBaseEntity *pTarget, const Vector &vecSoundCenter, bool bNoSound=false );
|
|
bool FInViewCone ( CBaseEntity *pEntity );
|
|
int Range( CBaseEntity *pTarget );
|
|
|
|
// Rotations
|
|
void SentryRotate( void );
|
|
bool MoveTurret( void );
|
|
|
|
// Attack
|
|
void Attack( void );
|
|
void MakeTracer( const Vector &vecTracerSrc, const trace_t &tr, int iTracerType );
|
|
bool Fire( void );
|
|
bool FireRocket( void );
|
|
virtual void ModifyFireBulletsDamage( CTakeDamageInfo* dmgInfo );
|
|
|
|
int GetBaseTurnRate( void );
|
|
|
|
virtual void MakeDisposableBuilding( CTFPlayer *pPlayer );
|
|
|
|
CNetworkVar( int, m_iState );
|
|
|
|
float m_flNextAttack;
|
|
float m_flFireRate;
|
|
IntervalTimer m_timeSinceLastFired;
|
|
|
|
// Rotation
|
|
int m_iRightBound;
|
|
int m_iLeftBound;
|
|
int m_iBaseTurnRate;
|
|
bool m_bTurningRight;
|
|
|
|
QAngle m_vecCurAngles;
|
|
QAngle m_vecGoalAngles;
|
|
|
|
float m_flTurnRate;
|
|
|
|
// Ammo
|
|
CNetworkVar( int, m_iAmmoShells );
|
|
CNetworkVar( int, m_iMaxAmmoShells );
|
|
CNetworkVar( int, m_iAmmoRockets );
|
|
CNetworkVar( int, m_iMaxAmmoRockets );
|
|
int m_iOldAmmoShells;
|
|
int m_iOldAmmoRockets;
|
|
|
|
int m_iAmmoType;
|
|
|
|
float m_flNextRocketAttack;
|
|
|
|
// Target player / object
|
|
CNetworkHandle( CBaseEntity, m_hEnemy );
|
|
bool m_bFireNextFrame;
|
|
bool m_bFireRocketNextFrame;
|
|
float m_flSentryRange;
|
|
|
|
// Player control shield.
|
|
CNetworkVar( bool, m_bPlayerControlled );
|
|
CNetworkVar( uint32, m_nShieldLevel );
|
|
float m_flShieldFadeTime;
|
|
|
|
// PDQ Sentry
|
|
CNetworkVar( bool, m_bPDQSentry );
|
|
|
|
//cached attachment indeces
|
|
int m_iAttachments[4];
|
|
|
|
int m_iPitchPoseParameter;
|
|
int m_iYawPoseParameter;
|
|
|
|
float m_flLastAttackedTime;
|
|
|
|
float m_flHeavyBulletResist;
|
|
|
|
CNetworkHandle( CTFPlayer, m_hAutoAimTarget );
|
|
float m_flAutoAimStartTime;
|
|
|
|
// for achievement: ACHIEVEMENT_TF_ENGINEER_MANUAL_SENTRY_ABSORB_DMG
|
|
int m_iLifetimeShieldedDamage;
|
|
|
|
DECLARE_DATADESC();
|
|
|
|
CountdownTimer m_inCombatThrottleTimer;
|
|
void UpdateNavMeshCombatStatus( void );
|
|
|
|
CHandle< CTFPlayer > m_lastTeammateWrenchHit; // which teammate last hit us with a wrench
|
|
IntervalTimer m_lastTeammateWrenchHitTimer; // time since last wrench hit
|
|
|
|
int m_iLastMuzzleAttachmentFired;
|
|
|
|
float m_flScaledSentry;
|
|
};
|
|
|
|
// sentry rocket class just to give it a unique class name, so we can distinguish it from other rockets
|
|
class CTFProjectile_SentryRocket : public CTFProjectile_Rocket
|
|
{
|
|
public:
|
|
DECLARE_CLASS( CTFProjectile_SentryRocket, CTFProjectile_Rocket );
|
|
DECLARE_NETWORKCLASS();
|
|
|
|
CTFProjectile_SentryRocket();
|
|
|
|
virtual int GetProjectileType() const OVERRIDE { return TF_PROJECTILE_SENTRY_ROCKET; }
|
|
|
|
// Creation.
|
|
static CTFProjectile_SentryRocket *Create( const Vector &vecOrigin, const QAngle &vecAngles, CBaseEntity *pOwner = NULL, CBaseEntity *pScorer = NULL );
|
|
|
|
virtual void Spawn();
|
|
};
|
|
|
|
#endif // TF_OBJ_SENTRYGUN_H
|