Если требуется сделать HC_SUPERCEDE в хуке RG_PM_Move(и не спрашивайте зачем это нужно, просто нужно), то возникает проблема.
Дело в том, что глобальный указатель pmove https://github.com/s1lentq/ReGameDL...1ac0dd1/regamedll/pm_shared/pm_shared.cpp#L12 устанавливается в самой функции PM_Move https://github.com/s1lentq/ReGameDL...c0dd1/regamedll/pm_shared/pm_shared.cpp#L3174 , а значит при хукании ее и возвращении HC_SUPERCEDE указатель не будет устанавливаться, это ломает работу функций set_pmove и get_pmove, они получают данные разыменовывая этот глобальный указатель, таким образом данные становится возможным получить только разыменовывая указатель - аргумент функции, который представлен так Решение проблемы предложил juice
Дело в том, что глобальный указатель pmove https://github.com/s1lentq/ReGameDL...1ac0dd1/regamedll/pm_shared/pm_shared.cpp#L12 устанавливается в самой функции PM_Move https://github.com/s1lentq/ReGameDL...c0dd1/regamedll/pm_shared/pm_shared.cpp#L3174 , а значит при хукании ее и возвращении HC_SUPERCEDE указатель не будет устанавливаться, это ломает работу функций set_pmove и get_pmove, они получают данные разыменовывая этот глобальный указатель, таким образом данные становится возможным получить только разыменовывая указатель - аргумент функции, который представлен так
const PlayerMove:pmove
но как это делать? вариант pmove[pm_myfield]
разумеется не работает, ошибка компиляции16 Сен 2018
Код:
#include <amxmodx>
#include <reapi>
#include <fakemeta>
new g_pPlayerMove;
public plugin_init() {
RegisterHookChain(RG_PM_Move, "OnPM_Move_Pre", false);
}
public OnPM_Move_Pre(const PlayerMove:ppmove, const server) {
g_pPlayerMove = _:ppmove;
new flags = get_tr2(g_pPlayerMove + (4 * 46), TR_AllSolid);
client_print(0, print_chat, "%d", flags);
}