Left 4 Dead

Left 4 Dead

Not enough ratings
Бинды, радиальные меню и пользовательские меню.
By (3)Player
Руководство по написанию биндов, созданию нестандартных радиальных меню, пользовательских меню в Left 4 Dead с примерами и комментариями.
   
Award
Favorite
Favorited
Unfavorite
Введение
Клавиатура и мышь являются основными средствами управления в L4D, а бинды, радиальные и пользовательские меню - это мощные средства, которые дают большие возможности для их использования.

В этом руководстве собрана вся необходимая информация для написания биндов и создания радиальных и пользовательских меню, а также в руководстве есть информация по связанным темам:
  • консоль
  • консольные команды и переменные
  • конфигурационные файлы ( конфиги )
  • общие принципы использования псевдонимов
  • создание дополнений ( аддонов )
Дополнительно в руководстве приведены примеры использования консольных команд,
консольных переменных, редактирования игровых файлов, создания конфигурационных файлов, а также ссылки на ресурсы где вы сможете найти более подробную информацию по теме.

(i) Информация в руководстве, на которую стоит обратить внимание, выделена с помощью специальных пометок:
- (i) <дополнительная информация>
- (!) <важное замечание>
- (url) <ссылка на ресурс>

(i) Ввод-вывод консоли, примеры написания команд, конфигурационных и прочих файлов выделены особым образом. Дополнительные комментарии и замечания к отдельным строкам начинаются со специальной текстовой метки "//", и имеют чисто информационный характер. В примерах, где показан ввод-вывод консоли, ввод команд обозначен текстовой меткой "]", и в реальном вводе команд использоваться не должен:
] echo Hello! // консольная команда "echo" выводит в консоль указанный текст Hello! // вывод консоли
Консоль, команды и переменные
Консоль
Консоль ( она же консоль отладки ) - это средство расширенной настройки и управления игрой, имеющее вид терминала. В ней есть текстовое поле, в котором последовательно выводятся сообщения консоли и введённые ранее команды, а также есть строка ввода, в которой можно вводить консольные команды.

(i) По умолчанию консоль выключена, но её можно включить в Меню>Параметры>Клавиатура/Мышь>"Включить консоль отладки". После этого консоль можно открыть с помощью клавиши "~".

Консольные команды вводятся в строку ввода по одной за раз, но можно вписать несколько команд если их разделить знаком ";". Ввод команды выполняется нажатием клавиши "Enter", после чего она начнёт выполнятся, а в текстовом поле консоли появится запись введённого текста из строки ввода. Текст, который был введён в консоль из строки ввода, обозначается символом "]" в начале строки.

(i) Строка ввода консоли имеет функцию автодополнения, а также можно выбрать ранее введённые команды с помощью клавиш "" и "".

(i) Текстовое поле консоли можно отчистить от записей с помощью команды "clear".

(i) Консоль распознаёт комментарии:
] say hello // в чате будет только "hello" PlayerName: hello
Часть текста, которая начинается двумя символами "/", будет игнорироваться консолью до конца строки.

(url) Консоль [valve developer community]

Консольные команды
Консольные команды - это специальные команды, которые дают указание на выполнение какого-либо действия. У игры L4D есть большой список команд, которые могут выполнять различные функции, менять игровые опции или выводить различную информацию в консоль. Но на выполнение некоторых команд есть свои ограничения. К примеру, многие команды считаются чит-кодами и их выполнение блокируется в обычном режиме игры.

(i) Консольные команды, несмотря на своё название, используются не только в консоли. При выборе пункта радиального или пользовательского меню, а также при нажатии клавиш выполняются команды без участия консоли.

(url) Полный список консольных команд и переменных L4D [valve developer community]

Типы консольных команд
  • Команда без параметров: <имя команды>
    toggle_duck // присесть/встать без удержания клавиши openserverbrowser // открыть/закрыть окно менеджера серверов quit // выход из игры // и т.п.
    Для выполнения команды достаточно ввести её имя.

  • Команда с параметрами: <имя команды> <параметр 1> <параметр 2> ... <параметр n>
    impulse 100 // включить/выключить фонарик impulse 201 // нарисовать спрей impulse 106 // вывод информации в консоль про объект, // на который указывает прицел ( чит ) map l4d_airport02_offices versus // загрузить 2ю карту компании // "Смерть в воздухе" в режиме сражения map l4d_airport02_offices survival // загрузить 2ю карту компании // "Смерть в воздухе" в режиме выживания map l4d_airport02_offices coop // загрузить 2ю карту компании // "Смерть в воздухе" в режиме кооператив map l4d_airport02_offices // 2й параметр необязательный, если // его не указать, то карта запустится // в режиме кооператива ent_fire prop_door_rotating addoutput "OnFullyOpen !self:Close::1:-1" // теперь все двери на карте будут закрываться через секунду ( чит ). // и т.п.
    Для выполнения команды требуется указать параметры, разделив их пробелами. В зависимости от параметров команда будет выполнять различные действия. Некоторые параметры могут быть необязательными.

  • Команды включения-выключения: +<имя команды>, -<имя команды>
    +forward // начать идти вперёд -forward // прекратить идти вперёд +duck // присесть -duck // встать +jump // прыжок -jump // команда выключения ничего не делает т.к. // прыжок был полностью выполнен командой "+jump" // команды включения-выключения парные и поэтому есть // команда выключения даже если для ней нет задач // и т.п.
    Эти команды управляют определённым действием в игре. Команда с префиксом "+" начинает действие, а с префиксом "-" прекращает. Команды включения-выключения имеют одно и то же имя и различаются только префиксами.
    Эти команды рассчитаны на работу с клавишами ( при нажатии срабатывает команда с префиксом "+", при отпускании - команда с префиксом "-" ), но в тоже время они могут выполняться без участия клавиш.

  • Команда изменения значения переменной: <имя переменной> <новое значение>
    Значение переменной можно изменить написав её имя а затем её новое значение:
    volume 0 // громкость 0% volume 1 // громкость 100% volume 0.5 // громкость 50% // и т.п.

(!) Консольные команды не чувствительны к регистру:
// результат будет один и тот же: ] +jump ] +Jump ] +JUMP

Специальные символы в консольных командах
  • Точка с запятой " ; " - разделяет команды:
    ] say hello +jump PlayerName: hello +jump // сообщение в чате ] say hello; +jump PlayerName: hello // сообщение "hello" и прыжок
  • Пробел - используется для разделения команд и их параметров:
    ] exec my_config.cfg // команда считает конф.файл "my_config.cfg" ] exec my config.cfg // команда попытается считать файл "my" // вместо "my config.cfg"
  • Двойные кавычки - группируют текст в один параметр. Игнорируют другие спец.символы:
    ] exec "my config.cfg" // считает файл "my config.cfg" ] say "hello; +jump" PlayerName: hello; +jump ] say "// hello" PlayerName: // hello

Консольные переменные
Консольные переменные хранят значение игровых параметров. У разных переменных значением могут быть целые числа, десятичные дроби или текст. Консольные переменные имеют свои ограничения по возможным вариантам значения. В некоторых переменных, которые отвечают за включение/выключение каких-либо настроек, в качестве значения отключения используется 0, а в качестве значения включения остальные числа ( как правило, используют 1 и 0 ).
// переменная, которая в качестве значения принимает целое число от 0 до 3 net_graph 3 // отображение параметров сети, вариант #3 net_graph 2 // отображение параметров сети, вариант #2 net_graph 1 // отображение параметров сети, вариант #1 net_graph 0 // отключить отображение параметров сети // переменная, которая в качестве значения принимает десятичную дробь от 0 до 1.0 snd_musicvolume 1.0 // громкость музыки 100% snd_musicvolume 0.5 // громкость музыки 50% snd_musicvolume 0 // громкость музыки 0% // переменная, которая отвечает за включение/выключение игровой опции gameinstructor_enable 1 // включить подсказки в игре gameinstructor_enable 0 // выключить подсказки в игре gameinstructor_enable 10 // подсказки будут включены gameinstructor_enable -1 // подсказки будут включены // переменная, которая в качестве значения принимает варианты из // "Easy", "Normal", "Hard" и "Impossible" z_difficulty Easy // изменить сложность игры на "Легко" z_difficulty Normal // изменить сложность игры на "Нормально" z_difficulty Hard // изменить сложность игры на "Мастер" z_difficulty Impossible // изменить сложность игры на "Эксперт" z_difficulty VeryEasy // произойдёт смена на стандартную сложность ( Normal ) z_difficulty MegaImpossible // также произойдёт смена на стандартную сложность // и т.п.

