VVWVV
08.04.2017, 17:06
Описание:
Изменяет состояние автоматона на исходное, поскольку обычным оператором state это сделать невозможно.
Параметры:
name - название автоматона
any_state - любое состояние автоматона
Возвращаемое значение:
Всегда возвращает нуль.
Минусы реализации:
Несовместимость с JIT-плагином.
Необходимо использовать библиотеку AMX Assembly (http://pro-pawn.ru/showthread.php?15075), точнее библиотеки amx_header, opcode.
Код:
// ResetState(name, any_state)
#define ResetState(%1,%2) __ResetState();state %1:%2
stock __ResetState()
{
new
ret_address,
ip,
hdr[AMX_HDR];
GetAmxHeader(hdr);
#emit load.s.pri 4 // ret addr
#emit stor.s.pri ret_address
ip = hdr[AMX_HDR_COD] - hdr[AMX_HDR_DAT] + ret_address;
if (UnrelocateOpcode(Opcode:ReadAmxMemory(ip)) == OP_BREAK)
ip += 4;
assert (ReadAmxMemory(ip) == _:OP_CONST_PRI);
WriteAmxMemory(ip + 4, 0);
return 0;
}
Пример использования:
somefunc() <>
{
print("Called somefunc() <>");
}
somefunc() <somestate:one>
{
print("Called somefunc() <somestate:one>");
}
main()
{
state somestate:one;
somefunc();
ResetState(somestate, one);
somefunc();
}
См. также:
[Function] GetNumberOfArguments (http://pro-pawn.ru/showthread.php?14689)
[Function] Чистим массив игрока (http://pro-pawn.ru/showthread.php?7931)
[Function] Защита от DeAMX (new) (http://pro-pawn.ru/showthread.php?8277)
[Function] ClearKillFeed (http://pro-pawn.ru/showthread.php?12295)
[Function] dc_SleepFix (http://pro-pawn.ru/showthread.php?13188)
[Function] GetNumberOfPublics (http://pro-pawn.ru/showthread.php?14704)
[Function] GetStackSize (http://pro-pawn.ru/showthread.php?10824)
[Function] itos (http://pro-pawn.ru/showthread.php?3243)
[Function] formatnum (http://pro-pawn.ru/showthread.php?14766)
Автор: VVWVV (http://pro-pawn.ru/member.php?4348)
Копирование данной статьи на других ресурсах без разрешения автора запрещено.
Изменяет состояние автоматона на исходное, поскольку обычным оператором state это сделать невозможно.
Параметры:
name - название автоматона
any_state - любое состояние автоматона
Возвращаемое значение:
Всегда возвращает нуль.
Минусы реализации:
Несовместимость с JIT-плагином.
Необходимо использовать библиотеку AMX Assembly (http://pro-pawn.ru/showthread.php?15075), точнее библиотеки amx_header, opcode.
Код:
// ResetState(name, any_state)
#define ResetState(%1,%2) __ResetState();state %1:%2
stock __ResetState()
{
new
ret_address,
ip,
hdr[AMX_HDR];
GetAmxHeader(hdr);
#emit load.s.pri 4 // ret addr
#emit stor.s.pri ret_address
ip = hdr[AMX_HDR_COD] - hdr[AMX_HDR_DAT] + ret_address;
if (UnrelocateOpcode(Opcode:ReadAmxMemory(ip)) == OP_BREAK)
ip += 4;
assert (ReadAmxMemory(ip) == _:OP_CONST_PRI);
WriteAmxMemory(ip + 4, 0);
return 0;
}
Пример использования:
somefunc() <>
{
print("Called somefunc() <>");
}
somefunc() <somestate:one>
{
print("Called somefunc() <somestate:one>");
}
main()
{
state somestate:one;
somefunc();
ResetState(somestate, one);
somefunc();
}
См. также:
[Function] GetNumberOfArguments (http://pro-pawn.ru/showthread.php?14689)
[Function] Чистим массив игрока (http://pro-pawn.ru/showthread.php?7931)
[Function] Защита от DeAMX (new) (http://pro-pawn.ru/showthread.php?8277)
[Function] ClearKillFeed (http://pro-pawn.ru/showthread.php?12295)
[Function] dc_SleepFix (http://pro-pawn.ru/showthread.php?13188)
[Function] GetNumberOfPublics (http://pro-pawn.ru/showthread.php?14704)
[Function] GetStackSize (http://pro-pawn.ru/showthread.php?10824)
[Function] itos (http://pro-pawn.ru/showthread.php?3243)
[Function] formatnum (http://pro-pawn.ru/showthread.php?14766)
Автор: VVWVV (http://pro-pawn.ru/member.php?4348)
Копирование данной статьи на других ресурсах без разрешения автора запрещено.