Конзола за разработчици - Общността на разработчиците на Valve

конзола

Този документ обяснява как да пишете код на конзолата, как да изпълнявате и създавате конзолни команди и променливи. Вижте Developer Console за общ преглед на функциите на конзолата.

Конзолен печат

Въвеждането на текст в конзолата е достъпно от всички модули и се контролира чрез Tier(). Има 3 допълнителни команди Msg(), DevMsg() и Warning(), които поддържат форматиран изходен низ като sprintf():

За обратна съвместимост с HL1 командите Con_Printf() и Con_DPrintf() са запазени.

Изпълнение на команда

Двигателят използва сървърния и клиентския интерфейс за изпълнение на команди (низове). Сървърът използва интерфейса IVEngineServer::ServerCommand():

Клиентът използва интерфейса на IVengineClient и избира между две команди, това определя дали командата ще бъде изпълнена първо на клиента или ще бъде изпратена директно на сървъра:

Добавяне на нови команди и променливи

Конзолата за разработчици е подсистема на Source двигателя, която дава достъп до различни модули, това става чрез интерфейса ICvar (вижте \public\icvar.h). Този интерфейс регистрира нови команди и търси съществуващи. Този интерфейс е достъпен чрез глобалната променлива CVAR в кода клиент-сървър (cv в кода на двигателя). Конзолните команди принадлежат към класа ConCommand, а конзолните променливи са ConVar, които и двете произлизат от базовия клас ConCommandBase (вижте \public\convar.h).

Добавянето на нови команди и променливи е доста просто и достъпно за използване както от сървърни, така и от клиентски модули (еднакво за целия двигател). Конструкторът на тези класове автоматично регистрира новата команда/променлива в конзолната система. Този пример за кратък код добавя нова команда my_function и новпроменлива my_variable инициализирана на 42:

Това е обичайна употреба, когато името на обекта и командата са еднакви и променливите се използват само в един източник и са декларирани като статични.

Използване на класа ConVar

Първо, нека да разгледаме най-използвания конструктор ConVar:

Първият аргумент pName е името на променливата (без интервали), следващият pDefaultValue винаги е низ, дори за ConVar с числови стойности. Флаговете дефинират специалните характеристики на променлива, всички декларации на флагове започват с FCVAR_*, ​​но повече за това по-късно. Много е добре да използвате pHelpString, за да могат потребителите да разберат за какво служи тази променлива. ConVars не са ограничени до конкретен тип, тяхната стойност може да бъде цяло число, float или низ и можете да го използвате, както искате. Докато имате самия обект ConVar или указател към него, можете да гледате и променяте стойността му директно. Всички тези примери са правилни и ще дадат същия резултат:

За да зададете стойност ConVar, трябва да използвате функцията SetValue(), която използва всеки тип данни:

По всяко време можете да нулирате [ConVar]] обратно към стойността по подразбиране с помощта на функцията Revert().

Ако ConVar е създаден в различни модули, тогава в интерфейса ICvar функцията FindVar() се използва за получаване на указател към обект, ако името на променливата е зададено. Ето един прост пример, който проверява дали ConVar е настроен на sv_cheats, дефиниран в модула на двигателя:

Диапазонът от валидни стойности може да бъде определен за числови ConVars с помощта на друг конструктор. След това ConVar автоматично се проверява от конзолната система, когато се променя ръчно. Ако въведеното число е извън диапазона, то се закръгля доследващата правилна стойност. Задаване на обхвата на валидните стойности от 1 до 100:

Понякога трябва да бъдете уведомени, когато потребител или друга подсистема промени стойността на вашия ConVar, така че може да се зададе функция за обратно извикване:

Използване на класа ConCommand

Класът ConCommand е по-прост от ConVar и има само един конструктор:

Както при ConVar, pName дефинира името на командата (без интервали!). обратното извикване е функция, която се изпълнява, когато потребителят изпълни тази команда, pHelpString и флаговете имат същата функция като в ConVar. ConCommands поддържа автоматично довършване за първия аргумент, особено използван за тези, които обработват файлове. Например, вие използвате командата loadtext lt;textfilegt ; което предполага .txt файл за въвеждане, конзолата търси всички налични .txt файлове и позволява на потребителя да избере един от списък. Ако е правилно, тогава completionFunc преминава, извиква се всеки път, когато конзолната система се нуждае от списък с налични аргументи.

Когато се изпълнява функция за обратно извикване, въведените в конзолата параметриnotсе предават като аргументи на функцията. функциите за обратно извикване трябва да попитат машината колко аргумента са получени с помощта на интерфейсната функция на машината Cmd_Argc(). След това можете да получите отделните аргументи, като използвате Cmd_Argv(index) , където индекс 1 е първият аргумент. Аргументите винаги се връщат като низове.

Това е пример за това как да създадете прост списък за автоматично довършване. Непълният параметър не се използва тук; съдържа знаци, въведени толкова отдавна (включително името на самата команда):

FCVAR_ флагове

Конзолните команди/променливи използват флагове, които имат определени характеристики и с тях трябва да се работи внимателно. Тези флагове се използват от конструктора и могат да бъдатмодифициран с ConCommandBase::AddFlags() (не се използва много често). Не е възможно да промените тези флагове по различен начин от изходния код, за да избегнете мами. Някои флагове трябва да бъдат зададени ръчно, други се задават автоматично от конзолната система:

FCVAR_LAUNCHER, FCVAR_GAMEDLL, FCVAR_CLIENTDLL, FCVAR_MATERIAL_SYSTEM, FCVAR_STUDIORENDER

Тези флагове се задават по време на процеса на регистрация и сочат към модула, където е създаден екипът (не е необходимо да ги задавате). Следните флагове трябва да бъдат зададени ръчно:

FCVAR_CHEAT
Използва се за отстраняване на грешки, не е премахнат от изданието поради факта, че разработчиците на модове и карти може да се нуждаят от него. За съжаление, не можем да позволим на нормалните играчи да използват тези инструменти за отстраняване на грешки, тъй като би било нечестно спрямо другите играчи (измама). Добро правило е първо да добавяте FCVAR_CHEAT към всички нови конзолни команди, които добавяте, освен ако това не е окончателната и законна опция за играчите. Опитът показва, че дори най-безобидните команди за отстраняване на грешки могат да се използват като измама по един или друг начин.

Сървърът на играта чрез настройка sv_cheats решава дали чийтовете са разрешени или не. Ако клиент се е свързал със сървър, където измамите са деактивирани (трябва да са по подразбиране), всички променливи на клиентската конзола, маркирани с FCVAR_CHEAT, се нулират до стойността си по подразбиране и не могат да бъдат променени, докато клиентът остава свързан. Конзолните команди, маркирани с FCVAR_CHEAT, също не могат да бъдат изпълнени.