Консоль разработчика
Вступление Консоль — это основной инструмент для отладки кода игры и настройки параметров. Консоль — это текстовый интерфейс ввода/вывода, который позволяет изменять глобальные переменные игры во время выполнения. Для включения консоли откройте «Options"→ «Keyboard» → «Advanced…» и выберите «Enable developer console». По-умолчанию консоль открывается кнопкой «~» (тильда). Чтобы сделать консоль доступной при старте игры, необходимо дописать ключи «-dev» или «-console» в параметры запуска (разработчики должны всегда использовать -dev). Если HL запущена в режиме встроенного отладчика, то консоль будет являться вашим окном отладки. Запустите игру с параметром «-condebug», чтобы записывать полный Log консоли в файл «console.log», находящийся в папке игры.
После того, как вы ввели команду, она должна быть выполнена, для этого нажмите ENTER или нажмите на кнопку 'Submit'. Команда имеет уникальное имя и может иметь несколько параметров, которые отделяются пробелами (синтаксис: команда <параметр1> [<параметр2>]). В имени команды не может быть пробелов, если параметр команды содержит пробелы, то он заключается в кавычки:
]bind h «say hello world»
]name «Gordon Freeman»
Консоль запоминает последние выполненые команды, для быстрого доступа к ним нажмите СТРЕЛКА ВВЕРХ или СТРЕЛКА ВНИЗ. Вы можете автоматически завершать имя и параметр команды, нажав TAB и выбрав из списка нужный вариант. Некоторые команды (например map, load и т. д.) поддерживают автозавершение для первого параметра.
Существуют определенные отличия между консольными командами и консольными переменными. Консольные команды обычно передают параметры для некоторой функции кода и выполняют ее, но они не запоминают переданные параметры. Консольные переменные сохраняют свое значение в глобальных настройках. Консольные переменные имеют только одно значение, которое может быть цифрой или строкой; это зависит от кода игры, как эти значения интерпретируются. Часто консольные переменные подобнв триггерам; могут иметь два значения/состояния: 0 — выключено, 1 — включено (примером такой команды может служить cl_showfps). Чтобы увидеть текущее значение переменной, достаточно написать ее имя без параметров.
Большинство консольных команд имеют приставки, которые служат для определения подсистемы к которой они принадлежат. Это правило не всегда распространяется на команды, которые перешли из первой части игры, они остались прежними. Вот некоторые приставки:
ai_ AI в одиночном режиме
cc_ Система закрытых сообщений
cl_ Сетевой клиент
demo_ Проигрыватель демозаписей
disp_ Карты ландшафта
dsp_ Аудио DSP настройки
ent_ Управление/отладка объектов (entity)
fire_ «Сжигание» событий объектов
fog_ Рендер тумана
g_ Одиночный режим игры
hltv_ Half-Life TV
host_ Система хостов
hud_ HUD клиента
joy_ Работа с джойстиком
log_ Система отчетов (Log)
m_ Работа с мышью
mat_ Система материалов
mp_ Сетевая игра (сервер)
nav_ Навигационные пути
net_ Сетевые команды
npc_ NPC в одиночном режиме
phys_ Физическая система
r_ Видео рендер
rcon_ Удаленное управление
sk_ Уровень сложности (skill)
snd_ Звуковая система
sv_ Настройки сервера (движок)
v_ Вид клиента
vgui_ VGUI
voice_ Голос игрока в игре
vprof_ Профилировщик кода (code profiler)
wc_ Помощник по WorldCraft/Hammer
Если вы забыли команду, то find <часть строки> покажет все команды, содержащие эту часть строки. Команда help <команда> покажет справку по данной команде (если доступна).
Вывод в консоли Вывод текста в консоль доступен из всех модулей и контролируется через Tier (). Есть 3 дополнительные команды Msg (), DevMsg () и Warning (); которые поддерживают вывод форматированной строки, как sprintf ():
DevMsg (char const* pMsg, …) — только в режиме разработчика
Msg (char const* pMsg, …) - всегда, белый текст
Warning (char const *pMsg, …) — всегда, красный текст
Для обратной совместимости с HL1 сохранены команды Con_Printf () и Con_DPrintf ().
Исполнение команд Движок использует интерфейс сервера и клиента, чтобы исполнять команды (строки). Сервер использует интерфейс IVEngineServer::ServerCommand ():
engine→ServerCommand («changelevel de_dust»);
Клиент использует интерфейс IVEngineClient и выбирает между двумя командами, от этого зависит, будет ли команда исполняться сначала на клиенте или посылаться непосредственно серверу:
engine→ServerCmd («say hello»); // послать команду на сервер
или
engine→ClientCmd («say hello»); // выполнить команду на клиенте
Добавление новых команд и переменных Консоль разработчика — это подсистема движка Source, которая дает доступ к различным модулям, это осуществляется через интерфейс ICvar (см. \public\icvar.h). Этот интерфейс регистрирует новые команды и ищет существующие. Этот интрефейс доступен через глобальную переменную cvar в клиент-серверном коде. Добавление новых команд и переменных довольно просто и дуступно для использования и для серверных и для клиентских модулей. Конструктор этих классов автоматически регистрирует новую команду/переменную в системе консоли. Этот короткий пример кода добавляет новую функцию my_function и новую переменную my_variable:
#include <convar.h>
ConVar my_variable («my_variable», «42», FCVAR_ARCHIVE, «My favorite number»);
void MyFunction_f (void)
{
Msg («This is my function\n»);
}
ConCommand my_function («my_function», MyFunction_f, «Shows a message.», FCVAR_CHEAT);
Использование класса ConVar Для начала рассмотрим конструктор класса ConVar:
ConVar (char const *pName,
  char const *pDefaultValue,
  int flags,
  char const *pHelpString)
