Генератор поддерживает возможность использования блока HEX-END. В основном акцентируется работа для хранения данных ( буфера ). Всего таких методов три, и дополнительно один для персональной настройки блока.
Для использования достаточно вызвать метод hex. Если передать 1 параметр, то генератор создает блок с указанным количеством байт. Если 2, то будет создан блок с количеством строк и колонок:
[Thread]
public void TEST() {
comment = "1 parameter:";
hex( 10 );
comment = "2 parameters:";
hex( 6, 3 );
}
Разница в основном заключается только в форматировании блока. Вот так получится в результате:
//------------- TEST --------------- :TEST 03A4: name_thread 'TEST' /* 1 parameter: */ hex 00 00 00 00 00 00 00 00 00 00 end /* 2 parameters: */ hex 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 end
Если данные нужно както структурировать, то можно указать конкретный тип данных, при этом он должен сам быть структурой и иметь открытые поля с данными, которые будут использованы для вычисления размера. В параметре указывается количество таких структур:
public struct HexSctruct {
public int min;
public int max;
public double range; // он же Float
public string vstring; // он же vString
public char sstring; // он же sString
public bool anyBool;
public byte anyByte;
public short anyShort;
public Car currentCar; // любой класс будет иметь размер 4 байта
}
[Thread]
public void TEST() {
hex<HexSctruct>( 2 );
}
Генератор подсчитает смещение между данными и структурами, что в итоге приведёт к этому:
//------------- TEST --------------- :TEST 03A4: name_thread 'TEST' hex // --------------------------------------------------- Struct #0 offset: +0 00 00 00 00 // +0 [int,uint,float] 00 00 00 00 // +4 [int,uint,float] 00 00 00 00 // +8 [int,uint,float] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 // +12 [vString,string] 00 00 00 00 00 00 00 00 // +28 [sString,char] 00 // +36 [byte,bool,sbyte] 00 // +37 [byte,bool,sbyte] 00 00 // +38 [short,ushort] 00 00 00 00 // +40 [handle] // --------------------------------------------------- Struct #1 offset: +44 00 00 00 00 // +0 [int,uint,float] 00 00 00 00 // +4 [int,uint,float] 00 00 00 00 // +8 [int,uint,float] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 // +12 [vString,string] 00 00 00 00 00 00 00 00 // +28 [sString,char] 00 // +36 [byte,bool,sbyte] 00 // +37 [byte,bool,sbyte] 00 00 // +38 [short,ushort] 00 00 00 00 // +40 [handle] end
Поддерживаются следующие типы данных:
| Размер | Основные типы | Альтернативные типы |
|---|---|---|
| 1 | byte, bool | sbyte |
| 2 | short | ushort |
| 4 | int, double, Variable | uint, любой класс или структура |
| 8 | sString | char |
| 16 | vString | string |
Если в блоке нужно выполнять ассемблерные вставки или другой код, то нужно указать в параметре строку с содержимым:
[Thread]
public void TEST() {
hex( @"
04 00 02 0800 04 01
04 00 02 $PLAYER_CHAR 01 @get_offset
" );
}
Всё это будет без изменений использовано генератором:
//------------- TEST --------------- :TEST 03A4: name_thread 'TEST' hex 04 00 02 0800 04 01 04 00 02 $PLAYER_CHAR 01 @get_offset end
Это одно из немногих мест, где генератор не проводит проверку валидации, поэтому использовать возможность нужно аккуратно и с умом.