Territorial Control
This gametype is included in A Boojum Snark's Team Fortress 2 Gametype Library
The complete entity setup for this gametype is included in "A Boojum Snark's Team Fortress 2 Gametype Library," a downloadable VMF that includes all official Team Fortress 2 gametypes. The entities can easily be transferred from the VMF to your own custom map without the hassle of having to build it yourself or debugging it.
"A Boojum Snark's Team Fortress 2 Gametype Library" can be downloaded here: TF2Maps.net
Карты TC, такие как Hydro, являются самыми сложными, что, вероятно, связано с тем, что их мало в обращении. Карты TC также являются одним из наиболее воспроизводимых типов карт из-за длительной кампании, состоящей из относительно коротких раундов и различной структуры маршрутов в каждой игре.
Главная ссылка в обучении на это была декомпилированной версией tc_hydro, полученной из TF2maps.net.
Выравнивание уровня
Отображение в общем случае выходит за рамки этого руководства. Предполагается, что вы уже знаете, как использовать Hammer, и у вас есть одна или две карты других типов под вашим поясом. Для новичков рекомендуется начинать с типа CTF (Capture-The-Flag), поскольку его проще всего настроить.
Для этого урока мы будем использовать действительно базовую карту с шестью комнатами и шестью комнатами для спавна, используя ту же схему, что и Hydro. Он будет иметь те же правила, что и Hydro:
- У каждой команды есть одна домашняя база, но они видны только тогда, когда противоборствующая команда находится на грани победы.
- Между основаниями находятся четыре другие зоны, каждая с одной контрольной точкой. Мы назовем их A, B, C и D.
- Каждая команда начинает владеть контрольными точками на своей домашней базе, плюс две в центральной области. Синим изначально принадлежат A и B, а красным изначально принадлежат C и D.
- Компьютер случайным образом выбирает две из четырех центральных точек, которые имеют разные команды владения, и начинает раунд между этими двумя точками. Во время этих раундов каждая команда должна защищать свою единственную точку, пытаясь захватить единственную точку другой команды.
- Когда одна команда управляет всеми четырьмя центральными точками, возникает другой тип раунда. В этом эндшпиле круглый тип, проигравшая команда должна защищать свою базу от команды-победителя. Эти раунды могут включать в себя либо контрольную точку А, либо синюю базу (если побеждает красный), либо D, и красное основание (если побеждает синий). Хотя в раунде эндшпильной игры есть два контрольных точки, точка победившей команды заблокирована и не может быть захвачена.
- Если защищающаяся команда в эндшпиле успешно защищает свою точку до истечения времени, они получают владение соседней точкой, и игра возвращается к нормальному типу раунда.
- Если атакующая команда захватывает базу защищающейся команды, они выигрывают игру.
В каждом из шести больших комнат будет одна контрольная точка. Шесть меньших пристроенных комнат будут содержать связанные комнаты появления. Левый и правый залы будут базовыми, и в четырех взаимосвязанных залах будет проходить каждый из шести возможных внутренних раундов.
Помните, только потому, что в центральной зоне есть четыре контрольных точки, это не значит, что там должно быть шесть возможных раундов (или десять на пять очков, пятнадцать на шесть и т. Д.). Как вы увидите позже, вы определяете, какие пары точек могут быть задействованы в раунде.
Контрольные точки
thumb Затем мы поместим базовые пластины для каждой контрольной точки и дадим каждому уникальное имя. Сделайте их как prop_dynamic entity с моделью cap_point_base.mdl, skin 0. В этом примере базовые шаблоны называются cp_baseplate_X, где X - один из BLUE, A, B, C, D или RED.
Затем на каждой опорной плите поместите объект team_control_point. Дайте каждому уникальное имя (cp_BLUE, cp_A, cp_B, cp_C, cp_D и cp_RED в этом случае) и присвойте каждому уникальный номер индекса. Эти индексы будут важны для создания обзора карты позже. В этом примере мы установим их как: cp_BLUE = 0, cp_A = 1, cp_B = 2, cp_C = 3, cp_D = 4 и cp_RED = 5. Возможно, вы также захотите установить для свойства «Print Name» что-то Информативный тоже - это отображается при захвате, как в "<PlayerName> captured <PrintName> Для команды 1!".
Для каждого из четырех внутренних объектов team_control_point добавьте два события вывода. В событии OnCapTeam1 установите оболочку соответствующей базовой плиты в 1, а когда происходит OnCapTeam2, установите скин на 2. Это просто изменит цвет света в центре базовой плиты, чтобы отобразить команду владельца.
Установите для владельца по умолчанию синий цвет для cp_BLUE, cp_A и cp_B, и красный для cp_C, cp_D и cp_RED. Вы также должны включить «Предупреждать о захвате» для всех из них, чтобы люди могли заметить, когда начинается шапка.
Теперь выберите инструменты текстуры / toolstrigger. Для каждой базовой плиты нарисуйте вокруг нее кисть с этой текстурой, а затем привяжите кисть к func_capturezone. Дайте каждому уникальное имя - например, cap_trigger_BLUE, cap_trigger_A и так далее. Это зоны, в которые игроки должны войти, чтобы захватить точку. НЕ выбирайте их все, а затем привязывайте к func_capturezone, потому что они сгруппируют их в одну единицу; Мы хотим отдельный объект для каждой точки захвата. Задайте соответствующую контрольную точку для каждого из них внутри имени объекта team_control_point.
Спавн комната
Так как карта, представленная здесь, является только примером. Каждая из них - просто кисть func_respawnroom с текстурой dev / nodraw, внутри которой находится инфопанель info_player_teams. Обычно у вас должно быть 12-16 точек появления внутри, все с теми же свойствами.
Вам не нужно указывать какие-либо из них, кроме как для других целей. Все, что вам нужно сделать, - это открыть свойства для каждого из объектов info_player_teamspawn и установить ассоциированную с ним контрольную точку в имя team_control_point, к которой вы хотите принадлежать в этой комнате появления. Игра автоматически назначит эту комнату для возрождения команде, которой принадлежит эта точка в начале раунда, в котором участвует эта точка.
При тестировании вашей карты на консоли могут появиться предупреждения о том, что некоторые из ваших комнат появления не могут найти точки появления внутри себя.
Entities
Это то, что полностью зависит от вас, но вы можете иметь сущность в любом месте на карте, которую вы хотите, и все, что действительно облегчает работу.
Заметки
Добавьте entity_control_point_master и назовите его cp_master. Вам не нужно изменять какие-либо значения на этом; Он просто существует, чтобы вызвать внезапную смерть, когда время истекает.
Таймеры и особые условия выигрыша
Нам нужен круглый таймер, чтобы они не могли продолжаться вечно. И из-за особых правил в отношении раундов защиты базы, мы хотим, чтобы для них были специальные таймеры, а также специальные правила для выигрыша раундов. Поэтому создайте три объекта team_round_timer и назовите их timer_main, timer_AtoBLUE и timer_DtoRED. Эти два последних будут особенными. Обратите внимание на мое соглашение об именах, что все, что связано с кругом, содержит шаблон FOOtoBAR, где FOO и BAR - это две контрольные точки, участвующие в раунде. Hydro использует аналогичное соглашение.
Для специальных правил выигрыша раундов защиты создайте два объекта game_round_win и назовите их winner_blue и winner_red. Для winner_blue установите Team в Blue, а с другой - для команды Red. Для обоих установите для параметра «Сброс принудительной карты» значение Нет, потому что мы хотим относиться к нему так, как если бы команда, которая была в обороне, теперь отбивается и должна вернуть себе среднюю позицию.
Для timer_main установите длину таймера 480 секунд (это только длина внутренних раундов от Hydro). Добавить одно событие: OnFinished cp_master.SetWinner (0). Это приводит к внезапной смерти, когда время заканчивается.
Для timer_AtoBLUE установите длину таймера (здесь Hydro использует 300, раунды защиты короче, чем обычные). Добавьте два события вывода: OnFinished winner_blue.RoundWin и OnFinished cp_A.SetOwner (3). Первый запустит синий, чтобы выиграть раунд защиты синей базы, когда таймер закончится, а второй даст синее право владения контрольной точкой А, чтобы они снова закрепились в средней точке. Аналогичным образом настройте timer_DtoRED, а вместо этого события перейдут к winner_red и cp_D.
Обратите внимание, что вы можете вырезать и вставлять события в Hammer, но будьте осторожны при этом - иногда, когда вы вставляете события, а затем меняете их цели, изменения не вступают в силу. После настройки объекта рекомендуется щелкнуть, а затем вернуться, чтобы проверить, что события и свойства настроены так, как вы планировали.
Круглые элементы управления
Это берет на себя все, кроме круглого контроля. Теперь для каждого раунда добавьте один объект team_control_point_round и два объекта logic_relay. На скриншоте выше вы видите, что мы сгруппировали logic_relays под их соответствующим круговым контролем. Логические_релизы, возможно, не являются действительно необходимыми, но они помогают упростить вещи, инкапсулируя все события, связанные с началом или концом раунда, как вы увидите.
На этой карте, как и в гидротехнике, всего восемь круглых контролей. Шесть обычных раундов называются round_AtoB, round_AtoC, round_AtoD, round_BtoC, round_BtoD и round_CtoD. Как вы можете видеть, они представляют все возможные комбинации двух контрольных точек из четырех внутренних. Однако нет необходимости покрывать все возможные комбинации. Если вы не хотите создавать пути для всех из них, вы можете оставить их, пока есть возможный маршрут между красной и синей базой через все раунды.
Два других раунда - это специальные раунды защиты, называемые round_AtoBLUE и round_DtoRED. Мы обсудим, как они будут отличаться от обычных внутренних раундов позже.
Два объекта logic_relay, связанные с каждым именем раунда round_X_start и round_X_end, где X является AtoC, AtoBLUE и т. Д. Более подробно об этом позже, но они в основном просто пересылки событий, используемые для управления блокировщиками пути и знаками.
Давайте рассмотрим свойства для обычного раунда round_AtoB. Приоритет равен 20 - это произвольное число, большее нуля. Это контролирует случайный выбор раундов во внутренней области. Все шесть обычных раундов установлены на приоритет 20, что означает, что сервер может выбрать любой из шести, у которых есть хотя бы одна контрольная точка, принадлежащая каждой команде.
Затем, свойство «Контрольные точки в этом раунде». Для round_AtoB установите это значение в «cp_A cp_B» без кавычек. Также обратите внимание, что это пробел, разделяющий имена контрольных точек. Каждый из раундов имеет другую пару контрольных точек, и вы должны иметь возможность выяснить, как их настроить. Обратите внимание, что в раунде не должно быть двух контрольных точек - вы можете делать вариации этого типа карты с любым количеством контрольных точек за раунд. Условием выигрыша по умолчанию для раунда является то, что одна команда контролирует все задействованные точки, но вы также можете добавить другие условия победы. Это оставлено в качестве упражнения для читателя.
Теперь каждый нормальный раунд имеет шесть выходных событий. На самом деле он имеет больше, но, как упоминалось ранее, мы используем сущности logic_relay для упрощения вещей. Вот список событий для round_AtoB. Вы можете выяснить, как настроить их для остальных пяти обычных раундов; Cut'n'paste и внести соответствующие изменения (и перепроверьте свои изменения).
- OnEnd round_AtoB_end.Trigger
- OnStart round_AtoB_start.Trigger
- OnStart tf_gamerules.SetReadTeamGoalString("Захватите вражескую контрольную точку, защищая вашу!")
- OnStart tf_gamerules.SetBlueTeamGoalString("Захватите вражескую контрольную точку, защищая вашу!")
- OnWonByTeam1 timer_main.Pause
- OnWonByTeam2 timer_main.Pause
Первые два события поступают к экспедиторам, о чем будет рассказано ниже. Следующие два параметра задают сообщения, которые отображаются игрокам в начале раунда. К сожалению, в такой организации, как Hydro, вы не можете точно знать, какая команда начинает с какой контрольной точки (например, round_AtoB может начинаться с красного или синего цвета A), что означает, что вы не можете сделать сообщения специфичными для элемента управления точки. Последние два события просто останавливают таймер обратного отсчета, когда раунд выигран, чтобы предотвратить случайное срабатывание патовой ситуации или внезапной смерти. Круглосуточная настройка и удаление
Теперь поговорим о двух объектах logic_relay, связанных с этим раундом. Как упоминалось ранее, они существуют только для пересылки событий и упрощения списка событий самого круглого объекта. Round_AtoB_start отвечает за настройку всех сущностей, дверей, блокаторов, знаков и так далее для round_AtoB. Это означает перекрытие путей к другим контрольным точкам или их отключение, чтобы они не мешали, устанавливая знаки, указывающие игроков на контрольные точки, изменяя цвета других знаков, чтобы отразить право собственности, и так далее. Другой логический_релей, round_AtoB_end, отменяет некоторые из этих изменений, когда раунд заканчивается. Ему не нужно отменить все из них; Просто то, что в противном случае пришлось бы позаботиться о многократных путях _start реле других раундов; Используйте свое суждение, чтобы свести к минимуму повторение событий.
Ниже приведены выходные события round_AtoB_start. Все они активируются OnTrigger, поэтому мы опустим эту часть.
- timer_main.SetTime(480) - Сбрасывает таймер для этого раунда.
- timer_AtoBLUE.ShowInHUD(0) - Контролирует, какие таймеры видят игроки.
- timer_DtoRED.ShowInHUD(0) - Контролирует, какие таймеры видят игроки.
- timer_main.ShowInHUD(1) - Контролирует, какие таймеры видят игроки.
- timer_main.Resume - Начинает таймер для этого раунда.
- brush_AtoB_disable.Disable - Удаляет препятствия, которые препятствовали бы этому раунду.
- brush_AtoB_enable.Enable - Добавляет препятствия, которые мешают игрокам ходить в районы, не имеющие отношения к этому раунду.
События таймера должны быть довольно очевидными. Бизнес ShowInHUD необходим только для этой карты, потому что у нас есть более одного таймера, поэтому каждый раунд должен убедиться, что отображается правильный таймер, а другие таймеры не отображаются.
Последние два события, ссылающиеся на объекты кистей, которые еще не были описаны, заслуживают большего объяснения. Это шаблон, скопированный с Hydro. Если вы хотите заблокировать прихожую, чтобы отключить доступ к другим областям во время этого раунда, создайте кисть, которая блокирует коридор, привяжите его (CTRL-t) к func_brush и дайте ему имя brush_AtoB_enable. Вы можете указать любое количество кистей с тем же именем. В имени нет ничего волшебного; Это просто так, чтобы этот логический_релей смог отправить все эти кисти в событие Включить, что заставляет их появляться. Аналогично, другое событие приводит к исчезновению всех кистей с именем brush_AtoB_disable. И, как и следовало ожидать, обходное реле делает противоположное. Вот выходные события OnTrigger round_AtoB_end:
- brush_AtoB_enable.Disable
- brush_AtoB_disable.Enable
Вы можете настроить подобные события с этих реле, чтобы включать и отключать реквизиты и знаки, изменять обложки на знаках и так далее. Мы не будем подробно описывать, как поместить все эти блокирующие кисти в карту примера; Вы можете увидеть это сами, и есть много разных возможных мест для их размещения в любом случае.
Одно замечание по поводу всех этих функций включает и отключает кисти: вы не можете дать func_brush более одного имени. Это означает, что если несколько раундов хотят контролировать, открыт ли данный путь, вам либо нужно иметь несколько кистей, которые могут блокировать этот путь (по одному для каждого заинтересованного раунда), либо дать блочной кисти для этого коридора специальное имя и добавить дополнительные Включить / отключить события для заинтересованных раундов. Существует прямая компромисс между разрастанием событий и распространением кистей. Для примера карты, мы сохраняем количество событий до минимума, и кисти расширяются, что, по-видимому, является выбором, сделанным в Hydro.
Оборонительные туры
Мы почти закончили! После того, как вы обобщили все вышеизложенное, чтобы настроить все ваши обычные раунды, осталось только настроить два специальных раунда защиты round_AtoBLUE и round_DtoRED. Опишем только, как они отличаются от внутренних раундов.
Во-первых, оба раунда защиты имеют более низкий приоритет: 10. Это гарантирует, что они не произойдут, пока одна команда не будет владеть всеми внутренними контрольными точками. Если round_AtoBLUE имеет приоритет 20 (то же, что и шесть внутренних раундов), тогда этот раунд может произойти, как только красный получит контроль над A. Мы не хотим, чтобы это произошло, следовательно, более низкий приоритет. Нет приоритета - 10 раундов могут быть сыграны до тех пор, пока все контрольные точки, на которые ссылается приоритет-20 раундов, не будут принадлежать одной команде.
Во-вторых, эти раунды ссылаются на специальные таймеры. Вместо вызова Pause, Resume и SetTime on timer_main, round_AtoBLUE и его реле вызывается timer_AtoBLUE и аналогично round_DtoRED использует timer_DtoRED. Конечно, аргументы ShowInHUD также различаются, поэтому вместо основного отображается соответствующий специальный таймер. Вы можете понять это достаточно легко.
В-третьих, цепочки целей также различны. Для раунда AtoBLUE установите строку цели синего: «Защищайте свою базу от врага!» И красным - «Захватить синюю базу!», И переключить эти два вокруг для раунда DtoRED.
В-четвертых, логические_релейности для AtoBLUE и DtoRED имеют некоторые дополнительные события для реализации специальных правил контрольной точки для этих раундов. Специальные правила заключаются в том, что, хотя в игре задействованы два контрольных точки, и каждая команда начинает владеть одним из них (как в обычных раундах), точка, принадлежащая команде в нападении, блокируется. Таким образом, команде, совершившей преступление, не нужно защищаться, и команде по защите нужно защищаться; Если они успешно защищаются до истечения времени, они автоматически получают контроль над заблокированной точкой контроля. Если команда в нападении захватывает разблокированный контрольный пункт, они выигрывают игру, но эта часть является автоматической, так как это означает, что команде принадлежат все контрольные точки на карте.
Вот дополнительные события для реле round_AtoBLUE_start:
- OnTrigger cap_trigger_A.Disable -Предотвращает захват A путем отключения кисти зоны триггера.
- OnTrigger cap_trigger_A.SetTeamCanCap(3 0) - Отмечает A как заблокированную. Заметьте, что это «3 0», а не 30.
И наоборот дополнительные события для round_AtoBLUE_end:
- cap_trigger_A.Enable -Восстанавливает кисть зоны триггера.
- cap_trigger_A.SetTeamCapCap(3 1) - Открывает контрольную точку A.
Обратите внимание, что владение контрольной точкой A присваивается синему круговым таймером, а не логической_релейной. Это потому, что logic_relay всегда запускается в конце раунда, независимо от того, кто выиграет, в то время как событие таймера происходит только в том случае, если побеждает защищающаяся команда.
Применение этой информации для настройки раунда DtoRED должно быть тривиальным. Одно отличие состоит в том, что аргументы «3 0» и «3 1» для SetTeamCanCap должны быть «2 0» и «2 1» вместо этого, так как номер команды Красных - 2 (3 для Синих соответственно; непонятно почему именно 2 и 3).
Готово!
Вот и все! Теперь у нас есть функциональная карта управления территорией, хотя для того, чтобы действительно завершить этот опыт (помимо отделки и т. Д.), Вы можете добавить обзорную карту - см. Соответствующий раздел ниже.
Создайте свою карту и протестируйте ее. Вы можете протестировать карту этого типа с одним игроком - просто выберите разведчика, чтобы ускорить захват, и попробуйте все возможные комбинации побед и поражений, переключая команды между некоторыми захватами.
Здесь есть одна интересная незначительная ошибка, которая также возникает в Hydro. Если команда успешно защищает свою базу и выигрывает право собственности на соседнюю точку, то в начале следующего раунда они все еще могут инициировать «захват» звуковых эффектов этого момента, даже если они уже владеют им. Игра вовсе не влияет на геймплей, но немного удивляет.
Пример карты будет приложен к этой статье ниже. Если у вас возникли проблемы с созданием собственной карты TC, обратитесь к ней для свойств сущности. Или, если вы только начинаете, используйте пример в качестве базы для вашей собственной карты.
Похожие типы карт
Создание линейной двунаправленной карты перетягивания каната на самом деле является упрощением случая ТС; Учитывая карту, которую мы разработали до сих пор, это всего лишь вопрос удаления кругов AC, AD и BD, увеличения приоритета раунда BC и замены некоторых динамических блокаторов статическими стенами. В результате получается линейная игра типа «вперед-назад», такая как комбинация «Зерно» и «Дустбол», при этом контрольные точки принимаются по паре за раунд. Другой пример карты с таким стилем игры будет приведен ниже.
Обзорная карта
Одна вещь, отсутствующая на карте, разработанной для этого учебника, - обзорное изображение, которое отображается между раундами в Hydro. В конце каждого раунда отображается верхняя диаграмма всей карты с текущим владением каждой из контрольных точек, а пара стрелок показывает, какие контрольные точки будут задействованы в следующем раунде. thumb
Если вы хотите выпустить свою карту ТС, вы можете составить себе карту общей формы вашего уровня в том же стиле мела, что и гидрокар. У вас могут возникнуть проблемы с регистрацией карты прямо на фоне доски, отображаемой в игре. Вам также нужно будет создать информацию, чтобы отобразить статусные отображения владения контрольной точкой и стрелки, показывающие, какой раунд будет воспроизводиться дальше.
Вот как работает регистрация изображения: синий прямоугольник - это контур текстуры 1024x1024. Внутри есть черные прямоугольники 800x600, 640x480 и 560x280, и красные квадраты 768x768, 512x512 и 256x256. Как вы можете видеть, обзор вашей карты должен занимать примерно 800x600 суб-область текстуры, плюс немного внизу, минус бит наверху, где отображается название, и немного в правом нижнем углу, где находится линейка является. Не означает создание текстуры 800x600, потому что это не будет работать на некоторых видеокартах. Сохраняйте квадрат (предпочтительно 1024x1024), но делайте большую часть прозрачной, за исключением этой пропорциональной области. Вы можете найти инструкции по преобразованию вашего .tga-файла в .vtf и созданию сопровождающего .vmt в статье Material Creation .
Теперь, чтобы сообщить игре, где находятся ваши контрольные точки, создайте файл <mapname> .res в ресурсе / roundinfo (создайте каталог, если он не существует) и заполните его так:
"roundinfo/tc_template1_hydro_basics.res" { "cp_BLUE" { "x" "143" "y" "211" } "cp_A" { "x" "259" "y" "211" } "cp_B" { "x" "259" "y" "140" } "cp_C" { "x" "373" "y" "211" } "cp_D" { "x" "373" "y" "140" } "cp_RED" { "x" "488" "y" "140" } }
Чтобы определить координаты для ввода, сделайте копию файла .tga в своем любимом редакторе изображений и масштабируйте его до 560x280. Я не знаю, почему этот размер, но это то, что указано в файле hydro.res. Затем найдите координаты в масштабированном изображении каждой из ваших контрольных точек и подключите их к файлу .res. Вы должны перечислить контрольные точки в .res-файле, используя те же имена, которые вы дали им в редакторе, и они должны быть перечислены в порядке возрастания индекса - так что cp_BLUE является первым в моем примере, потому что он имеет индекс 0, а cp_RED является последним Потому что он имеет самый высокий показатель, 5.
Вам не нужно указывать координаты для круглых стрелок; Игра может определить их из координат контрольной точки.
Наконец, вы захотите расслоить все это в форме, подлежащей распределению. Файлы-примеры - это просто потерянные файлы в zip-архиве, но лучше всего свернуть все в один файл .bsp, используя программу типа bspzip или pakrat.