2
0
mirror of https://github.com/s1lentq/reapi.git synced 2024-10-16 23:37:07 +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_engine.inc> // NOTE: only for ReHLDS
#include <reapi_gamedll.inc> // NOTE: only for gamedll Counter-Strike (ReGameDLL_CS) #include <reapi_gamedll.inc> // NOTE: only for gamedll Counter-Strike (ReGameDLL_CS)
// return constants // hookchain return type
enum enum
{ {
HC_CONTINUE = 0, HC_CONTINUE = 0, // plugin didn't take any action
HC_OVERRIDE, HC_OVERRIDE, // call real function, but use my return value
HC_SUPERCEDE, HC_SUPERCEDE, // skip real function, use my return value
HC_BREAK HC_BREAK // skip a call each forward in AMXX plugins
}; };
// hookchain types // hookchain types
@ -80,7 +80,7 @@ native bool:EnableHookChain(HookChain:hook);
* *
* native SetHookChainReturn(AType:type, any:...); * native SetHookChainReturn(AType:type, any:...);
*/ */
native SetHookChainReturn(HookChainReturn:type, any:...); native SetHookChainReturn(AType:type, any:...);
/* /*
* Gets the return value of a hookchain. * 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 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 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_ESCAPE (1<<3)
#define SIGNAL_VIPSAFETY (1<<4) #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 enum PLAYER_ANIM
{ {
PLAYER_IDLE, PLAYER_IDLE,
@ -33,22 +62,28 @@ enum GamedllFunc
* Return type: int * Return type: int
* Params: (const pObserver) * Params: (const pObserver)
*/ */
RH_GetForceCamera = 1024, RG_GetForceCamera = 1024,
/** /**
* Description: - * Description: -
* Params: (const index, const inflictor, const attacker, const Float:fadeTime, const Float:fadeHold, const alpha, Float:color[3]) * Params: (const index, const inflictor, const attacker, const Float:fadeTime, const Float:fadeHold, const alpha, Float:color[3])
*/ */
RH_PlayerBlind, RG_PlayerBlind,
/** /**
* Description: - * Description: -
* Params: (const index, inflictor, attacker, Float:vecSrc[3], Float:vecSpot[3], tracehandle) * 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 enum GamedllFunc_CBaseAnimating
@ -57,10 +92,10 @@ enum GamedllFunc_CBaseAnimating
* Description: - * Description: -
* Params: (const this) * Params: (const this)
*/ */
RH_CBaseAnimating_ResetSequenceInfo = 2048, RG_CBaseAnimating_ResetSequenceInfo = 2048,
// [...] // [...]
RH_CBaseAnimating_End RG_CBaseAnimating_End
}; };
enum GamedllFunc_CBasePlayer enum GamedllFunc_CBasePlayer
@ -69,20 +104,20 @@ enum GamedllFunc_CBasePlayer
* Description: - * Description: -
* Params: (const this) * Params: (const this)
*/ */
RH_CBasePlayer_Spawn = 3072, RG_CBasePlayer_Spawn = 3072,
/** /**
* Description: - * Description: -
* Params: (const this) * Params: (const this)
*/ */
RH_CBasePlayer_Precache, RG_CBasePlayer_Precache,
/** /**
* Description: - * Description: -
* Return type: int * Return type: int
* Params: (const this) * Params: (const this)
*/ */
RH_CBasePlayer_ObjectCaps, RG_CBasePlayer_ObjectCaps,
/** /**
@ -90,128 +125,128 @@ enum GamedllFunc_CBasePlayer
* Return type: int * Return type: int
* Params: (const this) * Params: (const this)
*/ */
RH_CBasePlayer_Classify, RG_CBasePlayer_Classify,
/** /**
* Description: - * Description: -
* Params: (const this, pevAttacker, Float:flDamage, Float:vecDir[3], tracehandle, bitsDamageType) * Params: (const this, pevAttacker, Float:flDamage, Float:vecDir[3], tracehandle, bitsDamageType)
*/ */
RH_CBasePlayer_TraceAttack, RG_CBasePlayer_TraceAttack,
/** /**
* Description: - * Description: -
* Return type: int * Return type: int
* Params: (const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType) * Params: (const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType)
*/ */
RH_CBasePlayer_TakeDamage, RG_CBasePlayer_TakeDamage,
/** /**
* Description: - * Description: -
* Params: (const this, Float:flHealth, bitsDamageType) * Params: (const this, Float:flHealth, bitsDamageType)
*/ */
RH_CBasePlayer_TakeHealth, RG_CBasePlayer_TakeHealth,
/** /**
* Description: - * Description: -
* Params: (const this, pevAttacker, iGib) * Params: (const this, pevAttacker, iGib)
*/ */
RH_CBasePlayer_Killed, RG_CBasePlayer_Killed,
/** /**
* Description: - * Description: -
* Params: (const this, score, bAllowNegativeScore) * Params: (const this, score, bAllowNegativeScore)
*/ */
RH_CBasePlayer_AddPoints, RG_CBasePlayer_AddPoints,
/** /**
* Description: - * Description: -
* Params: (const this, score, bAllowNegativeScore) * Params: (const this, score, bAllowNegativeScore)
*/ */
RH_CBasePlayer_AddPointsToTeam, RG_CBasePlayer_AddPointsToTeam,
/** /**
* Description: - * Description: -
* Return type: BOOL * Return type: BOOL
* Params: (const this, const pItem) * Params: (const this, const pItem)
*/ */
RH_CBasePlayer_AddPlayerItem, RG_CBasePlayer_AddPlayerItem,
/** /**
* Description: - * Description: -
* Return type: BOOL * Return type: BOOL
* Params: (const this, const pItem) * Params: (const this, const pItem)
*/ */
RH_CBasePlayer_RemovePlayerItem, RG_CBasePlayer_RemovePlayerItem,
/** /**
* Description: - * Description: -
* Return type: int * Return type: int
* Params: (const this, iAmount, szName[], iMax) * Params: (const this, iAmount, szName[], iMax)
*/ */
RH_CBasePlayer_GiveAmmo, RG_CBasePlayer_GiveAmmo,
/** /**
* Description: - * Description: -
* Params: (const this) * Params: (const this)
*/ */
RH_CBasePlayer_ResetMaxSpeed, RG_CBasePlayer_ResetMaxSpeed,
/** /**
* Description: - * Description: -
* Params: (const this) * Params: (const this)
*/ */
RH_CBasePlayer_Jump, RG_CBasePlayer_Jump,
/** /**
* Description: - * Description: -
* Params: (const this) * Params: (const this)
*/ */
RH_CBasePlayer_Duck, RG_CBasePlayer_Duck,
/** /**
* Description: - * Description: -
* Params: (const this) * Params: (const this)
*/ */
RH_CBasePlayer_PreThink, RG_CBasePlayer_PreThink,
/** /**
* Description: - * Description: -
* Params: (const this) * Params: (const this)
*/ */
RH_CBasePlayer_PostThink, RG_CBasePlayer_PostThink,
/** /**
* Description: - * Description: -
* Params: (const this) * Params: (const this)
*/ */
RH_CBasePlayer_UpdateClientData, RG_CBasePlayer_UpdateClientData,
/** /**
* Description: - * Description: -
* Params: (const this) * Params: (const this)
*/ */
RH_CBasePlayer_ImpulseCommands, RG_CBasePlayer_ImpulseCommands,
/** /**
* Description: - * Description: -
* Params: (const this) * Params: (const this)
*/ */
RH_CBasePlayer_RoundRespawn, RG_CBasePlayer_RoundRespawn,
/** /**
* Description: - * Description: -
* Params: (const this, Float:flUntilTime, Float:flHoldTime, Float:flFadeTime, iAlpha) * Params: (const this, Float:flUntilTime, Float:flHoldTime, Float:flFadeTime, iAlpha)
*/ */
RH_CBasePlayer_Blind, RG_CBasePlayer_Blind,
/** /**
* Description: - * Description: -
* Params: (const this, iPlayerIndex, bool:bSameTeam) * Params: (const this, iPlayerIndex, bool:bSameTeam)
*/ */
RH_CBasePlayer_Observer_IsValidTarget, RG_CBasePlayer_Observer_IsValidTarget,
// [...] // [...]
RH_CBasePlayer_End RG_CBasePlayer_End
}; };
// CSGameRules // CSGameRules

