Разблокирование главы вашего мода
Contents
Подход от Valve
Такой подход показывает лучший способ обновления главы вашего мода.
Переименование
Ваши карты должны быть в хронологическом порядке, чтобы вы и движок могли понять что за чем идет.
Обратите внимание, карты в Half-Life 2's названы в соответствии с этой схемой: "d#_areaname_##" где
- "#" название для "дня" внутри игры, так 1 для начала, 2 для середины, и 3 для конца игры
- "##" название части "сегмента" карты
Пример: d1_trainstation_01
Однако, в Half-Life 1's можно сделать разблокирование главы намного легче: "c#a$" где
- # номер главы
- $ Область главы, подчасть карты в общем.
Пример: c1a4 c4a1b
Обновление
In gameinterface.cpp
, modify void UpdateChapterRestrictions( const char* mapname )
and the array static TITLECOMMENT gTitleComments[]
to conform to your maps' naming format.
Each TITLECOMMENT in gTitleComments contains a char* pBSPName
(the map name or part of a map name) and a char* pTitleName
(the chapter that map or set of maps is part of). If you want the map e2m4 to be part of Chapter 2 of the mod Doom, add {"e2m4", "#Doom_Chapter2_Title"}
to the array (with a trailing comma if it's not last, of course). Replace "e2m4" with simply "e2" and all maps starting with "e2" will be part of Chapter 2.
Note the comment right above gTitleComments, which reads "This list gets searched for the first partial match, so some are out of order". Meaning, if e2m9 is part of Chapter 3 and the rest of the "e2" maps are in Chapter 2, then {"e2m9", "#Doom_Chapter3_Title"}
must come before {"e2", "#Doom_Chapter2_Title"}
in the array.
Необходимые исправления
UpdateChapterRestrictions has an inherent flaw which only comes to light when Steam runs a Source mod. Steam puts the mod's entire path in the command line; the mod MyMod might be run with hl2.exe -game "C:\Steam\SteamApps\SourceMods\MyMod"
.
But UpdateChapterRestrictions assumes "-game" to be just "mymod"(Mod name in lowercase), so char chapterNumberPrefix[64]
ends up as #C:\Steam\SteamApps\SourceMods\MyMod_chapter
, rather than #mymod_chapter
as it should be.
You can solve this problem in one of two ways. The first and easiest is to dispense with the "-game" parameter and simply hardcode "#mymod_chapter" as the chapterNumberPrefix. The second, which may be copied and pasted across mods, is to lop off the parent folders one by one, perhaps with strtok, until only the mod folder is left.
Более простой способ
Это обучение покажет как разблокировать карты используя триггеры в вашей карте. Если вы не знакомы с добавлением глав ваш мод, почитайте обзор Adding chapters to your mod , а после уже принимайтесь читать дальше.
Создание trigger_once браша
Создайте браш trigger_once на вашей второй карте. Он будет использоваться как триггер для разблокирования следующей главы в вашем моде. К примеру вы прошли карту1, и появились на карте 2, сработал триггер и глава связанная с картой 2 разблокировалась, и так далее до самых титров :) Проверьте, что ваш браш trigger_once называется примерно так Trigger001_UnlockChapter2.
Создание логической связи
Создайте енети logic_relay . Назовите ее Logic001_UnlockChapter2. Выставите параметр Start Disabled в положение Yes.
Теперь создайте енети point_clientcommand , и назовите его UnlockChapter2.
Добавление outputs для logic_relay
Откройте окно настроек созданного ранее logic_relay (двойной клик по нему), и выберете - Outputs. Теперь добавьте два Outputs используя кнопку "Add":
My Output | Target Entity | Target Input | Parameter | Delay | Only Once |
---|---|---|---|---|---|
OnTrigger | UnlockChapter2 | Command | incrementvar sv_unlockedchapters 2 100 -1 | 0.01 | Yes |
OnTrigger | UnlockChapter2 | Command | incrementvar sv_unlockedchapters 2 100 1 | 0.02 | Yes |
Цифра '2' после incrementvar sv_unlockedchapters
сделает главу доступной. Если в вашем моде больше 100 глав (что маловероятно), сделайте это число больше, чтобы охватить все главы (Число 100 в данном случае показывает общее количество глав в вашем моде, замените его на количество глав в вашем).
Как это работает
Команда incrementvar берет minValue, maxValue и дельту. Используя дельту 0
устанавливает sv_unlockedchapters в maxValue которых можно избежать уменьшая var, то увеличивая его, гарантируя что глава разблокирована, но не устанавливая его если значение больше чем нужно (видимо подразумевается загрузка сохранений их старых глав, в которых при срабатывании триггера без такой защиты главы бы обнулялись на момент где находиться игрок, ее зависимо что он прошел дальше).
Добавление outputs для trigger_once
Далее открываем окно настроек trigger_once , если помните вы назвали его как Trigger001_UnlockChapter2 (или как вы его там назвали), и выберите раздел Outputs. Сейчас добавьте Outputs используя кнопку "Add" и заполните все как на картинке...
Тестирование
Теперь сохраните, скомпилируйте и запустите карту. После загрузки мода пропишете в консоле showtriggers 1
. После этого запустите карту и пройдите через триггер trigger_once . Как только вы это сделайте выйдите в игровое меню (нажмите Esc) и выберите пункт New Game (Новая Игра). Вы должны увидеть что глава 2 разблокирована.
Выйдя из игры откройте файл cfg/config.cfg
который лежит в папке вашего мода и прокрутите его до самого низа. Вы увидите, что текст sv_unlockedchapters "1"
изменился на sv_unlockedchapters "2"
.
Всё готово. Теперь главы вашего мода разблокируются в порядке прохождения.