ReGameDLL API: Implemented hookchain's CSGameRules::CanPlayerHearPlayer, CBasePlayer::SwitchTeam, CBasePlayer::CanSwitchTeam, CBasePlayer::ThrowGrenade, CWeaponBox::SetModel, CGrenade::DefuseBombStart, CGrenade::DefuseBombEnd, CGrenade::ExplodeHeGrenade, CGrenade::ExplodeFlashbang, CGrenade::ExplodeSmokeGrenade, CGrenade::ExplodeBomb, ThrowHeGrenade, ThrowFlashbang, ThrowSmokeGrenade, PlantBomb

This commit is contained in:
s1lent 2018-01-27 23:31:30 +07:00
parent 7a429eadfe
commit 4e89da4628
No known key found for this signature in database
GPG Key ID: 0FE401DC73916B5C
13 changed files with 479 additions and 155 deletions

View File

@ -142,6 +142,21 @@ GAMEHOOK_REGISTRY(CSGameRules_BalanceTeams);
GAMEHOOK_REGISTRY(CSGameRules_OnRoundFreezeEnd); GAMEHOOK_REGISTRY(CSGameRules_OnRoundFreezeEnd);
GAMEHOOK_REGISTRY(PM_UpdateStepSound); GAMEHOOK_REGISTRY(PM_UpdateStepSound);
GAMEHOOK_REGISTRY(CBasePlayer_StartDeathCam); GAMEHOOK_REGISTRY(CBasePlayer_StartDeathCam);
GAMEHOOK_REGISTRY(CBasePlayer_SwitchTeam);
GAMEHOOK_REGISTRY(CBasePlayer_CanSwitchTeam);
GAMEHOOK_REGISTRY(CBasePlayer_ThrowGrenade);
GAMEHOOK_REGISTRY(CSGameRules_CanPlayerHearPlayer);
GAMEHOOK_REGISTRY(CWeaponBox_SetModel);
GAMEHOOK_REGISTRY(CGrenade_DefuseBombStart);
GAMEHOOK_REGISTRY(CGrenade_DefuseBombEnd);
GAMEHOOK_REGISTRY(CGrenade_ExplodeHeGrenade);
GAMEHOOK_REGISTRY(CGrenade_ExplodeFlashbang);
GAMEHOOK_REGISTRY(CGrenade_ExplodeSmokeGrenade);
GAMEHOOK_REGISTRY(CGrenade_ExplodeBomb);
GAMEHOOK_REGISTRY(ThrowHeGrenade);
GAMEHOOK_REGISTRY(ThrowFlashbang);
GAMEHOOK_REGISTRY(ThrowSmokeGrenade);
GAMEHOOK_REGISTRY(PlantBomb);
int CReGameApi::GetMajorVersion() { int CReGameApi::GetMajorVersion() {
return REGAMEDLL_API_VERSION_MAJOR; return REGAMEDLL_API_VERSION_MAJOR;

View File

@ -63,6 +63,15 @@
g_ReGameHookchains.m_##customPrefix##_##functionName.callChain(&className::functionName##_OrigFunc, this);\ g_ReGameHookchains.m_##customPrefix##_##functionName.callChain(&className::functionName##_OrigFunc, this);\
} }
#define LINK_HOOK_CLASS_VOID_CUSTOM2_CHAIN(className, customFuncName, functionName, args, ...)\
void className::functionName args {\
g_ReGameHookchains.m_##className##_##customFuncName.callChain(&className::functionName##_OrigFunc, this, __VA_ARGS__);\
}
#define LINK_HOOK_CLASS_VOID_CUSTOM2_CHAIN2(className, customFuncName, functionName)\
void className::functionName() {\
g_ReGameHookchains.m_##className##_##customFuncName.callChain(&className::functionName##_OrigFunc, this);\
}
#define LINK_HOOK_CLASS_CUSTOM_CHAIN(ret, className, customPrefix, functionName, args, ...)\ #define LINK_HOOK_CLASS_CUSTOM_CHAIN(ret, className, customPrefix, functionName, args, ...)\
ret className::functionName args {\ ret className::functionName args {\
return g_ReGameHookchains.m_##customPrefix##_##functionName.callChain(&className::functionName##_OrigFunc, this, __VA_ARGS__);\ return g_ReGameHookchains.m_##customPrefix##_##functionName.callChain(&className::functionName##_OrigFunc, this, __VA_ARGS__);\
@ -72,6 +81,15 @@
return g_ReGameHookchains.m_##customPrefix##_##functionName.callChain(&className::functionName##_OrigFunc, this);\ return g_ReGameHookchains.m_##customPrefix##_##functionName.callChain(&className::functionName##_OrigFunc, this);\
} }
#define LINK_HOOK_CLASS_CUSTOM2_CHAIN(ret, className, customFuncName, functionName, args, ...)\
ret className::functionName args {\
return g_ReGameHookchains.m_##className##_##customFuncName.callChain(&className::functionName##_OrigFunc, this, __VA_ARGS__);\
}
#define LINK_HOOK_CLASS_CUSTOM2_CHAIN2(ret, className, customFuncName, functionName)\
ret className::functionName() {\
return g_ReGameHookchains.m_##className##_##customFuncName.callChain(&className::functionName##_OrigFunc, this);\
}
#define LINK_HOOK_VOID_CHAIN(functionName, args, ...)\ #define LINK_HOOK_VOID_CHAIN(functionName, args, ...)\
void functionName args {\ void functionName args {\
g_ReGameHookchains.m_##functionName.callChain(functionName##_OrigFunc, __VA_ARGS__);\ g_ReGameHookchains.m_##functionName.callChain(functionName##_OrigFunc, __VA_ARGS__);\
@ -82,6 +100,11 @@
return g_ReGameHookchains.m_##functionName.callChain(functionName##_OrigFunc, __VA_ARGS__);\ return g_ReGameHookchains.m_##functionName.callChain(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__);\
}
#define LINK_HOOK_VOID_CHAIN2(functionName)\ #define LINK_HOOK_VOID_CHAIN2(functionName)\
void functionName() {\ void functionName() {\
g_ReGameHookchains.m_##functionName.callChain(functionName##_OrigFunc);\ g_ReGameHookchains.m_##functionName.callChain(functionName##_OrigFunc);\
@ -430,6 +453,10 @@ typedef IHookChainRegistryClassEmptyImpl<void, class CHalfLifeMultiplay> CReGame
typedef IHookChainClassImpl<void, class CHalfLifeMultiplay> CReGameHook_CSGameRules_OnRoundFreezeEnd; typedef IHookChainClassImpl<void, class CHalfLifeMultiplay> CReGameHook_CSGameRules_OnRoundFreezeEnd;
typedef IHookChainRegistryClassEmptyImpl<void, class CHalfLifeMultiplay> CReGameHookRegistry_CSGameRules_OnRoundFreezeEnd; typedef IHookChainRegistryClassEmptyImpl<void, class CHalfLifeMultiplay> CReGameHookRegistry_CSGameRules_OnRoundFreezeEnd;
// CSGameRules::CanPlayerHearPlayer hook
typedef IHookChainClassImpl<bool, CCStrikeGameMgrHelper, CBasePlayer *, CBasePlayer *> CReGameHook_CSGameRules_CanPlayerHearPlayer;
typedef IHookChainRegistryClassEmptyImpl<bool, CCStrikeGameMgrHelper, CBasePlayer *, CBasePlayer *> CReGameHookRegistry_CSGameRules_CanPlayerHearPlayer;
// PM_UpdateStepSound hook // PM_UpdateStepSound hook
typedef IHookChainImpl<void> CReGameHook_PM_UpdateStepSound; typedef IHookChainImpl<void> CReGameHook_PM_UpdateStepSound;
typedef IHookChainRegistryImpl<void> CReGameHookRegistry_PM_UpdateStepSound; typedef IHookChainRegistryImpl<void> CReGameHookRegistry_PM_UpdateStepSound;
@ -438,6 +465,62 @@ typedef IHookChainRegistryImpl<void> CReGameHookRegistry_PM_UpdateStepSound;
typedef IHookChainClassImpl<void, CBasePlayer> CReGameHook_CBasePlayer_StartDeathCam; typedef IHookChainClassImpl<void, CBasePlayer> CReGameHook_CBasePlayer_StartDeathCam;
typedef IHookChainRegistryClassImpl<void, CBasePlayer> CReGameHookRegistry_CBasePlayer_StartDeathCam; typedef IHookChainRegistryClassImpl<void, CBasePlayer> CReGameHookRegistry_CBasePlayer_StartDeathCam;
// CBasePlayer::SwitchTeam hook
typedef IHookChainClassImpl<void, CBasePlayer> CReGameHook_CBasePlayer_SwitchTeam;
typedef IHookChainRegistryClassImpl<void, CBasePlayer> CReGameHookRegistry_CBasePlayer_SwitchTeam;
// CBasePlayer::CanSwitchTeam hook
typedef IHookChainClassImpl<bool, CBasePlayer, TeamName> CReGameHook_CBasePlayer_CanSwitchTeam;
typedef IHookChainRegistryClassImpl<bool, CBasePlayer, TeamName> CReGameHookRegistry_CBasePlayer_CanSwitchTeam;
// CBasePlayer::ThrowGrenade hook
typedef IHookChainClassImpl<CGrenade *, CBasePlayer, CBasePlayerWeapon *, Vector &, Vector &, float, unsigned short> CReGameHook_CBasePlayer_ThrowGrenade;
typedef IHookChainRegistryClassImpl<CGrenade *, CBasePlayer, CBasePlayerWeapon *, Vector &, Vector &, float, unsigned short> CReGameHookRegistry_CBasePlayer_ThrowGrenade;
// CWeaponBox::SetModel hook
typedef IHookChainClassImpl<void, CWeaponBox, const char *> CReGameHook_CWeaponBox_SetModel;
typedef IHookChainRegistryClassImpl<void, CWeaponBox, const char *> CReGameHookRegistry_CWeaponBox_SetModel;
// CGrenade::DefuseBombStart hook
typedef IHookChainClassImpl<void, CGrenade, CBasePlayer *> CReGameHook_CGrenade_DefuseBombStart;
typedef IHookChainRegistryClassImpl<void, CGrenade, CBasePlayer *> CReGameHookRegistry_CGrenade_DefuseBombStart;
// CGrenade::DefuseBombEnd hook
typedef IHookChainClassImpl<void, CGrenade, CBasePlayer *, bool> CReGameHook_CGrenade_DefuseBombEnd;
typedef IHookChainRegistryClassImpl<void, CGrenade, CBasePlayer *, bool> CReGameHookRegistry_CGrenade_DefuseBombEnd;
// CGrenade::ExplodeHeGrenade hook
typedef IHookChainClassImpl<void, CGrenade, TraceResult *, int> CReGameHook_CGrenade_ExplodeHeGrenade;
typedef IHookChainRegistryClassImpl<void, CGrenade, TraceResult *, int> CReGameHookRegistry_CGrenade_ExplodeHeGrenade;
// CGrenade::ExplodeFlashbang hook
typedef IHookChainClassImpl<void, CGrenade, TraceResult *, int> CReGameHook_CGrenade_ExplodeFlashbang;
typedef IHookChainRegistryClassImpl<void, CGrenade, TraceResult *, int> CReGameHookRegistry_CGrenade_ExplodeFlashbang;
// CGrenade::ExplodeSmokeGrenade hook
typedef IHookChainClassImpl<void, CGrenade> CReGameHook_CGrenade_ExplodeSmokeGrenade;
typedef IHookChainRegistryClassImpl<void, CGrenade> CReGameHookRegistry_CGrenade_ExplodeSmokeGrenade;
// CGrenade::ExplodeBomb hook
typedef IHookChainClassImpl<void, CGrenade, TraceResult *, int> CReGameHook_CGrenade_ExplodeBomb;
typedef IHookChainRegistryClassImpl<void, CGrenade, TraceResult *, int> CReGameHookRegistry_CGrenade_ExplodeBomb;
// ThrowHeGrenade hook
typedef IHookChainImpl<CGrenade *, entvars_t *, Vector &, Vector &, float, int, unsigned short> CReGameHook_ThrowHeGrenade;
typedef IHookChainRegistryImpl<CGrenade *, entvars_t *, Vector &, Vector &, float, int, unsigned short> CReGameHookRegistry_ThrowHeGrenade;
// ThrowFlashbang hook
typedef IHookChainImpl<CGrenade *, entvars_t *, Vector &, Vector &, float> CReGameHook_ThrowFlashbang;
typedef IHookChainRegistryImpl<CGrenade *, entvars_t *, Vector &, Vector &, float> CReGameHookRegistry_ThrowFlashbang;
// ThrowSmokeGrenade hook
typedef IHookChainImpl<CGrenade *, entvars_t *, Vector &, Vector &, float, unsigned short> CReGameHook_ThrowSmokeGrenade;
typedef IHookChainRegistryImpl<CGrenade *, entvars_t *, Vector &, Vector &, float, unsigned short> CReGameHookRegistry_ThrowSmokeGrenade;
// PlantBomb hook
typedef IHookChainImpl<CGrenade *, entvars_t *, Vector &, Vector &> CReGameHook_PlantBomb;
typedef IHookChainRegistryImpl<CGrenade *, entvars_t *, Vector &, Vector &> CReGameHookRegistry_PlantBomb;
class CReGameHookchains: public IReGameHookchains { class CReGameHookchains: public IReGameHookchains {
public: public:
// CBasePlayer virtual // CBasePlayer virtual
@ -526,7 +609,22 @@ public:
CReGameHookRegistry_CSGameRules_OnRoundFreezeEnd m_CSGameRules_OnRoundFreezeEnd; CReGameHookRegistry_CSGameRules_OnRoundFreezeEnd m_CSGameRules_OnRoundFreezeEnd;
CReGameHookRegistry_PM_UpdateStepSound m_PM_UpdateStepSound; CReGameHookRegistry_PM_UpdateStepSound m_PM_UpdateStepSound;
CReGameHookRegistry_CBasePlayer_StartDeathCam m_CBasePlayer_StartDeathCam; CReGameHookRegistry_CBasePlayer_StartDeathCam m_CBasePlayer_StartDeathCam;
CReGameHookRegistry_CBasePlayer_SwitchTeam m_CBasePlayer_SwitchTeam;
CReGameHookRegistry_CBasePlayer_CanSwitchTeam m_CBasePlayer_CanSwitchTeam;
CReGameHookRegistry_CBasePlayer_ThrowGrenade m_CBasePlayer_ThrowGrenade;
CReGameHookRegistry_CSGameRules_CanPlayerHearPlayer m_CSGameRules_CanPlayerHearPlayer;
CReGameHookRegistry_CWeaponBox_SetModel m_CWeaponBox_SetModel;
CReGameHookRegistry_CGrenade_DefuseBombStart m_CGrenade_DefuseBombStart;
CReGameHookRegistry_CGrenade_DefuseBombEnd m_CGrenade_DefuseBombEnd;
CReGameHookRegistry_CGrenade_ExplodeHeGrenade m_CGrenade_ExplodeHeGrenade;
CReGameHookRegistry_CGrenade_ExplodeFlashbang m_CGrenade_ExplodeFlashbang;
CReGameHookRegistry_CGrenade_ExplodeSmokeGrenade m_CGrenade_ExplodeSmokeGrenade;
CReGameHookRegistry_CGrenade_ExplodeBomb m_CGrenade_ExplodeBomb;
CReGameHookRegistry_ThrowHeGrenade m_ThrowHeGrenade;
CReGameHookRegistry_ThrowFlashbang m_ThrowFlashbang;
CReGameHookRegistry_ThrowSmokeGrenade m_ThrowSmokeGrenade;
CReGameHookRegistry_PlantBomb m_PlantBomb;
public: public:
virtual IReGameHookRegistry_CBasePlayer_Spawn *CBasePlayer_Spawn(); virtual IReGameHookRegistry_CBasePlayer_Spawn *CBasePlayer_Spawn();
virtual IReGameHookRegistry_CBasePlayer_Precache *CBasePlayer_Precache(); virtual IReGameHookRegistry_CBasePlayer_Precache *CBasePlayer_Precache();
@ -613,6 +711,22 @@ public:
virtual IReGameHookRegistry_CSGameRules_OnRoundFreezeEnd *CSGameRules_OnRoundFreezeEnd(); virtual IReGameHookRegistry_CSGameRules_OnRoundFreezeEnd *CSGameRules_OnRoundFreezeEnd();
virtual IReGameHookRegistry_PM_UpdateStepSound *PM_UpdateStepSound(); virtual IReGameHookRegistry_PM_UpdateStepSound *PM_UpdateStepSound();
virtual IReGameHookRegistry_CBasePlayer_StartDeathCam *CBasePlayer_StartDeathCam(); virtual IReGameHookRegistry_CBasePlayer_StartDeathCam *CBasePlayer_StartDeathCam();
virtual IReGameHookRegistry_CBasePlayer_SwitchTeam *CBasePlayer_SwitchTeam();
virtual IReGameHookRegistry_CBasePlayer_CanSwitchTeam *CBasePlayer_CanSwitchTeam();
virtual IReGameHookRegistry_CBasePlayer_ThrowGrenade *CBasePlayer_ThrowGrenade();
virtual IReGameHookRegistry_CSGameRules_CanPlayerHearPlayer *CSGameRules_CanPlayerHearPlayer();
virtual IReGameHookRegistry_CWeaponBox_SetModel *CWeaponBox_SetModel();
virtual IReGameHookRegistry_CGrenade_DefuseBombStart *CGrenade_DefuseBombStart();
virtual IReGameHookRegistry_CGrenade_DefuseBombEnd *CGrenade_DefuseBombEnd();
virtual IReGameHookRegistry_CGrenade_ExplodeHeGrenade *CGrenade_ExplodeHeGrenade();
virtual IReGameHookRegistry_CGrenade_ExplodeFlashbang *CGrenade_ExplodeFlashbang();
virtual IReGameHookRegistry_CGrenade_ExplodeSmokeGrenade *CGrenade_ExplodeSmokeGrenade();
virtual IReGameHookRegistry_CGrenade_ExplodeBomb *CGrenade_ExplodeBomb();
virtual IReGameHookRegistry_ThrowHeGrenade *ThrowHeGrenade();
virtual IReGameHookRegistry_ThrowFlashbang *ThrowFlashbang();
virtual IReGameHookRegistry_ThrowSmokeGrenade *ThrowSmokeGrenade();
virtual IReGameHookRegistry_PlantBomb *PlantBomb();
}; };
extern CReGameHookchains g_ReGameHookchains; extern CReGameHookchains g_ReGameHookchains;

View File

@ -772,6 +772,7 @@ protected:
float m_flEscapeRatio; float m_flEscapeRatio;
float m_flTimeLimit; float m_flTimeLimit;
float m_flGameStartTime; float m_flGameStartTime;
bool m_bTeamBalanced;
}; };
typedef struct mapcycle_item_s typedef struct mapcycle_item_s
@ -795,6 +796,10 @@ class CCStrikeGameMgrHelper: public IVoiceGameMgrHelper
{ {
public: public:
virtual bool CanPlayerHearPlayer(CBasePlayer *pListener, CBasePlayer *pSender); virtual bool CanPlayerHearPlayer(CBasePlayer *pListener, CBasePlayer *pSender);
#ifdef REGAMEDLL_API
bool CanPlayerHearPlayer_OrigFunc(CBasePlayer *pListener, CBasePlayer *pSender);
#endif
}; };
extern CGameRules DLLEXPORT *g_pGameRules; extern CGameRules DLLEXPORT *g_pGameRules;

View File

@ -28,8 +28,10 @@ void CGrenade::Explode(Vector vecSrc, Vector vecAim)
Explode(&tr, DMG_BLAST); Explode(&tr, DMG_BLAST);
} }
LINK_HOOK_CLASS_VOID_CUSTOM2_CHAIN(CGrenade, ExplodeFlashbang, Explode, (TraceResult *pTrace, int bitsDamageType), pTrace, bitsDamageType)
// UNDONE: temporary scorching for PreAlpha - find a less sleazy permenant solution. // UNDONE: temporary scorching for PreAlpha - find a less sleazy permenant solution.
void CGrenade::Explode(TraceResult *pTrace, int bitsDamageType) void CGrenade::__API_HOOK(Explode)(TraceResult *pTrace, int bitsDamageType)
{ {
float flRndSound; // sound randomizer float flRndSound; // sound randomizer
@ -90,7 +92,9 @@ void CGrenade::Explode(TraceResult *pTrace, int bitsDamageType)
} }
} }
void CGrenade::Explode2(TraceResult *pTrace, int bitsDamageType) LINK_HOOK_CLASS_VOID_CUSTOM2_CHAIN(CGrenade, ExplodeBomb, Explode2, (TraceResult *pTrace, int bitsDamageType), pTrace, bitsDamageType)
void CGrenade::__API_HOOK(Explode2)(TraceResult *pTrace, int bitsDamageType)
{ {
float flRndSound; // sound randomizer float flRndSound; // sound randomizer
@ -221,7 +225,9 @@ void CGrenade::Explode2(TraceResult *pTrace, int bitsDamageType)
} }
} }
void CGrenade::Explode3(TraceResult *pTrace, int bitsDamageType) LINK_HOOK_CLASS_VOID_CUSTOM2_CHAIN(CGrenade, ExplodeHeGrenade, Explode3, (TraceResult *pTrace, int bitsDamageType), pTrace, bitsDamageType)
void CGrenade::__API_HOOK(Explode3)(TraceResult *pTrace, int bitsDamageType)
{ {
float flRndSound; // sound randomizer float flRndSound; // sound randomizer
@ -541,7 +547,9 @@ void CGrenade::Detonate()
Explode(&tr, DMG_BLAST); Explode(&tr, DMG_BLAST);
} }
void CGrenade::SG_Detonate() LINK_HOOK_CLASS_VOID_CUSTOM2_CHAIN2(CGrenade, ExplodeSmokeGrenade, SG_Detonate)
void CGrenade::__API_HOOK(SG_Detonate)()
{ {
TraceResult tr; TraceResult tr;
Vector vecSpot; Vector vecSpot;
@ -863,7 +871,9 @@ NOXREF CGrenade *CGrenade::ShootContact(entvars_t *pevOwner, Vector vecStart, Ve
return pGrenade; return pGrenade;
} }
CGrenade *CGrenade::ShootTimed2(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time, int iTeam, unsigned short usEvent) LINK_HOOK_CUSTOM2_CHAIN(CGrenade *, ThrowHeGrenade, CGrenade::ShootTimed2, (entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time, int iTeam, unsigned short usEvent), pevOwner, vecStart, vecVelocity, time, iTeam, usEvent)
CGrenade *CGrenade::__API_HOOK(ShootTimed2)(entvars_t *pevOwner, VectorRef vecStart, VectorRef vecVelocity, float time, int iTeam, unsigned short usEvent)
{ {
CGrenade *pGrenade = GetClassPtr<CCSGrenade>((CGrenade *)nullptr); CGrenade *pGrenade = GetClassPtr<CCSGrenade>((CGrenade *)nullptr);
pGrenade->Spawn(); pGrenade->Spawn();
@ -897,7 +907,9 @@ CGrenade *CGrenade::ShootTimed2(entvars_t *pevOwner, Vector vecStart, Vector vec
return pGrenade; return pGrenade;
} }
CGrenade *CGrenade::ShootTimed(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time) LINK_HOOK_CUSTOM2_CHAIN(CGrenade *, ThrowFlashbang, CGrenade::ShootTimed, (entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time), pevOwner, vecStart, vecVelocity, time)
CGrenade *CGrenade::__API_HOOK(ShootTimed)(entvars_t *pevOwner, VectorRef vecStart, VectorRef vecVelocity, float time)
{ {
CGrenade *pGrenade = GetClassPtr<CCSGrenade>((CGrenade *)nullptr); CGrenade *pGrenade = GetClassPtr<CCSGrenade>((CGrenade *)nullptr);
pGrenade->Spawn(); pGrenade->Spawn();
@ -940,40 +952,16 @@ CGrenade *CGrenade::ShootTimed(entvars_t *pevOwner, Vector vecStart, Vector vecV
constexpr float NEXT_DEFUSE_TIME = 0.5f; constexpr float NEXT_DEFUSE_TIME = 0.5f;
void CGrenade::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) LINK_HOOK_CLASS_VOID_CHAIN(CGrenade, DefuseBombStart, (CBasePlayer *pPlayer), pPlayer)
void CGrenade::__API_HOOK(DefuseBombStart)(CBasePlayer *pPlayer)
{ {
if (!m_bIsC4)
return;
// TODO: We must be sure that the activator is a player.
CBasePlayer *pPlayer = GetClassPtr<CCSPlayer>((CBasePlayer *)pActivator->pev);
// For CTs to defuse the c4
if (pPlayer->m_iTeam != CT)
{
return;
}
#ifdef REGAMEDLL_FIXES
if((pPlayer->pev->flags & FL_ONGROUND) != FL_ONGROUND) // Defuse should start only on ground
{
ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#C4_Defuse_Must_Be_On_Ground");
return;
}
#endif
if (m_bStartDefuse)
{
m_fNextDefuse = gpGlobals->time + NEXT_DEFUSE_TIME;
return;
}
// freeze the player in place while defusing // freeze the player in place while defusing
SET_CLIENT_MAXSPEED(pPlayer->edict(), 1); SET_CLIENT_MAXSPEED(pPlayer->edict(), 1);
if (TheBots) if (TheBots)
{ {
TheBots->OnEvent(EVENT_BOMB_DEFUSING, pActivator); TheBots->OnEvent(EVENT_BOMB_DEFUSING, pPlayer);
} }
if (CSGameRules()->IsCareer() && TheCareerTasks) if (CSGameRules()->IsCareer() && TheCareerTasks)
@ -1013,7 +1001,7 @@ void CGrenade::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useTy
} }
pPlayer->m_bIsDefusing = true; pPlayer->m_bIsDefusing = true;
m_pBombDefuser = static_cast<CBasePlayer *>(pActivator); m_pBombDefuser = pPlayer;
m_bStartDefuse = true; m_bStartDefuse = true;
m_fNextDefuse = gpGlobals->time + NEXT_DEFUSE_TIME; m_fNextDefuse = gpGlobals->time + NEXT_DEFUSE_TIME;
@ -1024,7 +1012,156 @@ void CGrenade::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useTy
#endif #endif
} }
CGrenade *CGrenade::ShootSatchelCharge(entvars_t *pevOwner, Vector vecStart, Vector vecAngles) LINK_HOOK_CLASS_VOID_CHAIN(CGrenade, DefuseBombEnd, (CBasePlayer *pPlayer, bool bDefused), pPlayer, bDefused)
void CGrenade::__API_HOOK(DefuseBombEnd)(CBasePlayer *pPlayer, bool bDefused)
{
if (bDefused)
{
// if the defuse process has ended, kill the c4
if (m_pBombDefuser->pev->deadflag == DEAD_NO)
{
#ifdef REGAMEDLL_ADD
if (!old_bomb_defused_sound.value)
#endif
{
Broadcast("BOMBDEF");
}
if (TheBots)
{
TheBots->OnEvent(EVENT_BOMB_DEFUSED, (CBaseEntity *)m_pBombDefuser);
}
MESSAGE_BEGIN(MSG_SPEC, SVC_DIRECTOR);
WRITE_BYTE(9);
WRITE_BYTE(DRC_CMD_EVENT);
WRITE_SHORT(ENTINDEX(m_pBombDefuser->edict()));
WRITE_SHORT(0);
WRITE_LONG(15 | DRC_FLAG_FINAL | DRC_FLAG_FACEPLAYER | DRC_FLAG_DRAMATIC);
MESSAGE_END();
UTIL_LogPrintf("\"%s<%i><%s><CT>\" triggered \"Defused_The_Bomb\"\n",
STRING(m_pBombDefuser->pev->netname),
GETPLAYERUSERID(m_pBombDefuser->edict()),
GETPLAYERAUTHID(m_pBombDefuser->edict()));
UTIL_EmitAmbientSound(ENT(pev), pev->origin, "weapons/c4_beep5.wav", 0, ATTN_NONE, SND_STOP, 0);
EMIT_SOUND(ENT(m_pBombDefuser->pev), CHAN_WEAPON, "weapons/c4_disarmed.wav", VOL_NORM, ATTN_NORM);
UTIL_Remove(this);
m_bJustBlew = true;
// release the player from being frozen
pPlayer->ResetMaxSpeed();
pPlayer->m_bIsDefusing = false;
MESSAGE_BEGIN(MSG_ALL, gmsgScenarioIcon);
WRITE_BYTE(0);
MESSAGE_END();
if (CSGameRules()->IsCareer() && !pPlayer->IsBot())
{
if (TheCareerTasks)
{
TheCareerTasks->HandleEvent(EVENT_BOMB_DEFUSED, pPlayer);
}
}
CSGameRules()->m_bBombDefused = true;
CSGameRules()->CheckWinConditions();
// give the defuser credit for defusing the bomb
m_pBombDefuser->pev->frags += 3.0f;
MESSAGE_BEGIN(MSG_ALL, gmsgBombPickup);
MESSAGE_END();
g_pGameRules->m_bBombDropped = FALSE;
m_pBombDefuser = nullptr;
m_bStartDefuse = false;
}
else
{
// if it gets here then the previouse defuser has taken off or been killed
// release the player from being frozen
pPlayer->ResetMaxSpeed();
pPlayer->m_bIsDefusing = false;
m_bStartDefuse = false;
m_pBombDefuser = nullptr;
#ifdef REGAMEDLL_FIXES
pPlayer->SetProgressBarTime(0);
#endif
// tell the bots someone has aborted defusing
if (TheBots)
{
TheBots->OnEvent(EVENT_BOMB_DEFUSE_ABORTED);
}
}
}
else
{
int iOnGround = ((m_pBombDefuser->pev->flags & FL_ONGROUND) == FL_ONGROUND);
if (!iOnGround)
{
ClientPrint(m_pBombDefuser->pev, HUD_PRINTCENTER, "#C4_Defuse_Must_Be_On_Ground");
}
// release the player from being frozen
pPlayer->ResetMaxSpeed();
pPlayer->m_bIsDefusing = false;
// cancel the progress bar
pPlayer->SetProgressBarTime(0);
m_pBombDefuser = nullptr;
m_bStartDefuse = false;
m_flDefuseCountDown = 0;
// tell the bots someone has aborted defusing
if (TheBots)
{
TheBots->OnEvent(EVENT_BOMB_DEFUSE_ABORTED);
}
}
}
void CGrenade::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value)
{
if (!m_bIsC4)
return;
// TODO: We must be sure that the activator is a player.
CBasePlayer *pPlayer = GetClassPtr<CCSPlayer>((CBasePlayer *)pActivator->pev);
// For CTs to defuse the c4
if (pPlayer->m_iTeam != CT)
{
return;
}
#ifdef REGAMEDLL_FIXES
if((pPlayer->pev->flags & FL_ONGROUND) != FL_ONGROUND) // Defuse should start only on ground
{
ClientPrint(pPlayer->pev, HUD_PRINTCENTER, "#C4_Defuse_Must_Be_On_Ground");
return;
}
#endif
if (m_bStartDefuse)
{
m_fNextDefuse = gpGlobals->time + NEXT_DEFUSE_TIME;
return;
}
DefuseBombStart(pPlayer);
}
LINK_HOOK_CUSTOM2_CHAIN(CGrenade *, PlantBomb, CGrenade::ShootSatchelCharge, (entvars_t *pevOwner, Vector vecStart, Vector vecAngles), pevOwner, vecStart, vecAngles)
CGrenade *CGrenade::__API_HOOK(ShootSatchelCharge)(entvars_t *pevOwner, VectorRef vecStart, VectorRef vecAngles)
{ {
CGrenade *pGrenade = GetClassPtr<CCSGrenade>((CGrenade *)nullptr); CGrenade *pGrenade = GetClassPtr<CCSGrenade>((CGrenade *)nullptr);
pGrenade->pev->movetype = MOVETYPE_TOSS; pGrenade->pev->movetype = MOVETYPE_TOSS;
@ -1084,7 +1221,9 @@ CGrenade *CGrenade::ShootSatchelCharge(entvars_t *pevOwner, Vector vecStart, Vec
return pGrenade; return pGrenade;
} }
CGrenade *CGrenade::ShootSmokeGrenade(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time, unsigned short usEvent) LINK_HOOK_CUSTOM2_CHAIN(CGrenade *, ThrowSmokeGrenade, CGrenade::ShootSmokeGrenade, (entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time, unsigned short usEvent), pevOwner, vecStart, vecVelocity, time, usEvent)
CGrenade *CGrenade::__API_HOOK(ShootSmokeGrenade)(entvars_t *pevOwner, VectorRef vecStart, VectorRef vecVelocity, float time, unsigned short usEvent)
{ {
CGrenade *pGrenade = GetClassPtr<CCSGrenade>((CGrenade *)nullptr); CGrenade *pGrenade = GetClassPtr<CCSGrenade>((CGrenade *)nullptr);
pGrenade->Spawn(); pGrenade->Spawn();
@ -1263,7 +1402,6 @@ void CGrenade::C4Think()
{ {
SetThink(&CGrenade::Detonate2); SetThink(&CGrenade::Detonate2);
} }
} }
// if the defusing process has started // if the defusing process has started
@ -1279,110 +1417,12 @@ void CGrenade::C4Think()
// if the bomb defuser has stopped defusing the bomb // if the bomb defuser has stopped defusing the bomb
if (gpGlobals->time > m_fNextDefuse || !iOnGround) if (gpGlobals->time > m_fNextDefuse || !iOnGround)
{ {
if (!iOnGround) DefuseBombEnd(pPlayer, false);
{
ClientPrint(m_pBombDefuser->pev, HUD_PRINTCENTER, "#C4_Defuse_Must_Be_On_Ground");
}
// release the player from being frozen
pPlayer->ResetMaxSpeed();
pPlayer->m_bIsDefusing = false;
// cancel the progress bar
pPlayer->SetProgressBarTime(0);
m_pBombDefuser = nullptr;
m_bStartDefuse = false;
m_flDefuseCountDown = 0;
// tell the bots someone has aborted defusing
if (TheBots)
{
TheBots->OnEvent(EVENT_BOMB_DEFUSE_ABORTED);
}
} }
} }
// if the defuse process has ended, kill the c4
else if (m_pBombDefuser->pev->deadflag == DEAD_NO)
{
#ifdef REGAMEDLL_ADD
if (!old_bomb_defused_sound.value)
#endif
{
Broadcast("BOMBDEF");
}
if (TheBots)
{
TheBots->OnEvent(EVENT_BOMB_DEFUSED, (CBaseEntity *)m_pBombDefuser);
}
MESSAGE_BEGIN(MSG_SPEC, SVC_DIRECTOR);
WRITE_BYTE(9);
WRITE_BYTE(DRC_CMD_EVENT);
WRITE_SHORT(ENTINDEX(m_pBombDefuser->edict()));
WRITE_SHORT(0);
WRITE_LONG(15 | DRC_FLAG_FINAL | DRC_FLAG_FACEPLAYER | DRC_FLAG_DRAMATIC);
MESSAGE_END();
UTIL_LogPrintf("\"%s<%i><%s><CT>\" triggered \"Defused_The_Bomb\"\n",
STRING(m_pBombDefuser->pev->netname),
GETPLAYERUSERID(m_pBombDefuser->edict()),
GETPLAYERAUTHID(m_pBombDefuser->edict()));
UTIL_EmitAmbientSound(ENT(pev), pev->origin, "weapons/c4_beep5.wav", 0, ATTN_NONE, SND_STOP, 0);
EMIT_SOUND(ENT(m_pBombDefuser->pev), CHAN_WEAPON, "weapons/c4_disarmed.wav", VOL_NORM, ATTN_NORM);
UTIL_Remove(this);
m_bJustBlew = true;
// release the player from being frozen
pPlayer->ResetMaxSpeed();
pPlayer->m_bIsDefusing = false;
MESSAGE_BEGIN(MSG_ALL, gmsgScenarioIcon);
WRITE_BYTE(0);
MESSAGE_END();
if (CSGameRules()->IsCareer() && !pPlayer->IsBot())
{
if (TheCareerTasks)
{
TheCareerTasks->HandleEvent(EVENT_BOMB_DEFUSED, pPlayer);
}
}
CSGameRules()->m_bBombDefused = true;
CSGameRules()->CheckWinConditions();
// give the defuser credit for defusing the bomb
m_pBombDefuser->pev->frags += 3.0f;
MESSAGE_BEGIN(MSG_ALL, gmsgBombPickup);
MESSAGE_END();
g_pGameRules->m_bBombDropped = FALSE;
m_pBombDefuser = nullptr;
m_bStartDefuse = false;
}
else else
{ {
// if it gets here then the previouse defuser has taken off or been killed DefuseBombEnd(pPlayer, true);
// release the player from being frozen
pPlayer->ResetMaxSpeed();
pPlayer->m_bIsDefusing = false;
m_bStartDefuse = false;
m_pBombDefuser = nullptr;
#ifdef REGAMEDLL_FIXES
pPlayer->SetProgressBarTime(0);
#endif
// tell the bots someone has aborted defusing
if (TheBots)
{
TheBots->OnEvent(EVENT_BOMB_DEFUSE_ABORTED);
}
} }
} }
} }

