Признак (Flag)

From Valve Developer Community
< Ru
Revision as of 10:40, 25 July 2025 by Clash (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
English (en)Русский (ru)Translate (Translate)

Признак (битовая маска) — это логическое значение, хранящееся в большой переменной. Это удобнее, поскольку минимальный объём распределения памяти составляет 1 байт (8 бит), а для логического значения требуется всего 1 бит. Если нужно хранить много логических значений, бинарная маска будет в восемь раз эффективнее, чем отдельные переменные типа bool.

Объектам мира в Source обычно применяются следующие типы признаков:

  • Признаки появления - SF_, определённые в соотвествующем .cpp файле объекта
  • Признаки поведения - FL_, определённые в файле C++ codepublic/const.h
  • Признаки эфектов - EF_, определённые в файле C++ codepublic/const.h
  • Признаки объекта (или EFlags) - EFL_, определённые в файле C++ codegame/shared/shareddefs.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
Warning.pngПредупреждение: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.
Note.pngПримечание: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!


Для обработки нескольких признаков одновременно, необходимо использовать Wikipedia icon битовые операторы &, | и ^ - обычные логические операторы, но только с одним битом.

Например:

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. Это то, чем на самом деле являются признаки: конкретное значение переменной, определяемое комбинацией выбранных признаков.

Warning.pngПредупреждение:spawnflags в игре имеет тип целое со знаком (signed int), а в Hammer длинное целое без знака (unsigned long)!