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.
174 lines
6.9 KiB
174 lines
6.9 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: Defines a class for objects that break after taking a certain amount |
|
// of damage. |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef FUNC_BREAK_H |
|
#define FUNC_BREAK_H |
|
#pragma once |
|
|
|
#include "entityoutput.h" |
|
#include "props.h" |
|
|
|
typedef enum { expRandom = 0, expDirected, expUsePrecise} Explosions; |
|
typedef enum { matGlass = 0, matWood, matMetal, matFlesh, matCinderBlock, matCeilingTile, matComputer, matUnbreakableGlass, matRocks, matWeb, matNone, matLastMaterial } Materials; |
|
|
|
|
|
#define NUM_SHARDS 6 // this many shards spawned when breakable objects break; |
|
|
|
// Spawnflags for func breakable |
|
#define SF_BREAK_TRIGGER_ONLY 0x0001 // may only be broken by trigger |
|
#define SF_BREAK_TOUCH 0x0002 // can be 'crashed through' by running player (plate glass) |
|
#define SF_BREAK_PRESSURE 0x0004 // can be broken by a player standing on it |
|
#define SF_BREAK_PHYSICS_BREAK_IMMEDIATELY 0x0200 // the first physics collision this breakable has will immediately break it |
|
#define SF_BREAK_DONT_TAKE_PHYSICS_DAMAGE 0x0400 // this breakable doesn't take damage from physics collisions |
|
#define SF_BREAK_NO_BULLET_PENETRATION 0x0800 // don't allow bullets to penetrate |
|
|
|
// Spawnflags for func_pushable (it's also func_breakable, so don't collide with those flags) |
|
#define SF_PUSH_BREAKABLE 0x0080 |
|
#define SF_PUSH_NO_USE 0x0100 // player cannot +use pickup this ent |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
class CBreakable : public CBaseEntity, public IBreakableWithPropData, public CDefaultPlayerPickupVPhysics |
|
{ |
|
public: |
|
DECLARE_CLASS( CBreakable, CBaseEntity ); |
|
|
|
// basic functions |
|
virtual void Spawn( void ); |
|
void ParsePropData( void ); |
|
bool CreateVPhysics( void ); |
|
virtual void Precache( void ); |
|
virtual bool KeyValue( const char *szKeyName, const char *szValue ); |
|
virtual void VPhysicsCollision( int index, gamevcollisionevent_t *pEvent ); |
|
|
|
void BreakTouch( CBaseEntity *pOther ); |
|
void DamageSound( void ); |
|
void Break( CBaseEntity *pBreaker ); |
|
|
|
// Input handlers |
|
void InputAddHealth( inputdata_t &inputdata ); |
|
void InputBreak( inputdata_t &inputdata ); |
|
void InputRemoveHealth( inputdata_t &inputdata ); |
|
void InputSetHealth( inputdata_t &inputdata ); |
|
void InputSetMass( inputdata_t &inputdata ); |
|
|
|
|
|
// breakables use an overridden takedamage |
|
virtual int OnTakeDamage( const CTakeDamageInfo &info ); |
|
|
|
// To spark when hit |
|
void TraceAttack( const CTakeDamageInfo &info, const Vector &vecDir, trace_t *ptr, CDmgAccumulator *pAccumulator ); |
|
|
|
bool IsBreakable( void ); |
|
bool SparkWhenHit( void ); |
|
|
|
char const *DamageDecal( int bitsDamageType, int gameMaterial ); |
|
|
|
virtual void Die( void ); |
|
void ResetOnGroundFlags(void); |
|
|
|
inline bool Explodable( void ) { return GetExplosiveRadius() > 0; } |
|
|
|
Materials GetMaterialType( void ) { return m_Material; } |
|
static void MaterialSoundRandom( int entindex, Materials soundMaterial, float volume ); |
|
static const char *MaterialSound( Materials precacheMaterial ); |
|
|
|
static const char *pSpawnObjects[]; |
|
|
|
int DrawDebugTextOverlays(void); |
|
|
|
DECLARE_DATADESC(); |
|
|
|
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_ExplosionMagnitude = flDamage; } |
|
float GetExplosiveRadius( void ) { return m_explodeRadius; } |
|
float GetExplosiveDamage( void ) { return m_ExplosionMagnitude; } |
|
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 ) { SetBlocksLOS( bBlocksLOS ); } |
|
void SetPropDataIsAIWalkable( bool bBlocksLOS ) { SetAIWalkable( bBlocksLOS ); } |
|
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 PHYSICS_MULTIPLAYER_SOLID; } |
|
void SetMultiplayerBreakMode( mp_break_t mode ) {} |
|
mp_break_t GetMultiplayerBreakMode( void ) const { return MULTIPLAYER_BREAK_DEFAULT; } |
|
|
|
protected: |
|
float m_angle; |
|
Materials m_Material; |
|
EHANDLE m_hBreaker; // The entity that broke us. Held as a data member because sometimes breaking is delayed. |
|
|
|
private: |
|
|
|
Explosions m_Explosion; |
|
QAngle m_GibDir; |
|
string_t m_iszGibModel; |
|
string_t m_iszSpawnObject; |
|
int m_ExplosionMagnitude; |
|
float m_flPressureDelay; // Delay before breaking when destoyed by pressure |
|
int m_iMinHealthDmg; // minimum damage attacker must have to cause damage |
|
bool m_bTookPhysicsDamage; |
|
|
|
string_t m_iszPropData; |
|
string_t m_iszModelName; |
|
|
|
protected: |
|
|
|
bool UpdateHealth( int iNewHealth, CBaseEntity *pActivator ); |
|
|
|
float m_impactEnergyScale; |
|
|
|
COutputEvent m_OnBreak; |
|
COutputFloat m_OnHealthChanged; |
|
|
|
// 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; |
|
PerformanceMode_t m_PerformanceMode; |
|
|
|
float m_explodeRadius; |
|
|
|
public: |
|
// IPlayerPickupVPhysics |
|
virtual void OnPhysGunPickup( CBasePlayer *pPhysGunUser, PhysGunPickup_t reason ); |
|
virtual void OnPhysGunDrop( CBasePlayer *pPhysGunUser, PhysGunDrop_t Reason ); |
|
virtual CBasePlayer *HasPhysicsAttacker( float dt ); |
|
private: |
|
CHandle<CBasePlayer> m_hPhysicsAttacker; |
|
float m_flLastPhysicsInfluenceTime; |
|
}; |
|
|
|
#endif // FUNC_BREAK_H
|
|
|