PDA

Просмотр полной версии : [Function] ResetState - изменяет состояние автоматона на исходное



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)

Копирование данной статьи на других ресурсах без разрешения автора запрещено.