mirror of
https://github.com/rehlds/reapi.git
synced 2025-01-01 09:35:47 +03:00
Small fixes
This commit is contained in:
parent
6fb4fc6779
commit
4c6f3c3d08
@ -29,7 +29,7 @@ struct retval_t
|
|||||||
{
|
{
|
||||||
char* _string;
|
char* _string;
|
||||||
float _float;
|
float _float;
|
||||||
int _interger;
|
int _integer;
|
||||||
CBaseEntity* _classptr;
|
CBaseEntity* _classptr;
|
||||||
edict_t* _edict;
|
edict_t* _edict;
|
||||||
entvars_t* _pev;
|
entvars_t* _pev;
|
||||||
@ -48,36 +48,44 @@ inline AType getApiType(entvars_t *) { return ATYPE_EVARS; }
|
|||||||
template<typename T>
|
template<typename T>
|
||||||
inline AType getApiType(T *) { return ATYPE_INTEGER; }
|
inline AType getApiType(T *) { return ATYPE_INTEGER; }
|
||||||
|
|
||||||
#define MAX_ARGS 12u
|
#define MAX_HOOKCHAIN_ARGS 12u
|
||||||
|
|
||||||
template<size_t current = 0, typename T1, typename T2, typename T3, typename T4, typename ...t_args>
|
template<size_t current = 0, typename T1, typename T2, typename T3, typename T4, typename ...t_args>
|
||||||
void setupArgTypes(AType args_type[MAX_ARGS], T1, T2, T3, T4, t_args... args)
|
void setupArgTypes(AType args_type[], T1, T2, T3, T4, t_args... args)
|
||||||
{
|
{
|
||||||
|
if (current + 4 <= MAX_HOOKCHAIN_ARGS)
|
||||||
*(uint32 *)&args_type[current] = getApiType(T1()) | (getApiType(T2()) << 8) | (getApiType(T3()) << 16) | (getApiType(T4()) << 24);
|
*(uint32 *)&args_type[current] = getApiType(T1()) | (getApiType(T2()) << 8) | (getApiType(T3()) << 16) | (getApiType(T4()) << 24);
|
||||||
if (sizeof...(args) && current + 1 < MAX_ARGS)
|
if (sizeof...(args) && current + 4 < MAX_HOOKCHAIN_ARGS)
|
||||||
setupArgTypes<current + 4>(args_type, args...);
|
setupArgTypes<current + 4>(args_type, args...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<size_t current = 0, typename T1, typename T2, typename T3>
|
template<size_t current = 0, typename T1, typename T2, typename T3>
|
||||||
void setupArgTypes(AType args_type[MAX_ARGS], T1, T2, T3)
|
void setupArgTypes(AType args_type[], T1, T2, T3)
|
||||||
{
|
{
|
||||||
|
if (current + 3 <= MAX_HOOKCHAIN_ARGS)
|
||||||
*(uint32 *)&args_type[current] = getApiType(T1()) | (getApiType(T2()) << 8) | (getApiType(T3()) << 16);
|
*(uint32 *)&args_type[current] = getApiType(T1()) | (getApiType(T2()) << 8) | (getApiType(T3()) << 16);
|
||||||
|
else
|
||||||
|
setupArgTypes(args_type, T1(), T2());
|
||||||
}
|
}
|
||||||
|
|
||||||
template<size_t current = 0, typename T1, typename T2>
|
template<size_t current = 0, typename T1, typename T2>
|
||||||
void setupArgTypes(AType args_type[MAX_ARGS], T1, T2)
|
void setupArgTypes(AType args_type[], T1, T2)
|
||||||
{
|
{
|
||||||
|
if (current + 2 <= MAX_HOOKCHAIN_ARGS)
|
||||||
*(uint16 *)&args_type[current] = getApiType(T1()) | (getApiType(T2()) << 8);
|
*(uint16 *)&args_type[current] = getApiType(T1()) | (getApiType(T2()) << 8);
|
||||||
|
else
|
||||||
|
setupArgTypes(args_type, T1());
|
||||||
}
|
}
|
||||||
|
|
||||||
template<size_t current = 0, typename T>
|
template<size_t current = 0, typename T>
|
||||||
void setupArgTypes(AType args_type[MAX_ARGS], T)
|
void setupArgTypes(AType args_type[], T)
|
||||||
{
|
{
|
||||||
|
if (current + 1 <= MAX_HOOKCHAIN_ARGS)
|
||||||
args_type[current] = getApiType(T());
|
args_type[current] = getApiType(T());
|
||||||
}
|
}
|
||||||
|
|
||||||
template<size_t current = 0>
|
template<size_t current = 0>
|
||||||
void setupArgTypes(AType args_type[MAX_ARGS])
|
void setupArgTypes(AType args_type[])
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,7 +94,7 @@ struct hookctx_t
|
|||||||
template<typename ...t_args>
|
template<typename ...t_args>
|
||||||
hookctx_t(size_t arg_count, t_args... args)
|
hookctx_t(size_t arg_count, t_args... args)
|
||||||
{
|
{
|
||||||
args_count = min(arg_count, MAX_ARGS);
|
args_count = min(arg_count, MAX_HOOKCHAIN_ARGS);
|
||||||
setupArgTypes(args_type, args...);
|
setupArgTypes(args_type, args...);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -100,7 +108,7 @@ struct hookctx_t
|
|||||||
retval_t retVal;
|
retval_t retVal;
|
||||||
size_t args_count;
|
size_t args_count;
|
||||||
size_t args_ptr;
|
size_t args_ptr;
|
||||||
AType args_type[MAX_ARGS];
|
AType args_type[MAX_HOOKCHAIN_ARGS];
|
||||||
};
|
};
|
||||||
|
|
||||||
extern hookctx_t* g_hookCtx;
|
extern hookctx_t* g_hookCtx;
|
||||||
@ -112,7 +120,7 @@ NOINLINE void DLLEXPORT _callVoidForward(const hook_t* hook, original_t original
|
|||||||
hookCtx->reset(size_t(&original) + sizeof(original));
|
hookCtx->reset(size_t(&original) + sizeof(original));
|
||||||
int hc_state = HC_CONTINUE;
|
int hc_state = HC_CONTINUE;
|
||||||
|
|
||||||
for (auto& fwd : hook->pre)
|
for (auto fwd : hook->pre)
|
||||||
{
|
{
|
||||||
if (fwd->GetState() == FSTATE_ENABLED)
|
if (fwd->GetState() == FSTATE_ENABLED)
|
||||||
{
|
{
|
||||||
@ -133,7 +141,7 @@ NOINLINE void DLLEXPORT _callVoidForward(const hook_t* hook, original_t original
|
|||||||
g_hookCtx = hookCtx;
|
g_hookCtx = hookCtx;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& fwd : hook->post) {
|
for (auto fwd : hook->post) {
|
||||||
if (fwd->GetState() == FSTATE_ENABLED) {
|
if (fwd->GetState() == FSTATE_ENABLED) {
|
||||||
auto ret = g_amxxapi.ExecuteForward(fwd->GetIndex(), args...);
|
auto ret = g_amxxapi.ExecuteForward(fwd->GetIndex(), args...);
|
||||||
|
|
||||||
@ -160,14 +168,15 @@ NOINLINE R DLLEXPORT _callForward(const hook_t* hook, original_t original, volat
|
|||||||
hookCtx->reset(size_t(&original) + sizeof(original), getApiType(R()));
|
hookCtx->reset(size_t(&original) + sizeof(original), getApiType(R()));
|
||||||
int hc_state = HC_CONTINUE;
|
int hc_state = HC_CONTINUE;
|
||||||
|
|
||||||
for (auto& fwd : hook->pre)
|
for (auto fwd : hook->pre)
|
||||||
{
|
{
|
||||||
if (fwd->GetState() == FSTATE_ENABLED)
|
if (fwd->GetState() == FSTATE_ENABLED)
|
||||||
{
|
{
|
||||||
auto ret = g_amxxapi.ExecuteForward(fwd->GetIndex(), args...);
|
auto ret = g_amxxapi.ExecuteForward(fwd->GetIndex(), args...);
|
||||||
|
|
||||||
if (ret == HC_CONTINUE)
|
if (ret == HC_CONTINUE) {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (!hookCtx->retVal.set) {
|
if (!hookCtx->retVal.set) {
|
||||||
g_amxxapi.LogError(fwd->GetAmx(), AMX_ERR_CALLBACK, "%s", "can't suppress original function call without new return value set");
|
g_amxxapi.LogError(fwd->GetAmx(), AMX_ERR_CALLBACK, "%s", "can't suppress original function call without new return value set");
|
||||||
@ -175,7 +184,7 @@ NOINLINE R DLLEXPORT _callForward(const hook_t* hook, original_t original, volat
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ret == HC_BREAK) {
|
if (ret == HC_BREAK) {
|
||||||
return *(R *)&hookCtx->retVal._interger;
|
return *(R *)&hookCtx->retVal._integer;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret > hc_state)
|
if (ret > hc_state)
|
||||||
@ -190,10 +199,12 @@ NOINLINE R DLLEXPORT _callForward(const hook_t* hook, original_t original, volat
|
|||||||
g_hookCtx = hookCtx;
|
g_hookCtx = hookCtx;
|
||||||
|
|
||||||
if (hc_state != HC_OVERRIDE)
|
if (hc_state != HC_OVERRIDE)
|
||||||
hookCtx->retVal._interger = *(int *)&retVal;
|
hookCtx->retVal._integer = *(int *)&retVal;
|
||||||
|
|
||||||
|
hookCtx->retVal.set = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& fwd : hook->post) {
|
for (auto fwd : hook->post) {
|
||||||
if (fwd->GetState() == FSTATE_ENABLED) {
|
if (fwd->GetState() == FSTATE_ENABLED) {
|
||||||
auto ret = g_amxxapi.ExecuteForward(fwd->GetIndex(), args...);
|
auto ret = g_amxxapi.ExecuteForward(fwd->GetIndex(), args...);
|
||||||
|
|
||||||
@ -202,7 +213,7 @@ NOINLINE R DLLEXPORT _callForward(const hook_t* hook, original_t original, volat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return *(R *)&hookCtx->retVal._interger;
|
return *(R *)&hookCtx->retVal._integer;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename R, typename original_t, typename ...f_args>
|
template <typename R, typename original_t, typename ...f_args>
|
||||||
|
@ -27,7 +27,7 @@ cell AMX_NATIVE_CALL RegisterHookChain(AMX *amx, cell *params)
|
|||||||
|
|
||||||
if (!hook->checkRequirements())
|
if (!hook->checkRequirements())
|
||||||
{
|
{
|
||||||
MF_LogError(amx, AMX_ERR_NATIVE, "%s: function (%s) is not available, %s required", __FUNCTION__, hook->func_name, hook->depend_name);
|
MF_LogError(amx, AMX_ERR_NATIVE, "%s: function (%s) is not available, %s required.", __FUNCTION__, hook->func_name, hook->depend_name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,7 +130,7 @@ cell AMX_NATIVE_CALL SetHookChainReturn(AMX *amx, cell *params)
|
|||||||
{
|
{
|
||||||
case ATYPE_INTEGER:
|
case ATYPE_INTEGER:
|
||||||
case ATYPE_FLOAT:
|
case ATYPE_FLOAT:
|
||||||
retVal._interger = *srcAddr;
|
retVal._integer = *srcAddr;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ATYPE_STRING:
|
case ATYPE_STRING:
|
||||||
@ -178,15 +178,21 @@ cell AMX_NATIVE_CALL GetHookChainReturn(AMX *amx, cell *params)
|
|||||||
}
|
}
|
||||||
|
|
||||||
enum args_e { arg_count, arg_value, arg_maxlen };
|
enum args_e { arg_count, arg_value, arg_maxlen };
|
||||||
|
|
||||||
auto& retVal = g_hookCtx->retVal;
|
auto& retVal = g_hookCtx->retVal;
|
||||||
|
|
||||||
|
if (!retVal.set)
|
||||||
|
{
|
||||||
|
MF_LogError(amx, AMX_ERR_NATIVE, "%s: return value isn't set.", __FUNCTION__);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
cell* dstAddr = getAmxAddr(amx, params[arg_value]);
|
cell* dstAddr = getAmxAddr(amx, params[arg_value]);
|
||||||
|
|
||||||
switch (retVal.type)
|
switch (retVal.type)
|
||||||
{
|
{
|
||||||
case ATYPE_INTEGER:
|
case ATYPE_INTEGER:
|
||||||
case ATYPE_FLOAT:
|
case ATYPE_FLOAT:
|
||||||
return retVal._interger;
|
return retVal._integer;
|
||||||
case ATYPE_STRING:
|
case ATYPE_STRING:
|
||||||
{
|
{
|
||||||
if (PARAMS_COUNT != 2)
|
if (PARAMS_COUNT != 2)
|
||||||
@ -244,7 +250,7 @@ cell AMX_NATIVE_CALL SetHookChainArg(AMX *amx, cell *params)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char temp_strings[MAX_ARGS][1024];
|
static char temp_strings[MAX_HOOKCHAIN_ARGS][1024];
|
||||||
|
|
||||||
cell* srcAddr = getAmxAddr(amx, params[arg_value]);
|
cell* srcAddr = getAmxAddr(amx, params[arg_value]);
|
||||||
size_t destAddr = g_hookCtx->args_ptr + number * sizeof(int);
|
size_t destAddr = g_hookCtx->args_ptr + number * sizeof(int);
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
void __declspec(noreturn) UTIL_SysError(const char *fmt, ...)
|
void __declspec(noreturn) UTIL_SysError(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list argptr;
|
va_list argptr;
|
||||||
static char string[8192];
|
char string[8192];
|
||||||
|
|
||||||
va_start(argptr, fmt);
|
va_start(argptr, fmt);
|
||||||
vsnprintf(string, sizeof(string), fmt, argptr);
|
vsnprintf(string, sizeof(string), fmt, argptr);
|
||||||
@ -32,7 +32,7 @@ char *UTIL_VarArgs(char *format, ...)
|
|||||||
void UTIL_LogPrintf(const char *fmt, ...)
|
void UTIL_LogPrintf(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list argptr;
|
va_list argptr;
|
||||||
static char string[1024];
|
char string[1024];
|
||||||
|
|
||||||
va_start(argptr, fmt);
|
va_start(argptr, fmt);
|
||||||
vsprintf(string, fmt, argptr);
|
vsprintf(string, fmt, argptr);
|
||||||
|
Loading…
Reference in New Issue
Block a user