View File

@ -85,7 +85,9 @@ void EXT_FUNC CHalfLifeMultiplay::__API_HOOK(ServerDeactivate)()
UTIL_LogPrintf("Career End\n"); UTIL_LogPrintf("Career End\n");
} }
bool CCStrikeGameMgrHelper::CanPlayerHearPlayer(CBasePlayer *pListener, CBasePlayer *pSender) LINK_HOOK_CLASS_CUSTOM_CHAIN(bool, CCStrikeGameMgrHelper, CSGameRules, CanPlayerHearPlayer, (CBasePlayer *pListener, CBasePlayer *pSender), pListener, pSender)
bool CCStrikeGameMgrHelper::__API_HOOK(CanPlayerHearPlayer)(CBasePlayer *pListener, CBasePlayer *pSender)
{ {
#ifdef REGAMEDLL_ADD #ifdef REGAMEDLL_ADD
switch ((int)sv_alltalk.value) switch ((int)sv_alltalk.value)
@ -489,6 +491,7 @@ CHalfLifeMultiplay::CHalfLifeMultiplay()
m_flEscapeRatio = 0.0f; m_flEscapeRatio = 0.0f;
m_flTimeLimit = 0.0f; m_flTimeLimit = 0.0f;
m_flGameStartTime = 0.0f; m_flGameStartTime = 0.0f;
m_bTeamBalanced = false;
#ifndef REGAMEDLL_FIXES #ifndef REGAMEDLL_FIXES
g_pMPGameRules = this; g_pMPGameRules = this;
@ -1446,8 +1449,10 @@ LINK_HOOK_CLASS_VOID_CUSTOM_CHAIN2(CHalfLifeMultiplay, CSGameRules, BalanceTeams
void EXT_FUNC CHalfLifeMultiplay::__API_HOOK(BalanceTeams)() void EXT_FUNC CHalfLifeMultiplay::__API_HOOK(BalanceTeams)()
{ {
int iTeamToSwap = UNASSIGNED;
int iNumToSwap; int iNumToSwap;
TeamName iTeamToSwap = UNASSIGNED;
m_bTeamBalanced = false;
// The ratio for teams is different for Assasination maps // The ratio for teams is different for Assasination maps
if (m_bMapHasVIPSafetyZone) if (m_bMapHasVIPSafetyZone)
@ -1522,7 +1527,7 @@ void EXT_FUNC CHalfLifeMultiplay::__API_HOOK(BalanceTeams)()
CBasePlayer *pPlayer = GetClassPtr<CCSPlayer>((CBasePlayer *)pEntity->pev); CBasePlayer *pPlayer = GetClassPtr<CCSPlayer>((CBasePlayer *)pEntity->pev);
if (pPlayer->m_iTeam == iTeamToSwap && GETPLAYERUSERID(pPlayer->edict()) > iHighestUserID && m_pVIP != pPlayer) if (pPlayer->CanSwitchTeam(iTeamToSwap) && GETPLAYERUSERID(pPlayer->edict()) > iHighestUserID)
{ {
iHighestUserID = GETPLAYERUSERID(pPlayer->edict()); iHighestUserID = GETPLAYERUSERID(pPlayer->edict());
toSwap = pPlayer; toSwap = pPlayer;
@ -1530,7 +1535,9 @@ void EXT_FUNC CHalfLifeMultiplay::__API_HOOK(BalanceTeams)()
} }
if (toSwap) { if (toSwap) {
m_bTeamBalanced = true;
toSwap->SwitchTeam(); toSwap->SwitchTeam();
m_bTeamBalanced = false;
} }
} }
} }

View File

@ -1248,7 +1248,7 @@ void PackPlayerItem(CBasePlayer *pPlayer, CBasePlayerItem *pItem, bool packAmmo)
pWeaponBox->PackAmmo(MAKE_STRING(pItem->pszAmmo1()), pPlayer->m_rgAmmo[pItem->PrimaryAmmoIndex()]); pWeaponBox->PackAmmo(MAKE_STRING(pItem->pszAmmo1()), pPlayer->m_rgAmmo[pItem->PrimaryAmmoIndex()]);
} }
SET_MODEL(ENT(pWeaponBox->pev), modelName); pWeaponBox->SetModel(modelName);
} }
} }
@ -1304,7 +1304,7 @@ void PackPlayerNade(CBasePlayer *pPlayer, CBasePlayerItem *pItem, bool packAmmo)
pWeaponBox->PackAmmo(MAKE_STRING(pItem->pszAmmo1()), pPlayer->m_rgAmmo[pItem->PrimaryAmmoIndex()]); pWeaponBox->PackAmmo(MAKE_STRING(pItem->pszAmmo1()), pPlayer->m_rgAmmo[pItem->PrimaryAmmoIndex()]);
} }
SET_MODEL(ENT(pWeaponBox->pev), modelName); pWeaponBox->SetModel(modelName);
} }
} }
#endif #endif
@ -1936,7 +1936,7 @@ void EXT_FUNC CBasePlayer::__API_HOOK(Killed)(entvars_t *pevAttacker, int iGib)
CHEGrenade *pHEGrenade = static_cast<CHEGrenade *>(m_pActiveItem); CHEGrenade *pHEGrenade = static_cast<CHEGrenade *>(m_pActiveItem);
if ((pev->button & IN_ATTACK) && m_rgAmmo[pHEGrenade->m_iPrimaryAmmoType]) if ((pev->button & IN_ATTACK) && m_rgAmmo[pHEGrenade->m_iPrimaryAmmoType])
{ {
CGrenade::ShootTimed2(pev, (pev->origin + pev->view_ofs), pev->angles, 1.5, m_iTeam, pHEGrenade->m_usCreateExplosion); ThrowGrenade(pHEGrenade, (pev->origin + pev->view_ofs), pev->angles, 1.5, pHEGrenade->m_usCreateExplosion);
#ifdef REGAMEDLL_FIXES #ifdef REGAMEDLL_FIXES
m_rgAmmo[m_pActiveItem->PrimaryAmmoIndex()]--; m_rgAmmo[m_pActiveItem->PrimaryAmmoIndex()]--;
@ -1946,9 +1946,10 @@ void EXT_FUNC CBasePlayer::__API_HOOK(Killed)(entvars_t *pevAttacker, int iGib)
} }
case WEAPON_FLASHBANG: case WEAPON_FLASHBANG:
{ {
if ((pev->button & IN_ATTACK) && m_rgAmmo[((CBasePlayerWeapon *)m_pActiveItem)->m_iPrimaryAmmoType]) CFlashbang *pFlashbang = static_cast<CFlashbang *>(m_pActiveItem);
if ((pev->button & IN_ATTACK) && m_rgAmmo[pFlashbang->m_iPrimaryAmmoType])
{ {
CGrenade::ShootTimed(pev, (pev->origin + pev->view_ofs), pev->angles, 1.5); ThrowGrenade(pFlashbang, (pev->origin + pev->view_ofs), pev->angles, 1.5);
#ifdef REGAMEDLL_FIXES #ifdef REGAMEDLL_FIXES
m_rgAmmo[m_pActiveItem->PrimaryAmmoIndex()]--; m_rgAmmo[m_pActiveItem->PrimaryAmmoIndex()]--;
@ -1961,7 +1962,7 @@ void EXT_FUNC CBasePlayer::__API_HOOK(Killed)(entvars_t *pevAttacker, int iGib)
CSmokeGrenade *pSmoke = static_cast<CSmokeGrenade *>(m_pActiveItem); CSmokeGrenade *pSmoke = static_cast<CSmokeGrenade *>(m_pActiveItem);
if ((pev->button & IN_ATTACK) && m_rgAmmo[pSmoke->m_iPrimaryAmmoType]) if ((pev->button & IN_ATTACK) && m_rgAmmo[pSmoke->m_iPrimaryAmmoType])
{ {
CGrenade::ShootSmokeGrenade(pev, (pev->origin + pev->view_ofs), pev->angles, 1.5, pSmoke->m_usCreateSmoke); ThrowGrenade(pSmoke, (pev->origin + pev->view_ofs), pev->angles, 1.5, pSmoke->m_usCreateSmoke);
#ifdef REGAMEDLL_FIXES #ifdef REGAMEDLL_FIXES
m_rgAmmo[m_pActiveItem->PrimaryAmmoIndex()]--; m_rgAmmo[m_pActiveItem->PrimaryAmmoIndex()]--;
@ -3058,6 +3059,20 @@ NOXREF void CBasePlayer::ThrowPrimary()
DropShield(); DropShield();
} }
LINK_HOOK_CLASS_CHAIN(CGrenade *, CBasePlayer, ThrowGrenade, (CBasePlayerWeapon *pWeapon, Vector vecSrc, Vector vecThrow, float time, unsigned short usEvent), pWeapon, vecSrc, vecThrow, time, usEvent)
CGrenade *CBasePlayer::__API_HOOK(ThrowGrenade)(CBasePlayerWeapon *pWeapon, VectorRef vecSrc, VectorRef vecThrow, float time, unsigned short usEvent)
{
switch (pWeapon->m_iId)
{
case WEAPON_HEGRENADE: return CGrenade::ShootTimed2(pev, vecSrc, vecThrow, time, m_iTeam, usEvent);
case WEAPON_FLASHBANG: return CGrenade::ShootTimed(pev, vecSrc, vecThrow, time);
case WEAPON_SMOKEGRENADE: return CGrenade::ShootSmokeGrenade(pev, vecSrc, vecThrow, time, usEvent);
}
return nullptr;
}
LINK_HOOK_CLASS_VOID_CHAIN(CBasePlayer, AddAccount, (int amount, RewardType type, bool bTrackChange), amount, type, bTrackChange) LINK_HOOK_CLASS_VOID_CHAIN(CBasePlayer, AddAccount, (int amount, RewardType type, bool bTrackChange), amount, type, bTrackChange)
#ifdef REGAMEDLL_ADD #ifdef REGAMEDLL_ADD
@ -7429,7 +7444,7 @@ CBaseEntity *EXT_FUNC CBasePlayer::__API_HOOK(DropPlayerItem)(const char *pszIte
const char *modelname = GetCSModelName(pWeapon->m_iId); const char *modelname = GetCSModelName(pWeapon->m_iId);
if (modelname) if (modelname)
{ {
SET_MODEL(ENT(pWeaponBox->pev), modelname); pWeaponBox->SetModel(modelname);
} }
return pWeaponBox; return pWeaponBox;
@ -7470,7 +7485,9 @@ bool CBasePlayer::HasNamedPlayerItem(const char *pszItemName)
return false; return false;
} }
void CBasePlayer::SwitchTeam() LINK_HOOK_CLASS_VOID_CHAIN2(CBasePlayer, SwitchTeam)
void CBasePlayer::__API_HOOK(SwitchTeam)()
{ {
int oldTeam; int oldTeam;
char *szOldTeam; char *szOldTeam;
@ -9483,3 +9500,19 @@ void CBasePlayer::PlayerRespawnThink()
} }
#endif #endif
} }
LINK_HOOK_CLASS_CHAIN(bool, CBasePlayer, CanSwitchTeam, (TeamName teamToSwap), teamToSwap)
bool CBasePlayer::__API_HOOK(CanSwitchTeam)(TeamName teamToSwap)
{
if (m_iTeam != teamToSwap)
return false;
// we won't VIP player to switch team
if (CSGameRules()->m_pVIP == this)
{
return false;
}
return true;
}

View File

@ -417,6 +417,9 @@ public:
bool MakeBomber_OrigFunc(); bool MakeBomber_OrigFunc();
bool GetIntoGame_OrigFunc(); bool GetIntoGame_OrigFunc();
void StartDeathCam_OrigFunc(); void StartDeathCam_OrigFunc();
CGrenade *ThrowGrenade_OrigFunc(CBasePlayerWeapon *pWeapon, VectorRef vecSrc, VectorRef vecThrow, float time, unsigned short usEvent = 0);
void SwitchTeam_OrigFunc();
bool CanSwitchTeam_OrigFunc(TeamName teamToSwap);
CCSPlayer *CSPlayer() const; CCSPlayer *CSPlayer() const;
#endif // REGAMEDLL_API #endif // REGAMEDLL_API
@ -442,10 +445,12 @@ public:
void SmartRadio(); void SmartRadio();
void ThrowWeapon(char *pszItemName); void ThrowWeapon(char *pszItemName);
void ThrowPrimary(); void ThrowPrimary();
CGrenade *ThrowGrenade(CBasePlayerWeapon *pWeapon, Vector vecSrc, Vector vecThrow, float time, unsigned short usEvent = 0);
void AddAccount(int amount, RewardType type = RT_NONE, bool bTrackChange = true); void AddAccount(int amount, RewardType type = RT_NONE, bool bTrackChange = true);
void Disappear(); void Disappear();
void MakeVIP(); void MakeVIP();
bool CanPlayerBuy(bool display = false); bool CanPlayerBuy(bool display = false);
bool CanSwitchTeam(TeamName teamToSwap);
void SwitchTeam(); void SwitchTeam();
void TabulateAmmo(); void TabulateAmmo();
void Pain(int iLastHitGroup, bool bHasArmour); void Pain(int iLastHitGroup, bool bHasArmour);

View File

@ -1564,6 +1564,13 @@ void CWeaponBox::BombThink()
pev->nextthink = gpGlobals->time + 1.0f; pev->nextthink = gpGlobals->time + 1.0f;
} }
LINK_HOOK_CLASS_VOID_CHAIN(CWeaponBox, SetModel, (const char *pszModelName), pszModelName)
void CWeaponBox::__API_HOOK(SetModel)(const char *pszModelName)
{
SET_MODEL(ENT(pev), pszModelName);
}
void CWeaponBox::Spawn() void CWeaponBox::Spawn()
{ {
Precache(); Precache();

View File

@ -182,6 +182,9 @@ public:
SATCHEL_RELEASE, SATCHEL_RELEASE,
}; };
public: public:
void DefuseBombStart(CBasePlayer *pPlayer);
void DefuseBombEnd(CBasePlayer *pPlayer, bool bDefused);
static CGrenade *ShootTimed(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time); static CGrenade *ShootTimed(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time);
static CGrenade *ShootTimed2(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time, int iTeam, unsigned short usEvent); static CGrenade *ShootTimed2(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time, int iTeam, unsigned short usEvent);
static CGrenade *ShootContact(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity); static CGrenade *ShootContact(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity);
@ -195,6 +198,21 @@ public:
void Explode3(TraceResult *pTrace, int bitsDamageType); void Explode3(TraceResult *pTrace, int bitsDamageType);
void SG_Explode(TraceResult *pTrace, int bitsDamageType); void SG_Explode(TraceResult *pTrace, int bitsDamageType);
#ifdef REGAMEDLL_API
static CGrenade *ShootTimed_OrigFunc(entvars_t *pevOwner, VectorRef vecStart, VectorRef vecVelocity, float time);
static CGrenade *ShootTimed2_OrigFunc(entvars_t *pevOwner, VectorRef vecStart, VectorRef vecVelocity, float time, int iTeam, unsigned short usEvent);
static CGrenade *ShootSmokeGrenade_OrigFunc(entvars_t *pevOwner, VectorRef vecStart, VectorRef vecVelocity, float time, unsigned short usEvent);
static CGrenade *ShootSatchelCharge_OrigFunc(entvars_t *pevOwner, VectorRef vecStart, VectorRef vecVelocity);
void DefuseBombStart_OrigFunc(CBasePlayer *pPlayer);
void DefuseBombEnd_OrigFunc(CBasePlayer *pPlayer, bool bDefused);
void Explode_OrigFunc(TraceResult *pTrace, int bitsDamageType);
void Explode3_OrigFunc(TraceResult *pTrace, int bitsDamageType);
void Explode2_OrigFunc(TraceResult *pTrace, int bitsDamageType);
void SG_Detonate_OrigFunc();
#endif
void EXPORT Smoke(); void EXPORT Smoke();
void EXPORT Smoke2(); void EXPORT Smoke2();
void EXPORT Smoke3_A(); void EXPORT Smoke3_A();
@ -447,11 +465,16 @@ public:
void EXPORT Kill(); void EXPORT Kill();
void EXPORT BombThink(); void EXPORT BombThink();
void SetModel(const char *pszModelName);
BOOL HasWeapon(CBasePlayerItem *pCheckItem); BOOL HasWeapon(CBasePlayerItem *pCheckItem);
BOOL PackWeapon(CBasePlayerItem *pWeapon); BOOL PackWeapon(CBasePlayerItem *pWeapon);
BOOL PackAmmo(string_t iszName, int iCount); BOOL PackAmmo(string_t iszName, int iCount);
#ifdef REGAMEDLL_API
void SetModel_OrigFunc(const char *pszModelName);
#endif
public: public:
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];