(!) Некоторые переменные сохраняют присвоенные значения после выхода из игры.
Специальные консольные команды
В L4D есть специальные команды, которые предназначены не для выполнения какой-либо функции в игре, а для взаимодействия с консолью, командами и переменными. Здесь перечислены только те команды, которые пригодятся для написания биндов и создания радиальных и пользовательских меню.

(url) Специальные консольные команды [valve developer community]

alias
Команда alias создаёт псевдонимы для команд:
alias <имя псевдонима> <команда>

После создания (объявления) псевдонима, его имя можно использовать как команду, и при этом он будет выполнять команды, которые были указаны при его объявлении:
] alias hello "echo Hello!" ] hello Hello!

Под одним псевдонимом можно записать набор команд, если их записать в кавычках и разделить знаком ";":
alias <имя псевдонима> "<команда 1>; <команда 2>; ... <команда n>"

(i) Если ввести команду alias в консоль без параметров, то консоль выведет список всех ранее объявленных псевдонимов:
] alias my_alias "say hello!" ] alias Current alias commands: my_alias : say hello!

Также можно вместо команд использовать другие псевдонимы:
] alias long_jump_start "+jump; +duck" ] alias long_jump_stop "-jump; -duck" ] alias long_jump "long_jump_start; wait 100; long_jump_stop" ] long_jump // тоже что и "+jump; +duck; wait 100; -jump; -duck"

Можно создавать псевдонимы с префиксами "+" и "-". Они также как и команды включения-выключения будут выполняться парно при нажатии клавиши:
] alias +long_jump "+jump; +duck" // выполнится при нажатии клавиши ] alias -long_jump "-jump; -duck" // выполниться после отпускания клавиши

Можно объявлять псевдонимы без команд:
] alias null_alias "" ] null_alias // ничего

Псевдоним можно переопределить, если его повторно объявить с другими командами:
] alias hello "say Hello!" ] hello PlayerName: Hello! // в чате появилось сообщение "Hello!" ] alias hello "echo Hello!" ] hello Hello! // вывод консоли

Также псевдоним можно переопределить с помощью другого псевдонима:
] alias walk_on "+speed; alias walk_toggle walk_off" ] alias walk_off "-speed; alias walk_toggle walk_on" ] alias walk_toggle "walk_on" ] walk_toggle // переключение между ходьбой/бегом

(!) Имена псевдонимов не чувствительны к регистру:
] alias my_alias "echo hello" ] my_alias hello ] alias My_Alias "echo Hello" ] my_alias Hello ] alias MY_ALIAS "echo HELLO" ] my_alias HELLO

(!) Псевдонимы не сохраняются после выхода из игры.

(!) Если в качестве имени псевдонима написать имя существующей команды, то при вводе этого имени будет вызываться псевдоним, а не команда:
] alias -speed "say Беги, Форрест, беги!" // теперь после отпускания клавиши "Shift" будет написано сообщение в чат, но не будет // переключения между ходьбой/бегом

(url) Alias [valve developer community]

setinfo
Команда setifo создаёт консольную переменную: setinfo <имя переменной> <значение>
Значением переменной могут быть целые числа, десятичные дроби или текст:
] setinfo my_cvar 1 // создание переменной "my_cvar" со значением "1"

(i) Консольные переменные которые вы создаёте никак не влияют на игру, но их можно использовать для настройки пользовательского меню.

(!) Консольные переменные, которые создаются командой setinfo, не сохраняются после завершения игры.

(url) Setinfo [valve developer community]

wait
Команда wait создаёт задержку на заданное количество кадров (fps):
wait <число>

Команда "wait" не делает ничего кроме того, что задерживает выполнение следующих после неё команд на указанное количество кадров. При fps = 60 команда "wait 60" будет "выполнятся" 1 секунду, но при большем fps задержка будет короче:
] alias test_wait "+attack; wait 60; -attack" ] test_wait // при использовании автоматического оружия, // на некоторое время начнётся стрельба

С помощью команды wait можно разграничить по времени выполнение команд:
] alias line1 "say . ^_^ -Who said 'moo'?" ] alias line2 "say . (00)\_______" ] alias line3 "say . (__)\ )\/\" ] alias line4 "say . U ||---W|" ] alias line5 "say . || ||" ] line1; line2; line3; line4; line5 // в чате будет только line1 PlayerName: . ^_^ -Who said 'moo'? ] line1; wait 300; line2; wait 300; line3; wait 300; line4; wait 300; line5 // ок PlayerName: . ^_^ -Who said 'moo'? PlayerName: . (00)\_______ PlayerName: . (__)\ )\/\ PlayerName: . U ||---W| PlayerName: . || ||

(!) На некоторых серверах выполнение команды wait блокируется настройками сервера. Переменная разрешающая использование команды: sv_allow_wait_command.
Однако, команда wait запущенная до окончания подключения к серверу будет выполнена:
// после подключения к серверу, через какое-то время будет написано сообщение в чат ] connect <ID сервера на котором блокируется команда wait>; wait 1300; say hello

(i) При чтении конфигурационных файлов, записанные в них команды wait работать не будут, однако, они будут работать в псевдонимах, которые вызываются в конф.файлах.

(url) Wait [valve developer community]

toggle
Команда toggle меняет значение переменной по набору значений:
toggle <имя переменной> <значение 1> <значение 2> ... <значение n>

Если значения не указаны, то команда будет переключать переменную межу значениями 1 и 0:
] toggle sv_voiceenable // включает-выключает режим голосовых сообщений

При достижении последнего значения в наборе, команда toggle начнёт переключение с начала набора:
] toggle volume 0.25 0.5 0.75 1.0 // если volume 1, команда присвоет значение 0.25

Переход в начало набора можно остановить, если повторить последнее значение дважды:
] alias volume_up "toggle volume 0 0.25 0.5 0.75 1 1" // увеличивает громкость ] alias volume_down "toggle volume 1 0.75 0.5 0.25 0 0" // уменьшает громкость

(url) Toggle [valve developer community]

find
Команда find ищет совпадения в названии и описании команд и выводит их в консоль:
find <слово для поиска>
] find cl_crosshair // поиск настроек прицела "cl_crosshair_alpha" = "100" ( def. "255" ) min. 0.000000 max. 255.000000 client archive - Crosshair alpha "cl_crosshair_blue" = "0" ( def. "220" ) min. 0.000000 max. 255.000000 client archive - Crosshair blue component "cl_crosshair_dynamic" = "1" client archive - Crosshair scales based on accuracy "cl_crosshair_green" = "255" ( def. "182" ) min. 0.000000 max. 255.000000 client archive - Crosshair green component "cl_crosshair_red" = "0" ( def. "138" ) min. 0.000000 max. 255.000000 client archive - Crosshair red component "cl_crosshair_thickness" = "1" ( def. "2" ) min. 1.000000 max. 5.000000 client archive - Crosshair thickness in pixels

