2
0
mirror of https://github.com/s1lentq/reapi.git synced 2024-10-16 15:27:06 +03:00

Added api hook RG_RoundEnd

Added natives rg_round_end, rg_update_teamscores
This commit is contained in:
s1lentq 2016-04-25 00:33:12 +06:00
parent 3000269b18
commit ea35220838
21 changed files with 337 additions and 165 deletions

View File

@ -17,13 +17,13 @@
#include <reapi_engine.inc> // NOTE: only for ReHLDS
#include <reapi_gamedll.inc> // NOTE: only for gamedll Counter-Strike (ReGameDLL_CS)
// return constants
// hookchain return type
enum
{
HC_CONTINUE = 0,
HC_OVERRIDE,
HC_SUPERCEDE,
HC_BREAK
HC_CONTINUE = 0, // plugin didn't take any action
HC_OVERRIDE, // call real function, but use my return value
HC_SUPERCEDE, // skip real function, use my return value
HC_BREAK // skip a call each forward in AMXX plugins
};
// hookchain types
@ -80,7 +80,7 @@ native bool:EnableHookChain(HookChain:hook);
*
* native SetHookChainReturn(AType:type, any:...);
*/
native SetHookChainReturn(HookChainReturn:type, any:...);
native SetHookChainReturn(AType:type, any:...);
/*
* Gets the return value of a hookchain.

View File

@ -65,3 +65,6 @@ native rg_multidmg_add(inflictor, victim, Float:flDamage, bitsDamageType);
native rg_fire_bullets(inflictor, attacker, shots, Float:vecSrc[3], Float:vecDirShooting[3], Float:vecSpread[3], Float:flDistance, iBulletType, iTracerFreq, iDamage);
native Float:[3] rg_fire_bullets3(inflictor, attacker, Float:vecSrc[3], Float:vecDirShooting[3], Float:vecSpread, Float:flDistance, iPenetration, iBulletType, iDamage, Float:flRangeModifier, bool:bPistol, shared_rand);
native rg_round_end(Float:tmDelay, WinStatus:st, ScenarionEventEndRound:event = ROUND_NONE, const message[] = "default", const sentence[] = "default");
native rg_update_teamscores(iCtsWins = 0, iTsWins = 0, bool:bAdd = true);

View File

@ -11,6 +11,35 @@
#define SIGNAL_ESCAPE (1<<3)
#define SIGNAL_VIPSAFETY (1<<4)
enum WinStatus
{
WINSTATUS_CTS = 1,
WINSTATUS_TERRORISTS,
WINSTATUS_DRAW,
};
// used for EndRoundMessage() logged messages
enum ScenarionEventEndRound
{
ROUND_NONE,
ROUND_TARGET_BOMB,
ROUND_VIP_ESCAPED,
ROUND_VIP_ASSASSINATED,
ROUND_TERRORISTS_ESCAPED,
ROUND_CTS_PREVENT_ESCAPE,
ROUND_ESCAPING_TERRORISTS_NEUTRALIZED,
ROUND_BOMB_DEFUSED,
ROUND_CTS_WIN,
ROUND_TERRORISTS_WIN,
ROUND_END_DRAW,
ROUND_ALL_HOSTAGES_RESCUED,
ROUND_TARGET_SAVED,
ROUND_HOSTAGE_NOT_RESCUED,
ROUND_TERRORISTS_NOT_ESCAPED,
ROUND_VIP_NOT_ESCAPED,
ROUND_GAME_COMMENCE,
};
enum PLAYER_ANIM
{
PLAYER_IDLE,
@ -33,22 +62,28 @@ enum GamedllFunc
* Return type: int
* Params: (const pObserver)
*/
RH_GetForceCamera = 1024,
RG_GetForceCamera = 1024,
/**
* Description: -
* Params: (const index, const inflictor, const attacker, const Float:fadeTime, const Float:fadeHold, const alpha, Float:color[3])
*/
RH_PlayerBlind,
RG_PlayerBlind,
/**
* Description: -
* Params: (const index, inflictor, attacker, Float:vecSrc[3], Float:vecSpot[3], tracehandle)
*/
RH_RadiusFlash_TraceLine,
RG_RadiusFlash_TraceLine,
/**
* Description: -
* Params: (WinStatus:status, ScenarionEventEndRound:event, Float:tmDelay)
*/
RG_RoundEnd,
// [...]
RH_GameDLL_End
RG_End
};
enum GamedllFunc_CBaseAnimating
@ -57,10 +92,10 @@ enum GamedllFunc_CBaseAnimating
* Description: -
* Params: (const this)
*/
RH_CBaseAnimating_ResetSequenceInfo = 2048,
RG_CBaseAnimating_ResetSequenceInfo = 2048,
// [...]
RH_CBaseAnimating_End
RG_CBaseAnimating_End
};
enum GamedllFunc_CBasePlayer
@ -69,20 +104,20 @@ enum GamedllFunc_CBasePlayer
* Description: -
* Params: (const this)
*/
RH_CBasePlayer_Spawn = 3072,
RG_CBasePlayer_Spawn = 3072,
/**
* Description: -
* Params: (const this)
*/
RH_CBasePlayer_Precache,
RG_CBasePlayer_Precache,
/**
* Description: -
* Return type: int
* Params: (const this)
*/
RH_CBasePlayer_ObjectCaps,
RG_CBasePlayer_ObjectCaps,
/**
@ -90,128 +125,128 @@ enum GamedllFunc_CBasePlayer
* Return type: int
* Params: (const this)
*/
RH_CBasePlayer_Classify,
RG_CBasePlayer_Classify,
/**
* Description: -
* Params: (const this, pevAttacker, Float:flDamage, Float:vecDir[3], tracehandle, bitsDamageType)
*/
RH_CBasePlayer_TraceAttack,
RG_CBasePlayer_TraceAttack,
/**
* Description: -
* Return type: int
* Params: (const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType)
*/
RH_CBasePlayer_TakeDamage,
RG_CBasePlayer_TakeDamage,
/**
* Description: -
* Params: (const this, Float:flHealth, bitsDamageType)
*/
RH_CBasePlayer_TakeHealth,
RG_CBasePlayer_TakeHealth,
/**
* Description: -
* Params: (const this, pevAttacker, iGib)
*/
RH_CBasePlayer_Killed,
RG_CBasePlayer_Killed,
/**
* Description: -
* Params: (const this, score, bAllowNegativeScore)
*/
RH_CBasePlayer_AddPoints,
RG_CBasePlayer_AddPoints,
/**
* Description: -
* Params: (const this, score, bAllowNegativeScore)
*/
RH_CBasePlayer_AddPointsToTeam,
RG_CBasePlayer_AddPointsToTeam,
/**
* Description: -
* Return type: BOOL
* Params: (const this, const pItem)
*/
RH_CBasePlayer_AddPlayerItem,
RG_CBasePlayer_AddPlayerItem,
/**
* Description: -
* Return type: BOOL
* Params: (const this, const pItem)
*/
RH_CBasePlayer_RemovePlayerItem,
RG_CBasePlayer_RemovePlayerItem,
/**
* Description: -
* Return type: int
* Params: (const this, iAmount, szName[], iMax)
*/
RH_CBasePlayer_GiveAmmo,
RG_CBasePlayer_GiveAmmo,
/**
* Description: -
* Params: (const this)
*/
RH_CBasePlayer_ResetMaxSpeed,
RG_CBasePlayer_ResetMaxSpeed,
/**
* Description: -
* Params: (const this)
*/
RH_CBasePlayer_Jump,
RG_CBasePlayer_Jump,
/**
* Description: -
* Params: (const this)
*/
RH_CBasePlayer_Duck,
RG_CBasePlayer_Duck,
/**
* Description: -
* Params: (const this)
*/
RH_CBasePlayer_PreThink,
RG_CBasePlayer_PreThink,
/**
* Description: -
* Params: (const this)
*/
RH_CBasePlayer_PostThink,
RG_CBasePlayer_PostThink,
/**
* Description: -
* Params: (const this)
*/
RH_CBasePlayer_UpdateClientData,
RG_CBasePlayer_UpdateClientData,
/**
* Description: -
* Params: (const this)
*/
RH_CBasePlayer_ImpulseCommands,
RG_CBasePlayer_ImpulseCommands,
/**
* Description: -
* Params: (const this)
*/
RH_CBasePlayer_RoundRespawn,
RG_CBasePlayer_RoundRespawn,
/**
* Description: -
* Params: (const this, Float:flUntilTime, Float:flHoldTime, Float:flFadeTime, iAlpha)
*/
RH_CBasePlayer_Blind,
RG_CBasePlayer_Blind,
/**
* Description: -
* Params: (const this, iPlayerIndex, bool:bSameTeam)
*/
RH_CBasePlayer_Observer_IsValidTarget,
RG_CBasePlayer_Observer_IsValidTarget,
// [...]
RH_CBasePlayer_End
RG_CBasePlayer_End
};
// CSGameRules

