mirror of
https://github.com/rehlds/reapi.git
synced 2025-01-01 09:35:47 +03:00
Increased automation of hookchains registration
This commit is contained in:
parent
df8cab66f4
commit
170f67bdf2
@ -4,5 +4,5 @@
|
|||||||
#define _reapi_const_included
|
#define _reapi_const_included
|
||||||
|
|
||||||
// reapi version
|
// reapi version
|
||||||
#define REAPI_VERISON_MAJOR 2
|
#define REAPI_VERISON_MAJOR 1
|
||||||
#define REAPI_VERISON_MINOR 0
|
#define REAPI_VERISON_MINOR 0
|
||||||
|
@ -15,14 +15,14 @@ bool CAPI_Config::Init()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAPI_Config::ServerActivate()
|
void CAPI_Config::ServerActivate() const
|
||||||
{
|
{
|
||||||
if (m_api_regame) {
|
if (m_api_regame) {
|
||||||
g_pCSGameRules = (CHalfLifeMultiplay **)g_ReGameApi->GetGameData()->GetGameRules();
|
g_pCSGameRules = (CHalfLifeMultiplay **)g_ReGameApi->GetGameData()->GetGameRules();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAPI_Config::ServerDeactivate()
|
void CAPI_Config::ServerDeactivate() const
|
||||||
{
|
{
|
||||||
if (m_api_regame) {
|
if (m_api_regame) {
|
||||||
g_pCSGameRules = nullptr;
|
g_pCSGameRules = nullptr;
|
||||||
|
@ -11,8 +11,8 @@ public:
|
|||||||
bool hasReHLDS() const { return m_api_rehlds; }
|
bool hasReHLDS() const { return m_api_rehlds; }
|
||||||
bool hasReGameDLL() const { return m_api_regame; }
|
bool hasReGameDLL() const { return m_api_regame; }
|
||||||
|
|
||||||
void ServerActivate();
|
void ServerActivate() const;
|
||||||
void ServerDeactivate();
|
void ServerDeactivate() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// to provide API functions
|
// to provide API functions
|
||||||
|
@ -47,7 +47,7 @@ void setupArgTypes(AType args_type[MAX_ARGS])
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<size_t current = 0, typename T, typename ...t_args>
|
template<size_t current = 0, typename T, typename ...t_args>
|
||||||
void setupArgTypes(AType args_type[MAX_ARGS], T arg, t_args... args)
|
void setupArgTypes(AType args_type[MAX_ARGS], T, t_args... args)
|
||||||
{
|
{
|
||||||
args_type[current] = getApiType(T());
|
args_type[current] = getApiType(T());
|
||||||
if (sizeof...(args) && current + 1 < MAX_ARGS)
|
if (sizeof...(args) && current + 1 < MAX_ARGS)
|
||||||
@ -201,7 +201,6 @@ 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);
|
||||||
|
|
||||||
|
|
||||||
// regamedll functions - player
|
// regamedll functions - player
|
||||||
void CBasePlayer_Spawn(IReGameHook_CBasePlayer_Spawn *chain, CBasePlayer *pthis);
|
void CBasePlayer_Spawn(IReGameHook_CBasePlayer_Spawn *chain, CBasePlayer *pthis);
|
||||||
void CBasePlayer_Precache(IReGameHook_CBasePlayer_Precache *chain, CBasePlayer *pthis);
|
void CBasePlayer_Precache(IReGameHook_CBasePlayer_Precache *chain, CBasePlayer *pthis);
|
||||||
@ -233,5 +232,4 @@ void CBasePlayer_GiveNamedItem(IReGameHook_CBasePlayer_GiveNamedItem *chain, CBa
|
|||||||
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);
|
||||||
void CBasePlayer_GiveShield(IReGameHook_CBasePlayer_GiveShield *chain, CBasePlayer *pthis, bool bDeploy);
|
void CBasePlayer_GiveShield(IReGameHook_CBasePlayer_GiveShield *chain, CBasePlayer *pthis, bool bDeploy);
|
||||||
|
|
||||||
|
|
||||||
void CBaseAnimating_ResetSequenceInfo(IReGameHook_CBaseAnimating_ResetSequenceInfo *chain, CBaseAnimating *pthis);
|
void CBaseAnimating_ResetSequenceInfo(IReGameHook_CBaseAnimating_ResetSequenceInfo *chain, CBaseAnimating *pthis);
|
||||||
|
@ -1,5 +1,61 @@
|
|||||||
#include "precompiled.h"
|
#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; }
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline size_t getFwdParamType(void(*)(T *)) { return FP_CELL; }
|
||||||
|
|
||||||
|
template<size_t current = 0>
|
||||||
|
void setupParamTypes(size_t param_types[], void (*)())
|
||||||
|
{
|
||||||
|
param_types[current] = FP_DONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<size_t current = 0, typename T, typename ...t_args>
|
||||||
|
void setupParamTypes(size_t param_types[], void(*)(T, t_args...))
|
||||||
|
{
|
||||||
|
void (*func)(T) = nullptr;
|
||||||
|
param_types[current] = getFwdParamType(func);
|
||||||
|
void (*next)(t_args...) = nullptr;
|
||||||
|
setupParamTypes<current + 1>(param_types, next);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename... f_args>
|
||||||
|
struct regargs
|
||||||
|
{
|
||||||
|
regargs(void (*)(f_args...))
|
||||||
|
{
|
||||||
|
void (*func)(f_args...) = nullptr;
|
||||||
|
setupParamTypes(types, func);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t types[sizeof...(f_args) + 1]; // + FP_DONE
|
||||||
|
};
|
||||||
|
|
||||||
|
struct regfunc
|
||||||
|
{
|
||||||
|
template<typename R, typename T, typename... f_args>
|
||||||
|
regfunc(R (*)(T, f_args...))
|
||||||
|
{
|
||||||
|
func = [](AMX *amx, const char *name) {
|
||||||
|
void(*func)(f_args...) = nullptr;
|
||||||
|
regargs<f_args...> args(func);
|
||||||
|
return g_amxxapi.RegisterSPForwardByName(amx, name, args);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
regfunc(const char *error) { UTIL_SysError(error); } // to cause a amxx module failure.
|
||||||
|
operator regfunc_t() const { return func; }
|
||||||
|
regfunc_t func;
|
||||||
|
|
||||||
|
static int current_cell; // the counter of cells
|
||||||
|
};
|
||||||
|
|
||||||
int regfunc::current_cell = 1;
|
int regfunc::current_cell = 1;
|
||||||
|
|
||||||
#define ENG(h) { {}, {}, #h, "ReHLDS", [](){ return api_cfg.hasReHLDS(); }, ((!(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_RehldsHookchains->##h##()->registerHook(&##h); }, [](){ g_RehldsHookchains->##h##()->unregisterHook(&##h); }}
|
#define ENG(h) { {}, {}, #h, "ReHLDS", [](){ return api_cfg.hasReHLDS(); }, ((!(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_RehldsHookchains->##h##()->registerHook(&##h); }, [](){ g_RehldsHookchains->##h##()->unregisterHook(&##h); }}
|
||||||
@ -69,3 +125,16 @@ hook_t* hooklist_t::getHookSafe(size_t hook)
|
|||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void hook_t::clear()
|
||||||
|
{
|
||||||
|
for (auto h : pre)
|
||||||
|
delete h;
|
||||||
|
pre.clear();
|
||||||
|
|
||||||
|
for (auto h : post)
|
||||||
|
delete h;
|
||||||
|
post.clear();
|
||||||
|
|
||||||
|
unregisterHookchain();
|
||||||
|
}
|
||||||
|
@ -8,115 +8,6 @@ typedef bool (*reqfunc_t)();
|
|||||||
typedef int (*regfunc_t)(AMX *, const char *);
|
typedef int (*regfunc_t)(AMX *, const char *);
|
||||||
typedef void (*regchain_t)();
|
typedef void (*regchain_t)();
|
||||||
|
|
||||||
struct regfunc
|
|
||||||
{
|
|
||||||
template<typename T, typename R>
|
|
||||||
regfunc(R (*)(T *, int, edict_t *, int, const char *, int, float, int, int)) {
|
|
||||||
func = [](AMX *amx, const char *name) { return g_amxxapi.RegisterSPForwardByName(amx, name, FP_CELL, FP_CELL, FP_CELL, FP_STRING, FP_CELL, FP_FLOAT, FP_CELL, FP_CELL, FP_DONE); };
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, typename R>
|
|
||||||
regfunc(R (*)(T *, IGameClient *, bool, const char *)) {
|
|
||||||
func = [](AMX *amx, const char *name) { return g_amxxapi.RegisterSPForwardByName(amx, name, FP_CELL, FP_CELL, FP_STRING, FP_DONE); };
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, typename R>
|
|
||||||
regfunc(R (*)(T *, int)) {
|
|
||||||
func = [](AMX *amx, const char *name) { return g_amxxapi.RegisterSPForwardByName(amx, name, FP_CELL, FP_DONE); };
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, typename R>
|
|
||||||
regfunc(R (*)(T *, struct cvar_s *, const char *)) {
|
|
||||||
func = [](AMX *amx, const char *name) { return g_amxxapi.RegisterSPForwardByName(amx, name, FP_CELL, FP_STRING, FP_DONE); };
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, typename R>
|
|
||||||
regfunc(R (*)(T *, CBaseAnimating *)) {
|
|
||||||
func = [](AMX *amx, const char *name) { return g_amxxapi.RegisterSPForwardByName(amx, name, FP_CELL, FP_DONE); };
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, typename R>
|
|
||||||
regfunc(R (*)(T *, CBasePlayer *)) {
|
|
||||||
func = [](AMX *amx, const char *name) { return g_amxxapi.RegisterSPForwardByName(amx, name, FP_CELL, FP_DONE); };
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, typename R>
|
|
||||||
regfunc(R (*)(T *, CBasePlayer *, const char *)) {
|
|
||||||
func = [](AMX *amx, const char *name) { return g_amxxapi.RegisterSPForwardByName(amx, name, FP_CELL, FP_STRING, FP_DONE); };
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, typename R>
|
|
||||||
regfunc(R (*)(T *, CBasePlayer *, bool)) {
|
|
||||||
func = [](AMX *amx, const char *name) { return g_amxxapi.RegisterSPForwardByName(amx, name, FP_CELL, FP_CELL, FP_DONE); };
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, typename R>
|
|
||||||
regfunc(R (*)(T *, CBasePlayer *, PLAYER_ANIM)) {
|
|
||||||
func = [](AMX *amx, const char *name) { return g_amxxapi.RegisterSPForwardByName(amx, name, FP_CELL, FP_CELL, FP_DONE); };
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, typename R>
|
|
||||||
regfunc(R (*)(T *, CBasePlayer *, entvars_t *, float, Vector&, TraceResult *, int)) {
|
|
||||||
func = [](AMX *amx, const char *name) { return g_amxxapi.RegisterSPForwardByName(amx, name, FP_CELL, FP_CELL, FP_FLOAT, FP_ARRAY, FP_CELL, FP_CELL, FP_DONE); };
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, typename R>
|
|
||||||
regfunc(R (*)(T *, CBasePlayer *, entvars_t *, entvars_t *, float, int)) {
|
|
||||||
func = [](AMX *amx, const char *name) { return g_amxxapi.RegisterSPForwardByName(amx, name, FP_CELL, FP_CELL, FP_CELL, FP_FLOAT, FP_CELL, FP_DONE); };
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, typename R>
|
|
||||||
regfunc(R (*)(T *, CBasePlayer *, float, int)) {
|
|
||||||
func = [](AMX *amx, const char *name) { return g_amxxapi.RegisterSPForwardByName(amx, name, FP_CELL, FP_FLOAT, FP_CELL, FP_DONE); };
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, typename R>
|
|
||||||
regfunc(R (*)(T *, CBasePlayer *, entvars_t *, int)) {
|
|
||||||
func = [](AMX *amx, const char *name) { return g_amxxapi.RegisterSPForwardByName(amx, name, FP_CELL, FP_CELL, FP_CELL, FP_DONE); };
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, typename R>
|
|
||||||
regfunc(R (*)(T *, CBasePlayer *, int, BOOL)) {
|
|
||||||
func = [](AMX *amx, const char *name) { return g_amxxapi.RegisterSPForwardByName(amx, name, FP_CELL, FP_CELL, FP_CELL, FP_DONE); };
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, typename R>
|
|
||||||
regfunc(R (*)(T *, CBasePlayer *, CBasePlayerItem *)) {
|
|
||||||
func = [](AMX *amx, const char *name) { return g_amxxapi.RegisterSPForwardByName(amx, name, FP_CELL, FP_CELL, FP_DONE); };
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, typename R>
|
|
||||||
regfunc(R (*)(T *, CBasePlayer *, int, char *, int)) {
|
|
||||||
func = [](AMX *amx, const char *name) { return g_amxxapi.RegisterSPForwardByName(amx, name, FP_CELL, FP_CELL, FP_STRING, FP_CELL, FP_DONE); };
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, typename R>
|
|
||||||
regfunc(R (*)(T *, CBasePlayer *, float, float, float, int)) {
|
|
||||||
func = [](AMX *amx, const char *name) { return g_amxxapi.RegisterSPForwardByName(amx, name, FP_CELL, FP_FLOAT, FP_FLOAT, FP_FLOAT, FP_CELL, FP_DONE); };
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, typename R>
|
|
||||||
regfunc(R (*)(T *, CBasePlayer *, int, bool)) {
|
|
||||||
func = [](AMX *amx, const char *name) { return g_amxxapi.RegisterSPForwardByName(amx, name, FP_CELL, FP_CELL, FP_CELL, FP_DONE); };
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, typename R>
|
|
||||||
regfunc(R (*)(T *, CBasePlayer *, entvars_t *, entvars_t *, float, float, int, Vector&)) {
|
|
||||||
func = [](AMX *amx, const char *name) { return g_amxxapi.RegisterSPForwardByName(amx, name, FP_CELL, FP_CELL, FP_CELL, FP_FLOAT, FP_FLOAT, FP_CELL, FP_ARRAY, FP_DONE); };
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, typename R>
|
|
||||||
regfunc(R (*)(T *, CBasePlayer *, entvars_t *, entvars_t *, Vector&, Vector&, TraceResult *)) {
|
|
||||||
func = [](AMX *amx, const char *name) { return g_amxxapi.RegisterSPForwardByName(amx, name, FP_CELL, FP_CELL, FP_CELL, FP_ARRAY, FP_ARRAY, FP_CELL, FP_DONE); };
|
|
||||||
}
|
|
||||||
|
|
||||||
regfunc(const char *error) { UTIL_SysError(error); } // to cause a amxx module failure.
|
|
||||||
operator regfunc_t() const { return func; }
|
|
||||||
regfunc_t func;
|
|
||||||
|
|
||||||
static int current_cell; // the counter of cells
|
|
||||||
};
|
|
||||||
|
|
||||||
struct hook_t
|
struct hook_t
|
||||||
{
|
{
|
||||||
std::vector<class CAmxxHook *> pre; // pre forwards
|
std::vector<class CAmxxHook *> pre; // pre forwards
|
||||||
@ -129,6 +20,8 @@ struct hook_t
|
|||||||
regfunc_t registerForward; // AMXX forward registration function
|
regfunc_t registerForward; // AMXX forward registration function
|
||||||
regchain_t registerHookchain; // register re* API hook
|
regchain_t registerHookchain; // register re* API hook
|
||||||
regchain_t unregisterHookchain; // unregister re* API hook
|
regchain_t unregisterHookchain; // unregister re* API hook
|
||||||
|
|
||||||
|
void clear();
|
||||||
};
|
};
|
||||||
|
|
||||||
extern hook_t hooklist_engine[];
|
extern hook_t hooklist_engine[];
|
||||||
|
@ -4,13 +4,15 @@ CHookManager g_hookManager;
|
|||||||
|
|
||||||
int CHookManager::addHandler(AMX* amx, int func, int forward, bool post) const
|
int CHookManager::addHandler(AMX* amx, int func, int forward, bool post) const
|
||||||
{
|
{
|
||||||
if (!m_hooklist[func]->post.size() && !m_hooklist[func]->pre.size())
|
auto hook = m_hooklist.getHookSafe(func);
|
||||||
|
|
||||||
|
if (!hook->post.size() && !hook->pre.size())
|
||||||
{
|
{
|
||||||
// API hookchain
|
// API hookchain
|
||||||
m_hooklist[func]->registerHookchain();
|
hook->registerHookchain();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto& dest = post ? m_hooklist[func]->post : m_hooklist[func]->pre;
|
auto& dest = post ? hook->post : hook->pre;
|
||||||
dest.push_back(new CAmxxHook(amx, forward));
|
dest.push_back(new CAmxxHook(amx, forward));
|
||||||
int id = func * MAX_HOOK_FORWARDS + dest.size();
|
int id = func * MAX_HOOK_FORWARDS + dest.size();
|
||||||
return post ? -id : id; // use unsigned ids for post hooks
|
return post ? -id : id; // use unsigned ids for post hooks
|
||||||
@ -40,11 +42,8 @@ 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 < RH_##__END__##_End; ++i) {\
|
||||||
if (m_hooklist[i] == nullptr)\
|
if (m_hooklist[i])\
|
||||||
continue;\
|
m_hooklist[i]->clear();\
|
||||||
m_hooklist[i]->pre.clear();\
|
|
||||||
m_hooklist[i]->post.clear();\
|
|
||||||
m_hooklist[i]->unregisterHookchain();\
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CLEAR_HOOKLIST(EngineFunc, engine);
|
CLEAR_HOOKLIST(EngineFunc, engine);
|
||||||
@ -59,18 +58,16 @@ hook_t* CHookManager::getHook(size_t func) const
|
|||||||
|
|
||||||
CAmxxHook* CHookManager::getAmxxHook(cell handle) const
|
CAmxxHook* CHookManager::getAmxxHook(cell handle) const
|
||||||
{
|
{
|
||||||
bool post = false;
|
bool post = handle < 0;
|
||||||
|
|
||||||
if (handle < 0) // post
|
if (post)
|
||||||
{
|
|
||||||
handle = ~handle;
|
handle = ~handle;
|
||||||
post = true;
|
else
|
||||||
}
|
handle--;
|
||||||
else handle--;
|
|
||||||
|
|
||||||
const size_t func = handle / MAX_HOOK_FORWARDS;
|
const size_t func = handle / MAX_HOOK_FORWARDS;
|
||||||
const size_t id = handle & (MAX_HOOK_FORWARDS - 1);
|
const size_t id = handle & (MAX_HOOK_FORWARDS - 1);
|
||||||
auto hook = m_hooklist[func];
|
auto hook = m_hooklist.getHookSafe(func);
|
||||||
|
|
||||||
if (hook)
|
if (hook)
|
||||||
{
|
{
|
||||||
|
@ -255,7 +255,7 @@ static cell AMX_NATIVE_CALL SetHookChainArg(AMX *amx, cell *params)
|
|||||||
*(cell *)destAddr = *srcAddr;
|
*(cell *)destAddr = *srcAddr;
|
||||||
break;
|
break;
|
||||||
case ATYPE_STRING:
|
case ATYPE_STRING:
|
||||||
*(char **)destAddr = getAmxStringTemp(srcAddr, temp_strings[number], 1023);
|
*(char **)destAddr = getAmxStringTemp(srcAddr, temp_strings[number], sizeof temp_strings[0] - 1);
|
||||||
break;
|
break;
|
||||||
case ATYPE_CLASSPTR:
|
case ATYPE_CLASSPTR:
|
||||||
*(CBaseEntity **)destAddr = CBaseEntity::Instance(INDEXENT(*srcAddr));
|
*(CBaseEntity **)destAddr = CBaseEntity::Instance(INDEXENT(*srcAddr));
|
||||||
|
@ -4,5 +4,5 @@
|
|||||||
#define _reapi_const_included
|
#define _reapi_const_included
|
||||||
|
|
||||||
// reapi version
|
// reapi version
|
||||||
#define REAPI_VERISON_MAJOR 2
|
#define REAPI_VERISON_MAJOR 1
|
||||||
#define REAPI_VERISON_MINOR 0
|
#define REAPI_VERISON_MINOR 0
|
||||||
|
Loading…
Reference in New Issue
Block a user