Skip to content

Commit

Permalink
implement CGib (#536)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
fl0werD authored May 27, 2020
1 parent 27c15c3 commit bffb373
Show file tree
Hide file tree
Showing 7 changed files with 135 additions and 37 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
majorVersion=5
minorVersion=16
minorVersion=17
maintenanceVersion=0
6 changes: 6 additions & 0 deletions regamedll/dlls/API/CAPI_Impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
48 changes: 46 additions & 2 deletions regamedll/dlls/API/CAPI_Impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -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__);\
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -687,6 +719,12 @@ class CReGameHookchains: public IReGameHookchains {
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();
Expand Down Expand Up @@ -800,6 +838,12 @@ class CReGameHookchains: public IReGameHookchains {
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;
Expand Down
26 changes: 0 additions & 26 deletions regamedll/dlls/basemonster.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
49 changes: 45 additions & 4 deletions regamedll/dlls/gib.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#include "precompiled.h"

LINK_ENTITY_TO_CLASS(gib, CGib, CCSGib)

void CGib::LimitVelocity()
{
float length = pev->velocity.Length();
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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++)
{
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;
}
}
9 changes: 8 additions & 1 deletion regamedll/dlls/gib.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,21 @@ class CGib: public CBaseEntity
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);
void EXPORT WaitTillLand();
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);

Expand Down
32 changes: 29 additions & 3 deletions regamedll/public/regamedll/regamedll_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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() {}
Expand Down Expand Up @@ -584,6 +604,12 @@ class IReGameHookchains {
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 {
Expand Down

0 comments on commit bffb373

Please sign in to comment.