Первый аргумент pName — это имя переменной (без пробелов), следующий: pDefaultValue, всегда является строковым, даже для числовых значений. Flags определяет специальные характеристики переменной, все флаги начинаются с FCVAR_*, но об этом позже. Очень хорошо использовать pHelpString, этот аргумент содержит справку о переменной. Это значение может быть любым, на ваше усмотрение.
if (my_variable.GetInt () == 42) DoSomething ();
if (my_variable.GetFloat () == 42.0f) DoSomething ();
if (strcmp (my_variable.GetString (), «42»)==0) DoSomething ();
Для установки значения ConVar используется функция SetValue (), использующая любые типы данных:
my_variable.SetValue (42);
my_variable.SetValue (42.0f);
my_variable.SetValue («42»);
Чтобы вернуть значение ConVar назад на значение по-умолчанию, необходимо использовать функцию Revert (). Если ConVar создан в разных модулях, то в интерфейсе ICvar функция FindVar () используется для получения указателя на объект, если имя переменной установлено. Вот простой пример, который проверяет установлена ли ConVar sv_cheats в модуле движка:
ConVar *pCheats = cvar→FindVar («sv_cheats»);
if (pCheats && pCheats→GetInt () == 1) AllowCheating ();
Массив правильных значений ConVars определяет числами и использует разные конструкторы. Если введенное значение выходит за границы массива, то оно уравнивается до следующего правильного значения. Установление правильного массива от 1 до 100:
ConVar my_variable («my_variable», «42», 0, «helptext», true, 1, true, 100);
Вы получите уведомление, если какая-либо из подсистем изменит значение ConVar, это потребует установленной функции обратного вызова:
static void OnChangeMyVariable (ConVar *var, char const *pOldString)
{
DevMsg («ConVar %s was changed from %s to %s\n», var→GetName (), pOldString, var→GetString ());
}

ConVar my_variable («my_variable», «42», 0, «My favorite number», OnChangeMyVariable);
Использование класса ConCommand class ConCommand использует простой как и ConVar один конструктор:
ConCommand (char const *pName,
FnCommandCallback callback,
char const *pHelpString = 0,
int flags = 0,
FnCommandCompletionCallback completionFunc = 0);
Как и у ConVar pName — это имя команды (без пробелов!). callback — это функция, которая выполняется, если пользователь выполнил команду, pHelpString — имеет то же значение, что и у ConVar. ConCommands поддерживает автозавершение для первого параметра и может использовать файлы. Например, вы используете команду loadtext lt;textfilegt; команде потребуется .txt файл для ввода, консоль будет искать все доступные .txt файлы и предложит выбрать нужный из списка. До тех пор, пока функция callback выполняется, параметр, веденный в консоли не считается за аргумент функции. Функция callback подает запрос движку на поиск аргументов через функцию Cmd_Argc (). Аргументы всегда возвращаются строкового типа.
void MySay_f (void)
{
if (engine→Cmd_Argc () > 1)
{
Msg (««Usage: my_say text\n»);
return;
}

Msg («I say: %s\n», engine→Cmd_Argv (1));
}

ConCommand my_say («my_say», MySay_f, «say something», 0);
Здесь приведен пример построения списка с автозавершением:
static int MySayAutoComplete (char const *partial,
char commands[ COMMAND_COMPLETION_MAXITEMS ][ COMMAND_COMPLETION_ITEM_LENGTH ])
{
strcpy (commands[0], «hello»);
strcpy (commands[1], «goodbye»);
return 2; // number of entries
}

ConCommand my_say («my_say», MySay_f, «say something», 0, MySayAutoComplete);
FCVAR_ флаги Консольные команды/переменные используют флаги, которые обладают определенными характеристиками. Эти флаги используются конструктором и редактируются через ConCommandBase::AddFlags ().
FCVAR_LAUNCHER, FCVAR_GAMEDLL, FCVAR_CLIENTDLL, FCVAR_MATERIAL_SYSTEM, FCVAR_STUDIORENDER Эти флаги отвечают за процесс создания команд в различных модулях.
FCVAR_CHEAT Используются при отладке, не удаляются из релиза по причине того, что могут потребоваться разработчикам модов и карт.
FCVAR_USERINFO Используются для передачи информации о пользователе, как правило эта информация передается по сети.
FCVAR_REPLICATED Сервер и клиент используют общий код, и при сетевой игре обязаны выполнять все действия одновременно, для этого и служит этот флаг.
FCVAR_ARCHIVE Некоторые консольные переменные имеют специфические параметры, которые используются только при старте игры (такие, как name или network_rate). Этот флаг отвечает за возможность сохранения значений таких переменных в файле config.cfg.
FCVAR_NOTIFY Дает возможность серверу посылать уведомления всем клиентам.
FCVAR_PROTECTED Отвечает за конфиденциальность значений некоторых переменных.
FCVAR_SPONLY Отвечает за возможность выполнения команд ТОЛЬКО в режиме одиночной игры.
FCVAR_DEMO Обеспечивает контроль за записью и просмотром демо-роликов.
FCVAR_DONTRECORD Команда, обратная по значению предыдущей.
Перевод: VDm.
1 декабря 2004, 23:11