View File

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

View File

@ -68,6 +68,16 @@ public:
virtual void unregisterHook(hookfunc_t hook) = 0; 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) // Hook chain registry(for hooks [un]registration)
template<typename ...t_args> template<typename ...t_args>
class IVoidHookChainRegistry { 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 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; 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 { class IReGameHookchains {
public: public:
virtual ~IReGameHookchains() {} virtual ~IReGameHookchains() {}
@ -211,6 +215,7 @@ public:
virtual IReGameHookRegistry_GetForceCamera* GetForceCamera() = 0; virtual IReGameHookRegistry_GetForceCamera* GetForceCamera() = 0;
virtual IReGameHookRegistry_PlayerBlind* PlayerBlind() = 0; virtual IReGameHookRegistry_PlayerBlind* PlayerBlind() = 0;
virtual IReGameHookRegistry_RadiusFlash_TraceLine* RadiusFlash_TraceLine() = 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 (*ApplyMultiDamage)(entvars_t *pevInflictor, entvars_t *pevAttacker);
void (*AddMultiDamage)(entvars_t *pevInflictor, CBaseEntity *pEntity, float flDamage, int bitsDamageType); void (*AddMultiDamage)(entvars_t *pevInflictor, CBaseEntity *pEntity, float flDamage, int bitsDamageType);
void (*EndRoundMessage)(const char *sentence, int event);
}; };
class IReGameApi { class IReGameApi {

View File

@ -68,12 +68,12 @@ public:
virtual void SetObjectCollisionBox() = 0; virtual void SetObjectCollisionBox() = 0;
virtual int Classify() = 0; virtual int Classify() = 0;
virtual void DeathNotice(struct entvars_s *pevChild) = 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 TakeDamage(struct entvars_s *pevInflictor, struct entvars_s *pevAttacker, float flDamage, int bitsDamageType) = 0;
virtual int TakeHealth(float flHealth, int bitsDamageType) = 0; virtual int TakeHealth(float flHealth, int bitsDamageType) = 0;
virtual void Killed(struct entvars_s *pevAttacker, int iGib) = 0; virtual void Killed(struct entvars_s *pevAttacker, int iGib) = 0;
virtual int BloodColor() = 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 bool IsTriggered(CCSEntity *pActivator) = 0;
virtual ICSMonster *MyMonsterPointer() = 0; virtual ICSMonster *MyMonsterPointer() = 0;
virtual ICSquadMonster *MySquadMonsterPointer() = 0; virtual ICSquadMonster *MySquadMonsterPointer() = 0;
@ -118,8 +118,8 @@ public:
public: public:
virtual struct entvars_s *GetEntVars() const = 0; virtual struct entvars_s *GetEntVars() const = 0;
virtual class CBaseEntity *GetEntity() 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 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 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 { class ICSDelay: public ICSEntity {
@ -208,7 +208,7 @@ public:
class ICSMonster: public ICSToggle { class ICSMonster: public ICSToggle {
public: public:
virtual void KeyValue(struct KeyValueData_s *pkvd) = 0; 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 TakeDamage(struct entvars_s *pevInflictor, struct entvars_s *pevAttacker, float flDamage, int bitsDamageType) = 0;
virtual int TakeHealth(float flHealth, int bitsDamageType) = 0; virtual int TakeHealth(float flHealth, int bitsDamageType) = 0;
virtual void Killed(struct entvars_s *pevAttacker, int iGib) = 0; virtual void Killed(struct entvars_s *pevAttacker, int iGib) = 0;
@ -260,7 +260,7 @@ public:
virtual int Restore(CRestore &restore) = 0; virtual int Restore(CRestore &restore) = 0;
virtual int ObjectCaps() = 0; virtual int ObjectCaps() = 0;
virtual int Classify() = 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 TakeDamage(struct entvars_s *pevInflictor, struct entvars_s *pevAttacker, float flDamage, int bitsDamageType) = 0;
virtual int TakeHealth(float flHealth, int bitsDamageType) = 0; virtual int TakeHealth(float flHealth, int bitsDamageType) = 0;
virtual void Killed(struct entvars_s *pevAttacker, int iGib) = 0; virtual void Killed(struct entvars_s *pevAttacker, int iGib) = 0;
@ -846,7 +846,7 @@ public:
virtual int Save(CSave &save) = 0; virtual int Save(CSave &save) = 0;
virtual int Restore(CRestore &restore) = 0; virtual int Restore(CRestore &restore) = 0;
virtual int ObjectCaps() = 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 TakeDamage(struct entvars_s *pevInflictor, struct entvars_s *pevAttacker, float flDamage, int bitsDamageType) = 0;
virtual int DamageDecal(int bitsDamageType) = 0; virtual int DamageDecal(int bitsDamageType) = 0;
virtual void Use(CCSEntity *pActivator, CCSEntity *pCaller, USE_TYPE useType, float value) = 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)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
</ClCompile> </ClCompile>
<ClCompile Include="..\src\reapi_utils.cpp" />
<ClCompile Include="..\src\sdk_util.cpp" /> <ClCompile Include="..\src\sdk_util.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

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

View File

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

View File

@ -55,7 +55,7 @@ void CBasePlayer_Spawn(IReGameHook_CBasePlayer_Spawn *chain, CBasePlayer *pthis)
chain->callNext(); 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) void CBasePlayer_Precache(IReGameHook_CBasePlayer_Precache *chain, CBasePlayer *pthis)
@ -65,7 +65,7 @@ void CBasePlayer_Precache(IReGameHook_CBasePlayer_Precache *chain, CBasePlayer *
chain->callNext(); 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) 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 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) 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 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) 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); 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) 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 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) 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 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) 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); 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) 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); 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) 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); 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) 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 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) 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 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) 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 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) void CBasePlayer_ResetMaxSpeed(IReGameHook_CBasePlayer_ResetMaxSpeed *chain, CBasePlayer *pthis)
@ -187,7 +187,7 @@ void CBasePlayer_ResetMaxSpeed(IReGameHook_CBasePlayer_ResetMaxSpeed *chain, CBa
chain->callNext(); 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) void CBasePlayer_Jump(IReGameHook_CBasePlayer_Jump *chain, CBasePlayer *pthis)
@ -197,7 +197,7 @@ void CBasePlayer_Jump(IReGameHook_CBasePlayer_Jump *chain, CBasePlayer *pthis)
chain->callNext(); 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) void CBasePlayer_Duck(IReGameHook_CBasePlayer_Duck *chain, CBasePlayer *pthis)
@ -207,7 +207,7 @@ void CBasePlayer_Duck(IReGameHook_CBasePlayer_Duck *chain, CBasePlayer *pthis)
chain->callNext(); 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) void CBasePlayer_PreThink(IReGameHook_CBasePlayer_PreThink *chain, CBasePlayer *pthis)
@ -217,7 +217,7 @@ void CBasePlayer_PreThink(IReGameHook_CBasePlayer_PreThink *chain, CBasePlayer *
chain->callNext(); 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) void CBasePlayer_PostThink(IReGameHook_CBasePlayer_PostThink *chain, CBasePlayer *pthis)
@ -227,7 +227,7 @@ void CBasePlayer_PostThink(IReGameHook_CBasePlayer_PostThink *chain, CBasePlayer
chain->callNext(); 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) void CBasePlayer_UpdateClientData(IReGameHook_CBasePlayer_UpdateClientData *chain, CBasePlayer *pthis)
@ -237,7 +237,7 @@ void CBasePlayer_UpdateClientData(IReGameHook_CBasePlayer_UpdateClientData *chai
chain->callNext(); 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) void CBasePlayer_ImpulseCommands(IReGameHook_CBasePlayer_ImpulseCommands *chain, CBasePlayer *pthis)
@ -247,7 +247,7 @@ void CBasePlayer_ImpulseCommands(IReGameHook_CBasePlayer_ImpulseCommands *chain,
chain->callNext(); 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) void CBasePlayer_RoundRespawn(IReGameHook_CBasePlayer_RoundRespawn *chain, CBasePlayer *pthis)
@ -257,7 +257,7 @@ void CBasePlayer_RoundRespawn(IReGameHook_CBasePlayer_RoundRespawn *chain, CBase
chain->callNext(); 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) 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); 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) 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 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) 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); 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) void CBasePlayer_GiveDefaultItems(IReGameHook_CBasePlayer_GiveDefaultItems *chain, CBasePlayer *pthis)
@ -297,7 +297,7 @@ void CBasePlayer_GiveDefaultItems(IReGameHook_CBasePlayer_GiveDefaultItems *chai
chain->callNext(); 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) 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); 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) 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); 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) 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); 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) void CBaseAnimating_ResetSequenceInfo(IReGameHook_CBaseAnimating_ResetSequenceInfo *chain, CBaseAnimating *pthis)
@ -337,7 +337,7 @@ void CBaseAnimating_ResetSequenceInfo(IReGameHook_CBaseAnimating_ResetSequenceIn
chain->callNext(); chain->callNext();
}; };
callVoidForward(RH_CBaseAnimating_ResetSequenceInfo, original, pthis->entindex()); callVoidForward(RG_CBaseAnimating_ResetSequenceInfo, original, pthis->entindex());
} }
int GetForceCamera(IReGameHook_GetForceCamera *chain, CBasePlayer *pObserver) 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 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) 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); 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) 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); 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 // hookchain return type
enum HookChainState enum HookChainState
{ {
HC_CONTINUE = 0, HC_CONTINUE = 0, // plugin didn't take any action
HC_OVERRIDE, HC_OVERRIDE, // call real function, but use my return value
HC_SUPERCEDE, HC_SUPERCEDE, // skip real function, use my return value
HC_BREAK HC_BREAK // skip all forwards and real function, use my return value
}; };
// api types // 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); 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 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); 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 // regamedll functions - player
void CBasePlayer_Spawn(IReGameHook_CBasePlayer_Spawn *chain, CBasePlayer *pthis); void CBasePlayer_Spawn(IReGameHook_CBasePlayer_Spawn *chain, CBasePlayer *pthis);