View File

@ -71,7 +71,8 @@ enum
// used for EndRoundMessage() logged messages
enum ScenarionEventEndRound
{
ROUND_TARGET_BOMB = 1,
ROUND_NONE,
ROUND_TARGET_BOMB,
ROUND_VIP_ESCAPED,
ROUND_VIP_ASSASSINATED,
ROUND_TERRORISTS_ESCAPED,
@ -375,6 +376,13 @@ public:
void MarkSpawnSkipped() { m_bSkipSpawn = false; }
float TimeRemaining() { return m_iRoundTimeSecs - gpGlobals->time + m_fRoundCount; }
bool IsMatchStarted() { return (m_fTeamCount != 0.0f || m_fCareerRoundMenuTime != 0.0f || m_fCareerMatchMenuTime != 0.0f); }
inline void TerminateRound(float tmDelay, int iWinStatus)
{
m_iRoundWinStatus = iWinStatus;
m_fTeamCount = gpGlobals->time + tmDelay;
m_bRoundTerminating = true;
}
public:
CVoiceGameMgr m_VoiceGameMgr;
float m_fTeamCount; // m_flRestartRoundTime, the global time when the round is supposed to end, if this is not 0
@ -458,6 +466,10 @@ public:
int m_iRoundWinDifference;
float m_fCareerMatchMenuTime;
bool m_bSkipSpawn;
// custom
bool m_bNeededPlayers;
float m_flEscapeRatio;
};
typedef struct mapcycle_item_s

View File