View File

@ -193,7 +193,7 @@ void CFlashbang::WeaponIdle()
Vector vecSrc = m_pPlayer->pev->origin + m_pPlayer->pev->view_ofs + gpGlobals->v_forward * 16; Vector vecSrc = m_pPlayer->pev->origin + m_pPlayer->pev->view_ofs + gpGlobals->v_forward * 16;
Vector vecThrow = gpGlobals->v_forward * flVel + m_pPlayer->pev->velocity; Vector vecThrow = gpGlobals->v_forward * flVel + m_pPlayer->pev->velocity;
CGrenade::ShootTimed(m_pPlayer->pev, vecSrc, vecThrow, 1.5); m_pPlayer->ThrowGrenade(this, vecSrc, vecThrow, 1.5);
SendWeaponAnim(FLASHBANG_THROW, UseDecrement() != FALSE); SendWeaponAnim(FLASHBANG_THROW, UseDecrement() != FALSE);
SetPlayerShieldAnim(); SetPlayerShieldAnim();

View File

@ -194,7 +194,7 @@ void CHEGrenade::WeaponIdle()
Vector vecSrc = m_pPlayer->pev->origin + m_pPlayer->pev->view_ofs + gpGlobals->v_forward * 16; Vector vecSrc = m_pPlayer->pev->origin + m_pPlayer->pev->view_ofs + gpGlobals->v_forward * 16;
Vector vecThrow = gpGlobals->v_forward * flVel + m_pPlayer->pev->velocity; Vector vecThrow = gpGlobals->v_forward * flVel + m_pPlayer->pev->velocity;
CGrenade::ShootTimed2(m_pPlayer->pev, vecSrc, vecThrow, 1.5, m_pPlayer->m_iTeam, m_usCreateExplosion); m_pPlayer->ThrowGrenade(this, vecSrc, vecThrow, 1.5, m_usCreateExplosion);
SendWeaponAnim(HEGRENADE_THROW, UseDecrement() != FALSE); SendWeaponAnim(HEGRENADE_THROW, UseDecrement() != FALSE);
SetPlayerShieldAnim(); SetPlayerShieldAnim();

