Консоль разработчика
Вступление
Консоль - это основной инструмент для отладки кода игры и настройки параметров. Консоль - это текстовый интерфейс ввода/вывода, который позволяет изменять глобальные переменные игры во время выполнения. Для включения консоли откройте
"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
Команда, обратная по значению предыдущей.
Оригинал: Официальный сайт SSDK
Перевод: VDm