help
Команда help выводит в консоль краткое описание команды или переменной:
help <имя команды или переменной>
] help quit "quit" - Exit the engine.

key_listboundkeys
Команда key_listboundkeys выведет в консоль список всех клавиш, к которым подвязаны команды, и те самые команды, которая она должна выполнять.

key_findbinding
Команда key_findbinding выполняет поиск среди команд, которые связаны с клавишами, и выводит список найденных команд и связанных с ними клавиш:
key_findbinding <слово для поиска>
] key_findbinding message "u" = "messagemode2" "y" = "messagemode"
Конфигурационные файлы
Конфигурационные файлы - это простые текстовые файлы с форматом ".cfg", в которые записаны консольные команды. Игра может их считывать и выполнять записанные в них команды.
Это стандартный способ хранения игровых настроек в L4D. Настройки хранятся в конф. файлах в виде консольных команд, и при запуске игры конф.файлы считываются и записанные в них команды выполняются, выставляя параметры игры.
Конфигурационные файлы хранятся в папке left4dead/cfg/.

(i) Игра будет выполнять любые записанные команды ( которые можно выполнить ), и поэтому конф.файлы можно использовать не только для настройки игровых опций.

(url) Конфигурационные файлы [valve developer community]

Стандартные конфигурационные файлы:
config.cfg - в этот файл записываются текущие настройки игры.
config_default.cfg - в этом файле хранятся стандартные настройки клавиатуры.
autoexec.cfg - в этот файл можно записать свой список команд и они будут выполняться при каждом запуске игры.

(!) По умолчанию конф.файл autoexec.cfg отсутствует, но его можно создать самостоятельно.

Команда exec
exec <имя конф.файла>
Это команда выполнения консольных команд из конфигурационного файла. Команда "exec" ищет файлы в папке left4dead/cfg/. Если нужный файл находится там, то достаточно указать его имя:
] exec config_default.cfg // устанавливает настройки клавиатуры по умолчанию

Если файл лежит во вложенных папках, тогда нужно указать путь к файлу от папки cfg:
// команда для считывания файла left4dead/cfg/configs/my_config.cfg: ] exec configs/my_config.cfg

(url) Exec [valve developer community]

Создание конфигурационных файлов
Можно создавать свои собственные конф.файлы. Для этого создайте текстовый файл, измените его формат на .cfg и запишите в него свой список команд. Такие файлы не будут считываться при запуске, но их можно считать с помощью консольной команды exec.

(i) Можно записать команды считывания ваших конф.файлов в файл autoexec.cfg, чтобы команды в ваших конф.файлах выполнялись при запуске игры.

Запись команд в конфигурационных файлах аналогична записи команд в консоль. В строке конф.файла записывается команда с необходимыми параметрами, а следующая команда начинается уже на новой строке. Так же как и в консоли, в конф.файле можно записать несколько команд в одной строке если их разделить знаком ";".
При чтении конф.файла, записанные в нем команды будут выполнятся последовательно.
// конф.файл my_cfg.cfg: slot5 // выбираем таблетки wait 300 // ждём +attack // используем таблетки wait 100 // ждём -attack // прекращаем начатое действие
// консоль: ] exec my_cfg.cfg // выбрать таблетки и съесть их

(!) При считывании конф. файлов текст на кириллице считываться не будет:
// конф. файл mess.cfg: alias message "say Hello! Привет!"
// консоль: ] alias message "say Hello! Привет!" ] message PlayerName: Hello! Привет! ] exec mess.cfg Unknown command: ! // такая ошибка обычно появляется при вводе // неверной команды, но здесь это вызвано ошибками // чтения конф.файла содержащего текст на кириллице ] message PlayerName: Hello! // текст на кириллице отсутствует

(i) В конфигурационных файлах можно оставлять комментарии:
<команда> <параметр> // комментарий
При выполнении конф.файла, часть текста, которая начинается двумя символами "/", будет игнорироваться до конца строки.
Бинды
"Бинд" - разговорное название пользовательского списка команд, который изменяет функциональность клавиш в игре. Называйте его манипулятор связи консольных команд с устройствами ввода с нулевым уровнем, если хотите, но в руководстве он будет называться просто "бинд".

Команды настройки клавиатуры:
  • bind
    Команда bind связывает нажатие клавиш с выполнением команд:
    bind <клавиша> <команда>

    Также можно указать несколько команд написав их в кавычках и разделив знаком ";" :
    bind <клавиша> "<команда 1>; <команда 2> ... ; <команда n>"

    После связывания клавиши с командой с помощью команды "bind", при нажатии указанной клавиши будут выполнятся связанные с ней команды:
    ] bind h "say hello!" // теперь после нажатия клавиши "h" в чате появится // сообщение "hello!"

    Также можно вместо команд использовать псевдонимы:
    ] alias my_alias "say hello!" ] bind h my_alias // теперь после нажатия клавиши "h" в чате появится // сообщение "hello!"

    Если ввести в консоль команду "bind <клавиша>" без команд, тогда в консоли будет вывод команд, которые уже связаны с клавишей:
    ] bind y "y" = "messagemode"

    Названия большинства буквенных и числовых клавиш для указания их в команде "bind" совпадают со значениями их символов в англоязычной раскладке ( названия для клавиши буквы 'ы' будет 's', для клавиши цифры '1' будет '1' и т.д. ). Но для некоторых других клавиш их названия для указания в команде не так очевидны. Например, название для клавиши буквы 'ж' будет 'semicolon'.
    Здесь можно найти более подробную информацию о названии клавиш для команды "bind":
    (url) Команды настройки клавиатуры [valve developer community]

    Команда bind по особому работает с командами и псевдонимами имеющие префиксы "+" и "-". При нажатии клавиши выполняется команда с префиксом "+", а при отпускании клавиши команда с префиксом "-". Для того чтобы связать клавишу с этими командами, достаточно связать её только с командой включения:
    ] bind k +forward // теперь при нажатии клавиши "k" начнётся движение вперёд, // а при отпускании прекратится.

    Но если связать клавишу с командой выключения обратного эффекта не произойдёт:
    ] bind k -forward // при отпускании клавиши "k" движения вперёд не будет

    Если связать несколько команд включения с клавишей, то после отпускания клавиши команда выключения выполнится только одна:
    ] bind k "+jump; +duck" // после нажатия клавиши "k": +jump и +duck // после отпускания клавиши "k": только -jump

    (i) Используйте псевдонимы с префиксами для того, чтобы явно указать необходимые действия при нажатии-отпускании клавиши:
    ] alias +long_jump "+jump; +duck" // команды, которые выполнятся при нажатии // клавиши ] alias -long_jump "-jump; -duck" // команды, которые выполнятся после // отпускания клавиши ] bind k +long_jump

    (!) Изменения, которые выполнит команда "bind", сохраняются после завершения игры.

  • BindToggle
    Команда BindToggle аналогична команде bind, но предназначена для работы с переменными:
    BindToggle <клавиша> <имя переменной>

    После связывания клавиши с переменной, при нажатии клавиши будет происходить смена значений переменной с 1 на 0 и обратно:
    ] BindToggle m snd_musicvolume // включить/выключить музыку

    (!) Изменения, которые выполнит команда BindToggle, сохраняются после завершения игры.

  • unbind
    Команда unbind делает противоположное, что делают команды bind и BindToggle. Она освобождает клавишу от выполнения команд:
    unbind <клавиша>

    ] unbind w // теперь нет движения вперёд

  • unbindall
    Команда unbindall освобождает все кнопки от выполнения команд.

    (!) Изменения, которые выполняют команды unbind и unbindall сохраняются после завершения игры.

