Признак (Flag)
Признак (битовая маска) — это логическое значение, хранящееся в большой переменной. Это удобнее, поскольку минимальный объём распределения памяти составляет 1 байт (8 бит), а для логического значения требуется всего 1 бит. Если нужно хранить много логических значений, бинарная маска будет в восемь раз эффективнее, чем отдельные переменные типа bool.
Объектам мира в Source обычно применяются следующие типы признаков:
- Признаки появления - SF_, определённые в соотвествующем.cppфайле объекта
- Признаки поведения - FL_, определённые в файле public/const.h
- Признаки эфектов - EF_, определённые в файле public/const.h
- Признаки объекта (или EFlags) -EFL_, определённые в файле game/shared/shareddefs.h
Элементам карты применяются следующие типы признаков:
- Признаки содержимого - CONTENTS_, определённые в файле public/bspflags.h
- Признаки поверхности - SURF_, определённые в файле public/bspflags.h
Использование
Признаками следует управлять с помощью специальных функций Source, а не напрямую. Каждый тип признаков имеет различный набор функций, но все подчиняются единому шаблону именования:
- Add<*>Flags()
- Remove<*>Flags()
- Clear<*>Flags()
- Has<*>Flags()(иногда- Is<*>FlagSet())
Функции вызова, которые следует использовать для соотвествующих типов признаков:
| Префикс | Добавление | Удаление | Проверка | Очистка | Чтение всех | Внутреннее имя | |
|---|---|---|---|---|---|---|---|
| Spawn Flags | SF_ | AddSpawnFlags | RemoveSpawnFlags | HasSpawnFlags | ClearSpawnFlags | GetSpawnFlags | m_spawnflags | 
| Behavior Flags | FL_ | AddFlag | RemoveFlag | N/A | ClearFlags | GetFlags | m_fFlags | 
| Effect Flags | EF_ | AddEffects | RemoveEffects | IsEffectActive | ClearEffects | GetEffects | m_fEffects | 
| Entity flags | EFL_ | AddEFlags | RemoveEFlags | IsEFlagSet | N/A | GetEFlags | m_iEFlags | 
 Предупреждение:Don't modify the fields in the Internal Field column directly; always call the functions to add or remove flags, as many of the functions do additional work to notify the entity system that the entity's state has changed.
Предупреждение:Don't modify the fields in the Internal Field column directly; always call the functions to add or remove flags, as many of the functions do additional work to notify the entity system that the entity's state has changed. Примечание:Make sure you always use the right functions for the right type of flags, as the compiler won't detect if you've made a mistake. It's very easy to mix up flags starting with
Примечание:Make sure you always use the right functions for the right type of flags, as the compiler won't detect if you've made a mistake. It's very easy to mix up flags starting with EFL_ and EF_, so always double check. Some of Valve's own code makes these mistakes!
Для обработки нескольких признаков одновременно, необходимо использовать  битовые операторы
 битовые операторы &, | и ^ - обычные логические операторы, но только с одним битом.
Например:
if ( HasSpawnFlags(SF_CITIZEN_MEDIC | SF_CITIZEN_NOT_COMMANDABLE) ) ...
Создание
Признаки обычно объявляются как перечисление, наподобие этого:
enum MyFlags_t
{
    FL_MYFLAG = 1 << 0,
    FL_MYFLAG = 1 << 1,
    FL_MYFLAG = 1 << 2,
    // и т.д.
};
Или тоже самое:
enum MyFlags_t
{
    FL_MYFLAG = 1,
    FL_MYFLAG = 2,
    FL_MYFLAG = 4,
    // и т.д.
};
Или:
enum MyFlags_t
{
    FL_MYFLAG = 0x1,
    FL_MYFLAG = 0x2,
    FL_MYFLAG = 0x4,
    // и т.д.
};
Применение старого формата записи кода с использованием препроцессора для определения признаков следует избегать, поскольку он не является строго типизированным:
#define FL_MYFLAG 1<<0
#define FL_MYFLAG 2
#define FL_MYFLAG 0x4
// и т.д.
Признаки в редакторе Hammer
Признаки отображаются в диалоговом окне Свойства объекта редактора Hammer. Для разных объектов будут доступны разные признаки. Признак отображается в виде поля для отметки, означающей, что каждый признак может быть включен или отключен. Можно получить доступ к признакам через ключ-параметр spawnflags. Это то, чем на самом деле являются признаки: конкретное значение переменной, определяемое комбинацией выбранных признаков.
 Предупреждение:
Предупреждение:spawnflags в игре имеет тип целое со знаком (signed int), а в Hammer длинное целое без знака (unsigned long)!
























