Таблица описаний данных
Таблица описаний данных является репозиторием описаний членов
классов: данных и функций, который позволяет движку связывать,
сохранять/восстанавливать и иным способом понимать назначение этих
членов. Неудачное описание этих членов в таблице может привести к
непредвиденным результатам во время выполнения.
Элементы таблицы объявляются внутри блоков
BEGIN_DATADESC и
END_DATADESC. Любое количество следующих макросов могут быть помещены внутри таблицы как это потребуется, вот пример:
BEGIN_DATADESC( CMyClass )
DEFINE_FIELD( . . . )
END_DATADESC() |
Ниже приводится список наиболее часто используемые типы элементов.
DEFINE_FIELD
Это макро определение используется для сохранения и загрузки в движке.
Любая переменная свойства определеямая в этом макросе сохраняется и
восстанавливается автоматически. Макрос объявляется так:
DEFINE_FIELD(
variableName,
variableType )
Параметр
dataMemberType может быть любого из нижеприведенных типов:
FIELD_VOID
|
Нет типа или значения (используется для параметров функций)
|
FIELD_FLOAT
|
Любой вещественный тип
|
FIELD_STRING
|
Строковой ID (фозвращается из ALLOC_STRING)
|
FIELD_VECTOR
|
Любой вектор, QAngle, и AngularImpulse
|
FIELD_QUATERNION
|
Кватернион
|
FIELD_INTEGER
|
Любой целый или перечисления
|
FIELD_BOOLEAN
|
Булевое значение (представлено как целое)
|
FIELD_SHORT
|
2 байтовое целое
|
FIELD_CHARACTER
|
Один байт
|
FIELD_COLOR32
|
8-бит на канал [R,G,B,A] (32-битный цвет)
|
FIELD_EMBEDDED
|
Встроенные объект с описанием данных, рекурсивно просматриваемый и
встроенный класс/структура на основе дополнительного описания типа
|
FIELD_CUSTOM
|
Специальный тип который содержит указатели функции на функции чтения/записи/синтаксического анализа
|
FIELD_CLASSPTR
|
Указатель CBaseEntity
|
FIELD_EHANDLE
|
Дескриптор энтити
|
FIELD_EDICT
|
Указатель edict_t
|
FIELD_POSITION_VECTOR
|
Значение мировых координт, которое автоматически фиксируется через переходы между уровнями
|
FIELD_TIME
|
Вещественное значение времени, которое автоматически фиксируется через переходы между уровнями
|
FIELD_TICK
|
Целое значение счетчика, которое фиксировано подобно FIELD_TIME
|
FIELD_MODELNAME
|
Строка движка которая является названием модели (должно быть предзагружено (precached))
|
FIELD_SOUNDNAME
|
Строка движка которая является названием звука (должно быть предзагружено (precached))
|
FIELD_INPUT
|
Список введенных полей данных, все наследованы от CMultiInputVar
|
FIELD_FUNCTION
|
Указатель функции класса (Think, Use, и т.д.)
|
FIELD_VMATRIX
|
VMatrix (Примечание: output координаты НЕ ЯВЛЯЮТСЯ мировыми)
|
FIELD_VMATRIX_WORLDSPACE
|
VMatrix отображает некоторое локальное мировое пространство (автоматически фиксируется через переходы между уровнями)
|
FIELD_MATRIX3X4_WORLDSPACE
|
matrix3x4_t которая отображает некоторое локальное мировое пространство
(автоматически фиксируется через переходы между уровнями)
|
FIELD_INTERVAL
|
AНачало диапазона с точечной запятой (например, 3.2->3.6 == 3.2 и 0.4 )
|
FIELD_MODELINDEX
|
Индекс модели
|
FIELD_MATERIALINDEX
|
Индекс материала (с использованием таблицы строк предзагрузки)
|
DEFINE_KEYFIELD
Этот макрос работает в такой же способ как
DEFINE_FIELD
который относится к сохранению и восстановлению данных членов. Он
расширяет эту функциональность определяя кроме всего прочего ссылаемое
имя для члена данных которое связано с его ключевым значением,
идентификатор которого определен в записи FGD файла для класса энтити.
Как только данное свойство объявляется, член данных инициализируется
значением описанным в карте на момент создания этой энтити.
DEFINE_FIELD(
variableName,
variableType, "keyvalueName” )
Для примера, нижеприведенное определение связывает член данных
m_bEnabled с ключевым значением
enabled идентификатора в Хаммере.
DEFINE_FIELD( m_bEnabled, FIELD_BOOLEAN, "enabled” )
Примечание: значение ключевого значения не чуствительно к регистру.
DEFINE_OUTPUT
Данный макрос используется для связи события вывода(output) с
именованным идентификатором используемым в Хаммере. Он определяется так:
DEFINE_OUTPUT(
outputVariable, outputName )
Примечание: outputVariable в данном случае должно быть типом
COuputEvent.
DEFINE_INPUTFUNC
Данный макрос используется для связи именованых вводов(inputs) в Хаммере
с функциями движка. Также он описывает тип параметра передаваемого
функции от системы ввода/вывода энтитей. Макрос определяется так:
DEFINE_INPUTFUNC(
parameterType, "inputName”, InputFunction )
parameterType может быть одним из нижеперечисленных
FIELD_ типов:
FIELD_VOID
FIELD_INTEGER
FIELD_FLOAT
FIELD_STRING
FIELD_VECTOR
FIELD_COLOR32
FIELD_BOOLEAN
DEFINE_INPUT
Данный макрос урезанная версия
DEFINE_INPUTFUNC. Он автоматически устаналивает описанный член данных к параметру полученному от функции
Input().
Эти упрощения нужны для создания input-функции у которой единственное
назначение - установить член данных в указзаное значение. Макрос
определяется так:
DEFINE_INPUT(
variableName, variableType, "keyvalueName” )
DEFINE_ARRAY
DEFINE_AUTO_ARRAY
Как показывает их имена, эоти макросы взаимодействуют с сохранением и
восстановлением значений массивов. Число элементов в массиве должно быть
определено используя
DEFINE_ARRAY, тогда как
DEFINE_AUTO_ARRAY заставляет код автоматически определить размер массива во время выполнения программы.
Макросы определяются так:
DEFINE_ARRAY(
variable, variableType, numElements )
DEFINE_AUTO_ARRAY(
variable,
variableType )
DEFINE_CUSTOM_FIELD
Данный макрос позволяет произвольную интерпретацию переменной с
описанием того как будет произведиться сохранение/восстановелние.
Передавая ссылку на класс-обработчик, пользователь может полностью
управлять сериализацией данных.
Класс-обработчик должен наследоваться от
CClassPtrSaveRestoreOps; он использует функции
Save() и
Restore() для сериализации.
Для большей информации, смотрите использование
CClassPtrSaveRestoreOps внутри кода.
DEFINE_THINKFUNC
Энтити использующие функцию
Think() должны объявлять эту функцию через данный макрос.
Эти функции должны быть следующего типа:
typedef void (*ThinkFunc)( void);
DEFINE_USEFUNC
Энтити использующие функцию
Use() должны объявлять эту функцию через данный макрос.
Эти функции должны быть следующего типа:
typedef void (*UseFunc)(
CBaseEntity *pActivator,
CBaseEntity *pCaller,
USE_TYPE useType,
float value
);