168 lines
6.5 KiB
C++
168 lines
6.5 KiB
C++
//========= 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
|