Data Descriptions

From Valve Developer Community
< Ru
Jump to: navigation, search
English (en)Русский (ru)Translate (Translate)

Таблица описаний данных является репозиторием описаний членов классов: данных и функций, который позволяет движку связывать, сохранять/восстанавливать и иным способом понимать назначение этих членов. Неудачное описание этих членов в таблице может привести к непредвиденным результатам во время выполнения.

Элементы таблицы объявляются внутри блоков 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 Строка движка которая является названием модели (должно быть кеширована)
FIELD_SOUNDNAME Строка движка которая является названием звука (должно быть кеширована)
FIELD_INPUT Список введенных полей данных, все наследованы от CMultiInputVar
FIELD_FUNCTION Указатель функции класса (Think, Use, и т.д.)
FIELD_VMATRIX VMatrix (Примечание: output координаты НЕ ЯВЛЯЮТСЯ мировыми)
FIELD_VMATRIX_WORLDSPACE VMatrix отображает некоторое локальное мировое пространство (автоматически фиксируется через переходы между уровнями)
FIELD_MATRIX3X4_WORLDSPACE matrix3x4_t которая отображает некоторое локальное мировое пространство (автоматически фиксируется через переходы между уровнями)
FIELD_INTERVAL Начало диапазона с точечной запятой (например, 3.2->3.6 == 3.2 и 0.4 )
FIELD_MODELINDEX Индекс модели
FIELD_MATERIALINDEX Индекс материала (с использованием таблицы строк предзагрузки)

DEFINE_KEYFIELD

Этот макрос работает в такой же способ как DEFINE_FIELD который относится к сохранению и восстановлению данных членов. Он расширяет эту функциональность определяя кроме всего прочего ссылаемое имя для члена данных которое связано с его ключевым значением, идентификатор которого определен в записи FGD файла для класса энтити. Как только данное свойство объявляется, член данных инициализируется значением описанным в карте на момент создания этой энтити.

DEFINE_KEYFIELD( variableName, variableType, "keyvalueName" )

Для примера, нижеприведенное определение связывает член данных m_bEnabled с ключевым значением enabled идентификатора в Хаммере.

DEFINE_KEYFIELD( m_bEnabled, FIELD_BOOLEAN, "enabled" )
Note.pngПримечание:значение ключевого значения не чуствительно к регистру.

DEFINE_OUTPUT

Данный макрос используется для связи события вывода(output) с именованным идентификатором используемым в Хаммере. Он определяется так:

DEFINE_OUTPUT( outputVariable, outputName )
Note.pngПримечание: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 AND DEFINE_AUTO_ARRAY

Как показывает их имена, эоти макросы взаимодействуют с сохранением и восстановлением значений массивов(en). Число элементов в массиве(en) должно быть определено используя 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_ENTITYFUNC

Энтити использующие пользовательскую функцию должны объявить эту функцию через данный макрос.

Эти функции должны быть следующего типа:

typedef void (CBaseEntity::*ENTITYFUNCPTR)(CBaseEntity *pOther );

DEFINE_USEFUNC

Энтити использующие пользовательскую функцию Use() должны объявлять эту функцию через данный макрос.

Эти функции должны быть следующего типа:

typedef void (*UseFunc)(
	CBaseEntity *pActivator,
	CBaseEntity *pCaller,
	USE_TYPE useType,
	float value
);

Другие

  • dlls\simtimer.h
    • DEFINE_SIMTIMER - Определяет SimTimer(en)
  • game_shared\physics_saverestore.h
    • DEFINE_PHYSPTR - Определяет физические указатели
    • DEFINE_PHYSPTR_ARRAY - Определяет массив физических указателей
  • game_shared\saverestore_bitstring.h
  • game_shared\saverestore_utlmap.h
    • DEFINE_UTLMAP - Определяет CUtlMap(en)
  • game_shared\saverestore_utlrbtree.h
  • game_shared\saverestore_utlvector.h
  • game_shared\soundenvelope.h
    • DEFINE_SOUNDPATCH
  • public\saverestore.h
    • DEFINE_KEYFIELD_NOT_SAVED
    • DEFINE_ENTITY_FIELD
    • DEFINE_ENTITY_GLOBAL_FIELD
    • DEFINE_GLOBAL_FIELD
    • DEFINE_GLOBAL_KEYFIELD
    • DEFINE_CUSTOM_FIELD
    • DEFINE_CUSTOM_KEYFIELD
    • DEFINE_AUTO_ARRAY2D
    • DEFINE_EMBEDDED
    • DEFINE_EMBEDDED_OVERRIDE
    • DEFINE_EMBEDDEDBYREF
    • DEFINE_EMBEDDED_ARRAY
    • DEFINE_EMBEDDED_AUTO_ARRAY
    • DEFINE_PRED_TYPEDESCRIPTION
    • DEFINE_PRED_TYPEDESCRIPTION_PTR
    • DEFINE_PRED_FIELD
    • DEFINE_PRED_ARRAY
    • DEFINE_FIELD_NAME
    • DEFINE_PRED_FIELD_TOL
    • DEFINE_PRED_ARRAY_TOL
    • DEFINE_FIELD_NAME_TOL
  • public\stdstring.h
    • DEFINE_STDSTRING