View File

@ -1,14 +1,16 @@
#include "precompiled.h" #include "precompiled.h"
inline size_t getFwdParamType(void(*)(int)) { return FP_CELL; } inline size_t getFwdParamType(void(*)(int)) { return FP_CELL; }
inline size_t getFwdParamType(void(*)(bool)) { 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(*)(Vector&)) { return FP_ARRAY; }
inline size_t getFwdParamType(void(*)(PLAYER_ANIM)) { 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(*)(ScenarionEventEndRound)) { return FP_CELL; }
inline size_t getFwdParamType(void(*)(const char *)) { return FP_STRING; } 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> 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> template<size_t current = 0>
void setupParamTypes(size_t param_types[], void (*)()) void setupParamTypes(size_t param_types[], void (*)())
@ -66,11 +68,12 @@ hook_t hooklist_engine[] = {
ENG(Cvar_DirectSet) 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[] = { hook_t hooklist_gamedll[] = {
DLL(GetForceCamera), DLL(GetForceCamera),
DLL(PlayerBlind), DLL(PlayerBlind),
DLL(RadiusFlash_TraceLine) DLL(RadiusFlash_TraceLine),
DLL(RoundEnd)
}; };
hook_t hooklist_animating[] = { hook_t hooklist_animating[] = {

View File

@ -63,42 +63,10 @@ struct hooklist_t
enum EngineFunc 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_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_DropClient,
RH_SV_ActivateServer, RH_SV_ActivateServer,
//RH_SV_WriteVoiceCodec,
//RH_Steam_GSGetSteamID,
//RH_SV_TransferConsistencyInfo,
//RH_Steam_GSBUpdateUserData,
RH_Cvar_DirectSet, RH_Cvar_DirectSet,
//RH_SV_EstablishTimeBase,
//RH_SV_Spawn_f,
// [...] // [...]
RH_EngineFunc_End RH_EngineFunc_End
@ -106,55 +74,56 @@ enum EngineFunc
enum GamedllFunc enum GamedllFunc
{ {
RH_GetForceCamera = BEGIN_FUNC_REGION(gamedll), RG_GetForceCamera = BEGIN_FUNC_REGION(gamedll),
RH_PlayerBlind, RG_PlayerBlind,
RH_RadiusFlash_TraceLine, RG_RadiusFlash_TraceLine,
RG_RoundEnd,
// [...] // [...]
RH_GameDLL_End RG_End
}; };
enum GamedllFunc_CBaseAnimating 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 enum GamedllFunc_CBasePlayer
{ {
// CBasePlayer virtual // CBasePlayer virtual
RH_CBasePlayer_Spawn = BEGIN_FUNC_REGION(player), RG_CBasePlayer_Spawn = BEGIN_FUNC_REGION(player),
RH_CBasePlayer_Precache, RG_CBasePlayer_Precache,
RH_CBasePlayer_ObjectCaps, RG_CBasePlayer_ObjectCaps,
RH_CBasePlayer_Classify, RG_CBasePlayer_Classify,
RH_CBasePlayer_TraceAttack, RG_CBasePlayer_TraceAttack,
RH_CBasePlayer_TakeDamage, RG_CBasePlayer_TakeDamage,
RH_CBasePlayer_TakeHealth, RG_CBasePlayer_TakeHealth,
RH_CBasePlayer_Killed, RG_CBasePlayer_Killed,
RH_CBasePlayer_AddPoints, RG_CBasePlayer_AddPoints,
RH_CBasePlayer_AddPointsToTeam, RG_CBasePlayer_AddPointsToTeam,
RH_CBasePlayer_AddPlayerItem, RG_CBasePlayer_AddPlayerItem,
RH_CBasePlayer_RemovePlayerItem, RG_CBasePlayer_RemovePlayerItem,
RH_CBasePlayer_GiveAmmo, RG_CBasePlayer_GiveAmmo,
RH_CBasePlayer_ResetMaxSpeed, RG_CBasePlayer_ResetMaxSpeed,
RH_CBasePlayer_Jump, RG_CBasePlayer_Jump,
RH_CBasePlayer_Duck, RG_CBasePlayer_Duck,
RH_CBasePlayer_PreThink, RG_CBasePlayer_PreThink,
RH_CBasePlayer_PostThink, RG_CBasePlayer_PostThink,
RH_CBasePlayer_UpdateClientData, RG_CBasePlayer_UpdateClientData,
RH_CBasePlayer_ImpulseCommands, RG_CBasePlayer_ImpulseCommands,
RH_CBasePlayer_RoundRespawn, RG_CBasePlayer_RoundRespawn,
RH_CBasePlayer_Blind, RG_CBasePlayer_Blind,
RH_CBasePlayer_Observer_IsValidTarget, RG_CBasePlayer_Observer_IsValidTarget,
RH_CBasePlayer_SetAnimation, RG_CBasePlayer_SetAnimation,
RH_CBasePlayer_GiveDefaultItems, RG_CBasePlayer_GiveDefaultItems,
RH_CBasePlayer_GiveNamedItem, RG_CBasePlayer_GiveNamedItem,
RH_CBasePlayer_AddAccount, RG_CBasePlayer_AddAccount,
RH_CBasePlayer_GiveShield, RG_CBasePlayer_GiveShield,
// [...] // [...]
RH_CBasePlayer_End RG_CBasePlayer_End
}; };

View File

@ -41,14 +41,16 @@ void CAmxxHook::SetState(fwdstate st)
void CHookManager::clearHandlers() const void CHookManager::clearHandlers() const
{ {
#define CLEAR_HOOKLIST(__END__, __START__)\ #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])\ if (m_hooklist[i])\
m_hooklist[i]->clear();\ m_hooklist[i]->clear();\
} }
CLEAR_HOOKLIST(EngineFunc, engine); CLEAR_HOOKLIST(RH_EngineFunc_End, engine);
CLEAR_HOOKLIST(GameDLL, gamedll);
CLEAR_HOOKLIST(CBasePlayer, player); 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 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_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") #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_bFreezePeriod, MEMBER_INTEGER),
GM_MEMBERS(m_bBombDropped, MEMBER_INTEGER), GM_MEMBERS(m_bBombDropped, MEMBER_INTEGER),
// m_VoiceGameMgr -> // m_VoiceGameMgr ->
@ -348,7 +348,7 @@ member_t memberlist_player[] = {
memberlist_t memberlist; memberlist_t memberlist;
member_t *memberlist_t::operator[](size_t members) const 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; #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); const auto table = members_tables_e(members / MAX_REGION_RANGE);

View File

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

View File

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

View File

@ -164,6 +164,77 @@ static cell AMX_NATIVE_CALL rg_fire_bullets3(AMX *amx, cell *params)
return TRUE; 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[] = AMX_NATIVE_INFO Misc_Natives[] =
{ {
{ "rg_set_animation", rg_set_animation }, { "rg_set_animation", rg_set_animation },
@ -180,6 +251,9 @@ AMX_NATIVE_INFO Misc_Natives[] =
{ "rg_fire_bullets", rg_fire_bullets }, { "rg_fire_bullets", rg_fire_bullets },
{ "rg_fire_bullets3", rg_fire_bullets3 }, { "rg_fire_bullets3", rg_fire_bullets3 },
{ "rg_round_end", rg_round_end },
{ "rg_update_teamscores", rg_update_teamscores },
{ nullptr, nullptr } { 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 #define ENTINDEX indexOfEdict
extern edict_t* g_pEdicts; extern edict_t* g_pEdicts;
extern enginefuncs_t* g_pengfuncsTable;
inline size_t indexOfEdict(edict_t* ed) 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); 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, ...); extern void __declspec(noreturn) UTIL_SysError(const char *fmt, ...);