Создание биндов
Бинд - это список команд который связывает клавиши с выполнением действий, которых как правило нет в меню настройки клавиатуры. Создание бинда заключается в вводе команд связывания клавиш с выполнением необходимых консольных команд или псевдонимов:
// простой бинд: ] bind "h" "say hello!" // после нажатия клавиши "h" в чате появится сообщение "hello"
Игра записывает все текущие настройки клавиш в конф.файл "config.cfg" после завершения игры, и поэтому бинды, состоящие только из команд "bind", достаточно один раз ввести в консоль, для того, чтобы они всегда работали.

Но они как правило не ограничиваются только командой "bind". В биндах очень часто используются псевдонимы, которые необходимо объявить ( создать ) перед тем как их использовать:
// бинд для переключения между ходьбой/бегом с помощью нажатия клавиши ] alias walk_on "+speed; alias walk_toggle walk_off" ] alias walk_off "-speed; alias walk_toggle walk_on" ] alias walk_toggle "walk_on" ] bind "shift" "walk_toggle"
После выхода из игры, игра не записывает созданные ранее псевдонимы в конф.файл "config.cfg", а это значит, что их нужно объявлять каждый раз после запуска игры для того, чтобы бинд работал.
Выполнение этих объявлений можно ( и нужно ) автоматизировать. Для этого бинд записывается в отдельный конф.файл, а затем в конф.файл "autoexec.cfg" добавляется команда считывания конф.файла бинда.
// конф.файл ToggleWalk.cfg: alias walk_on "+speed; alias walk_toggle walk_off" alias walk_off "-speed; alias walk_toggle walk_on" alias walk_toggle "walk_on" bind "shift" "walk_toggle"
// конф.файл autoexec.cfg: exec ToggleWalk.cfg
Конф.файл autoexec.cfg выполняется автоматически при каждом запуске игры, и если в нём записаны команды считывания других конф.файлов, то команды в этих конф.файлах также будут выполнятся.

Главной функцией бинда является связывание клавиш с выполнением консольных команд, и поэтому перед тем как создать конкретный бинд, нужно найти те самые консольные команды, которые бинд должен выполнять. В L4D есть очень много команд, которые делают интересные вещи и не очень. В этом руководстве описаны только те команды, которые необходимы для создания биндов, радиальных и пользовательских меню, но другие команды здесь описываться не будут.
Благодаря усилиям неравнодушных людей в сети есть достаточно большое количество руководств и статей, в которых есть множества примеров интересных команд и описаний к ним.

Большинство биндов, которые используются для повседневной игры, простые и незамысловатые, и их сможет написать любой человек без подготовки, но есть примеры более сложных биндов, выполняющие нетривиальные задачи. Чтобы написать сложный бинд придётся немного подумать и проявить воображение, но в тоже время это всё не настолько сложно, и для написания любых биндов достаточно той информации, которая написана в этом руководстве.

(i) Благодаря тому, что бинды это список консольных команд, можно делится своими биндами, а также использовать бинды других, дополнять и модифицировать их под свои нужды.
Бинды и переопределение псевдонимов
Консольные команды выполняют определённое действие в игре, и выполняют строго то что в них заложено, а команда "bind" просто выполняет консольную команду при нажатии клавиши, и не более того. Бинды были бы не так интересны если бы не была возможность создавать и переопределять псевдонимы.
  • Благодаря тому, что можно создавать и переопределять псевдонимы, можно создавать бинды, которые ведут себя по-разному в зависимости от ситуации:
    alias key1 "<команда 1>" alias key2 "alias key1 <команда 2>" bind k key1 // клавиша "K" выполняет свою обычную функцию, // определённой псевдонимом bind l key2 // но после нажатия клавиши "L", // клавиша "K" начинает вести себя по другому

  • Можно создать бинд который выполняет действие только при нажатии двух клавиш:
    alias command "<команда>" // команда, которую должен выполнить бинд alias null_command "" // псевдоним, который ничего не делает alias +key1 "key1_command; alias key2_command command" alias -key1 "alias key2_command null_command" alias key1_command "null_command" alias +key2 "key2_command; alias key1_command command" alias -key2 "alias key1_command null_command" alias key2_command "null_command" bind <клавиша 1> +key1 bind <клавиша 2> +key2
    Комментарий: Две клавиши связаны с выполнением двух парных псевдонимов включения-выключения. Для каждой пары есть псевдоним, который выполняется псевдонимом включения ( +key1 выполняет key1_command, а +key2 выполняет key2_command). Каждая пара включения-выключения при нажатии клавиши выполняет свой отдельный псевдоним, а затем переопределяет псевдоним другой пары на выполнение command. После отпускания клавиши псевдонимы выключения переопределяют псевдонимы на их исходные команды.
    Таким образом при нажатии одной из двух клавиш ничего не произойдёт, но если нажать две клавиши, то будет выполнена команда бинда.

  • Можно сделать бинд, который будет срабатывать на комбинацию клавиш:
    alias +step "step_up_1" alias -step "step_down_1" alias step_down_1 "" alias step_up_1 "alias +step step_up_2; alias -step step_down_2" alias step_down_2 "alias +step step_up_1; alias -step step_down_1" alias step_up_2 "alias +step step_up_3; alias -step step_down_3" alias step_down_3 "alias +step step_up_2; alias -step step_down_2" alias step_up_3 "<команда>" // команда, которую должен выполнить бинд bind <клавиша 1> +step bind <клавиша 2> +step bind <клавиша 3> +step
    Комментарий: Три клавиши связаны с выполнением одной и той же пары псевдонимов включения-выключения +step и -step, которые выполняют псевдонимы из группы псевдонимов. Псевдонимы из группы состоят из нескольких пар псевдонимов step_up_* и step_down_*. step_up_* выполняется при нажатии клавиши и переопределяет +step и -step на выполнение следующей пары, а step_down_* на выполнение предыдущей. Конечный псевдоним из группы step_up_3 выполнит команду бинда.
    Такой бинд будет игнорировать нажатие отдельных клавиш, но при этом выполнит команду, когда все три клавиши будут нажаты ( при этом не важно в какой последовательности они будут нажаты ).

    (i) Можно сделать большее количество клавиш, которые участвуют в выполнении бинда. Количество нажатых клавиш, необходимых для выполнения бинда, также может быть другим и отличатся от общего числа клавиш, участвующих в бинде.

  • Или бинд, в котором клавиши могут работать в нескольких режимах:
    // псевдонимы, которые будут выполняться клавишами: alias key_1 "<команда_1>" alias key_2 "<команда_2>" alias key_3 "<команда_3>" // вариант команд для клавиш №1: alias mode_1 "alias key_1 <команда_1>; alias key_2 <команда_2>; alias key_3 <команда_3>; alias toggle_mode mode_2" // вариант команд для клавиш №2: alias mode_2 "alias key_1 <команда_4>; alias key_2 <команда_5>; alias key_3 <команда_6>; alias toggle_mode mode_1" // псевдоним переключения режимов: alias toggle_mode "mode_2" // клавиша переключения режимов: bind <клавиша> toggle_mode bind <клавиша_1> key_1 bind <клавиша_2> key_2 bind <клавиша_3> key_3
    Комментарий: Псевдонимы key_1 - key_3 связаны с клавишами и выполняют указанные команды, а псевдонимы mode_1 и mode_2 выполняют их переопределение, каждый на свой вариант набора команд. Также mode_1 и mode_2 переопределяют toggle_mode на выполнение другого псевдонима mode_*, тем самым делая из toggle_mode переключатель между режимами работы клавиш.

  • И много чего ещё...

Варианты использования переопределения псевдонимов очень много, но все они основаны на одном: использовании команды переопределения псевдонима в команде другого псевдонима.
// действие которое выполнит псевдоним "command" зависит от других псевдонимов, // которые определят его поведение alias command "" // выполнение псевдонимов "variant1", "variant2" и "variant3" - это условия // от которых зависит поведение "command" alias variant1 "alias command <команда 1>" alias variant2 "alias command <команда 2>" alias variant3 "alias command <команда 3>" // в зависимости от условий результат от нажатии клавиши будет разным bind <клавиша> command

