Вступление Консоль - это основной инструмент для отладки кода игры и настройки параметров. Консоль - это текстовый интерфейс ввода/вывода, который позволяет изменять глобальные переменные игры во время выполнения. Для включения консоли откройте "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 ( см. publicicvar.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 functionn");
}
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 %sn", 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 textn");
return;
}
Msg("I say: %sn", 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 Команда, обратная по значению предыдущей.