//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: A gib is a chunk of a body, or a piece of wood/metal/rocks/etc. // // $Workfile: $ // $Date: $ // $NoKeywords: $ //=============================================================================// #ifndef GIB_H #define GIB_H #ifdef _WIN32 #pragma once #endif #include "baseanimating.h" #include "player_pickup.h" #include "Sprite.h" extern CBaseEntity *CreateRagGib( const char *szModel, const Vector &vecOrigin, const QAngle &vecAngles, const Vector &vecForce, float flFadeTime = 0.0, bool bShouldIgnite = false ); #define GERMAN_GIB_COUNT 4 #define HUMAN_GIB_COUNT 6 #define ALIEN_GIB_COUNT 4 enum GibType_e { GIB_HUMAN, GIB_ALIEN, }; class CGib : public CBaseAnimating, public CDefaultPlayerPickupVPhysics { public: DECLARE_CLASS( CGib, CBaseAnimating ); virtual ~CGib( void ); void Spawn( const char *szGibModel, float flLifetime = 25.0f ); void InitGib( CBaseEntity *pVictim, float fMaxVelocity, float fMinVelocity ); void BounceGibTouch ( CBaseEntity *pOther ); void StickyGibTouch ( CBaseEntity *pOther ); void WaitTillLand( void ); void DieThink( void ); void LimitVelocity( void ); virtual bool SUB_AllowedToFade( void ); void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); virtual int ObjectCaps( void ) { return (BaseClass::ObjectCaps() & ~FCAP_ACROSS_TRANSITION) | FCAP_DONT_SAVE | FCAP_IMPULSE_USE; } static void SpawnHeadGib( CBaseEntity *pVictim ); static void SpawnRandomGibs( CBaseEntity *pVictim, int cGibs, GibType_e eGibType ); static void SpawnStickyGibs( CBaseEntity *pVictim, Vector vecOrigin, int cGibs ); static void SpawnSpecificGibs( CBaseEntity *pVictim, int nNumGibs, float fMaxVelocity, float fMinVelocity, const char* cModelName, float flLifetime = 25); void SetPhysicsAttacker( CBasePlayer *pEntity, float flTime ); virtual void OnPhysGunPickup( CBasePlayer *pPhysGunUser, PhysGunPickup_t reason ); virtual void OnPhysGunDrop( CBasePlayer *pPhysGunUser, PhysGunDrop_t reason ); virtual CBasePlayer *HasPhysicsAttacker( float dt ); void SetSprite( CBaseEntity *pSprite ) { m_hSprite = pSprite; } CBaseEntity *GetSprite( void ) { return m_hSprite.Get(); } void SetFlame( CBaseEntity *pFlame ) { m_hFlame = pFlame; } CBaseEntity *GetFlame( void ) { return m_hFlame.Get(); } DECLARE_DATADESC(); public: void SetBloodColor( int nBloodColor ); int m_cBloodDecals; int m_material; float m_lifeTime; bool m_bForceRemove; CHandle m_hPhysicsAttacker; float m_flLastPhysicsInfluenceTime; private: // A little piece of duplicated code void AdjustVelocityBasedOnHealth( int nHealth, Vector &vecVelocity ); int m_bloodColor; EHANDLE m_hSprite; EHANDLE m_hFlame; // Limit the max number of extant Gibs (mainly a memory issue): #ifdef _GAMECONSOLE static const int MAX_CONCURRENT_GIBS = 25; #else static const int MAX_CONCURRENT_GIBS = 75; #endif static CUtlVector s_ExtantGibs; }; class CRagGib : public CBaseAnimating { public: DECLARE_CLASS( CRagGib, CBaseAnimating ); void Spawn( const char *szModel, const Vector &vecOrigin, const Vector &vecForce, float flFadeTime ); }; #endif //GIB_H