diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/server/tf2/tf_obj.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/server/tf2/tf_obj.h')
| -rw-r--r-- | game/server/tf2/tf_obj.h | 492 |
1 files changed, 492 insertions, 0 deletions
diff --git a/game/server/tf2/tf_obj.h b/game/server/tf2/tf_obj.h new file mode 100644 index 0000000..b53002d --- /dev/null +++ b/game/server/tf2/tf_obj.h @@ -0,0 +1,492 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Base Object built by a player +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef TF_OBJ_H +#define TF_OBJ_H +#ifdef _WIN32 +#pragma once +#endif + +#include "baseentity.h" +#include "tf_func_resource.h" +#include "ihasbuildpoints.h" +#include "baseobject_shared.h" +#include "info_vehicle_bay.h" + +class CBaseTFPlayer; +class CTFTeam; +class CRopeKeyframe; +class CBaseTechnology; +class CGrenadeObjectSapper; +class CObjectPowerPack; +class CVGuiScreen; +class CResourceZone; +class KeyValues; +class CObjectBuffStation; +struct animevent_t; + +#define OBJECT_REPAIR_RATE 10 // Health healed per second while repairing + +// Construction +#define OBJECT_CONSTRUCTION_INTERVAL 0.1 +#define OBJECT_CONSTRUCTION_STARTINGHEALTH 0.1 + + +extern ConVar object_verbose; +extern ConVar obj_child_range_factor; + +#if defined( _DEBUG ) +#define TRACE_OBJECT( str ) \ +if ( object_verbose.GetInt() ) \ +{ \ + Msg( "%s", str ); \ +} +#else +#define TRACE_OBJECT( string ) +#endif + + +// ------------------------------------------------------------------------ // +// Resupply object that's built by the player +// ------------------------------------------------------------------------ // +class CBaseObject : public CBaseCombatCharacter, public IHasBuildPoints +{ + DECLARE_CLASS( CBaseObject, CBaseCombatCharacter ); +public: + CBaseObject(); + + virtual void UpdateOnRemove( void ); + + DECLARE_SERVERCLASS(); + DECLARE_DATADESC(); + + virtual bool IsBaseObject( void ) const { return true; } + + virtual void BaseObjectThink( void ); + virtual void LostPowerThink( void ); + virtual CBaseTFPlayer *GetOwner( void ); + + // Creation + virtual void Precache(); + virtual void Spawn( void ); + virtual void Activate( void ); + void InitializeMapPlacedObject( void ); + + virtual void SetBuilder( CBaseTFPlayer *pBuilder, bool moveobjects = false ); + virtual void SetupTeamModel( void ) { return; } + virtual void SetType( int iObjectType ); + int ObjectType( ) const; + + virtual int BloodColor( void ) { return BLOOD_COLOR_MECH; } + + // Building + virtual float GetTotalTime( void ); + virtual void StartPlacement( CBaseTFPlayer *pPlayer ); + void StopPlacement( void ); + bool FindNearestBuildPoint( CBaseEntity *pEntity, Vector vecBuildOrigin, float &flNearestPoint, Vector &vecNearestBuildPoint ); + virtual bool CalculatePlacement( CBaseTFPlayer *pPlayer ); + bool CheckBuildPoint( Vector vecPoint, Vector &vecTrace, Vector *vecOutPoint=NULL ); + bool VerifyCorner( const Vector &vBottomCenter, float xOffset, float yOffset ); + virtual bool CheckBuildOrigin( CBaseTFPlayer *pPlayer, const Vector &vecBuildOrigin, bool bSnappedToPoint = false ); + void AttemptToFindPower( void ); + void AttemptToFindBuffStation( void ); + void AttemptToActivateBuffStation( void ); + virtual float GetNearbyObjectCheckRadius( void ) { return 30.0; } + bool UpdatePlacement( CBaseTFPlayer *pPlayer ); + virtual bool ShouldAttachToParent( void ) { return true; } + void SetVehicleBay( CVGuiScreenVehicleBay *pBay ) { m_hVehicleBay = pBay; } + + // Sort of a hack for walkers - vehicles are pre-rotated by 90 degrees and walkers need to undo this. + virtual void AdjustInitialBuildAngles(); + + // Exit points for mounted vehicles.... + virtual void GetExitPoint( CBaseEntity *pPlayer, int nBuildPoint, Vector *pExitPoint, QAngle *pAngles ); + + // I've finished building the specified object on the specified build point + virtual int FindObjectOnBuildPoint( CBaseObject *pObject ); + + // This gives an object a chance to prevent itself from being built when the user clicks the + // attack button during placement. Barbed wire uses this to change which object the barbed wire + // is attached to. + virtual bool PreStartBuilding(); + + virtual bool StartBuilding( CBaseEntity *pPlayer ); + void BuildingThink( void ); + void SetControlPanelsActive( bool bState ); + virtual void FinishedBuilding( void ); + bool IsBuilding( void ) { return m_bBuilding; }; + bool IsPlacing( void ) { return m_bPlacing; }; + bool MustBeBuiltInResourceZone( void ) const; + bool MustBeBuiltInConstructionYard( void ) const; + virtual bool MustNotBeBuiltInConstructionYard( void ) const; + bool MustBeBuiltOnAttachmentPoint( void ) const; + + void AlignToGround( Vector vecOrigin ); + + // Returns information about the various control panels + virtual void GetControlPanelInfo( int nPanelIndex, const char *&pPanelName ); + virtual void GetControlPanelClassName( int nPanelIndex, const char *&pPanelName ); + + // Client commands sent by clicking on various panels.... + // NOTE: pArg->Argv(0) == pCmd, pArg->Argv(1) == the first argument + virtual bool ClientCommand( CBaseTFPlayer *pSender, const CCommand &args ); + + // Damage + void SetHealth( float flHealth ); + virtual void TraceAttack( const CTakeDamageInfo &info, const Vector &vecDir, trace_t *ptr ); + virtual int OnTakeDamage( const CTakeDamageInfo &info ); + bool PassDamageOntoChildren( const CTakeDamageInfo &info, float *flDamageLeftOver ); + virtual float GetRepairTime( void ); + virtual bool UpdateRepair( float flRepairTime ); + virtual bool Repair( float flHealth ); + + // Powerups + virtual bool CanPowerupEver( int iPowerup ); + virtual bool CanPowerupNow( int iPowerup ); + virtual void PowerupStart( int iPowerup, float flAmount, CBaseEntity *pAttacker, CDamageModifier *pDamageModifier ); + virtual void PowerupEnd( int iPowerup ); + + // Destruction + virtual bool ShouldAutoRemove( void ); + virtual void Killed( void ); + virtual void DestroyObject( void ); // Silent cleanup + virtual bool IsDying( void ) { return m_bDying; } + + // Data + virtual Class_T Classify( void ); + virtual int GetType( void ); + virtual CBaseTFPlayer *GetBuilder( void ); + virtual CBaseTFPlayer *GetOriginalBuilder( void ); + CTFTeam *GetTFTeam( void ) { return (CTFTeam*)GetTeam(); }; + + // ID functions + virtual bool IsAnUpgrade( void ) { return false; } + virtual bool IsAVehicle( void ) { return false; } + virtual bool IsSentrygun() { return false; } + virtual bool WantsCoverFromSentryGun() { return false; } + virtual bool WantsCover() { return false; } + + // Inputs + void InputSetHealth( inputdata_t &inputdata ); + void InputAddHealth( inputdata_t &inputdata ); + void InputRemoveHealth( inputdata_t &inputdata ); + void InputSetMinDisabledHealth( inputdata_t &inputdata ); + void InputSetSolidToPlayer( inputdata_t &inputdata ); + + // Pickup + virtual int ObjectCaps( void ); + virtual void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); + virtual void PickupObject( void ); + virtual bool CanBeRemovedBy( CBaseTFPlayer *pPlayer ); + virtual bool CanBeRotatedBy( CBaseTFPlayer *pPlayer ); + + virtual void ChangeTeam( int iTeamNum ) OVERRIDE; // Assign this entity to a team. + + virtual void ChangeBuilder( CBaseTFPlayer *pNewBuilder, bool moveobjects ); + virtual const char *GetWeaponClassnameForObject( void ); + virtual void AddItemsNeededForObject( CBaseTFPlayer *pNewOwner ); + + // Objects that are damaged/disabled can return false here when checked for being available + virtual bool ComputeEMPDamageState( void ) { return true; } + + // Handling object inactive + virtual bool ShouldBeActive( void ); + + // Technology + virtual void GainedNewTechnology( CBaseTechnology *pTechnology ); + + // Sappers + bool HasSapper( void ); + bool HasSapperFromPlayer( CBaseTFPlayer *pPlayer ); + void AddSapper( CGrenadeObjectSapper *pSapper ); + void RemoveSapper( CGrenadeObjectSapper *pSapper ); + + // Called when the builder rotates this object... + virtual void ObjectMoved( ); + + // Minibase stuff + virtual bool WasMapPlaced( void ); + virtual CRopeKeyframe *ConnectCableTo( CBaseObject *pObject, int iLocalAttachment, int iTargetAttachment ); + virtual bool HasCableTo( CBaseObject *pObject ); + virtual int GetCableAttachment( void ); + + // Returns the object flags + int GetObjectFlags() const { return m_fObjectFlags; } + void SetObjectFlags( int flags ) { m_fObjectFlags = flags; } + + CResourceZone *GetResourceZone() { return m_hResourceZone.Get(); } + int RopeCount() const { return m_aRopes.Count(); } + + // Power handling (Human objects need power to operate) + bool IsPowered( void ); + void SetPowerPack( CObjectPowerPack *pPack ); + CObjectPowerPack *GetPowerPack( void ) { return m_hPowerPack; }; + + void AttemptToGoActive( void ); + virtual void OnGoActive( void ); + virtual void OnGoInactive( void ); + + // Buffed objects (objects that connect to a medic's buff station) + bool IsHookedAndBuffed( void ); + virtual bool CanBeHookedToBuffStation( void ); + void SetBuffStation( CObjectBuffStation *pBuffStation, bool bPlacing ); + CObjectBuffStation *GetBuffStation( void ); + + virtual void BuffStationActivate( void ); + virtual void BuffStationDeactivate( void ); + + // Deterioration + void StartDeteriorating( void ); + void StopDeteriorating( void ); + bool IsDeteriorating( void ) { return m_bDeteriorating; }; + void DeterioratingThink( void ); + + // Disabling + void SetDisabled( bool bDisabled ); + bool IsDisabled( void ) { return m_bDisabled; } + + // Animation + virtual void PlayStartupAnimation( void ); + + Activity GetActivity( ) const; + void SetActivity( Activity act ); + void SetObjectSequence( int sequence ); + + virtual void OnActivityChanged( Activity act ); + + // Object points + void SpawnObjectPoints( void ); + + // Derive to customize an object's attached version + virtual void SetupAttachedVersion( void ) { return; } + virtual void SetupUnattachedVersion( void ) { return; } + + QAngle ConvertAbsAnglesToLocal( QAngle vecLocalAngles ); + +public: + // VulnerablePoints + void CreateVulnerablePoints( void ); + void AddVulnerablePoint( const char* szHitboxName, float Multiplier ); + float FindVulnerablePointMultiplier( int nGroup, int nBox ); + + // Build points + CUtlVector<VulnerablePoint_t> m_VulnerablePoints; + + virtual bool TestHitboxes( const Ray_t &ray, unsigned int fContentsMask, trace_t& tr ); + +public: + // Client/Server shared build point code + void CreateBuildPoints( void ); + void AddAndParseBuildPoint( int iAttachmentNumber, KeyValues *pkvBuildPoint ); + virtual int AddBuildPoint( int iAttachmentNum ); + virtual void AddValidObjectToBuildPoint( int iPoint, int iObjectType ); + virtual CBaseObject *GetBuildPointObject( int iPoint ); + bool IsBuiltOnAttachment( void ) { return (m_hBuiltOnEntity.Get() != NULL); } + void AttachObjectToObject( const CBaseEntity *pEntity, int iPoint, Vector &vecOrigin ); + void DetachObjectFromObject( void ); + CBaseObject *GetParentObject( void ); + void SetBuildPointPassenger( int iPoint, int iPassenger ); + int GetBuildPointPassenger( int iPoint ) const; + + virtual float GetSapperAttachTime( void ); + +// IHasBuildPoints +public: + virtual int GetNumBuildPoints( void ) const; + virtual bool GetBuildPoint( int iPoint, Vector &vecOrigin, QAngle &vecAngles ); + virtual int GetBuildPointAttachmentIndex( int iPoint ) const; + virtual bool CanBuildObjectOnBuildPoint( int iPoint, int iObjectType ); + virtual void SetObjectOnBuildPoint( int iPoint, CBaseObject *pObject ); + virtual float GetMaxSnapDistance( int iBuildPoint ); + virtual bool ShouldCheckForMovement( void ) { return true; } + virtual int GetNumObjectsOnMe( void ); + virtual CBaseEntity *GetFirstObjectOnMe( void ); + virtual CBaseObject *GetObjectOfTypeOnMe( int iObjectType ); + virtual void RemoveAllObjects( void ); + + +// IServerNetworkable. +public: + + virtual int ShouldTransmit( const CCheckTransmitInfo *pInfo ); + virtual void SetTransmit( CCheckTransmitInfo *pInfo, bool bAlways ); + + +protected: + // Clean off the object of offensive material, returns true if it found anything + bool RemoveEnemyAttachments( CBaseEntity *pActivator ); + void RemoveAnalyzer( CBaseEntity *pRemovingEntity ); + void RemoveAllSappers( CBaseEntity *pRemovingEntity ); + + void GiveNamedTechnology( CBaseTFPlayer *pRecipient, const char *techname ); + + // Show/hide vgui screens. + bool ShowVGUIScreen( int panelIndex, bool bShow ); + +private: + void DetermineAnimation( void ); + + // Spawns the various control panels + void SpawnControlPanels(); + + // Purpose: Spawn any objects specified inside the mdl + void SpawnEntityOnBuildPoint( const char *pEntityName, int iAttachmentNumber ); + + // Various commands sent by control panels + void DismantleCommand( CBaseTFPlayer *pSender ); + void YawCommand( CBaseTFPlayer *pSender, float flYaw ); + void TakeControlCommand( CBaseTFPlayer *pSender ); + +protected: + enum OBJSOLIDTYPE + { + SOLID_TO_PLAYER_USE_DEFAULT = 0, + SOLID_TO_PLAYER_YES, + SOLID_TO_PLAYER_NO, + }; + + bool IsSolidToPlayers( void ) const; + + // object flags.... + CNetworkVar( int, m_fObjectFlags ); + CNetworkHandle( CBaseTFPlayer, m_hBuilder ); + + // Zone we're in (valid only for objects that sit in zones) + CNetworkHandle( CResourceZone, m_hResourceZone ); + + // Combat Objects + char *m_szAmmoName; // Ammo used by players to build me + + // Cables + CUtlVector< CHandle<CRopeKeyframe> > m_aRopes; + + // Placement + Vector m_vecBuildOrigin; + Vector m_vecBuildMins; + Vector m_vecBuildMaxs; + CNetworkHandle( CBaseEntity, m_hBuiltOnEntity ); + int m_iBuiltOnPoint; + + bool m_bInvulnerable; + bool m_bCantDie; + float m_flRepairMultiplier; + bool m_bDying; + + // Outputs + COutputEvent m_OnDestroyed; + COutputEvent m_OnDamaged; + COutputEvent m_OnRepaired; + + COutputEvent m_OnBecomingDisabled; + COutputEvent m_OnBecomingReenabled; + + COutputFloat m_OnObjectHealthChanged; + + // Control panel + typedef CHandle<CVGuiScreen> ScreenHandle_t; + CUtlVector<ScreenHandle_t> m_hScreens; + +private: + // Make sure we pick up changes to these. + IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_iHealth ); + IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_takedamage ); + + Activity m_Activity; + + CNetworkVar( int, m_iObjectType ); + + + // True if players shouldn't do collision avoidance, but should just collide exactly with the object. + OBJSOLIDTYPE m_SolidToPlayers; + void SetSolidToPlayers( OBJSOLIDTYPE stp, bool force = false ); + + // True if this was a map placed object, not a player built one + bool m_bWasMapPlaced; + + // Disabled + CNetworkVar( bool, m_bDisabled ); + + // Vehicle bays + CHandle<CVGuiScreenVehicleBay> m_hVehicleBay; + + // Building + CNetworkVar( bool, m_bPlacing ); // True while the object's being placed + CNetworkVar( bool, m_bBuilding ); // True while the object's still constructing itself + float m_flConstructionTimeLeft; // Current time left in construction + float m_flTotalConstructionTime; // Total construction time (the value of GetTotalTime() at the time construction + // started, ie, incase you teleport out of a construction yard) + + CNetworkVar( float, m_flPercentageConstructed ); // Used to send to client + float m_flHealth; // Health during construction. Needed a float due to small increases in health. + + // Repair capping + float m_flLastRepairTime; + float m_flNextRepairMultiplier; + float m_flRepairedSinceLastTime; + + // Sappers on me + CNetworkVar( bool, m_bHasSapper ); + typedef CHandle<CGrenadeObjectSapper> SapperHandle; + CUtlVector< SapperHandle > m_hSappers; + + // Power handling (Human objects need power to operate) + CHandle< CObjectPowerPack > m_hPowerPack; + + // Buff Station + CHandle< CObjectBuffStation > m_hBuffStation; + bool m_bBuffActivated; + + // Deterioration + CNetworkVar( bool, m_bDeteriorating ); + float m_flStartedDeterioratingAt; + CHandle<CBaseTFPlayer> m_hOriginalBuilder; + + // Build points + CUtlVector<BuildPoint_t> m_BuildPoints; + + // Store the last time I took damage from an enemy. Use this to know whether to drop resources + // when I die, because I only want to drop resources if I was "destroyed" by an enemy, not if I deteriorated. + float m_flLastRealDamage; + + // Amount of resources the player who built me paid for me + int m_iAmountPlayerPaidForMe; + + // Attack notification sounds + string_t m_iszUnderAttackSound; + + // If non-zero then if health gets below this amount, the object becomes disabled + float m_flMinDisableHealth; + + // If not NULL, then when going disabled, swith to this model + string_t m_iszDisabledModel; + string_t m_iszEnabledModel; +}; + +inline bool CBaseObject::CanBeHookedToBuffStation( void ) +{ + return false; +} + +inline CObjectBuffStation *CBaseObject::GetBuffStation( void ) +{ + return m_hBuffStation.Get(); +} + +inline void CBaseObject::BuffStationActivate( void ) +{ + m_bBuffActivated = true; +} + +inline void CBaseObject::BuffStationDeactivate( void ) +{ + m_bBuffActivated = false; +} + +extern short g_sModelIndexFireball; // holds the index for the fireball + + +#endif // TF_OBJ_H |