@ -68,6 +68,16 @@ public:
virtual void unregisterHook(hookfunc_t hook) = 0;
};
// Hook chain registry(for hooks [un]registration)
template<typename t_ret, typename ...t_args>
class IHookChainRegistryClassEmpty {
public:
typedef t_ret(*hookfunc_t)(IHookChain<t_ret, t_args...>*, t_args...);
virtual void registerHook(hookfunc_t hook) = 0;
virtual void unregisterHook(hookfunc_t hook) = 0;
};
// Hook chain registry(for hooks [un]registration)
template<typename ...t_args>
class IVoidHookChainRegistry {

View File

@ -170,6 +170,10 @@ typedef IVoidHookChainRegistry<class CBasePlayer *, struct entvars_s *, struct e
typedef IVoidHookChain<class CBasePlayer *, struct entvars_s *, struct entvars_s *, Vector &, Vector &, struct TraceResult *> IReGameHook_RadiusFlash_TraceLine;
typedef IVoidHookChainRegistry<class CBasePlayer *, struct entvars_s *, struct entvars_s *, Vector &, Vector &, struct TraceResult *> IReGameHookRegistry_RadiusFlash_TraceLine;
// RoundEnd hook
typedef IHookChain<bool, int, ScenarionEventEndRound, float> IReGameHook_RoundEnd;
typedef IHookChainRegistryClassEmpty<bool, int, ScenarionEventEndRound, float> IReGameHookRegistry_RoundEnd;
class IReGameHookchains {
public:
virtual ~IReGameHookchains() {}
@ -211,6 +215,7 @@ public:
virtual IReGameHookRegistry_GetForceCamera* GetForceCamera() = 0;
virtual IReGameHookRegistry_PlayerBlind* PlayerBlind() = 0;
virtual IReGameHookRegistry_RadiusFlash_TraceLine* RadiusFlash_TraceLine() = 0;
virtual IReGameHookRegistry_RoundEnd* RoundEnd() = 0;
};
@ -229,6 +234,8 @@ struct ReGameFuncs_t {
void (*ApplyMultiDamage)(entvars_t *pevInflictor, entvars_t *pevAttacker);
void (*AddMultiDamage)(entvars_t *pevInflictor, CBaseEntity *pEntity, float flDamage, int bitsDamageType);
void (*EndRoundMessage)(const char *sentence, int event);
};
class IReGameApi {

View File

@ -68,12 +68,12 @@ public:
virtual void SetObjectCollisionBox() = 0;
virtual int Classify() = 0;
virtual void DeathNotice(struct entvars_s *pevChild) = 0;
virtual void TraceAttack(struct entvars_s *pevAttacker, float flDamage, Vector vecDir, struct TraceResult *ptr, int bitsDamageType) = 0;
virtual void TraceAttack(struct entvars_s *pevAttacker, float flDamage, Vector &vecDir, struct TraceResult *ptr, int bitsDamageType) = 0;
virtual int TakeDamage(struct entvars_s *pevInflictor, struct entvars_s *pevAttacker, float flDamage, int bitsDamageType) = 0;
virtual int TakeHealth(float flHealth, int bitsDamageType) = 0;
virtual void Killed(struct entvars_s *pevAttacker, int iGib) = 0;
virtual int BloodColor() = 0;
virtual void TraceBleed(float flDamage, Vector vecDir, struct TraceResult *ptr, int bitsDamageType) = 0;
virtual void TraceBleed(float flDamage, Vector &vecDir, struct TraceResult *ptr, int bitsDamageType) = 0;
virtual bool IsTriggered(CCSEntity *pActivator) = 0;
virtual ICSMonster *MyMonsterPointer() = 0;
virtual ICSquadMonster *MySquadMonsterPointer() = 0;
@ -118,8 +118,8 @@ public:
public:
virtual struct entvars_s *GetEntVars() const = 0;
virtual class CBaseEntity *GetEntity() const = 0;
virtual void FireBullets(int iShots, Vector vecSrc, Vector vecDirShooting, Vector vecSpread, float flDistance, int iBulletType, int iTracerFreq, int iDamage, entvars_t *pevAttacker) = 0;
virtual Vector FireBullets3(Vector vecSrc, Vector vecDirShooting, float vecSpread, float flDistance, int iPenetration, int iBulletType, int iDamage, float flRangeModifier, entvars_t *pevAttacker, bool bPistol, int shared_rand) = 0;
virtual void FireBullets(int iShots, Vector &vecSrc, Vector &vecDirShooting, Vector &vecSpread, float flDistance, int iBulletType, int iTracerFreq, int iDamage, entvars_t *pevAttacker) = 0;
virtual Vector FireBullets3(Vector &vecSrc, Vector &vecDirShooting, float vecSpread, float flDistance, int iPenetration, int iBulletType, int iDamage, float flRangeModifier, entvars_t *pevAttacker, bool bPistol, int shared_rand) = 0;
};
class ICSDelay: public ICSEntity {
@ -208,7 +208,7 @@ public:
class ICSMonster: public ICSToggle {
public:
virtual void KeyValue(struct KeyValueData_s *pkvd) = 0;
virtual void TraceAttack(struct entvars_s *pevAttacker, float flDamage, Vector vecDir, struct TraceResult *ptr, int bitsDamageType) = 0;
virtual void TraceAttack(struct entvars_s *pevAttacker, float flDamage, Vector &vecDir, struct TraceResult *ptr, int bitsDamageType) = 0;
virtual int TakeDamage(struct entvars_s *pevInflictor, struct entvars_s *pevAttacker, float flDamage, int bitsDamageType) = 0;
virtual int TakeHealth(float flHealth, int bitsDamageType) = 0;
virtual void Killed(struct entvars_s *pevAttacker, int iGib) = 0;
@ -260,7 +260,7 @@ public:
virtual int Restore(CRestore &restore) = 0;
virtual int ObjectCaps() = 0;
virtual int Classify() = 0;
virtual void TraceAttack(struct entvars_s *pevAttacker, float flDamage, Vector vecDir, struct TraceResult *ptr, int bitsDamageType) = 0;
virtual void TraceAttack(struct entvars_s *pevAttacker, float flDamage, Vector &vecDir, struct TraceResult *ptr, int bitsDamageType) = 0;
virtual int TakeDamage(struct entvars_s *pevInflictor, struct entvars_s *pevAttacker, float flDamage, int bitsDamageType) = 0;
virtual int TakeHealth(float flHealth, int bitsDamageType) = 0;
virtual void Killed(struct entvars_s *pevAttacker, int iGib) = 0;
@ -846,7 +846,7 @@ public:
virtual int Save(CSave &save) = 0;
virtual int Restore(CRestore &restore) = 0;
virtual int ObjectCaps() = 0;
virtual void TraceAttack(struct entvars_s *pevAttacker, float flDamage, Vector vecDir, struct TraceResult *ptr, int bitsDamageType) = 0;
virtual void TraceAttack(struct entvars_s *pevAttacker, float flDamage, Vector &vecDir, struct TraceResult *ptr, int bitsDamageType) = 0;
virtual int TakeDamage(struct entvars_s *pevInflictor, struct entvars_s *pevAttacker, float flDamage, int bitsDamageType) = 0;
virtual int DamageDecal(int bitsDamageType) = 0;
virtual void Use(CCSEntity *pActivator, CCSEntity *pCaller, USE_TYPE useType, float value) = 0;

View File

@ -245,6 +245,7 @@
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\src\reapi_utils.cpp" />
<ClCompile Include="..\src\sdk_util.cpp" />
</ItemGroup>
<ItemGroup>

View File

@ -698,6 +698,9 @@
<ClCompile Include="..\src\natives_misc.cpp">
<Filter>src\natives</Filter>
</ClCompile>
<ClCompile Include="..\src\reapi_utils.cpp">
<Filter>src</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="..\extra\amxmodx\scripting\include\reapi.inc">

View File

@ -55,7 +55,7 @@ struct amxx_module_info_s
/* calling convention for native functions */
#if !defined AMX_NATIVE_CALL
#define AMX_NATIVE_CALL
#define AMX_NATIVE_CALL FORCE_STACK_ALIGN
#endif
/* calling convention for all interface functions and callback functions */
#if !defined AMXAPI

View File

@ -55,7 +55,7 @@ void CBasePlayer_Spawn(IReGameHook_CBasePlayer_Spawn *chain, CBasePlayer *pthis)
chain->callNext();
};
callVoidForward(RH_CBasePlayer_Spawn, original, pthis->entindex());
callVoidForward(RG_CBasePlayer_Spawn, original, pthis->entindex());
}
void CBasePlayer_Precache(IReGameHook_CBasePlayer_Precache *chain, CBasePlayer *pthis)
@ -65,7 +65,7 @@ void CBasePlayer_Precache(IReGameHook_CBasePlayer_Precache *chain, CBasePlayer *
chain->callNext();
};
callVoidForward(RH_CBasePlayer_Precache, original, pthis->entindex());
callVoidForward(RG_CBasePlayer_Precache, original, pthis->entindex());
}
int CBasePlayer_ObjectCaps(IReGameHook_CBasePlayer_ObjectCaps *chain, CBasePlayer *pthis)
@ -75,7 +75,7 @@ int CBasePlayer_ObjectCaps(IReGameHook_CBasePlayer_ObjectCaps *chain, CBasePlaye
return chain->callNext();
};
return callForward<int>(RH_CBasePlayer_ObjectCaps, original, pthis->entindex());
return callForward<int>(RG_CBasePlayer_ObjectCaps, original, pthis->entindex());
}
int CBasePlayer_Classify(IReGameHook_CBasePlayer_Classify *chain, CBasePlayer *pthis)
@ -85,7 +85,7 @@ int CBasePlayer_Classify(IReGameHook_CBasePlayer_Classify *chain, CBasePlayer *p
return chain->callNext();
};
return callForward<int>(RH_CBasePlayer_Classify, original, pthis->entindex());
return callForward<int>(RG_CBasePlayer_Classify, original, pthis->entindex());
}
void CBasePlayer_TraceAttack(IReGameHook_CBasePlayer_TraceAttack *chain, CBasePlayer *pthis, entvars_t *pevAttacker, float flDamage, Vector& vecDir, TraceResult *ptr, int bitsDamageType)
@ -97,7 +97,7 @@ void CBasePlayer_TraceAttack(IReGameHook_CBasePlayer_TraceAttack *chain, CBasePl
chain->callNext(PEV(_pevAttacker), _flDamage, vecDirCopy, (TraceResult *)_ptr, _bitsDamageType);
};
callVoidForward(RH_CBasePlayer_TraceAttack, original, pthis->entindex(), indexOfEdict(pevAttacker), flDamage, g_amxxapi.PrepareCellArrayA(reinterpret_cast<cell *>(&vecDirCopy), 3, true), int(ptr), bitsDamageType);
callVoidForward(RG_CBasePlayer_TraceAttack, original, pthis->entindex(), indexOfEdict(pevAttacker), flDamage, g_amxxapi.PrepareCellArrayA(reinterpret_cast<cell *>(&vecDirCopy), 3, true), int(ptr), bitsDamageType);
}
int CBasePlayer_TakeDamage(IReGameHook_CBasePlayer_TakeDamage *chain, CBasePlayer *pthis, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType)
@ -107,7 +107,7 @@ int CBasePlayer_TakeDamage(IReGameHook_CBasePlayer_TakeDamage *chain, CBasePlaye
return chain->callNext(PEV(_pevInflictor), PEV(_pevAttacker), _flDamage, _bitsDamageType);
};
return callForward<int>(RH_CBasePlayer_TakeDamage, original, pthis->entindex(), indexOfEdict(pevInflictor), indexOfEdict(pevAttacker), flDamage, bitsDamageType);
return callForward<int>(RG_CBasePlayer_TakeDamage, original, pthis->entindex(), indexOfEdict(pevInflictor), indexOfEdict(pevAttacker), flDamage, bitsDamageType);
}
int CBasePlayer_TakeHealth(IReGameHook_CBasePlayer_TakeHealth *chain, CBasePlayer *pthis, float flHealth, int bitsDamageType)
@ -117,7 +117,7 @@ int CBasePlayer_TakeHealth(IReGameHook_CBasePlayer_TakeHealth *chain, CBasePlaye
return chain->callNext(_flHealth, _bitsDamageType);
};
return callForward<int>(RH_CBasePlayer_TakeHealth, original, pthis->entindex(), flHealth, bitsDamageType);
return callForward<int>(RG_CBasePlayer_TakeHealth, original, pthis->entindex(), flHealth, bitsDamageType);
}
void CBasePlayer_Killed(IReGameHook_CBasePlayer_Killed *chain, CBasePlayer *pthis, entvars_t *pevAttacker, int iGib)
@ -127,7 +127,7 @@ void CBasePlayer_Killed(IReGameHook_CBasePlayer_Killed *chain, CBasePlayer *pthi
chain->callNext(PEV(_pevAttacker), _iGib);
};
callVoidForward(RH_CBasePlayer_Killed, original, pthis->entindex(), indexOfEdict(pevAttacker), iGib);
callVoidForward(RG_CBasePlayer_Killed, original, pthis->entindex(), indexOfEdict(pevAttacker), iGib);
}
void CBasePlayer_AddPoints(IReGameHook_CBasePlayer_AddPoints *chain, CBasePlayer *pthis, int score, BOOL bAllowNegativeScore)
@ -137,7 +137,7 @@ void CBasePlayer_AddPoints(IReGameHook_CBasePlayer_AddPoints *chain, CBasePlayer
chain->callNext(_score, _bAllowNegativeScore);
};
callVoidForward(RH_CBasePlayer_AddPoints, original, pthis->entindex(), score, bAllowNegativeScore);
callVoidForward(RG_CBasePlayer_AddPoints, original, pthis->entindex(), score, bAllowNegativeScore);
}
void CBasePlayer_AddPointsToTeam(IReGameHook_CBasePlayer_AddPointsToTeam *chain, CBasePlayer *pthis, int score, BOOL bAllowNegativeScore)
@ -147,7 +147,7 @@ void CBasePlayer_AddPointsToTeam(IReGameHook_CBasePlayer_AddPointsToTeam *chain,
chain->callNext(_score, _bAllowNegativeScore);
};
callVoidForward(RH_CBasePlayer_AddPointsToTeam, original, pthis->entindex(), score, bAllowNegativeScore);
callVoidForward(RG_CBasePlayer_AddPointsToTeam, original, pthis->entindex(), score, bAllowNegativeScore);
}
BOOL CBasePlayer_AddPlayerItem(IReGameHook_CBasePlayer_AddPlayerItem *chain, CBasePlayer *pthis, CBasePlayerItem *pItem)
@ -157,7 +157,7 @@ BOOL CBasePlayer_AddPlayerItem(IReGameHook_CBasePlayer_AddPlayerItem *chain, CBa
return chain->callNext(getPrivate<CBasePlayerItem>(_pItem));
};
return callForward<BOOL>(RH_CBasePlayer_AddPlayerItem, original, pthis->entindex(), pItem->entindex());
return callForward<BOOL>(RG_CBasePlayer_AddPlayerItem, original, pthis->entindex(), pItem->entindex());
}
BOOL CBasePlayer_RemovePlayerItem(IReGameHook_CBasePlayer_RemovePlayerItem *chain, CBasePlayer *pthis, CBasePlayerItem *pItem)
@ -167,7 +167,7 @@ BOOL CBasePlayer_RemovePlayerItem(IReGameHook_CBasePlayer_RemovePlayerItem *chai
return chain->callNext(getPrivate<CBasePlayerItem>(_pItem));
};
return callForward<BOOL>(RH_CBasePlayer_RemovePlayerItem, original, pthis->entindex(), pItem->entindex());
return callForward<BOOL>(RG_CBasePlayer_RemovePlayerItem, original, pthis->entindex(), pItem->entindex());
}
int CBasePlayer_GiveAmmo(IReGameHook_CBasePlayer_GiveAmmo *chain, CBasePlayer *pthis, int iAmount, char *szName, int iMax)
@ -177,7 +177,7 @@ int CBasePlayer_GiveAmmo(IReGameHook_CBasePlayer_GiveAmmo *chain, CBasePlayer *p
return chain->callNext(_iAmount, _szName, _iMax);
};
return callForward<int>(RH_CBasePlayer_GiveAmmo, original, pthis->entindex(), iAmount, szName, iMax);
return callForward<int>(RG_CBasePlayer_GiveAmmo, original, pthis->entindex(), iAmount, szName, iMax);
}
void CBasePlayer_ResetMaxSpeed(IReGameHook_CBasePlayer_ResetMaxSpeed *chain, CBasePlayer *pthis)
@ -187,7 +187,7 @@ void CBasePlayer_ResetMaxSpeed(IReGameHook_CBasePlayer_ResetMaxSpeed *chain, CBa
chain->callNext();
};
callVoidForward(RH_CBasePlayer_ResetMaxSpeed, original, pthis->entindex());
callVoidForward(RG_CBasePlayer_ResetMaxSpeed, original, pthis->entindex());
}
void CBasePlayer_Jump(IReGameHook_CBasePlayer_Jump *chain, CBasePlayer *pthis)
@ -197,7 +197,7 @@ void CBasePlayer_Jump(IReGameHook_CBasePlayer_Jump *chain, CBasePlayer *pthis)
chain->callNext();
};
callVoidForward(RH_CBasePlayer_Jump, original, pthis->entindex());
callVoidForward(RG_CBasePlayer_Jump, original, pthis->entindex());
}
void CBasePlayer_Duck(IReGameHook_CBasePlayer_Duck *chain, CBasePlayer *pthis)
@ -207,7 +207,7 @@ void CBasePlayer_Duck(IReGameHook_CBasePlayer_Duck *chain, CBasePlayer *pthis)
chain->callNext();
};
callVoidForward(RH_CBasePlayer_Duck, original, pthis->entindex());
callVoidForward(RG_CBasePlayer_Duck, original, pthis->entindex());
}
void CBasePlayer_PreThink(IReGameHook_CBasePlayer_PreThink *chain, CBasePlayer *pthis)
@ -217,7 +217,7 @@ void CBasePlayer_PreThink(IReGameHook_CBasePlayer_PreThink *chain, CBasePlayer *
chain->callNext();
};
callVoidForward(RH_CBasePlayer_PreThink, original, pthis->entindex());
callVoidForward(RG_CBasePlayer_PreThink, original, pthis->entindex());
}
void CBasePlayer_PostThink(IReGameHook_CBasePlayer_PostThink *chain, CBasePlayer *pthis)
@ -227,7 +227,7 @@ void CBasePlayer_PostThink(IReGameHook_CBasePlayer_PostThink *chain, CBasePlayer
chain->callNext();
};
callVoidForward(RH_CBasePlayer_PostThink, original, pthis->entindex());
callVoidForward(RG_CBasePlayer_PostThink, original, pthis->entindex());
}
void CBasePlayer_UpdateClientData(IReGameHook_CBasePlayer_UpdateClientData *chain, CBasePlayer *pthis)
@ -237,7 +237,7 @@ void CBasePlayer_UpdateClientData(IReGameHook_CBasePlayer_UpdateClientData *chai
chain->callNext();
};
callVoidForward(RH_CBasePlayer_UpdateClientData, original, pthis->entindex());
callVoidForward(RG_CBasePlayer_UpdateClientData, original, pthis->entindex());
}
void CBasePlayer_ImpulseCommands(IReGameHook_CBasePlayer_ImpulseCommands *chain, CBasePlayer *pthis)
@ -247,7 +247,7 @@ void CBasePlayer_ImpulseCommands(IReGameHook_CBasePlayer_ImpulseCommands *chain,
chain->callNext();
};
callVoidForward(RH_CBasePlayer_ImpulseCommands, original, pthis->entindex());
callVoidForward(RG_CBasePlayer_ImpulseCommands, original, pthis->entindex());
}
void CBasePlayer_RoundRespawn(IReGameHook_CBasePlayer_RoundRespawn *chain, CBasePlayer *pthis)
@ -257,7 +257,7 @@ void CBasePlayer_RoundRespawn(IReGameHook_CBasePlayer_RoundRespawn *chain, CBase
chain->callNext();
};
callVoidForward(RH_CBasePlayer_RoundRespawn, original, pthis->entindex());
callVoidForward(RG_CBasePlayer_RoundRespawn, original, pthis->entindex());
}
void CBasePlayer_Blind(IReGameHook_CBasePlayer_Blind *chain, CBasePlayer *pthis, float flUntilTime, float flHoldTime, float flFadeTime, int iAlpha)
@ -267,7 +267,7 @@ void CBasePlayer_Blind(IReGameHook_CBasePlayer_Blind *chain, CBasePlayer *pthis,
chain->callNext(_flUntilTime, _flHoldTime, _flFadeTime, _iAlpha);
};
callVoidForward(RH_CBasePlayer_Blind, original, pthis->entindex(), flUntilTime, flHoldTime, flFadeTime, iAlpha);
callVoidForward(RG_CBasePlayer_Blind, original, pthis->entindex(), flUntilTime, flHoldTime, flFadeTime, iAlpha);
}
CBaseEntity *CBasePlayer_Observer_IsValidTarget(IReGameHook_CBasePlayer_Observer_IsValidTarget *chain, CBasePlayer *pthis, int iPlayerIndex, bool bSameTeam)
@ -277,7 +277,7 @@ CBaseEntity *CBasePlayer_Observer_IsValidTarget(IReGameHook_CBasePlayer_Observer
return chain->callNext(_iPlayerIndex, _bSameTeam);
};
return callForward<CBaseEntity *>(RH_CBasePlayer_Observer_IsValidTarget, original, pthis->entindex(), iPlayerIndex, bSameTeam);
return callForward<CBaseEntity *>(RG_CBasePlayer_Observer_IsValidTarget, original, pthis->entindex(), iPlayerIndex, bSameTeam);
}
void CBasePlayer_SetAnimation(IReGameHook_CBasePlayer_SetAnimation *chain, CBasePlayer *pthis, PLAYER_ANIM playerAnim)
@ -287,7 +287,7 @@ void CBasePlayer_SetAnimation(IReGameHook_CBasePlayer_SetAnimation *chain, CBase
chain->callNext(_playerAnim);
};
callVoidForward(RH_CBasePlayer_SetAnimation, original, pthis->entindex(), playerAnim);
callVoidForward(RG_CBasePlayer_SetAnimation, original, pthis->entindex(), playerAnim);
}
void CBasePlayer_GiveDefaultItems(IReGameHook_CBasePlayer_GiveDefaultItems *chain, CBasePlayer *pthis)
@ -297,7 +297,7 @@ void CBasePlayer_GiveDefaultItems(IReGameHook_CBasePlayer_GiveDefaultItems *chai
chain->callNext();
};
callVoidForward(RH_CBasePlayer_GiveDefaultItems, original, pthis->entindex());
callVoidForward(RG_CBasePlayer_GiveDefaultItems, original, pthis->entindex());
}
void CBasePlayer_GiveNamedItem(IReGameHook_CBasePlayer_GiveNamedItem *chain, CBasePlayer *pthis, const char *pszName)
@ -307,7 +307,7 @@ void CBasePlayer_GiveNamedItem(IReGameHook_CBasePlayer_GiveNamedItem *chain, CBa
chain->callNext(_pszName);
};
callVoidForward(RH_CBasePlayer_GiveNamedItem, original, pthis->entindex(), pszName);
callVoidForward(RG_CBasePlayer_GiveNamedItem, original, pthis->entindex(), pszName);
}
void CBasePlayer_AddAccount(IReGameHook_CBasePlayer_AddAccount *chain, CBasePlayer *pthis, int amount, bool bTrackChange)
@ -317,7 +317,7 @@ void CBasePlayer_AddAccount(IReGameHook_CBasePlayer_AddAccount *chain, CBasePlay
chain->callNext(_amount, _bTrackChange);
};
callVoidForward(RH_CBasePlayer_AddAccount, original, pthis->entindex(), amount, bTrackChange);
callVoidForward(RG_CBasePlayer_AddAccount, original, pthis->entindex(), amount, bTrackChange);
}
void CBasePlayer_GiveShield(IReGameHook_CBasePlayer_GiveShield *chain, CBasePlayer *pthis, bool bDeploy)
@ -327,7 +327,7 @@ void CBasePlayer_GiveShield(IReGameHook_CBasePlayer_GiveShield *chain, CBasePlay
chain->callNext(_bDeploy);
};
callVoidForward(RH_CBasePlayer_GiveShield, original, pthis->entindex(), bDeploy);
callVoidForward(RG_CBasePlayer_GiveShield, original, pthis->entindex(), bDeploy);
}
void CBaseAnimating_ResetSequenceInfo(IReGameHook_CBaseAnimating_ResetSequenceInfo *chain, CBaseAnimating *pthis)
@ -337,7 +337,7 @@ void CBaseAnimating_ResetSequenceInfo(IReGameHook_CBaseAnimating_ResetSequenceIn
chain->callNext();
};
callVoidForward(RH_CBaseAnimating_ResetSequenceInfo, original, pthis->entindex());
callVoidForward(RG_CBaseAnimating_ResetSequenceInfo, original, pthis->entindex());
}
int GetForceCamera(IReGameHook_GetForceCamera *chain, CBasePlayer *pObserver)
@ -347,7 +347,7 @@ int GetForceCamera(IReGameHook_GetForceCamera *chain, CBasePlayer *pObserver)
return chain->callNext(getPrivate<CBasePlayer>(_pObserver));
};
return callForward<int>(RH_GetForceCamera, original, pObserver->entindex());
return callForward<int>(RG_GetForceCamera, original, pObserver->entindex());
}
void PlayerBlind(IReGameHook_PlayerBlind *chain, CBasePlayer *pPlayer, entvars_t *pevInflictor, entvars_t *pevAttacker, float fadeTime, float fadeHold, int alpha, Vector& color)
@ -359,7 +359,7 @@ void PlayerBlind(IReGameHook_PlayerBlind *chain, CBasePlayer *pPlayer, entvars_t
chain->callNext(getPrivate<CBasePlayer>(_pPlayer), PEV(_pevInflictor), PEV(_pevAttacker), _fadeTime, _fadeHold, _alpha, colorCopy);
};
callVoidForward(RH_PlayerBlind, original, pPlayer->entindex(), indexOfEdict(pevInflictor), indexOfEdict(pevAttacker), fadeTime, fadeHold, alpha, g_amxxapi.PrepareCellArrayA(reinterpret_cast<cell *>(&colorCopy), 3, true));
callVoidForward(RG_PlayerBlind, original, pPlayer->entindex(), indexOfEdict(pevInflictor), indexOfEdict(pevAttacker), fadeTime, fadeHold, alpha, g_amxxapi.PrepareCellArrayA(reinterpret_cast<cell *>(&colorCopy), 3, true));
}
void RadiusFlash_TraceLine(IReGameHook_RadiusFlash_TraceLine *chain, CBasePlayer *pPlayer, entvars_t *pevInflictor, entvars_t *pevAttacker, Vector& vecSrc, Vector& vecSpot, TraceResult *ptr)
@ -371,5 +371,15 @@ void RadiusFlash_TraceLine(IReGameHook_RadiusFlash_TraceLine *chain, CBasePlayer
chain->callNext(getPrivate<CBasePlayer>(_pPlayer), PEV(_pevInflictor), PEV(_pevAttacker), vecSrcCopy, vecSpotCopy, (TraceResult *)_ptr);
};
callVoidForward(RH_RadiusFlash_TraceLine, original, pPlayer->entindex(), indexOfEdict(pevInflictor), indexOfEdict(pevAttacker), g_amxxapi.PrepareCellArrayA(reinterpret_cast<cell *>(&vecSrcCopy), 3, true), g_amxxapi.PrepareCellArrayA(reinterpret_cast<cell *>(&vecSpotCopy), 3, true), int(ptr));
callVoidForward(RG_RadiusFlash_TraceLine, original, pPlayer->entindex(), indexOfEdict(pevInflictor), indexOfEdict(pevAttacker), g_amxxapi.PrepareCellArrayA(reinterpret_cast<cell *>(&vecSrcCopy), 3, true), g_amxxapi.PrepareCellArrayA(reinterpret_cast<cell *>(&vecSpotCopy), 3, true), int(ptr));
}
bool RoundEnd(IReGameHook_RoundEnd *chain, int winStatus, ScenarionEventEndRound event, float tmDelay)
{
auto original = [chain](int _winStatus, ScenarionEventEndRound _event, float _tmDelay)
{
return chain->callNext(_winStatus, _event, _tmDelay);
};
return callForward<bool>(RG_RoundEnd, original, winStatus, event, tmDelay);
}

