Описание:
Изменяет состояние автоматона на исходное, поскольку обычным оператором state это сделать невозможно.
Параметры:
name - название автоматона
any_state - любое состояние автоматона
Возвращаемое значение:
Всегда возвращает нуль.
Минусы реализации:- Несовместимость с JIT-плагином.
- Необходимо использовать библиотеку AMX Assembly, точнее библиотеки amx_header, opcode.
Код:
PHP код:
// 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;
}
Пример использования:
PHP код:
somefunc() <>
{
print("Called somefunc() <>");
}
somefunc() <somestate:one>
{
print("Called somefunc() <somestate:one>");
}
main()
{
state somestate:one;
somefunc();
ResetState(somestate, one);
somefunc();
}
См. также:
Автор: VVWVV
Копирование данной статьи на других ресурсах без разрешения автора запрещено.