Переопределение псевдонимов даёт возможность делать сложные схемы управления, которые выполняют разные действия в зависимости от условий. Но возможности, которые даёт переопределение псевдонимов, не безграничны. Переопределения псевдонимов выполняются консольной командой, которую напрямую или косвенно выполняет сам игрок, но игра её самостоятельно выполнять не будет. А это значит, что условия переопределения псевдонимов могут быть созданы нажатием/отпусканием клавиши, чтением конф.файла, выборе пункта радиального или пользовательского меню, либо непосредственным вводом этой команды в консоль.
Но не смотря на эти ограничения переопределения псевдонимов в биндах является очень полезной вещью, с помощью которой можно упростить и ускорить выполнение типовых действий, а также сократить общее число используемых клавиш в игре.

Все примеры в этом руководстве приведены только для того, чтобы вы могли понять как используются псевдонимы в работе биндов. Дополнительно в руководстве приведены примеры биндов выполняющие конкретные задачи ( пример 1-3 ). Несмотря на то, что все эти примеры были созданы только для демонстрации, они вполне рабочие и вы можете их использовать в игре или как основу для своих бидов.

(!) Важно помнить, что есть риск того, что у биндов могут быть недочёты, которые не видны на первый взгляд. Даже при использовании правильно работающих биндов при переопределении псевдонимов могут возникать сбои из-за багов самой игры. Держите под рукой бинды, которые возвращают стандартные настройки и отменяют команды, которые включают другие бинды:
alias cancel_bind "<команды которые отменяют действия бинда>" bind <клавиша> cancel_bind
Пример 1: быстрый выбор слота
Бинд для быстрого выбора слота с помощью клавиш "W", "S", "A" и "D":
// autoexec.cfg: exec SelectSlot.cfg
// SelectSlot.cfg: // псевдонимы для клавиши "Alt", которые подменяют команды клавиш "W", "S", "A" и "D" alias +alt_key "alias w_comand slot3; alias s_comand slot2; alias a_comand slot4; alias d_comand slot5" alias -alt_key "alias w_comand +forward; alias s_comand +back; alias a_comand +moveleft; alias d_comand +moveright" // псевдонимы для клавиши "W" alias +w_key "w_comand" alias -w_key "-forward" alias w_comand "+forward" // псевдоним, который будет переопределяться клавишей // "Alt", и выполнятся клавишей "W" // тоже самое, но для клавиши "S" alias +s_key "s_comand" alias -s_key "-back" alias s_comand "+back" // тоже самое, но для клавиши "A" alias +a_key "a_comand" alias -a_key "-moveleft" alias a_comand "+moveleft" // тоже самое, но для клавиши "D" alias +d_key "d_comand" alias -d_key "-moveright" alias d_comand "+moveright" // отмена бинда alias cancel_bind "-forward; -back; -moveleft; -moveright; unbind alt; bind w +forward; bind s +back; bind a +moveleft; bind d +moveright" //связывание псевдонимов с клавишами bind "alt" "+alt_key" bind "w" "+w_key" bind "s" "+s_key" bind "a" "+a_key" bind "d" "+d_key" bind "k" "cancel_bind"

Комментарий: Клавиши "W", "S", "A" и "D" выполняют свои стандартные команды движения, но после нажатия клавиши "Alt" они будут выбирать слот: граната для "W", пистолет для "S", аптечка для "A", и таблетки для "D".
При этом от клавиш не отвязываются команды остановки, чтобы можно было остановиться при зажатой клавише "Alt".
Пример 2: переключение между дополнительными слотами
Комментарий: На некоторых модифицированных серверах есть плагины, которые изменяют и дополняют L4D. Есть плагины которые добавляют возможность иметь несколько предметов в одном слоте. Но L4D не рассчитывался на подобное и само-собой стандартный интерфейс игры в таких случаях не очень удобен.
Бинд в этом примере будет выполнять переключения между дополнительными слотами при нажатии клавиши "Shift" и вращением колёсика мыши.
// autoexec.cfg: exec AdditionalSlot.cfg
// AdditionalSlot.cfg: // На серверах, как правило, для выбора дополнительного слота нужно нажать клавишу // слота второй раз. alias seclect_slot "slot2" // псевдоним для текущего слота // набор псевдонимов для клавиш выбора слотов (1-5), которые выбирают слот // и переопределяют select_slot для повторного выбора: alias my_slot_1 "slot1; alias seclect_slot slot1" // для клавиши "1" alias my_slot_2 "slot2; alias seclect_slot slot2" // для клавиши "2" alias my_slot_3 "slot3; alias seclect_slot slot3" // для клавиши "3" alias my_slot_4 "slot4; alias seclect_slot slot4" // для клавиши "4" alias my_slot_5 "slot5; alias seclect_slot slot5" // для клавиши "5" // псевдонимы для клавиши Shift alias +shift_key "+speed; bind MWHEELUP select_slot; bind MWHEELDOWN select_slot" alias -shift_key "-speed; bind MWHEELUP invprev; bind MWHEELDOWN invnext" // отмена бинда: alias cancel_bind "-speed; bind shift +speed; bind 1 slot1; bind 2 slot2; bind 3 slot3; bind 4 slot4; bind 5 slot5; bind MWHEELUP invprev; bind MWHEELDOWN invnext" // Связывание новых псевдонимов с клавишами: bind "1" "my_slot_1" bind "2" "my_slot_2" bind "3" "my_slot_3" bind "4" "my_slot_4" bind "5" "my_slot_5" bind "SHIFT" "+shift_key" bind "k" "cancel_bind"
Пример 3: выбор предыдущего слота
Бинд для выбора предыдущего оружия, который срабатывает при нажатии клавиши "Q" (как в Counter-Strike или Half-Life):
// autoexec.cfg: exec LastSlot.cfg
// LastSlot.cfg: // псевдоним выбора предыдущего слота: alias last_slot "" // псевдоним переопределения last_slot, выполняется при смене оружия // при этом он никогда не выполняет переопределение last_slot напрямую, // а использует для этого псевдонимы update_cmd_*: alias update_last_slot "" // псевдонимы для клавиш выбора оружия (1-5): alias my_slot_1 "select_slot_1" alias my_slot_2 "select_slot_2" alias my_slot_3 "select_slot_3" alias my_slot_4 "select_slot_4" alias my_slot_5 "select_slot_5" // псевдонимы select_slot_* // выбирают слот, переопределяют last_slot с помощью update_last_slot, // затем переопределяют сам update_last_slot для того, чтобы он при следующей // смене оружия переопределил last_slot на выбор текущего слота, и наконец // переопределяет my_slot_* на непосредственный выбор слота, для того, // чтобы при нажатии клавиши выбора оружия несколько раз не происходило // изменение last_slot на выбор уже выбранного слота alias select_slot_1 "slot1; update_last_slot; alias update_last_slot update_cmd_1; alias my_slot_1 slot1" alias select_slot_2 "slot2; update_last_slot; alias update_last_slot update_cmd_2; alias my_slot_2 slot2" alias select_slot_3 "slot3; update_last_slot; alias update_last_slot update_cmd_3; alias my_slot_3 slot3" alias select_slot_4 "slot4; update_last_slot; alias update_last_slot update_cmd_4; alias my_slot_4 slot4" alias select_slot_5 "slot5; update_last_slot; alias update_last_slot update_cmd_5; alias my_slot_5 slot5" // псевдонимы update_cmd_* // update_last_slot выполняет переопределение last_slot с помощью одного из // этих псевдонимов. они выполняют переопределение last_slot и переопределяют // my_slot_* на выполнение соответствующего select_slot_* alias update_cmd_1 "alias last_slot select_slot_1; alias my_slot_1 select_slot_1" alias update_cmd_2 "alias last_slot select_slot_2; alias my_slot_2 select_slot_2" alias update_cmd_3 "alias last_slot select_slot_3; alias my_slot_3 select_slot_3" alias update_cmd_4 "alias last_slot select_slot_4; alias my_slot_4 select_slot_4" alias update_cmd_5 "alias last_slot select_slot_5; alias my_slot_5 select_slot_5" // отмена бинда: alias cancel_bind "bind q lastinv; bind 1 slot1; bind 2 slot2; bind 3 slot3; bind 4 slot4; bind 5 slot5" // Связывание новых псевдонимов с клавишами: bind "1" "my_slot_1" bind "2" "my_slot_2" bind "3" "my_slot_3" bind "4" "my_slot_4" bind "5" "my_slot_5" bind "q" "last_slot" bind "k" "cancel_bind"

