This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
nekohook/modules/source2013/sdk/game/server/physics_bone_follower.h
2020-08-04 13:13:01 -04:00

119 lines
3.9 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#ifndef PHYSICS_BONE_FOLLOWER_H
#define PHYSICS_BONE_FOLLOWER_H
#ifdef _WIN32
#pragma once
#endif
class CBoneFollower;
//
// To use bone followers in an entity, contain a CBoneFollowerManager in it.
// Then:
// - Call InitBoneFollowers() in the entity's CreateVPhysics().
// - Call UpdateBoneFollowers() after you move your bones.
// - Call DestroyBoneFollowers() when your entity's removed
struct physfollower_t {
DECLARE_SIMPLE_DATADESC();
int boneIndex;
CHandle<CBoneFollower> hFollower;
};
struct vcollide_t;
// create a manager and a list of followers directly from a ragdoll
void CreateBoneFollowersFromRagdoll(CBaseAnimating *pEntity,
class CBoneFollowerManager *pManager,
vcollide_t *pCollide);
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
class CBoneFollowerManager {
DECLARE_SIMPLE_DATADESC();
public:
CBoneFollowerManager();
~CBoneFollowerManager();
// Use either of these to create the bone followers in your entity's
// CreateVPhysics()
void InitBoneFollowers(CBaseAnimating *pParentEntity, int iNumBones,
const char **pFollowerBoneNames);
void AddBoneFollower(
CBaseAnimating *pParentEntity, const char *pFollowerBoneName,
solid_t *pSolid = NULL); // Adds a single bone follower
// Call this after you move your bones
void UpdateBoneFollowers(CBaseAnimating *pParentEntity);
// Call this when your entity's removed
void DestroyBoneFollowers(void);
physfollower_t *GetBoneFollower(int iFollowerIndex);
int GetBoneFollowerIndex(CBoneFollower *pFollower);
int GetNumBoneFollowers(void) const { return m_iNumBones; }
private:
bool CreatePhysicsFollower(CBaseAnimating *pParentEntity,
physfollower_t &follow, const char *pBoneName,
solid_t *pSolid);
private:
int m_iNumBones;
CUtlVector<physfollower_t> m_physBones;
};
class CBoneFollower : public CBaseEntity {
DECLARE_CLASS(CBoneFollower, CBaseEntity);
DECLARE_DATADESC();
DECLARE_SERVERCLASS();
public:
// CBaseEntity
void VPhysicsUpdate(IPhysicsObject *pPhysics);
int UpdateTransmitState(void);
// NOTE: These are forwarded to the parent object!
void VPhysicsCollision(int index, gamevcollisionevent_t *pEvent);
void VPhysicsFriction(IPhysicsObject *pObject, float energy,
int surfaceProps, int surfacePropsHit);
void VPhysicsShadowCollision(int index, gamevcollisionevent_t *pEvent);
bool TestCollision(const Ray_t &ray, unsigned int mask, trace_t &trace);
int ObjectCaps(void);
void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType,
float value);
void Touch(CBaseEntity *pOther);
void TraceAttack(const CTakeDamageInfo &info, const Vector &vecDir,
trace_t *ptr, CDmgAccumulator *pAccumulator);
// locals
bool Init(CBaseEntity *pOwner, const char *pModelName, solid_t &solid,
const Vector &position, const QAngle &orientation);
void UpdateFollower(const Vector &position, const QAngle &orientation,
float flInterval);
void SetTraceData(int physicsBone, int hitGroup);
// factory
static CBoneFollower *Create(CBaseEntity *pOwner, const char *pModelName,
solid_t &solid, const Vector &position,
const QAngle &orientation);
private:
CNetworkVar(int, m_modelIndex);
CNetworkVar(int, m_solidIndex);
int m_physicsBone;
int m_hitGroup;
};
#endif // PHYSICS_BONE_FOLLOWER_H