implement CGib (#536)

* implement CGib
Move code part from basemonster.cpp to gib.cpp
3-rd party:
Link entity to class (can hookable by HamSandwich amxx module)
Add hooks for ReAPI
This commit is contained in:
fl0werD 2020-05-27 06:56:24 +04:00 committed by GitHub
parent 27c15c38f6
commit bffb373539
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 135 additions and 37 deletions

View File

@ -1,3 +1,3 @@
majorVersion=5
minorVersion=16
minorVersion=17
maintenanceVersion=0

View File

@ -170,6 +170,12 @@ GAMEHOOK_REGISTRY(CBasePlayer_DropIdlePlayer);
GAMEHOOK_REGISTRY(CreateWeaponBox);
GAMEHOOK_REGISTRY(SpawnHeadGib);
GAMEHOOK_REGISTRY(SpawnRandomGibs);
GAMEHOOK_REGISTRY(CGib_Spawn);
GAMEHOOK_REGISTRY(CGib_BounceGibTouch);
GAMEHOOK_REGISTRY(CGib_WaitTillLand);
int CReGameApi::GetMajorVersion() {
return REGAMEDLL_API_VERSION_MAJOR;
}

View File

@ -105,6 +105,16 @@
return g_ReGameHookchains.m_##functionName.callChain(functionName##_OrigFunc, __VA_ARGS__);\
}
#define LINK_HOOK_GLOB_CLASS_VOID_CHAIN(className, functionName, args, ...)\
void className::functionName args {\
g_ReGameHookchains.m_##functionName.callChain(className::functionName##_OrigFunc, __VA_ARGS__);\
}
#define LINK_HOOK_GLOB_CLASS_CHAIN(ret, className, functionName, args, ...)\
ret className::functionName args {\
return g_ReGameHookchains.m_##functionName.callChain(className::functionName##_OrigFunc, __VA_ARGS__);\
}
#define LINK_HOOK_CUSTOM2_CHAIN(ret, customFuncName, functionName, args, ...)\
ret functionName args {\
return g_ReGameHookchains.m_##customFuncName.callChain(functionName##_OrigFunc, __VA_ARGS__);\
@ -137,6 +147,8 @@
#define LINK_HOOK_VOID_CHAIN2(...)
#define LINK_HOOK_CHAIN(...)
#define LINK_HOOK_CHAIN2(...)
#define LINK_HOOK_GLOB_CLASS_VOID_CHAIN(...)
#define LINK_HOOK_GLOB_CLASS_CHAIN(...)
#endif // REGAMEDLL_API
@ -564,13 +576,33 @@ typedef IHookChainClassImpl<bool, CBasePlayerWeapon, int, int, float, float, con
typedef IHookChainRegistryClassImpl<bool, CBasePlayerWeapon, int, int, float, float, const char *, const char *> CReGameHookRegistry_CBasePlayerWeapon_DefaultShotgunReload;
// CBasePlayer::DropIdlePlayer hook
typedef IHookChainClassImpl<void, CBasePlayer, const char *> CReGameHook_CBasePlayer_DropIdlePlayer;
typedef IHookChainRegistryClassImpl<void, CBasePlayer, const char *> CReGameHookRegistry_CBasePlayer_DropIdlePlayer;
typedef IHookChainClassImpl<void, class CBasePlayer, const char *> CReGameHook_CBasePlayer_DropIdlePlayer;
typedef IHookChainRegistryClassImpl<void, class CBasePlayer, const char *> CReGameHookRegistry_CBasePlayer_DropIdlePlayer;
// CreateWeaponBox hook
typedef IHookChainImpl<CWeaponBox *, CBasePlayerItem *, CBasePlayer *, const char *, Vector &, Vector &, Vector &, float, bool> CReGameHook_CreateWeaponBox;
typedef IHookChainRegistryImpl<CWeaponBox *, CBasePlayerItem *, CBasePlayer *, const char *, Vector &, Vector &, Vector &, float, bool> CReGameHookRegistry_CreateWeaponBox;
// SpawnHeadGib hook
typedef IHookChainImpl<class CGib *, entvars_t *> CReGameHook_SpawnHeadGib;
typedef IHookChainRegistryImpl<class CGib *, entvars_t *> CReGameHookRegistry_SpawnHeadGib;
// SpawnRandomGibs hook
typedef IHookChainImpl<void, entvars_t *, int, int> CReGameHook_SpawnRandomGibs;
typedef IHookChainRegistryImpl<void, entvars_t *, int, int> CReGameHookRegistry_SpawnRandomGibs;
// CGib::Spawn hook
typedef IHookChainClassImpl<void, class CGib, const char *> CReGameHook_CGib_Spawn;
typedef IHookChainRegistryClassImpl<void, class CGib, const char *> CReGameHookRegistry_CGib_Spawn;
// CGib::BounceGibTouch hook
typedef IHookChainClassImpl<void, class CGib, CBaseEntity *> CReGameHook_CGib_BounceGibTouch;
typedef IHookChainRegistryClassImpl<void, class CGib, CBaseEntity *> CReGameHookRegistry_CGib_BounceGibTouch;
// CGib::WaitTillLand hook
typedef IHookChainClassImpl<void, class CGib> CReGameHook_CGib_WaitTillLand;
typedef IHookChainRegistryClassImpl<void, class CGib> CReGameHookRegistry_CGib_WaitTillLand;
class CReGameHookchains: public IReGameHookchains {
public:
// CBasePlayer virtual
@ -687,6 +719,12 @@ public:
CReGameHookRegistry_CBasePlayer_DropIdlePlayer m_CBasePlayer_DropIdlePlayer;
CReGameHookRegistry_CreateWeaponBox m_CreateWeaponBox;
CReGameHookRegistry_SpawnHeadGib m_SpawnHeadGib;
CReGameHookRegistry_SpawnRandomGibs m_SpawnRandomGibs;
CReGameHookRegistry_CGib_Spawn m_CGib_Spawn;
CReGameHookRegistry_CGib_BounceGibTouch m_CGib_BounceGibTouch;
CReGameHookRegistry_CGib_WaitTillLand m_CGib_WaitTillLand;
public:
virtual IReGameHookRegistry_CBasePlayer_Spawn *CBasePlayer_Spawn();
virtual IReGameHookRegistry_CBasePlayer_Precache *CBasePlayer_Precache();
@ -800,6 +838,12 @@ public:
virtual IReGameHookRegistry_CBasePlayerWeapon_DefaultShotgunReload *CBasePlayerWeapon_DefaultShotgunReload();
virtual IReGameHookRegistry_CBasePlayer_DropIdlePlayer *CBasePlayer_DropIdlePlayer();
virtual IReGameHookRegistry_CreateWeaponBox *CreateWeaponBox();
virtual IReGameHookRegistry_SpawnHeadGib *SpawnHeadGib();
virtual IReGameHookRegistry_SpawnRandomGibs *SpawnRandomGibs();
virtual IReGameHookRegistry_CGib_Spawn *CGib_Spawn();
virtual IReGameHookRegistry_CGib_BounceGibTouch *CGib_BounceGibTouch();
virtual IReGameHookRegistry_CGib_WaitTillLand *CGib_WaitTillLand();
};
extern CReGameHookchains g_ReGameHookchains;

View File

@ -368,32 +368,6 @@ void CBaseMonster::Killed(entvars_t *pevAttacker, int iGib)
m_IdealMonsterState = MONSTERSTATE_DEAD;
}
void CGib::WaitTillLand()
{
if (!IsInWorld())
{
UTIL_Remove(this);
return;
}
if (pev->velocity == g_vecZero)
{
SetThink(&CBaseEntity::SUB_StartFadeOut);
pev->nextthink = gpGlobals->time + m_lifeTime;
#ifndef REGAMEDLL_FIXES
if (m_bloodColor != DONT_BLEED)
{
CSoundEnt::InsertSound(bits_SOUND_MEAT, pev->origin, 384, 25);
}
#endif
}
else
{
pev->nextthink = gpGlobals->time + 0.5f;
}
}
BOOL CBaseMonster::TakeHealth(float flHealth, int bitsDamageType)
{
if (pev->takedamage == DAMAGE_NO)

View File

@ -1,5 +1,7 @@
#include "precompiled.h"
LINK_ENTITY_TO_CLASS(gib, CGib, CCSGib)
void CGib::LimitVelocity()
{
float length = pev->velocity.Length();
@ -74,7 +76,9 @@ NOXREF void CGib::SpawnStickyGibs(entvars_t *pevVictim, Vector vecOrigin, int cG
}
}
void CGib::SpawnHeadGib(entvars_t *pevVictim)
LINK_HOOK_GLOB_CLASS_CHAIN(CGib *, CGib, SpawnHeadGib, (entvars_t *pevVictim), pevVictim)
CGib *CGib::__API_HOOK(SpawnHeadGib)(entvars_t *pevVictim)
{
CGib *pGib = GetClassPtr<CCSGib>((CGib *)nullptr);
@ -132,9 +136,13 @@ void CGib::SpawnHeadGib(entvars_t *pevVictim)
}
pGib->LimitVelocity();
return pGib;
}
void CGib::SpawnRandomGibs(entvars_t *pevVictim, int cGibs, int human)
LINK_HOOK_GLOB_CLASS_VOID_CHAIN(CGib, SpawnRandomGibs, (entvars_t *pevVictim, int cGibs, int human), pevVictim, cGibs, human)
void CGib::__API_HOOK(SpawnRandomGibs)(entvars_t *pevVictim, int cGibs, int human)
{
for (int cSplat = 0; cSplat < cGibs; cSplat++)
{
@ -198,11 +206,14 @@ void CGib::SpawnRandomGibs(entvars_t *pevVictim, int cGibs, int human)
pGib->pev->solid = SOLID_BBOX;
UTIL_SetSize(pGib->pev, Vector(0, 0, 0), Vector(0, 0, 0));
}
pGib->LimitVelocity();
}
}
void CGib::BounceGibTouch(CBaseEntity *pOther)
LINK_HOOK_CLASS_VOID_CHAIN(CGib, BounceGibTouch, (CBaseEntity *pOther), pOther)
void CGib::__API_HOOK(BounceGibTouch)(CBaseEntity *pOther)
{
if (pev->flags & FL_ONGROUND)
{
@ -260,7 +271,9 @@ void CGib::StickyGibTouch(CBaseEntity *pOther)
pev->movetype = MOVETYPE_NONE;
}
void CGib::Spawn(const char *szGibModel)
LINK_HOOK_CLASS_VOID_CHAIN(CGib, Spawn, (const char *szGibModel), szGibModel)
void CGib::__API_HOOK(Spawn)(const char *szGibModel)
{
pev->movetype = MOVETYPE_BOUNCE;
@ -292,3 +305,31 @@ void CGib::Spawn(const char *szGibModel)
// how many blood decals this gib can place (1 per bounce until none remain).
m_cBloodDecals = 5;
}
LINK_HOOK_CLASS_VOID_CHAIN2(CGib, WaitTillLand)
void CGib::__API_HOOK(WaitTillLand)()
{
if (!IsInWorld())
{
UTIL_Remove(this);
return;
}
if (pev->velocity == g_vecZero)
{
SetThink(&CBaseEntity::SUB_StartFadeOut);
pev->nextthink = gpGlobals->time + m_lifeTime;
#ifndef REGAMEDLL_FIXES
if (m_bloodColor != DONT_BLEED)
{
CSoundEnt::InsertSound(bits_SOUND_MEAT, pev->origin, 384, 25);
}
#endif
}
else
{
pev->nextthink = gpGlobals->time + 0.5f;
}
}

View File

@ -34,6 +34,10 @@ public:
virtual int ObjectCaps() { return (CBaseEntity::ObjectCaps() & ~FCAP_ACROSS_TRANSITION) | FCAP_DONT_SAVE; }
public:
void Spawn_OrigFunc(const char *szGibModel);
void BounceGibTouch_OrigFunc(CBaseEntity *pOther);
void WaitTillLand_OrigFunc();
void Spawn(const char *szGibModel);
void EXPORT BounceGibTouch(CBaseEntity *pOther);
void EXPORT StickyGibTouch(CBaseEntity *pOther);
@ -41,7 +45,10 @@ public:
void LimitVelocity();
public:
static void SpawnHeadGib(entvars_t *pevVictim);
static CGib *SpawnHeadGib_OrigFunc(entvars_t *pevVictim);
static void SpawnRandomGibs_OrigFunc(entvars_t *pevVictim, int cGibs, int human);
static CGib *SpawnHeadGib(entvars_t *pevVictim);
static void SpawnRandomGibs(entvars_t *pevVictim, int cGibs, int human);
static void SpawnStickyGibs(entvars_t *pevVictim, Vector vecOrigin, int cGibs);

View File

@ -38,7 +38,7 @@
#include <API/CSInterfaces.h>
#define REGAMEDLL_API_VERSION_MAJOR 5
#define REGAMEDLL_API_VERSION_MINOR 16
#define REGAMEDLL_API_VERSION_MINOR 17
// CBasePlayer::Spawn hook
typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_Spawn;
@ -461,13 +461,33 @@ typedef IHookChainClass<bool, class CBasePlayerWeapon, int, int, float, float, c
typedef IHookChainRegistryClass<bool, class CBasePlayerWeapon, int, int, float, float, const char *, const char *> IReGameHookRegistry_CBasePlayerWeapon_DefaultShotgunReload;
// CBasePlayer::DropIdlePlayer hook
typedef IHookChainClass<void, CBasePlayer, const char *> IReGameHook_CBasePlayer_DropIdlePlayer;
typedef IHookChainRegistryClass<void, CBasePlayer, const char *> IReGameHookRegistry_CBasePlayer_DropIdlePlayer;
typedef IHookChainClass<void, class CBasePlayer, const char *> IReGameHook_CBasePlayer_DropIdlePlayer;
typedef IHookChainRegistryClass<void, class CBasePlayer, const char *> IReGameHookRegistry_CBasePlayer_DropIdlePlayer;
// CreateWeaponBox hook
typedef IHookChain<class CWeaponBox *, class CBasePlayerItem *, class CBasePlayer *, const char *, Vector &, Vector &, Vector &, float, bool> IReGameHook_CreateWeaponBox;
typedef IHookChainRegistry<class CWeaponBox *, class CBasePlayerItem *, class CBasePlayer *, const char *, Vector &, Vector &, Vector &, float, bool> IReGameHookRegistry_CreateWeaponBox;
// SpawnHeadGib hook
typedef IHookChain<class CGib *, entvars_t *> IReGameHook_SpawnHeadGib;
typedef IHookChainRegistry<class CGib *, entvars_t *> IReGameHookRegistry_SpawnHeadGib;
// SpawnRandomGibs hook
typedef IHookChain<void, entvars_t *, int, int> IReGameHook_SpawnRandomGibs;
typedef IHookChainRegistry<void, entvars_t *, int, int> IReGameHookRegistry_SpawnRandomGibs;
// CGib::Spawn hook
typedef IHookChainClass<void, class CGib, const char *> IReGameHook_CGib_Spawn;
typedef IHookChainRegistryClass<void, class CGib, const char *> IReGameHookRegistry_CGib_Spawn;
// CGib::BounceGibTouch hook
typedef IHookChainClass<void, class CGib, CBaseEntity *> IReGameHook_CGib_BounceGibTouch;
typedef IHookChainRegistryClass<void, class CGib, CBaseEntity *> IReGameHookRegistry_CGib_BounceGibTouch;
// CGib::WaitTillLand hook
typedef IHookChainClass<void, class CGib> IReGameHook_CGib_WaitTillLand;
typedef IHookChainRegistryClass<void, class CGib> IReGameHookRegistry_CGib_WaitTillLand;
class IReGameHookchains {
public:
virtual ~IReGameHookchains() {}
@ -584,6 +604,12 @@ public:
virtual IReGameHookRegistry_CBasePlayerWeapon_DefaultShotgunReload *CBasePlayerWeapon_DefaultShotgunReload() = 0;
virtual IReGameHookRegistry_CBasePlayer_DropIdlePlayer *CBasePlayer_DropIdlePlayer() = 0;
virtual IReGameHookRegistry_CreateWeaponBox *CreateWeaponBox() = 0;
virtual IReGameHookRegistry_SpawnHeadGib *SpawnHeadGib() = 0;
virtual IReGameHookRegistry_SpawnRandomGibs *SpawnRandomGibs() = 0;
virtual IReGameHookRegistry_CGib_Spawn *CGib_Spawn() = 0;
virtual IReGameHookRegistry_CGib_BounceGibTouch *CGib_BounceGibTouch() = 0;
virtual IReGameHookRegistry_CGib_WaitTillLand *CGib_WaitTillLand() = 0;
};
struct ReGameFuncs_t {