Комментарий: При нажатии клавиши "Q" с помощью несложных манипуляций с переопределением псевдонимов будет выбран тот слот, который был выбран ранее. Однако такой бинд будет пытаться выбрать любой слот, который был раньше выбран с помощью клавиш, даже если он пуст. К сожалению консольные команды не могут следить за состоянием вещей в игре и менять своё поведение на основе этого.

(!) Бинды из 2го и 3го примеров используют одни и те же клавиши выбора оружия (1-5), а также создают псевдонимы с одними и теми же именами (my_slot_1 - my_slot_5), и поэтому они не могут работать одновременно:
// autoexec.cfg: exec AdditionalSlot.cfg // при выполнении конф.файла "AdditionalSlot.cfg" объявляются // псевдонимы my_slot_1-my_slot_5 и связываются с клавишами 1-5 exec LastSlot.cfg // конф.файл "LastSlot.cfg" объявит свои версии псевдонимов // my_slot1-my_slot_5, после чего бинд из файла // "AdditionalSlot.cfg" работать не будет
Для того, чтобы эти бинды работали вместе их нужно совместить в один бинд, который будет выполнять одновременно две задачи.
Радиальное меню
Радиальное меню используется в L4D для выбора вокализов в игре. Меню открывается с помощью кнопки на клавиатуре, а нужный пункт выбирается с помощью мыши.

Радиальное меню можно открыть с помощью команды "+mouse_menu <имя меню>" или "radialmenu <имя меню>":
bind z "+mouse_menu MyMenu" // откроет при нажатии и закроет при отпускании клавиши, // при этом выполнит тот пункт меню, который был выделен bind x "radialmenu MyMenu" // только откроет меню

Настройки радиальных меню находятся в файле left4dead/scripts/radialmenu.txt . Если прочитать этот файл, то можно увидеть что все радиальные меню описываются с помощью одной структуры:
// структура файла radialmenu.txt: "RadialMenu" { // структура радиального меню "<название меню>,<параметр 1>,<параметр 2>" { // центральный пункт меню "Center" { "command" "<команда пункта меню>" "text" "<название пункта меню>" } // верхний пункт меню "North" { "command" "<команда пункта меню>" "text" "<название пункта меню>" } // верхний пункт меню справа "NorthEast" { "command" "<команда пункта меню>" "text" "<название пункта меню>" } // правый пункт меню "East" { "command" "<команда пункта меню>" "text" "<название пункта меню>" } // нижний пункт меню справа "SouthEast" { "command" "<команда пункта меню>" "text" "<название пункта меню>" } // нижний пункт меню "South" { "command" "<команда пункта меню>" "text" "<название пункта меню>" } // нижний пункт меню слева "SouthWest" { "command" "<команда пункта меню>" "text" "<название пункта меню>" } // левый пункт меню "West" { "command" "<команда пункта меню>" "text" "<название пункта меню>" } // верхний пункт меню слева "NorthWest" { "command" "<команда пункта меню>" "text" "<название пункта меню>" } } // структура следующего радиального меню "<название следующего меню>,<параметр 1>,<параметр 2>" { // аналогичная структура } // и т.д. }

В файле radialmenu.txt используется специальная структура для описания меню. Эта структура представляет из себя список параметров, которые разделены по группам.

Параметры записаны в виде пары, которая состоит из названия параметра и его значения:
"command" "vocalize smartlook" // название параметра - command, значение параметра - vocalize smartlook
Каждый элемент пары заключаются в двойные кавычки и разделяются между собой пробелом. В файле каждая пара записывается на новой строке.

Группа состоит из названия группы, которое записывается в кавычках, и фигурных скобок, между которыми записываются параметры и/или другие группы которые к ней относятся:
"Center" // название группы { // параметры: "command" "vocalize smartlook" "text" "#L4D_rosetta_look" }
Для лучшей читаемости, к параметрам, которые вложены в группу, добавляют отступы ( табуляцию ).

Структура файла radialmenu.txt представляет из себя группу "RadialMenu", в которой записаны группы, каждая из которых отвечает за какое-то конкретное меню. В имени группы меню вначале пишется имя меню, а затем через запятую указываются два необязательных параметра:
"Orders,Survivor,Alive" // стандартное меню вокализов с именем "Orders" { // ... }
"Survivor" означает, что этим меню могут пользоваться только выжившие. Если изменить его на "Zombie", то меню можно использовать только при игре за заражённых, а если этот параметр убрать, меню можно использовать в любой команде. Параметр "Alive" означает, что это меню можно открыть только когда вы живы. Если изменить его на "Dead", то меню можно открыть только после смерти. Если не указать этот параметр, меню можно открывать всегда.
"MyMenu,Zombie,Alive" // меню которым можно пользоваться только при игре за заражённых "MyMenu,Alive" // меню которым можно пользоваться только пока вы живы "MyMenu" // меню которые можно открыть всегда

Затем в группе меню перечисляются группы пунктов меню. Для названий групп пунктов меню используются специальные названия, которые указывают на их положение в меню.
В группе пункта всего два параметра "command" и "text". Значение параметра "command" - это консольная команда, которая будет выполнятся при выборе этого пункта меню, а параметр "text" - это название пункта, которое будет отображаться в меню.
"Center" // центральный пункт меню { "command" "vocalize smartlook" // vocalize smartlook -> ваш персонаж // скажет "Глядите!" "text" "#L4D_rosetta_look" // если после "text" в кавычках написать // какой-либо текст, то он будет отображаться // в названии пункта меню, но здесь // написано специальное обозначение // текста, который должен меняться в зависимости // от выбранного языка интерфейса в игре. }
Создание радиального меню
Мы можем изменять существующие меню, меняя значения их параметров, а также создавать свои радиальные меню, добавляя новые группы меню. Для того чтобы создать и/или изменить существующие меню можно внести изменения в сам файл radialmenu.txt . Но лучше всего сделать эти изменения в виде дополнения.

// нестандартное меню с именем MyMenu, которое можно использовать при игре за выживших "MyMenu,Survivor,Alive" { // центральный пункт меню "Center" { "command" "vocalize smartlook" // вокализ "Глядите" "text" "#L4D_rosetta_look" } // верхний пункт меню "North" { "command" "say :)" // напишет в чат ":)" "text" ":)" } // верхний пункт меню справа "NorthEast" { "command" "say Hello!" // напишет в чате "Hello!" "text" "Hello!" } // правый пункт меню "East" { "command" "vocalize PlayerNo" // вокализ "Нет" "text" "#L4D_rosetta_no" } // нижний пункт меню справа "SouthEast" { "command" "say !menu" // напишет в чат "!menu" "text" "Menu" } // нижний пункт меню "South" { "command" "say gg" // напишет в чат "gg" "text" "gg" } // нижний пункт меню слева "SouthWest" { "command" "toggle snd_musicvolume" // включит/выключит музыку в игре "text" "music on/off" } // левый пункт меню "West" { "command" "vocalize PlayerYes" // вокализ "Да" "text" "#L4D_rosetta_yes" } // верхний пункт меню слева "NorthWest" { "command" "say :(" // напишет в чат ":(" "text" ":(" } }
(i) В параметре "command" можно записать несколько команд, разделив их знаком ";".

