mirror of
https://github.com/rehlds/reapi.git
synced 2024-12-29 08:05:36 +03:00
Update reapi sdk
HC_OVERRIDE mark as deprecated Do safe native GetHookChainReturn
This commit is contained in:
parent
adb34bb0ed
commit
30c7a76ca4
@ -687,6 +687,8 @@ enum RewardType
|
|||||||
RT_NONE,
|
RT_NONE,
|
||||||
RT_ROUND_BONUS,
|
RT_ROUND_BONUS,
|
||||||
RT_PLAYER_RESET,
|
RT_PLAYER_RESET,
|
||||||
|
RT_PLAYER_JOIN,
|
||||||
|
RT_PLAYER_SPEC_JOIN,
|
||||||
RT_PLAYER_BOUGHT_SOMETHING,
|
RT_PLAYER_BOUGHT_SOMETHING,
|
||||||
RT_HOSTAGE_TOOK,
|
RT_HOSTAGE_TOOK,
|
||||||
RT_HOSTAGE_RESCUED,
|
RT_HOSTAGE_RESCUED,
|
||||||
|
@ -56,13 +56,16 @@ enum members_tables_e
|
|||||||
#include <reapi_addons> // NOTE: 3-rd party addons
|
#include <reapi_addons> // NOTE: 3-rd party addons
|
||||||
#include <reapi_version>
|
#include <reapi_version>
|
||||||
|
|
||||||
|
#pragma deprecated Use HC_CONTINUE or anything.
|
||||||
|
#define HC_OVERRIDE 0
|
||||||
|
|
||||||
// hookchain return type
|
// hookchain return type
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
HC_CONTINUE = 0, // plugin didn't take any action
|
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_SUPERCEDE, // skip real function, use my return value
|
||||||
HC_BREAK // skip a call each forward in AMXX plugins
|
HC_BREAK // skip all forwards and real function, use my return value
|
||||||
|
// @note Warning: Be very careful using this type of return will skip calls for all following AMXX the plugins.
|
||||||
};
|
};
|
||||||
|
|
||||||
// hookchain types
|
// hookchain types
|
||||||
@ -113,7 +116,6 @@ native bool:EnableHookChain(HookChain:hook);
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Sets the return value of a hookchain.
|
* Sets the return value of a hookchain.
|
||||||
* This needs to be used in conjunction with RH_OVERRIDE or RH_SUPERCEDE.
|
|
||||||
*
|
*
|
||||||
* @param type To specify the type ATYPE_*, look at the enum AType
|
* @param type To specify the type ATYPE_*, look at the enum AType
|
||||||
* @param value The value to set the return to.
|
* @param value The value to set the return to.
|
||||||
@ -125,11 +127,12 @@ native SetHookChainReturn(AType:type, any:...);
|
|||||||
* Gets the return value of the current hookchain.
|
* Gets the return value of the current hookchain.
|
||||||
* This has no effect in pre hookchain.
|
* This has no effect in pre hookchain.
|
||||||
*
|
*
|
||||||
|
* @param type To specify the type ATYPE_*, look at the enum AType
|
||||||
* @param [maxlen] Max length of string (optional)
|
* @param [maxlen] Max length of string (optional)
|
||||||
* @return If an integer or boolean or one byte or float, array or everything else is passed via 1rd argument and more
|
* @return If an integer or boolean or one byte or float, array or everything else is passed via 1rd argument and more
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
native any:GetHookChainReturn(any:...);
|
native any:GetHookChainReturn(AType:type, any:...);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set hookchain argument.
|
* Set hookchain argument.
|
||||||
|
@ -4,9 +4,9 @@
|
|||||||
enum HookChainState
|
enum HookChainState
|
||||||
{
|
{
|
||||||
HC_CONTINUE = 0, // plugin didn't take any action
|
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_SUPERCEDE, // skip real function, use my return value
|
||||||
HC_BREAK // skip all forwards and real function, use my return value
|
HC_BREAK // skip all forwards and real function, use my return value
|
||||||
|
// @note Warning: Be very careful using this type of return will skip calls for all following AMXX the plugins.
|
||||||
};
|
};
|
||||||
|
|
||||||
// api types
|
// api types
|
||||||
@ -236,10 +236,10 @@ NOINLINE R DLLEXPORT _callForward(const hook_t* hook, original_t original, volat
|
|||||||
auto retVal = original(args...);
|
auto retVal = original(args...);
|
||||||
g_hookCtx = hookCtx;
|
g_hookCtx = hookCtx;
|
||||||
|
|
||||||
if (likely(hc_state != HC_OVERRIDE))
|
if (unlikely(!hookCtx->retVal.set)) {
|
||||||
hookCtx->retVal._integer = *(int *)&retVal;
|
hookCtx->retVal._integer = *(int *)&retVal;
|
||||||
|
hookCtx->retVal.set = true;
|
||||||
hookCtx->retVal.set = true;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto fwd : hook->post) {
|
for (auto fwd : hook->post) {
|
||||||
|
@ -100,7 +100,6 @@ cell AMX_NATIVE_CALL DisableHookChain(AMX *amx, cell *params)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Sets the return value of a hookchain.
|
* Sets the return value of a hookchain.
|
||||||
* This needs to be used in conjunction with RH_OVERRIDE or RH_SUPERCEDE.
|
|
||||||
*
|
*
|
||||||
* @param type To specify the type ATYPE_*, look at the enum AType
|
* @param type To specify the type ATYPE_*, look at the enum AType
|
||||||
* @param value The value to set the return to.
|
* @param value The value to set the return to.
|
||||||
@ -164,10 +163,11 @@ cell AMX_NATIVE_CALL SetHookChainReturn(AMX *amx, cell *params)
|
|||||||
* Gets the return value of the current hookchain.
|
* Gets the return value of the current hookchain.
|
||||||
* This has no effect in pre hookchain.
|
* This has no effect in pre hookchain.
|
||||||
*
|
*
|
||||||
|
* @param type To specify the type ATYPE_*, look at the enum AType
|
||||||
* @param [maxlen] Max length of string (optional)
|
* @param [maxlen] Max length of string (optional)
|
||||||
* @return If an integer or boolean or one byte or float, array or everything else is passed via 1rd argument and more
|
* @return If an integer or boolean or one byte or float, array or everything else is passed via 1rd argument and more
|
||||||
*
|
*
|
||||||
* native any:GetHookChainReturn(any:...);
|
* native any:GetHookChainReturn(AType:type, any:...);
|
||||||
*/
|
*/
|
||||||
cell AMX_NATIVE_CALL GetHookChainReturn(AMX *amx, cell *params)
|
cell AMX_NATIVE_CALL GetHookChainReturn(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
@ -177,9 +177,15 @@ cell AMX_NATIVE_CALL GetHookChainReturn(AMX *amx, cell *params)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum args_e { arg_count, arg_value, arg_maxlen };
|
enum args_e { arg_count, arg_type, arg_value, arg_maxlen };
|
||||||
auto& retVal = g_hookCtx->retVal;
|
auto& retVal = g_hookCtx->retVal;
|
||||||
|
|
||||||
|
if (unlikely(params[arg_type] != retVal.type))
|
||||||
|
{
|
||||||
|
MF_LogError(amx, AMX_ERR_NATIVE, "%s: trying to set return value with incompatible type.", __FUNCTION__);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
if (unlikely(!retVal.set))
|
if (unlikely(!retVal.set))
|
||||||
{
|
{
|
||||||
MF_LogError(amx, AMX_ERR_NATIVE, "%s: return value isn't set.", __FUNCTION__);
|
MF_LogError(amx, AMX_ERR_NATIVE, "%s: return value isn't set.", __FUNCTION__);
|
||||||
|
Loading…
Reference in New Issue
Block a user