diff options
Diffstat (limited to 'game/server/physics_prop_ragdoll.h')
| -rw-r--r-- | game/server/physics_prop_ragdoll.h | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/game/server/physics_prop_ragdoll.h b/game/server/physics_prop_ragdoll.h new file mode 100644 index 0000000..7c24b47 --- /dev/null +++ b/game/server/physics_prop_ragdoll.h @@ -0,0 +1,162 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#ifndef PHYSICS_PROP_RAGDOLL_H +#define PHYSICS_PROP_RAGDOLL_H +#ifdef _WIN32 +#pragma once +#endif + +#include "ragdoll_shared.h" +#include "player_pickup.h" + + +//----------------------------------------------------------------------------- +// Purpose: entity class for simple ragdoll physics +//----------------------------------------------------------------------------- + +// UNDONE: Move this to a private header +class CRagdollProp : public CBaseAnimating, public CDefaultPlayerPickupVPhysics +{ + DECLARE_CLASS( CRagdollProp, CBaseAnimating ); + +public: + CRagdollProp( void ); + ~CRagdollProp( void ); + + virtual void UpdateOnRemove( void ); + + void DrawDebugGeometryOverlays(); + + void Spawn( void ); + void Precache( void ); + + // Disable auto fading under dx7 or when level fades are specified + void DisableAutoFade(); + + int ObjectCaps(); + + DECLARE_SERVERCLASS(); + // Don't treat as a live target + virtual bool IsAlive( void ) { return false; } + + virtual void TraceAttack( const CTakeDamageInfo &info, const Vector &dir, trace_t *ptr, CDmgAccumulator *pAccumulator ); + virtual bool TestCollision( const Ray_t &ray, unsigned int mask, trace_t& trace ); + virtual void Teleport( const Vector *newPosition, const QAngle *newAngles, const Vector *newVelocity ); + virtual void SetupBones( matrix3x4_t *pBoneToWorld, int boneMask ); + virtual void VPhysicsUpdate( IPhysicsObject *pPhysics ); + virtual int VPhysicsGetObjectList( IPhysicsObject **pList, int listMax ); + + virtual int DrawDebugTextOverlays(void); + + // Response system stuff + virtual IResponseSystem *GetResponseSystem(); + virtual void ModifyOrAppendCriteria( AI_CriteriaSet& set ); + void SetSourceClassName( const char *pClassname ); + + // Physics attacker + virtual CBasePlayer *HasPhysicsAttacker( float dt ); + + // locals + void InitRagdollAnimation( void ); + void InitRagdoll( const Vector &forceVector, int forceBone, const Vector &forcePos, matrix3x4_t *pPrevBones, matrix3x4_t *pBoneToWorld, float dt, int collisionGroup, bool activateRagdoll, bool bWakeRagdoll = true ); + + void RecheckCollisionFilter( void ); + void SetDebrisThink(); + void ClearFlagsThink( void ); + inline ragdoll_t *GetRagdoll( void ) { return &m_ragdoll; } + + virtual bool IsRagdoll() { return true; } + + // Damage passing + virtual void SetDamageEntity( CBaseEntity *pEntity ); + virtual int OnTakeDamage( const CTakeDamageInfo &info ); + virtual void OnSave( IEntitySaveUtils *pUtils ); + virtual void OnRestore(); + + // Purpose: CDefaultPlayerPickupVPhysics + virtual void VPhysicsCollision( int index, gamevcollisionevent_t *pEvent ); + virtual void OnPhysGunPickup( CBasePlayer *pPhysGunUser, PhysGunPickup_t reason ); + virtual void OnPhysGunDrop( CBasePlayer *pPhysGunUser, PhysGunDrop_t Reason ); + virtual AngularImpulse PhysGunLaunchAngularImpulse(); + bool HasPhysgunInteraction( const char *pszKeyName, const char *pszValue ); + void HandleFirstCollisionInteractions( int index, gamevcollisionevent_t *pEvent ); + + void SetUnragdoll( CBaseAnimating *pOther ); + + void SetBlendWeight( float weight ) { m_flBlendWeight = weight; } + void SetOverlaySequence( Activity activity ); + void FadeOut( float flDelay = 0, float fadeTime = -1 ); + bool IsFading(); + CBaseEntity* GetKiller() { return m_hKiller; } + void SetKiller( CBaseEntity *pKiller ) { m_hKiller = pKiller; } + void GetAngleOverrideFromCurrentState( char *pOut, int size ); + + void DisableMotion( void ); + + // Input/Output + void InputStartRadgollBoogie( inputdata_t &inputdata ); + void InputEnableMotion( inputdata_t &inputdata ); + void InputDisableMotion( inputdata_t &inputdata ); + void InputTurnOn( inputdata_t &inputdata ); + void InputTurnOff( inputdata_t &inputdata ); + void InputFadeAndRemove( inputdata_t &inputdata ); + + DECLARE_DATADESC(); + +protected: + void CalcRagdollSize( void ); + ragdoll_t m_ragdoll; + +private: + void UpdateNetworkDataFromVPhysics( IPhysicsObject *pPhysics, int index ); + void FadeOutThink(); + + bool m_bStartDisabled; + + CNetworkArray( Vector, m_ragPos, RAGDOLL_MAX_ELEMENTS ); + CNetworkArray( QAngle, m_ragAngles, RAGDOLL_MAX_ELEMENTS ); + + string_t m_anglesOverrideString; + + typedef CHandle<CBaseAnimating> CBaseAnimatingHandle; + CNetworkVar( CBaseAnimatingHandle, m_hUnragdoll ); + + + unsigned int m_lastUpdateTickCount; + bool m_allAsleep; + bool m_bFirstCollisionAfterLaunch; + EHANDLE m_hDamageEntity; + EHANDLE m_hKiller; // Who killed me? + CHandle<CBasePlayer> m_hPhysicsAttacker; + float m_flLastPhysicsInfluenceTime; + float m_flFadeOutStartTime; + float m_flFadeTime; + + + string_t m_strSourceClassName; + bool m_bHasBeenPhysgunned; + + // If not 1, then allow underlying sequence to blend in with simulated bone positions + CNetworkVar( float, m_flBlendWeight ); + CNetworkVar( int, m_nOverlaySequence ); + float m_flDefaultFadeScale; + + Vector m_ragdollMins[RAGDOLL_MAX_ELEMENTS]; + Vector m_ragdollMaxs[RAGDOLL_MAX_ELEMENTS]; +}; + +CBaseEntity *CreateServerRagdoll( CBaseAnimating *pAnimating, int forceBone, const CTakeDamageInfo &info, int collisionGroup, bool bUseLRURetirement = false ); +CRagdollProp *CreateServerRagdollAttached( CBaseAnimating *pAnimating, const Vector &vecForce, int forceBone, int collisionGroup, IPhysicsObject *pAttached, CBaseAnimating *pParentEntity, int boneAttach, const Vector &originAttached, int parentBoneAttach, const Vector &boneOrigin ); +void DetachAttachedRagdoll( CBaseEntity *pRagdollIn ); +void DetachAttachedRagdollsForEntity( CBaseEntity *pRagdollParent ); +CBaseAnimating *CreateServerRagdollSubmodel( CBaseAnimating *pOwner, const char *pModelName, const Vector &position, const QAngle &angles, int collisionGroup ); + +bool Ragdoll_IsPropRagdoll( CBaseEntity *pEntity ); +void Ragdoll_GetAngleOverrideString( char *pOut, int size, CBaseEntity *pEntity ); +ragdoll_t *Ragdoll_GetRagdoll( CBaseEntity *pEntity ); + +#endif // PHYSICS_PROP_RAGDOLL_H |