diff options
| author | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
|---|---|---|
| committer | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
| commit | 39ed87570bdb2f86969d4be821c94b722dc71179 (patch) | |
| tree | abc53757f75f40c80278e87650ea92808274aa59 /mp/src/game/server/func_break.h | |
| download | source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip | |
First version of the SOurce SDK 2013
Diffstat (limited to 'mp/src/game/server/func_break.h')
| -rw-r--r-- | mp/src/game/server/func_break.h | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/mp/src/game/server/func_break.h b/mp/src/game/server/func_break.h new file mode 100644 index 00000000..d4073c43 --- /dev/null +++ b/mp/src/game/server/func_break.h @@ -0,0 +1,174 @@ +//========= 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
|