View File

@ -3,10 +3,10 @@
// hookchain return type
enum HookChainState
{
HC_CONTINUE = 0,
HC_OVERRIDE,
HC_SUPERCEDE,
HC_BREAK
HC_CONTINUE = 0, // plugin didn't take any action
HC_OVERRIDE, // call real function, but use my return value
HC_SUPERCEDE, // skip real function, use my return value
HC_BREAK // skip all forwards and real function, use my return value
};
// api types
@ -200,6 +200,7 @@ void Cvar_DirectSet(IRehldsHook_Cvar_DirectSet *chain, cvar_t *var, const char *
int GetForceCamera(IReGameHook_GetForceCamera *chain, CBasePlayer *pObserver);
void PlayerBlind(IReGameHook_PlayerBlind *chain, CBasePlayer *pPlayer, entvars_t *pevInflictor, entvars_t *pevAttacker, float fadeTime, float fadeHold, int alpha, Vector& color);
void RadiusFlash_TraceLine(IReGameHook_RadiusFlash_TraceLine *chain, CBasePlayer *pPlayer, entvars_t *pevInflictor, entvars_t *pevAttacker, Vector& vecSrc, Vector& vecSpot, TraceResult *ptr);
bool RoundEnd(IReGameHook_RoundEnd *chain, int winStatus, ScenarionEventEndRound event, float tmDelay);
// regamedll functions - player
void CBasePlayer_Spawn(IReGameHook_CBasePlayer_Spawn *chain, CBasePlayer *pthis);

View File

@ -1,14 +1,16 @@
#include "precompiled.h"
inline size_t getFwdParamType(void(*)(int)) { return FP_CELL; }
inline size_t getFwdParamType(void(*)(bool)) { return FP_CELL; }
inline size_t getFwdParamType(void(*)(Vector&)) { return FP_CELL; }
inline size_t getFwdParamType(void(*)(PLAYER_ANIM)) { return FP_CELL; }
inline size_t getFwdParamType(void(*)(float)) { return FP_FLOAT; }
inline size_t getFwdParamType(void(*)(const char *)) { return FP_STRING; }
inline size_t getFwdParamType(void(*)(int)) { return FP_CELL; }
inline size_t getFwdParamType(void(*)(bool)) { return FP_CELL; }
inline size_t getFwdParamType(void(*)(Vector&)) { return FP_ARRAY; }
inline size_t getFwdParamType(void(*)(PLAYER_ANIM)) { return FP_CELL; }
inline size_t getFwdParamType(void(*)(ScenarionEventEndRound)) { return FP_CELL; }
inline size_t getFwdParamType(void(*)(float)) { return FP_FLOAT; }
inline size_t getFwdParamType(void(*)(const char *)) { return FP_STRING; }
inline size_t getFwdParamType(void(*)(char *)) { return FP_STRING; }
template<typename T>
inline size_t getFwdParamType(void(*)(T *)) { return FP_CELL; }
inline size_t getFwdParamType(void(*)(T *)) { return FP_CELL; }
template<size_t current = 0>
void setupParamTypes(size_t param_types[], void (*)())
@ -66,11 +68,12 @@ hook_t hooklist_engine[] = {
ENG(Cvar_DirectSet)
};
#define DLL(h) { {}, {}, #h, "ReGameDLL", [](){ return api_cfg.hasReGameDLL(); }, ((!(RH_##h & (MAX_REGION_RANGE - 1)) ? regfunc::current_cell = 1, true : false) || (RH_##h & (MAX_REGION_RANGE - 1)) == regfunc::current_cell++) ? regfunc(h) : regfunc(#h " doesn't match hook definition"), [](){ g_ReGameHookchains->##h##()->registerHook(&##h); }, [](){ g_ReGameHookchains->##h##()->unregisterHook(&##h); }}
#define DLL(h) { {}, {}, #h, "ReGameDLL", [](){ return api_cfg.hasReGameDLL(); }, ((!(RG_##h & (MAX_REGION_RANGE - 1)) ? regfunc::current_cell = 1, true : false) || (RG_##h & (MAX_REGION_RANGE - 1)) == regfunc::current_cell++) ? regfunc(h) : regfunc(#h " doesn't match hook definition"), [](){ g_ReGameHookchains->##h##()->registerHook(&##h); }, [](){ g_ReGameHookchains->##h##()->unregisterHook(&##h); }}
hook_t hooklist_gamedll[] = {
DLL(GetForceCamera),
DLL(PlayerBlind),
DLL(RadiusFlash_TraceLine)
DLL(RadiusFlash_TraceLine),
DLL(RoundEnd)
};
hook_t hooklist_animating[] = {

View File

@ -63,42 +63,10 @@ struct hooklist_t
enum EngineFunc
{
//RH_Steam_NotifyClientConnect = 0,
//RH_SV_ConnectClient,
//RH_SV_GetIDString,
//RH_SV_SendServerinfo,
//RH_SV_CheckProtocol,
//RH_SVC_GetChallenge,
//RH_SV_CheckKeyInfo,
//RH_SV_CheckIPRestrictions,
//RH_SV_FinishCertificateCheck,
//RH_Steam_NotifyBotConnect,
//RH_SV_SerializeSteamid,
//RH_SV_CompareUserID,
//RH_Steam_NotifyClientDisconnect,
//RH_NET_GetPacketPreprocessor,
//RH_ValidateCommand,
//RH_ClientConnected,
//RH_SV_HandleClientMessage,
//RH_Mod_LoadBrushModel,
//RH_Mod_LoadStudioModel,
//RH_ExecuteServerStringCmd,
//RH_SV_EmitEvents,
//RH_EV_PlayReliableEvent,
RH_SV_StartSound = BEGIN_FUNC_REGION(engine),
//RH_PF_Remove_I,
//RH_PF_BuildSoundMsg_I,
//RH_SV_WriteFullClientUpdate,
//RH_SV_CheckConsistencyResponse,
RH_SV_DropClient,
RH_SV_ActivateServer,
//RH_SV_WriteVoiceCodec,
//RH_Steam_GSGetSteamID,
//RH_SV_TransferConsistencyInfo,
//RH_Steam_GSBUpdateUserData,
RH_Cvar_DirectSet,
//RH_SV_EstablishTimeBase,
//RH_SV_Spawn_f,
// [...]
RH_EngineFunc_End
@ -106,55 +74,56 @@ enum EngineFunc
enum GamedllFunc
{
RH_GetForceCamera = BEGIN_FUNC_REGION(gamedll),
RH_PlayerBlind,
RH_RadiusFlash_TraceLine,
RG_GetForceCamera = BEGIN_FUNC_REGION(gamedll),
RG_PlayerBlind,
RG_RadiusFlash_TraceLine,
RG_RoundEnd,
// [...]
RH_GameDLL_End
RG_End
};
enum GamedllFunc_CBaseAnimating
{
RH_CBaseAnimating_ResetSequenceInfo = BEGIN_FUNC_REGION(animating),
RG_CBaseAnimating_ResetSequenceInfo = BEGIN_FUNC_REGION(animating),
// [...]
RH_CBaseAnimating_End
RG_CBaseAnimating_End
};
enum GamedllFunc_CBasePlayer
{
// CBasePlayer virtual
RH_CBasePlayer_Spawn = BEGIN_FUNC_REGION(player),
RH_CBasePlayer_Precache,
RH_CBasePlayer_ObjectCaps,
RH_CBasePlayer_Classify,
RH_CBasePlayer_TraceAttack,
RH_CBasePlayer_TakeDamage,
RH_CBasePlayer_TakeHealth,
RH_CBasePlayer_Killed,
RH_CBasePlayer_AddPoints,
RH_CBasePlayer_AddPointsToTeam,
RH_CBasePlayer_AddPlayerItem,
RH_CBasePlayer_RemovePlayerItem,
RH_CBasePlayer_GiveAmmo,
RH_CBasePlayer_ResetMaxSpeed,
RH_CBasePlayer_Jump,
RH_CBasePlayer_Duck,
RH_CBasePlayer_PreThink,
RH_CBasePlayer_PostThink,
RH_CBasePlayer_UpdateClientData,
RH_CBasePlayer_ImpulseCommands,
RH_CBasePlayer_RoundRespawn,
RH_CBasePlayer_Blind,
RG_CBasePlayer_Spawn = BEGIN_FUNC_REGION(player),
RG_CBasePlayer_Precache,
RG_CBasePlayer_ObjectCaps,
RG_CBasePlayer_Classify,
RG_CBasePlayer_TraceAttack,
RG_CBasePlayer_TakeDamage,
RG_CBasePlayer_TakeHealth,
RG_CBasePlayer_Killed,
RG_CBasePlayer_AddPoints,
RG_CBasePlayer_AddPointsToTeam,
RG_CBasePlayer_AddPlayerItem,
RG_CBasePlayer_RemovePlayerItem,
RG_CBasePlayer_GiveAmmo,
RG_CBasePlayer_ResetMaxSpeed,
RG_CBasePlayer_Jump,
RG_CBasePlayer_Duck,
RG_CBasePlayer_PreThink,
RG_CBasePlayer_PostThink,
RG_CBasePlayer_UpdateClientData,
RG_CBasePlayer_ImpulseCommands,
RG_CBasePlayer_RoundRespawn,
RG_CBasePlayer_Blind,
RH_CBasePlayer_Observer_IsValidTarget,
RH_CBasePlayer_SetAnimation,
RH_CBasePlayer_GiveDefaultItems,
RH_CBasePlayer_GiveNamedItem,
RH_CBasePlayer_AddAccount,
RH_CBasePlayer_GiveShield,
RG_CBasePlayer_Observer_IsValidTarget,
RG_CBasePlayer_SetAnimation,
RG_CBasePlayer_GiveDefaultItems,
RG_CBasePlayer_GiveNamedItem,
RG_CBasePlayer_AddAccount,
RG_CBasePlayer_GiveShield,
// [...]
RH_CBasePlayer_End
RG_CBasePlayer_End
};

View File

@ -41,14 +41,16 @@ void CAmxxHook::SetState(fwdstate st)
void CHookManager::clearHandlers() const
{
#define CLEAR_HOOKLIST(__END__, __START__)\
for (size_t i = BEGIN_FUNC_REGION(__START__); i < RH_##__END__##_End; ++i) {\
for (size_t i = BEGIN_FUNC_REGION(__START__); i < ##__END__; ++i) {\
if (m_hooklist[i])\
m_hooklist[i]->clear();\
}
CLEAR_HOOKLIST(EngineFunc, engine);
CLEAR_HOOKLIST(GameDLL, gamedll);
CLEAR_HOOKLIST(CBasePlayer, player);
CLEAR_HOOKLIST(RH_EngineFunc_End, engine);
CLEAR_HOOKLIST(RG_End, gamedll);
CLEAR_HOOKLIST(RG_CBaseAnimating_End, animating);
CLEAR_HOOKLIST(RG_CBasePlayer_End, player);
}
hook_t* CHookManager::getHook(size_t func) const

View File

@ -31,7 +31,7 @@ int regmember::current_cell = 1;
#define GM_MEMBERS(mx, mtype) ((!(mx & (MAX_REGION_RANGE - 1)) ? regmember::current_cell = 1, true : false) || (mx & (MAX_REGION_RANGE - 1)) == regmember::current_cell++) ? regmember(((CHalfLifeMultiplay *)&mem_dummy)->##mx, sizeof(((CHalfLifeMultiplay *)&mem_dummy)->##mx), offsetof(CHalfLifeMultiplay, mx), mtype) : regmember(#mx " doesn't match member definition")
#define GM_VOICE_MEMBERS(mx, mtype) ((!(mx & (MAX_REGION_RANGE - 1)) ? regmember::current_cell = 1, true : false) || (mx & (MAX_REGION_RANGE - 1)) == regmember::current_cell++) ? regmember(((CVoiceGameMgr *)&mem_dummy)->##mx, sizeof(((CVoiceGameMgr *)&mem_dummy)->##mx), offsetof(CVoiceGameMgr, mx), mtype) : regmember(#mx " doesn't match member definition")
member_t memberlist_gamerules[] = {
member_t memberlist_gamerules[] = {
GM_MEMBERS(m_bFreezePeriod, MEMBER_INTEGER),
GM_MEMBERS(m_bBombDropped, MEMBER_INTEGER),
// m_VoiceGameMgr ->
@ -348,7 +348,7 @@ member_t memberlist_player[] = {
memberlist_t memberlist;
member_t *memberlist_t::operator[](size_t members) const
{
{
#define CASE(h) case ht_##h: if (index < arraysize(memberlist_##h)) return &memberlist_##h[index]; else break;
const auto table = members_tables_e(members / MAX_REGION_RANGE);

View File

@ -4,6 +4,7 @@
meta_globals_t *gpMetaGlobals;
gamedll_funcs_t *gpGamedllFuncs;
mutil_funcs_t *gpMetaUtilFuncs;
enginefuncs_t *g_pengfuncsTable;
plugin_info_t Plugin_info =
{
@ -51,6 +52,7 @@ C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, m
return FALSE;
}
GET_HOOK_TABLES(PLID, &g_pengfuncsTable, nullptr, nullptr);
memcpy(pFunctionTable, &gMetaFunctionTable, sizeof(META_FUNCTIONS));
return TRUE;
}

View File

@ -136,7 +136,7 @@ static cell AMX_NATIVE_CALL SetHookChainReturn(AMX *amx, cell *params)
case ATYPE_FLOAT:
retVal._interger = *srcAddr;
break;
case ATYPE_STRING:
{
if (retVal._string != nullptr)
@ -271,7 +271,7 @@ AMX_NATIVE_INFO HookChain_Natives[] =
{ "EnableHookChain", EnableHookChain },
{ "DisableHookChain", DisableHookChain },
{ "SetHookChainReturn", SetHookChainReturn },
{ "GetHookChainReturn", GetHookChainReturn },

View File

@ -164,6 +164,77 @@ static cell AMX_NATIVE_CALL rg_fire_bullets3(AMX *amx, cell *params)
return TRUE;
}
struct {
const char *msg;
const char *sentence;
size_t status;
} msg_sentence_list[] = {
{ "", "" }, // ROUND_NONE
{ "#Target_Bombed", "terwin", WINSTATUS_TERRORISTS }, // ROUND_TARGET_BOMB
{ "#VIP_Escaped", "ctwin", WINSTATUS_CTS }, // ROUND_VIP_ESCAPED
{ "#VIP_Assassinated", "terwin", WINSTATUS_TERRORISTS }, // ROUND_VIP_ASSASSINATED
{ "#Terrorists_Escaped", "terwin", WINSTATUS_TERRORISTS }, // ROUND_TERRORISTS_ESCAPED
{ "#CTs_PreventEscape", "ctwin", WINSTATUS_CTS }, // ROUND_CTS_PREVENT_ESCAPE
{ "#Escaping_Terrorists_Neutralized", "ctwin", WINSTATUS_CTS }, // ROUND_ESCAPING_TERRORISTS_NEUTRALIZED
{ "#Bomb_Defused", "ctwin", WINSTATUS_CTS }, // ROUND_BOMB_DEFUSED
{ "#CTs_Win", "ctwin", WINSTATUS_CTS }, // ROUND_CTS_WIN
{ "#Terrorists_Win", "terwin", WINSTATUS_TERRORISTS }, // ROUND_TERRORISTS_WIN
{ "#Round_Draw", "rounddraw", WINSTATUS_DRAW }, // ROUND_END_DRAW
{ "#All_Hostages_Rescued", "ctwin", WINSTATUS_CTS }, // ROUND_ALL_HOSTAGES_RESCUED
{ "#Target_Saved", "ctwin", WINSTATUS_CTS }, // ROUND_TARGET_SAVED
{ "#Hostages_Not_Rescued", "terwin", WINSTATUS_TERRORISTS }, // ROUND_HOSTAGE_NOT_RESCUED
{ "#Terrorists_Not_Escaped", "ctwin", WINSTATUS_CTS }, // ROUND_TERRORISTS_NOT_ESCAPED
{ "#VIP_Not_Escaped", "terwin", WINSTATUS_TERRORISTS }, // ROUND_VIP_NOT_ESCAPED
{ "#Game_Commencing", "", WINSTATUS_DRAW }, // ROUND_GAME_COMMENCE
};
// native rg_round_end(Float:tmDelay, WinStatus:st, ScenarionEventEndRound:event = ROUND_NONE, const message[] = "default", const sentence[] = "default");
static cell AMX_NATIVE_CALL rg_round_end(AMX *amx, cell *params)
{
enum args_e { arg_count, arg_delay, arg_win, arg_event, arg_message, arg_sentence, arg_silent };
size_t winstatus = params[arg_win];
if (winstatus <= 0) {
MF_LogError(amx, AMX_ERR_NATIVE, "rg_round_end: unknown win-status %i", winstatus);
return FALSE;
}
const char *_sentence, *_message;
ScenarionEventEndRound event = static_cast<ScenarionEventEndRound>(params[arg_event]);
_sentence = getAmxString(amx, params[arg_sentence]);
_message = getAmxString(amx, params[arg_message]);
if (event != ROUND_NONE) {
auto& lst = msg_sentence_list[event];
if (strcmp(_sentence, "default") == 0)
_sentence = lst.sentence;
if (strcmp(_message, "default") == 0)
_message = lst.msg;
}
if (_sentence[0])
Broadcast(_sentence);
if (_message[0])
g_ReGameFuncs->EndRoundMessage(_message, event);
(*g_pCSGameRules)->TerminateRound(*(float *)&params[arg_delay], winstatus);
return TRUE;
}
// native rg_update_teamscores(iCtsWins = 0, iTsWins = 0, bool:bAdd = true);
static cell AMX_NATIVE_CALL rg_update_teamscores(AMX *amx, cell *params)
{
enum args_e { arg_count, arg_cts, arg_ts, arg_add };
(*g_pCSGameRules)->m_iNumCTWins = ((params[arg_add] != 0) ? (*g_pCSGameRules)->m_iNumCTWins : 0) + params[arg_cts];
(*g_pCSGameRules)->m_iNumTerroristWins = ((params[arg_add] != 0) ? (*g_pCSGameRules)->m_iNumTerroristWins : 0) + params[arg_ts];
UpdateTeamScores();
return TRUE;
}
AMX_NATIVE_INFO Misc_Natives[] =
{
{ "rg_set_animation", rg_set_animation },
@ -180,6 +251,9 @@ AMX_NATIVE_INFO Misc_Natives[] =
{ "rg_fire_bullets", rg_fire_bullets },
{ "rg_fire_bullets3", rg_fire_bullets3 },
{ "rg_round_end", rg_round_end },
{ "rg_update_teamscores", rg_update_teamscores },
{ nullptr, nullptr }
};

36
reapi/src/reapi_utils.cpp Normal file
View File

@ -0,0 +1,36 @@
#include "precompiled.h"
void Broadcast(const char *sentence)
{
char text[32];
strcpy(text, "%!MRAD_");
strcat(text, UTIL_VarArgs("%s", sentence));
static int gmsgSendAudio = 0;
if (gmsgSendAudio == 0 && !(gmsgSendAudio = REG_USER_MSG("SendAudio", -1)))
return;
g_pengfuncsTable->pfnMessageBegin(MSG_BROADCAST, REG_USER_MSG("SendAudio", -1), NULL, NULL);
g_pengfuncsTable->pfnWriteByte(0);
g_pengfuncsTable->pfnWriteString(text);
g_pengfuncsTable->pfnWriteShort(100);
g_pengfuncsTable->pfnMessageEnd();
}
void UpdateTeamScores()
{
static int gmsgTeamScore = 0;
if (gmsgTeamScore == 0 && !(gmsgTeamScore = REG_USER_MSG("TeamScore", -1)))
return;
g_pengfuncsTable->pfnMessageBegin(MSG_ALL, gmsgTeamScore, NULL, NULL);
g_pengfuncsTable->pfnWriteString("CT");
g_pengfuncsTable->pfnWriteShort((*g_pCSGameRules)->m_iNumCTWins);
g_pengfuncsTable->pfnMessageEnd();
g_pengfuncsTable->pfnMessageBegin(MSG_ALL, gmsgTeamScore, NULL, NULL);
g_pengfuncsTable->pfnWriteString("TERRORIST");
g_pengfuncsTable->pfnWriteShort((*g_pCSGameRules)->m_iNumTerroristWins);
g_pengfuncsTable->pfnMessageEnd();
}

View File

@ -8,6 +8,7 @@ char(&ArraySizeHelper(T(&array)[N]))[N];
#define ENTINDEX indexOfEdict
extern edict_t* g_pEdicts;
extern enginefuncs_t* g_pengfuncsTable;
inline size_t indexOfEdict(edict_t* ed)
{
@ -78,4 +79,7 @@ inline T get_member_direct(edict_t *pEntity, int offset, int element = 0, int si
return get_member_direct<T>(pEntity->pvPrivateData, offset, element, size);
}
void Broadcast(const char *sentence);
void UpdateTeamScores();
extern void __declspec(noreturn) UTIL_SysError(const char *fmt, ...);