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