diff options
Diffstat (limited to 'game/client/physpropclientside.h')
| -rw-r--r-- | game/client/physpropclientside.h | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/game/client/physpropclientside.h b/game/client/physpropclientside.h new file mode 100644 index 0000000..b305fbf --- /dev/null +++ b/game/client/physpropclientside.h @@ -0,0 +1,167 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#ifndef PHYSPROPCLIENTSIDE_H +#define PHYSPROPCLIENTSIDE_H +#ifdef _WIN32 +#pragma once +#endif + +#include "c_breakableprop.h" +#include "props_shared.h" + +class C_FuncPhysicsRespawnZone; + +class C_PhysPropClientside : public C_BreakableProp, public IBreakableWithPropData, public IMultiplayerPhysics +{ + +public: + DECLARE_CLASS( C_PhysPropClientside, C_BreakableProp ); + + C_PhysPropClientside(); + virtual ~C_PhysPropClientside(); + + bool Initialize(); + void Spawn(); + int ParsePropData( void ); + virtual bool IsDormant( void ) { return false; } // we could add a PVS check here + virtual void ClientThink( void ); + virtual CollideType_t GetCollideType( void ) { return ENTITY_SHOULD_RESPOND; } + virtual void StartTouch( C_BaseEntity *pOther ); + virtual void HitSurface( C_BaseEntity *pOther ); + virtual void ImpactTrace( trace_t *pTrace, int iDamageType, const char *pCustomImpactName ); + virtual bool IsClientCreated( void ) const { return true; } + virtual int GetMultiplayerPhysicsMode() { return m_iPhysicsMode; } + virtual float GetMass(); + virtual bool IsAsleep(); + + virtual bool KeyValue( const char *szKeyName, const char *szValue ); + + virtual void OnTakeDamage( int iDamage ); // very simple version + virtual void Break(); + virtual void Clone( Vector &velocity ); + virtual void StartFadeOut( float fTime ); + virtual void SetHealth(int iHealth) { m_iHealth = iHealth; } + virtual int GetHealth() const { return m_iHealth; } + int GetNumBreakableChunks( void ) { return m_iNumBreakableChunks; } + + void SetRespawnZone( C_FuncPhysicsRespawnZone *pZone ); + +// IBreakableWithPropData interface: +public: +// IBreakableWithPropData + void SetDmgModBullet( float flDmgMod ) { m_flDmgModBullet = flDmgMod; } + void SetDmgModClub( float flDmgMod ) { m_flDmgModClub = flDmgMod; } + void SetDmgModExplosive( float flDmgMod ) { m_flDmgModExplosive = flDmgMod; } + float GetDmgModBullet( void ) { return m_flDmgModBullet; } + float GetDmgModClub( void ) { return m_flDmgModClub; } + float GetDmgModExplosive( void ) { return m_flDmgModExplosive; } + void SetExplosiveRadius( float flRadius ) { m_explodeRadius = flRadius; } + void SetExplosiveDamage( float flDamage ) { m_explodeDamage = flDamage; } + float GetExplosiveRadius( void ) { return m_explodeRadius; } + float GetExplosiveDamage( void ) { return m_explodeDamage; } + void SetPhysicsDamageTable( string_t iszTableName ) { m_iszPhysicsDamageTableName = iszTableName; } + string_t GetPhysicsDamageTable( void ) { return m_iszPhysicsDamageTableName; } + void SetBreakableModel( string_t iszModel ) { m_iszBreakableModel = iszModel; } + string_t GetBreakableModel( void ) { return m_iszBreakableModel; } + void SetBreakableSkin( int iSkin ) { m_iBreakableSkin = iSkin; } + int GetBreakableSkin( void ) { return m_iBreakableSkin; } + void SetBreakableCount( int iCount ) { m_iBreakableCount = iCount; } + int GetBreakableCount( void ) { return m_iBreakableCount; } + void SetMaxBreakableSize( int iSize ) { m_iMaxBreakableSize = iSize; } + int GetMaxBreakableSize( void ) { return m_iMaxBreakableSize; } + void SetPropDataBlocksLOS( bool bBlocksLOS ) { m_bBlockLOSSetByPropData = true; SetBlocksLOS( bBlocksLOS ); } + void SetPropDataIsAIWalkable( bool b ) { m_bIsWalkableSetByPropData = true; SetAIWalkable( b ); } + void SetBasePropData( string_t iszBase ) { m_iszBasePropData = iszBase; } + string_t GetBasePropData( void ) { return m_iszBasePropData; } + void SetInteraction( propdata_interactions_t Interaction ) { m_iInteractions |= (1 << Interaction); } + bool HasInteraction( propdata_interactions_t Interaction ) { return ( m_iInteractions & (1 << Interaction) ) != 0; } + void SetPhysicsMode(int iMode); + int GetPhysicsMode() { return m_iPhysicsMode; } + void SetMultiplayerBreakMode( mp_break_t mode ) {} + mp_break_t GetMultiplayerBreakMode( void ) const { return MULTIPLAYER_BREAK_DEFAULT; } + + +// static management fucntions: + static void RecreateAll(); // recreate all clientside props in map + static void DestroyAll(); // clear all clientside created phys props + static C_PhysPropClientside *CreateNew(bool bForce = false); + +protected: + + static void ParseAllEntities(const char *pMapData); + static const char *ParseEntity( const char *pEntData ); + static void InitializePropRespawnZones(void); + +public: + + int m_iPhysicsMode; // should always be PHYSICS_MULTIPLAYER_CLIENTSIDE + float m_flTouchDelta; // Amount of time that must pass before another touch function can be called + float m_fDeathTime; // Point at which this object self destructs. + // The default of -1 indicates the object shouldn't destruct. + +// properties from serverclass CPhysicsProp + float m_impactEnergyScale; + int m_spawnflags; + float m_inertiaScale; + +protected: +// Prop data storage + float m_flDmgModBullet; + float m_flDmgModClub; + float m_flDmgModExplosive; + string_t m_iszPhysicsDamageTableName; + string_t m_iszBreakableModel; + int m_iBreakableSkin; + int m_iBreakableCount; + int m_iMaxBreakableSize; + string_t m_iszBasePropData; + int m_iInteractions; + float m_explodeDamage; + float m_explodeRadius; + bool m_bBlockLOSSetByPropData; + bool m_bIsWalkableSetByPropData; + + // Count of how many pieces we'll break into, custom or generic + int m_iNumBreakableChunks; + + C_FuncPhysicsRespawnZone *m_pRespawnZone; +}; + +//----------------------------------------------------------------------------- +// Purpose: A clientside zone that respawns physics props in it when the player leaves the PVS +//----------------------------------------------------------------------------- +class C_FuncPhysicsRespawnZone : public C_BaseEntity +{ + DECLARE_CLASS( C_FuncPhysicsRespawnZone, C_BaseEntity ); +public: + + C_FuncPhysicsRespawnZone( void ); + ~C_FuncPhysicsRespawnZone( void ); + + bool KeyValue( const char *szKeyName, const char *szValue ); + bool Initialize( void ); + void InitializePropsWithin( void ); + void PropDestroyed( C_PhysPropClientside *pProp ); + bool CanMovePropAt( Vector vecOrigin, const Vector &vecMins, const Vector &vecMaxs ); + void RespawnProps( void ); + void ClientThink( void ); + +private: + struct clientsideproprespawn_t + { + string_t iszModelName; + Vector vecOrigin; + QAngle vecAngles; + int iSkin; + int iHealth; + int iSpawnFlags; + ClientEntityHandle_t hClientEntity; + }; + CUtlVector<clientsideproprespawn_t> m_PropList; +}; + +#endif // PHYSPROPCLIENTSIDE_H |