Мы можем менять значения параметров в структуре, на те, которые нужны нам, но не их названия. Также в названии группы пункта меню нужно использовать только специальные названия для пунктов ( "Center", "North" и т.д. ).

При выборе пункта меню будет выполнятся консольная команда, указанная в параметре "command". В стандартных радиальных меню используется только команда вокализов "vocalize <название вокализа>", но если указать другие команды, то они выполнятся также, как если бы они были бы введены в консоль.

(!) Не забывайте про фигурные скобки ( "{" и "}" ), а также про двойные кавычки. Они группируют параметры и их значения, и являются частью структуры файла, нарушение которой приведёт к ошибкам.

Радиальное меню можно использовать для открытия других радиальных меню, и тем самым сделать навигацию между несколькими меню:
"Menu1" { "Center" { "command" "radialmenu Menu2" "text" "Часть 2" } // *другие пункты меню* } "Menu2" { "Center" { "command" "radialmenu Menu1" "text" "Назад" } // *другие пункты меню* }

Вместо консольных команд можно использовать псевдонимы:
// радиальное меню, которое работает вместе с биндом для переключения между // дополнительными слотами (Пример №2). // пункты меню, которые не используются, можно не указывать. Они отображаться не будут. "GunMenu,Survivor,Alive" { // центральный пункт меню "Center" { "command" "my_slot_1" "text" "ОРУЖИЕ" } // верхний пункт меню "North" { "command" "my_slot_3" "text" "ГРАНАТА" } // правый пункт меню "East" { "command" "my_slot_5" "text" "ТАБЛЕТКИ" } // нижний пункт меню "South" { "command" "my_slot_4" "text" "АПТЕЧКА" } // левый пункт меню "West" { "command" "my_slot_2" "text" "ПИСТОЛЕТ" } }

(i) В файле radialmenu.txt можно оставлять комментарии:
"command" "<команда>" // комментарий
Часть текста, которая начинается двумя символами "/", будет игнорироваться до конца строки.
Пользовательское меню
Пользовательское меню - наследие Counter-Strike:Source, на базе которого создавался L4D. Это меню открывается в левой части экрана, а пункты меню выбираются с помощью клавиш 0-9.

Пользовательское меню можно открыть с помощью команды "show_menu <имя меню>"
bind "x" "show_menu MyMenu"

Описание пользовательских меню находятся в файле left4dead/scripts/clientmenu.txt . Структура пользовательского меню очень похожа на структуру радиальных меню, но имеет некоторые отличия:
// структура файла clentmenu.txt "ClientMenu" { // группа пользовательского меню "<название меню>,<параметр 1>,<параметр 2>" { // параметр заголовка меню "Title" "<текст заголовка меню>" // группа пункта меню "<клавиша (0-9) которая выбирает этот пункт>" { "command" "<команда пункта меню>" "label" "<название пункта меню>" } // группа пункта меню, который может быть неактивным "<клавиша (0-9) которая выбирает этот пункт>" { "command" "<команда пункта меню>" "label" "<название пункта меню>" // не обязательный параметр: "invalidLabel" "<название пункта меню, если он не активен>" // условие, при котором пункт будет неактивным: "ignorevar" { "cvar" "<консольная переменная>" "value" "<значение>" } } } "<название следующего меню>,<параметр 1>,<параметр 2>" { // аналогичная структура } // и т.д. }

Так же как и в структурах радиальных меню, в названии группы меню пишется имя меню и два необязательных параметра. Эти параметры такие же как и в радиальном меню, но для первого параметра есть дополнительный вариант "Spectator". Этот вариант параметра означает, что меню могут открывать только наблюдатели.
В названии группы пункта меню пишется номер клавиши (1-9), которая будет выбирать этот пункт.
У пользовательского меню есть заголовки. Название заголовка записано в параметре "Title".

В отличии от радиального меню, пункты пользовательского меню могут быть неактивными. Группа параметров "ignorevar" определяет когда этот пункт меню должен быть активным:
"ignorevar" { "cvar" "<консольная переменная>" "value" "<значение>" }
Если значение консольной переменной, имя которой записано в параметре "cvar", совпадает со значением в параметре "value", тогда пункт меню станет неактивным. При выборе пункта меню, команда в параметре "command" выполнятся не будет, а название пункта будет отображаться тусклым цветом. Если указан параметр "invalidLabel", то название пункта меню изменится на текст указанный в этом параметре.
Создание пользовательского меню
Мы можем изменять существующие меню, меняя значения их параметров, а также создавать свои пользовательские меню, добавляя группы меню. Для того чтобы создать и/или изменить существующие меню можно внести изменения в сам файл clientmenu.txt . Но лучше всего сделать эти изменения в виде дополнения.

Пользовательское меню можно изменить или создать по аналогии с радиальным меню, но нужно учитывать их отличия:
// нестандартное меню для включения-выключения голосового чата: "VoiceChatMenu" { "Title" "Голосовой чат" "1" { "command" "sv_voiceenable 1" "label" "Включить" "invalidLabel" "Включён" "ignorevar" { "cvar" "sv_voiceenable" "value" "1" } } "2" { "command" "sv_voiceenable 0" "label" "Выключить" "invalidLabel" "Выключен" "ignorevar" { "cvar" "sv_voiceenable" "value" "0" } } "0" { "command" "" "label" "Отмена" } }
(i) В параметре "command" можно записать несколько команд, разделив их знаком ";".

Так же как и в радиальном меню, любая консольная команда, записанная в параметре "command" будет выполнена при выборе пункта меню ( если её можно выполнить ).

(!) Не забывайте про фигурные скобки ( "{" и "}" ), а также про двойные кавычки. Они группируют параметры и их значения, и являются частью структуры файла, нарушение которой приведёт к ошибкам.

Для настройки пользовательского меню можно использовать свои консольные переменные:
// cfg/autoexec.cfg : setinfo cvar_left_menu 0 // создаём переменную cvar_left_menu со значением 0
// scripts/clientmenu.txt : // нестандартное меню, которое выполняет включение-выключение команды // непрерывного поворота влево ( команды +left и -left ) "LeftOnMenu" { "Title" "+left" // пункт меню, который включает непрерывный поворот "1" { // при выборе этого пункта меню выполняется команда +left // и меняется значение нашей переменной на 1 "command" "+left; cvar_left_menu 1" "label" "Включить" // Если значение нашей переменной будет равно 1, тогда этот пункт // станет неактивным, а его название изменится на "Включён" "invalidLabel" "Включён" "ignorevar" { "cvar" "cvar_left_menu " "value" "1" } } // пункт меню, который выключает непрерывный поворот "2" { // при выборе этого пункта меню выполняется команда -left // и меняется значение нашей переменной на 0 "command" "-left; cvar_left_menu 0" "label" "Выключить" // если значение нашей переменной будет равно 0, тогда этот пункт // станет неактивным, а его название изменится на "Выключен" "invalidLabel" "Выключен" "ignorevar" { "cvar" "cvar_left_menu " "value" "0" } } "0" { "command" "" // если в значении параметра "command" ничего не указать, // то при выборе этого пункта, меню закроется, // не выполнив ни какой команды "label" "Отмена" } }

В пользовательских меню можно создать навигацию между несколькими меню:
// команда 'play ui/menu_click01.wav' воспроизведёт звук при выборе пункта меню "SelectMenu" { "Title" "Выбор меню" "1" { "command" "show_menu VoiceChatMenu; play ui/menu_click01.wav" "label" "Голосовой чат" } "2" { "command" "show_menu LeftOnMenu; play ui/menu_click01.wav" "label" "+left" } "3" { "command" "show_menu ChangeNickMenu; play ui/menu_click01.wav" "label" "Изменить ник" } "9" { "command" "show_menu MainMenu; play ui/menu_click01.wav" "label" "Назад" } "0" { "command" "play ui/menu_click01.wav" "label" "Отмена" } }

(!) Пользовательское меню не поддерживает локализацию:
// название пункта радиального меню: "text" "#L4D_rosetta_look" // если установлен русский язык интерфейса, то в игре // название пункта меню будет "Глядите!", // если английский - "Look!" // название пункта пользовательского меню: "label" "#L4D_rosetta_look" // название пункта меню будет "#L4D_rosetta_look"

(i) Пользовательское меню имеет одну особенность: в ней можно использовать указатели на ники игроков "*Survivor<номер>":
// стандартное пользовательское меню "Kick" "Kick,Survivor" { "Title" "Vote to kick a survivor" "1" { "command" "voteproxy Kick *Survivor1" "label" "*Survivor1" } "2" { "command" "voteproxy Kick *Survivor2" "label" "*Survivor2" } "3" { "command" "voteproxy Kick *Survivor3" "label" "*Survivor3" } "4" { "command" "voteproxy Kick *Survivor4" "label" "*Survivor4" } "0" { "command" "" "label" "Exit" } }
*Survivor1, *Survivor2, *Survivor3 и *Survivor4 - это специальные указатели на ники игроков. При открытии меню в игре, "*Survivor<номер>" изменится на ник соответсвующего игрока на сервере, причём не только в тексте названий пунктов меню, но и в командах которые они выполняют:
"SayHello" { "Title" "Hello ..." "1" { "command" "say Hello *Survivor1" "label" "*Survivor1" } "2" { "command" "say Hello *Survivor2" "label" "*Survivor2" } "3" { "command" "say Hello *Survivor3" "label" "*Survivor3" } "4" { "command" "say Hello *Survivor4" "label" "*Survivor4" } "0" { "command" "" "label" "Выход" } }
Если на сервере есть игроки с никами "Biba", "Boba", "Pupa" и "Lupa", тогда меню "SayHello" будет иметь следующий вид: Hello ... 1. Biba // напишет в чат: Hello Biba 2. Boba // напишет в чат: Hello Boba 3. Pupa // напишет в чат: Hello Pupa 4. Lupa // напишет в чат: Hello Lupa 0. Выход

(i) В файле clientmenu.txt можно оставлять комментарии:
"command" "<команда>" // комментарий
Часть текста, которая начинается двумя символами "/", будет игнорироваться до конца строки.
Дополнения
В игре L4D есть система дополнений, которая позволяет добавлять в игру новые файлы и заменять на другие версии уже существующие файлы игры, без непосредственной замены старых файлов или добавления новых.
Для дополнения и замены файлов система дополнений использует специальные пакеты данных, в которых упакованы новые фалы игры. Эти пакеты данных имеют вид файлов с форматом .vpk (далее vpk-файлы).
При запуске игра проверяет наличие vpk-файлов в папке с игрой и их содержимое. Все файлы, которые упакованы в vpk-файле, игра будет использовать так, как если бы они находились в папке с игрой. Если в vpk-файле есть файлы, которые совпадают с оригинальными файлами игры по названию и месту их нахождения во вложенных папках, то игра будет использовать файлы из vpk-файла вместо оригинальных.

Различные дополнения ( они же аддоны ) такие как нестандартные карты и моды, которые мы добавляем в игру, работают с помощью системы дополнений и имеют вид vpk-файлов. Для добавления пользовательских дополнений используется папка left4dead/addons/.

(!) При использовании нескольких дополнений, которые имеют изменённую версию одного и того же файла, игра будет использовать только одну версию изменённого файла. При этом оригинальный файл и изменённые версии файла в других дополнениях игра использовать не будет.

(i) Отключайте неиспользуемые дополнения и включайте их при необходимости, чтобы избежать ошибок, вызванных из-за наличия нескольких версий одного и того же файла.

Создание дополнения
Для создания дополнения нужно создать папку (далее папка дополнения) и поместить в неё файлы, которые должны заменять или дополнять оригинальные файлы игры. Файлы должны иметь те же имена, что и заменяемые, и находится в тех же папках (относительно папки left4dead):
Заменяемый файл: left4dead/scripts/radialmenu.txt Новый файл: папка дополнения/scripts/radialmenu.txt
Затем нужно упаковать папку дополнения в vpk-файл . Программа, которая может это сделать, находится в папке с игрой bin/vpk.exe . У этой программы нет графического интерфейса (если мы попытаемся её открыть, то привычного нам окна программы не появится), но можно перетащить папку дополнения прямо на иконку программы. Тогда она упакует файлы в vpk-файл и поместит его в том месте где находилась папка дополнения.
После этого, переместите созданный vpk-файл в папку addons. После запуска игра будет использовать новые файлы из дополнения.

(i) В папку дополнения можно добавить файл addoninfo.txt и указать в нём описание дополнения, версию и указатели на его содержание:
// Пример файла "addoninfo.txt" для дополнения радиальных или пользовательских меню "AddonInfo" { "addonSteamAppID" "500" // id игры ( 500 = L4D ) "addonTitle" "My Menu" // название дополнения "addonVersion" 1 // версия дополнения "addonContent_Script" 1 // указание на содержание в нём скриптов }
После этого, если упаковать папку дополнения в vpk-файл и поместить его в папку addons, то после запуска игры в меню дополнений будет отображаться название дополнения с указанием его содержимого.
(url) Addoninfo.txt [valve developer community]

Создание дополнения радиальных меню:
1. Создайте папку дополнения, а в ней папку scripts.
2. Поместите в "папка дополнения/scripts/" изменённый файл radialmenu.txt
3. Упакуйте папку дополнения с помощью программы bin/vpk.exe в vpk-файл
4. Поместите vpk-файл в папку addons

Создание дополнения пользовательских меню:
1. Создайте папку дополнения, а в ней папку scripts.
2. Поместите в "папка дополнения/scripts/" изменённый файл clientmenu.txt
3. Упакуйте папку дополнения с помощью программы bin/vpk.exe в vpk-файл
4. Поместите vpk-файл в папку addons

Включение и отключение дополнений
Если в файле дополнения был упакован файл addoninfo.txt, то дополнение можно отключить в "Главное Меню>Дополнительно>Дополнения". Он будет отображаться в списке дополнений с тем именем, которое было указано в файле addoninfo.txt.

Дополнения также можно отключить изменив записи в файле left4dead/addonlist.txt. В файле addonlist.txt записаны названия файлов дополнений в папке left4dead/addons (даже тех, у которых нет addoninfo.txt), а после них стоит "0", либо "1". Если после имени файла вписать "1", то дополнение будет загружаться при запуске игры, но если вписать "0", тогда игра будет игнорировать дополнение:
"AddonList" { "trainingmap.vpk" "0" // дополнение с нестандартными меню "bms_addon_finale.vpk" "1" "minimal hud by virus.vpk" "1" "mymenu.vpk" "1" // дополнение с нестандартными меню "OMEGA Custom Files.vpk" "1" }

(i) Загрузка дополнений происходит при запуске игры. После включения/отключения дополнений в меню игры или в файле addonlist.txt, перезапустите игру, если она запущена, для того чтобы произошли изменения.
2 Comments
Skelmer Apr 16 @ 12:27pm 
Флаг "Zombie" не рабочий. Нужно использовать "Infected"
tttttteto Jun 4, 2024 @ 11:30am 
ебать