View File

@ -195,7 +195,7 @@ void CSmokeGrenade::WeaponIdle()
Vector vecSrc = m_pPlayer->pev->origin + m_pPlayer->pev->view_ofs + gpGlobals->v_forward * 16.0f; Vector vecSrc = m_pPlayer->pev->origin + m_pPlayer->pev->view_ofs + gpGlobals->v_forward * 16.0f;
Vector vecThrow = gpGlobals->v_forward * flVel + m_pPlayer->pev->velocity; Vector vecThrow = gpGlobals->v_forward * flVel + m_pPlayer->pev->velocity;
CGrenade::ShootSmokeGrenade(m_pPlayer->pev, vecSrc, vecThrow, 1.5, m_usCreateSmoke); m_pPlayer->ThrowGrenade(this, vecSrc, vecThrow, 1.5, m_usCreateSmoke);
SendWeaponAnim(SMOKEGRENADE_THROW, UseDecrement() != FALSE); SendWeaponAnim(SMOKEGRENADE_THROW, UseDecrement() != FALSE);
SetPlayerShieldAnim(); SetPlayerShieldAnim();

View File

@ -30,15 +30,15 @@
#include "archtypes.h" #include "archtypes.h"
#include <API/CSInterfaces.h>
#include <hookchains.h> #include <hookchains.h>
#include <interface.h> #include <interface.h>
#include <player.h> #include <cbase.h>
#include <gamerules.h> #include <gamerules.h>
#include <client.h> #include <client.h>
#include <API/CSInterfaces.h>
#define REGAMEDLL_API_VERSION_MAJOR 5 #define REGAMEDLL_API_VERSION_MAJOR 5
#define REGAMEDLL_API_VERSION_MINOR 4 #define REGAMEDLL_API_VERSION_MINOR 5
// CBasePlayer::Spawn hook // CBasePlayer::Spawn hook
typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_Spawn; typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_Spawn;
@ -356,6 +356,10 @@ typedef IHookChainRegistry<void> IReGameHookRegistry_CSGameRules_BalanceTeams;
typedef IHookChain<void> IReGameHook_CSGameRules_OnRoundFreezeEnd; typedef IHookChain<void> IReGameHook_CSGameRules_OnRoundFreezeEnd;
typedef IHookChainRegistry<void> IReGameHookRegistry_CSGameRules_OnRoundFreezeEnd; typedef IHookChainRegistry<void> IReGameHookRegistry_CSGameRules_OnRoundFreezeEnd;
// CSGameRules::CanPlayerHearPlayer hook
typedef IHookChain<bool, class CBasePlayer *, class CBasePlayer *> IReGameHook_CSGameRules_CanPlayerHearPlayer;
typedef IHookChainRegistry<bool, class CBasePlayer *, class CBasePlayer *> IReGameHookRegistry_CSGameRules_CanPlayerHearPlayer;
// PM_UpdateStepSound hook // PM_UpdateStepSound hook
typedef IHookChain<void> IReGameHook_PM_UpdateStepSound; typedef IHookChain<void> IReGameHook_PM_UpdateStepSound;
typedef IHookChainRegistry<void> IReGameHookRegistry_PM_UpdateStepSound; typedef IHookChainRegistry<void> IReGameHookRegistry_PM_UpdateStepSound;
@ -364,6 +368,62 @@ typedef IHookChainRegistry<void> IReGameHookRegistry_PM_UpdateStepSound;
typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_StartDeathCam; typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_StartDeathCam;
typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_StartDeathCam; typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_StartDeathCam;
// CBasePlayer::SwitchTeam hook
typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_SwitchTeam;
typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_SwitchTeam;
// CBasePlayer::CanSwitchTeam hook
typedef IHookChainClass<bool, class CBasePlayer, TeamName> IReGameHook_CBasePlayer_CanSwitchTeam;
typedef IHookChainRegistryClass<bool, class CBasePlayer, TeamName> IReGameHookRegistry_CBasePlayer_CanSwitchTeam;
// CBasePlayer::ThrowGrenade hook
typedef IHookChainClass<class CGrenade *, class CBasePlayer, class CBasePlayerWeapon *, Vector &, Vector &, float, unsigned short> IReGameHook_CBasePlayer_ThrowGrenade;
typedef IHookChainRegistryClass<class CGrenade *, class CBasePlayer, class CBasePlayerWeapon *, Vector &, Vector &, float, unsigned short> IReGameHookRegistry_CBasePlayer_ThrowGrenade;
// CWeaponBox::SetModel hook
typedef IHookChainClass<void, class CWeaponBox, const char *> IReGameHook_CWeaponBox_SetModel;
typedef IHookChainRegistryClass<void, class CWeaponBox, const char *> IReGameHookRegistry_CWeaponBox_SetModel;
// CGrenade::DefuseBombStart hook
typedef IHookChainClass<void, class CGrenade, class CBasePlayer *> IReGameHook_CGrenade_DefuseBombStart;
typedef IHookChainRegistryClass<void, class CGrenade, class CBasePlayer *> IReGameHookRegistry_CGrenade_DefuseBombStart;
// CGrenade::DefuseBombEnd hook
typedef IHookChainClass<void, class CGrenade, class CBasePlayer *, bool> IReGameHook_CGrenade_DefuseBombEnd;
typedef IHookChainRegistryClass<void, class CGrenade, class CBasePlayer *, bool> IReGameHookRegistry_CGrenade_DefuseBombEnd;
// CGrenade::ExplodeHeGrenade hook
typedef IHookChainClass<void, class CGrenade, struct TraceResult *, int> IReGameHook_CGrenade_ExplodeHeGrenade;
typedef IHookChainRegistryClass<void, class CGrenade, struct TraceResult *, int> IReGameHookRegistry_CGrenade_ExplodeHeGrenade;
// CGrenade::ExplodeFlashbang hook
typedef IHookChainClass<void, class CGrenade, struct TraceResult *, int> IReGameHook_CGrenade_ExplodeFlashbang;
typedef IHookChainRegistryClass<void, class CGrenade, struct TraceResult *, int> IReGameHookRegistry_CGrenade_ExplodeFlashbang;
// CGrenade::ExplodeSmokeGrenade hook
typedef IHookChainClass<void, class CGrenade> IReGameHook_CGrenade_ExplodeSmokeGrenade;
typedef IHookChainRegistryClass<void, class CGrenade> IReGameHookRegistry_CGrenade_ExplodeSmokeGrenade;
// CGrenade::ExplodeBomb hook
typedef IHookChainClass<void, class CGrenade, struct TraceResult *, int> IReGameHook_CGrenade_ExplodeBomb;
typedef IHookChainRegistryClass<void, class CGrenade, struct TraceResult *, int> IReGameHookRegistry_CGrenade_ExplodeBomb;
// ThrowHeGrenade hook
typedef IHookChain<class CGrenade *, entvars_t *, Vector &, Vector &, float, int, unsigned short> IReGameHook_ThrowHeGrenade;
typedef IHookChainRegistry<class CGrenade *, entvars_t *, Vector &, Vector &, float, int, unsigned short> IReGameHookRegistry_ThrowHeGrenade;
// ThrowFlashbang hook
typedef IHookChain<class CGrenade *, entvars_t *, Vector &, Vector &, float> IReGameHook_ThrowFlashbang;
typedef IHookChainRegistry<class CGrenade *, entvars_t *, Vector &, Vector &, float> IReGameHookRegistry_ThrowFlashbang;
// ThrowSmokeGrenade hook
typedef IHookChain<class CGrenade *, entvars_t *, Vector &, Vector &, float, unsigned short> IReGameHook_ThrowSmokeGrenade;
typedef IHookChainRegistry<class CGrenade *, entvars_t *, Vector &, Vector &, float, unsigned short> IReGameHookRegistry_ThrowSmokeGrenade;
// PlantBomb hook
typedef IHookChain<class CGrenade *, entvars_t *, Vector &, Vector &> IReGameHook_PlantBomb;
typedef IHookChainRegistry<class CGrenade *, entvars_t *, Vector &, Vector &> IReGameHookRegistry_PlantBomb;
class IReGameHookchains { class IReGameHookchains {
public: public:
virtual ~IReGameHookchains() {} virtual ~IReGameHookchains() {}
@ -454,6 +514,21 @@ public:
virtual IReGameHookRegistry_CSGameRules_OnRoundFreezeEnd *CSGameRules_OnRoundFreezeEnd() = 0; virtual IReGameHookRegistry_CSGameRules_OnRoundFreezeEnd *CSGameRules_OnRoundFreezeEnd() = 0;
virtual IReGameHookRegistry_PM_UpdateStepSound *PM_UpdateStepSound() = 0; virtual IReGameHookRegistry_PM_UpdateStepSound *PM_UpdateStepSound() = 0;
virtual IReGameHookRegistry_CBasePlayer_StartDeathCam *CBasePlayer_StartDeathCam() = 0; virtual IReGameHookRegistry_CBasePlayer_StartDeathCam *CBasePlayer_StartDeathCam() = 0;
virtual IReGameHookRegistry_CBasePlayer_SwitchTeam *CBasePlayer_SwitchTeam() = 0;
virtual IReGameHookRegistry_CBasePlayer_CanSwitchTeam *CBasePlayer_CanSwitchTeam() = 0;
virtual IReGameHookRegistry_CBasePlayer_ThrowGrenade *CBasePlayer_ThrowGrenade() = 0;
virtual IReGameHookRegistry_CSGameRules_CanPlayerHearPlayer *CSGameRules_CanPlayerHearPlayer() = 0;
virtual IReGameHookRegistry_CWeaponBox_SetModel *CWeaponBox_SetModel() = 0;
virtual IReGameHookRegistry_CGrenade_DefuseBombStart *CGrenade_DefuseBombStart() = 0;
virtual IReGameHookRegistry_CGrenade_DefuseBombEnd *CGrenade_DefuseBombEnd() = 0;
virtual IReGameHookRegistry_CGrenade_ExplodeHeGrenade *CGrenade_ExplodeHeGrenade() = 0;
virtual IReGameHookRegistry_CGrenade_ExplodeFlashbang *CGrenade_ExplodeFlashbang() = 0;
virtual IReGameHookRegistry_CGrenade_ExplodeSmokeGrenade *CGrenade_ExplodeSmokeGrenade() = 0;
virtual IReGameHookRegistry_CGrenade_ExplodeBomb *CGrenade_ExplodeBomb() = 0;
virtual IReGameHookRegistry_ThrowHeGrenade *ThrowHeGrenade() = 0;
virtual IReGameHookRegistry_ThrowFlashbang *ThrowFlashbang() = 0;
virtual IReGameHookRegistry_ThrowSmokeGrenade *ThrowSmokeGrenade() = 0;
virtual IReGameHookRegistry_PlantBomb *PlantBomb() = 0;
}; };
struct ReGameFuncs_t { struct ReGameFuncs_t {