Warcraft 3 создание триггерных способностей

Обновлено: 07.07.2024

Панель управления, с вынесенными на неё основными клавишами. Для работы с триггерами используются только семь кнопок: Переменные (Cntr+B), Новая категория (Cntr+G), Новый триггер (Cntr+Е), Новый комментарий к триггеру (Cntr+M), Новое событие (Cntr+E), Новое условие (Cntr+D) и Новое действие (Cntr+R). Остальные являются общими и используется во всех окнах редактора

Список триггеров. Для удобства работы с ними можно создавать различные категории, в будущем, при компиляции кода они не будут учитываться и поэтому названия могут содержать в себе кириллицу, а вот названия триггеров не могут содержать в себе кириллических букв, а также не могут повторяться, даже находясь в различных категориях.

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

Окно кода триггера. Пожалуй, самая важная часть редактора триггеров. В ней Вы можете редактировать и создавать код карты. Подробнее о нем узнаем в следующей главе


  • События (Events)
  • Условия (Condition)
  • Действия (Actions)

  • “Map Initialization” (Срабатывает при загрузке карты)
  • “Periodic Event” (Срабатывает каждый раз, когда таймер будет равен нулю)
  • “Time Elapsed” (Срабатывает один раз, когда таймер будет равен нулю)
  • “Generic Unit Event” (Срабатывает при выполнении юнитом какого-либо действия)

Условия.Следующим этапом будет заполнение пункта “Условия”. Это необходимо для сужения области применения триггера.
Например, вам необходимо отследить применение какого-либо заклинания, тогда нужно создать событие ( щелкнув для этого правой кнопкой мыши и выбрав пункт “Новое событие(New Event)”) “Generic Unit Event”, выбрав там пункт “Начинает Применять Способность”. Далее нужно создать новое условие (аналогично созданию события) и выбрать там пункт “Ability Comparison”, после чего триггер примет примерно такой вид :


Действия. Это является самой главной частью любого кода. Благо действий в редакторе карт достаточно чтобы превратить Warcraft в нечто новое и (надеюсь) оригинальное. А вообще создание действий аналогично созданию событий и условий. Триггеры являются своеобразным “конструктором” в который нужно просто подставлять нужные вам условия, действия и т.д.

Каждый триггер имеет 2 состояния: включён и выключен соответственно. Чтобы выключить триггер необходимо нажать правой кнопкой мыши и выбрать пункт “Изначально включён”. Для работы с триггерами используется вкладка “Триггер” при выборе действия. Включение и выключение триггеров даёт массу особенностей. Например, если вам нужно при нахождении определённого артефакта у юнита, давать ему золото, то легче отследить нахождение у юнита этого артефакта и включить триггер, дающий золото определённому игроку. Также это можно реализовать и просто одним включенным триггером, проверяя при каждом исполнение значение переменной, означающей находится ли артефакт у юнита (Например, переменная типа “Логическая (Boolean)”) и делать тоже самое, но вместо включения триггера поставить действие, которое изменит значение переменной на противоположное

Для улучшения работы с кодом можно использовать переменные. Они значительно упрощают работу с кодом и могут помочь при оптимизации. Все переменные делятся на Локальные и Глобальные. Сначала мы остановимся на изучении Глобальных переменных, т.к. Локальные переменные редко используются триггерами, но тем не менее являются важной частью изучения. Для создания глобальных переменных необходимо нажать, находясь в редакторе триггеров, сочетание клавиш “Ctrl + B”. Переменные имеют множество типов, можно создать переменные со значением юнитов, чисел, спецэффектов и т.д. Чтобы изменить значения переменной, необходимо создать действие “Set Variable”, выбрать в настройках переменную и значение. Использование переменных может значительно улучшить быстродействие игры. Например, можно занести в переменную позицию того или иного юнита и больше не использовать функцию определения положения вообще. Также переменные можно использовать как средство обмена информации между другими триггерами проекта.
Ну а теперь мы перейдём к локальным переменным. Эти переменные создаются и используются в пределах 1 функции. Они являются “универсальным” средством создания чего-либо. Локальные переменные редко применяются в триггерах, а в Jass’е просто незаменимы. Все же средствами триггеров можно использовать и их, но это практически нигде не применяется, а используют сразу Jass. Это своеобразное использование жасса прямо в триггерах. Для этого существует действие “Custom Script” . Вообще действие “Custom Script” используется для вызова функций из особого Custom Script’а карты, написанного кстати на Jass’е и интерпритируется как обычный Jass код, чтобы отредактировать или просто посмотреть его необходимо нажать на пункте, имеющим название вашей карты в списке всех триггеров (Подробнее можно узнать о Custom Script’е при изучении самого жасса, но это не имеет никакого отношения к данному пособию).
Очень важным аспектом в изучении переменных являются массивы. Массив по сути это переменные с множеством значений. Например, чтобы записать всех юнитов на карте достаточно лишь 1 массива. Значения массивов меняются так “<Имя переменной массива>[номер элемента] = значение переменной” и считываются аналогичным способом.

Очень важным элементом в создании карт являются условия и циклы. Сначала поговорим об условиях. Чтобы объявить новое условие необходимо создать действие “If /Then/Else”. Данное действие состоит из 3 частей. Первая часть это условие, вторая часть это действие, если условие вернёт истину, то оно будет выполняться, а третья часть это действия, но только те, которые будут выполняться, если вернётся лож. Теперь попытаюсь объяснить это всё на примере:


Теперь при исполнении данного условия будет меняться значение переменной, если она была равна нулю, то станет равна единице и наоборот, если она была равна единице, то станет равна нулю.

Следующим шагом будет изучение циклов. Они также являются практически неотемлемой частью любого кода. Если в вашей карте не будут использованы условия и циклы, то скорее всего ваша карта даже не доживёт до релиза и если честно я не встречал ни одной хорошей карты, в которой бы не было циклов или условий. И так начнём. Циклы используются в картостроении для выполнения однотипных действий. Примером может служить изменение переменных массива. Циклами являются все действия начинающиеся на “For Each…”, всего их 6 и каждая имеет свой синтаксис написания. В принципе они все похожи и разбирать каждую в отдельность нет смысла, поэтому мы остановимся на самой первой “ For Each Integer A, Do Multiple Action”. Удобство работы с этой функцией заключается в том, что можно менять не весь код функции сразу, как в “ For Each Integer A, Do Action ”, а по отдельности каждую строку. Число, равное количеству раз выполнения цикла, является переменная типа “Integer (Целочисленная)”. Чтобы получить её значение необходимо использовать вместо переменной функцию “For Loop Integer A”. Для примера используем вот такой код:


Данный пример очищает переменные “Hero[1]”, “Hero[2]” , “Hero[3]”, … , “Hero[12]” от всех записанных в них значений. Также есть ещё одна интересная функция, функция “ For Each Integer Variable, Do Multiple Action”. Она нужна для замены переменной “A” на любую вашу переменную типа “Integer (Целочисленная)”. Синтаксис этой функции отличается от ранее рассмотренной и поэтому я приведу пример кода

Я думаю все нашли отличия этих функций, но если перевести эти функции в Jass, то вы не найдёте никаких отличий за исключением названий переменных. Для первого примера создается локальная переменная с названием “bj_forLoopAIndex”, а во втором примере вместо этой переменной просто используется ваша. А вообще все эти шесть функций в текстовом виде выглядят одинаково и созданы в триггерном виде лишь для упрощения работы с циклами. Глава 5. Различные секреты и примеры их исполнения

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

Убираем у него тень и вместо всех возможностей ставим одну – Москиты (воин). Так же, убираем потребление пищи (просто ставя в строку «Требуется пищи» - 0). Если вы создали дамми со стандартного «Работника» или «Раба», то нужно еще убрать классификацию войск – «Работник». Дамми юнит готов к работе. Теперь создаем пассивную способность (пустышку) с стандартной «Сильный удар», убираем в ней «Шанс на сильный удар» - ставим 0. Заполняем описание как вам нужно и ставим необходимую пиктограмму. Далее создаем активную способность с стандартной Полиморф. Делаем ей 3 уровня. Копируем все характеристики первого уровня на второй и третий, после чего удаляем требования «Технологии-Требования» и «Технологии-Требования: уровни». Не забываем убрать затрачиваемую манну, тоже нужно поставить 0, так как дамми юнит не имеет манны. Теперь главное – ставим длительность воздействия на героя (по уровням) – 3/4/5 секунды, аналогично и с длительностью воздействия на воина.
Так, основу для способности мы уже сделали. Добавляем нашему героя пустышку созданную вами и переходим к триггерам.
Создаем триггер:

  • она подойдет для мультиплеера, так как нет, не одной переменной;
  • ее можно переделать почти подо, что угодно;
  • она, ну очень, проста в создании
  • она будет работать и на тех врагов, которых еще не атаковали, а только замахиваться;
  • есть способы сделать все проще, чем так

Проверяем, если вы все сделали правильно, то все должно безупречно работать если же нет, то качаем карту пример

Все знают что варовские заклинания всем надоели. Хотите как-нибудь украсить свой спел, но не знаете как. Да и вообще хотите узнать как сделать триггерное заклинание?
Вам сюда.
Пожалуй начну эту подстатью с объяснения, что такое триггерный спел, а позже подойдем и к примерам, так как они друг от друга неразрывны.

  1. Используемые мгновенно
  2. Указываемые на цель

В первом варианте нажал на кнопку и заклинание активировалось.
Во втором помимо нажатия на кнопку, надо указать на цель и только после этого заклинание активировалось.
Но все триггерные заклинания объединяет одно - это "Дамми Спелл" или "Пустышка". Спелл при использовании которого ничего не происходит, объяснять как делать "дамми" спелы не буду вы и так это знаете. Теперь перейдем к Теоритическим примерам.

И так мы захотели спел для этого посмотрим в триггеры, а точнее на события которые нам нужны Ведь без понимания что делают события мы не сможем сделать приличный спелл:

Это событие относится к заклинаниям 2го типа. Вы нажимаете спелл, и пока вы не укажите место применения заклинания триггер не сработает.

Это событие относится к заклинаниям 1го типа. Вы только нажали кнопку спелла, а триггер уже срабатывает.
Так же можно и отнести ко 2му типу, пока вы выбираете цель, триггер работает.

Принадлежит как к заклинаниям 1го типа так и 2го. Вы нажали на спелл и начали искать цель но не нашли и отменили. Или же вы уже используете спел по типа "Звездопад" и по какой-то вашей причине его отменили. В обоих случаях триггер срабатывает.

Это событие У заклинаний 1го типа. У заклинаний бывает указано "время подготовки" как тока подготовка закончится триггер сработает.
У заклинаний 2го типа. Указал на цель, триггер сработал.

Помимо выше перечисленных условий иногда будем использовать:

Это событие запускает триггер каждый раз через указанное нами время

Мы же не хотим чтобы триггер срабатывал при любом заклинании, для этого в условии надо указать:

  1. Действие вокруг чего-то
  2. Действие от чего-то до чего-то
  3. Действие на чем-то

Не забываем что, чтобы они были нужны уже переменные, а действия я покажу через триггеры эффектов.

Первое означает что при активации заклинания, все или часть действий будут вокруг юнита или точки. И выглядеть это будет примерно так:

Второе означает что между юнитом и юнитом, или точкой и точкой, или юнитом и точкой, будет какое-то действие. И выглядеть это будет примерно так:

И третье это просто действие на юните\точке, а вид у него таков:

Ну вроде основы я разъяснил, остальное это производные от выше написанного и почти всех триггеров содержащихся в "WE".

  1. Вызов
  2. Аура
  3. Мгновенное заклинание
  4. Направляемое
  5. Кастуемое определенное время
  6. Пассивка

Основные используемые объекты заклинаний:
"Дамми Спелл" - пустое заклинание при использовании которого ничего не происходит.

-+=Вызов=+-

Это заклинание при котором появляется миньон, один или боле, на время или постоянно. Так же надо пояснить что миньоны могут появляться как в заклинании "Джайны" "Дух Воды", то есть 1 миньон у нас есть и еще не исчез, а мы уже призвали второго. Для создания нам потребуется создать Миньона, "Дамми Спелл",

Дополнительно используемые объекты заклинаний "Вызов":
"Миньон" - юнит которого вы призываете себе на помощь.

Разделим его на 3 типа
а) Миньон не пропадает, но при повторном касте он заменяется
б) Миньон на время, но при повторном касте он заменяется
в) Миньон на время, но при повторном касте появляется второй миньон

а) Миньон не пропадает, но при повторном касте он заменяется

б) Миньон на время, но при повторном касте он заменяетcя

После некоторых экспериментов, это заклинание состоит из 1го тригера а не из 2х как раньше.

Все, теперь у нас при касте появляется юнит на 10 сек, по истечении которых он исчезает. И при повторном касте тоже исчезает но появляется другой.

в) Миньон на время, но при повторном касте появляется второй миньон

При первом касте появляется миньон на 5 сек. по истечении которых он исчезает. При повторном касте первый миньон не исчезает, но появляется второй миньон на 5 сек.

С аурой проще так как основная часть работы лежит в "РО". И как всегда НО, когда переходим на триггер тут уже все становится хоть и не неимоверно, но не менее сложно.

а) Аура Жизни

Аура действует на дружественных юнитов, повышает им максимальное значение ХП на 500 ед. и от владельца ауры к юнитам на которых она действует идет эффект. Сделал я ее на основе "Доспехи Веры". И еще одну способность на основе предмета увеличивающее жизни "Аура увеличения жизни".

Создаем 1 триггер который запишет юнита изучившего способность "Доспехи Веры" в переменную массив:

Первое готово теперь 2е. Это само действие триггерного заклинание при воздействии на юнита. На русский язык "способность подействовала на юнит - триггер сработал".

б) Аура Маны

И простенькая аура на увеличения маны на 250 ед. созданная на основе "Чародейская Аура". У Юнитов на которых она действует будет свой эффект. Дополнительное что мы создадим это "Аура увеличения маны"

Сделаем простое заклинание "Громовая Поступь" как у «Кэрна» но с другим эффектом:

Как видно необязательно делать урон и радиус урона триггерно, достаточно воспользоваться стандартными спеллами и всего лишь добавить другой эффект.

Изменим стандартный "Молот Бурь". Будет эффект от кастующего до атакованного юнита и вокруг атакованного юнита.

  1. придумать пассивку
  2. дамми спел
  3. спеллы из которых она будет состоять

в моем случае создадим пассивку при которой нам будет даваться вампиризм и + к атаке.



Возьмем за основу способность "Удар грома" или любую другую активную способность без указания цели, также следует знать, что на основе одного и того же заклинания не стоит делать все нестандартные способности, так как они имеют один и тот же ID приказа (в этом нам бы помогло заклинание "Канал",но о нем в следующей статье), назовем эту способность "Случайность".
Для проверки этого заклинания убираем у него затраты маны и перезарядку(ставим 0), еще можно убрать урон и длительность ,если надо конечно же.
Далее создадим способность на основе "Пронзающая смерть (враг)" , также убираем затраты и перезарядку, по желанию регулируем урон и длительность.
Еще создадим способность на основе "Полиморф (враг)" убираем затраты и перезарядку, а также в целях убираем "Враги", "Нейтральные" и "Не герои", регулируем длительность(если надо).
Теперь требуется создать героя и дать ему нашу способность "Случайность", также создать дамми-юнита, дадим ему нами созданные способности "Полиморф" и "Пронзающая смерть", уберем возможность атаки, а также уберем модель, для этого прописываем в поле "Графика- Файл модели" значение ".mdl" и не забываем убрать тень и потребление пищи.
Все на этом работа в РО закончена, переходим к следующей части.


Первым делом удаляем триггер с инициализацией ,он нам ни к чему.Создадим триггер и назовем его "Cast"
Событием ставим
"Боевая единица - Unit Приводит способность в действие"
это и будет приводить его в действие, он будет срабатывать каждый раз ,когда кто-то применит способность, а для того, чтобы он срабатывал только когда надо, Условием ставим
Ability being cast равно Случайность
В итоге получается такой триггер



В Действия первым делом нужно присвоить реальной переменной случайное значение, для того ,чтобы её создать нужно нажать кнопку в виде икса или нажать сочетание клавиш "Ctrl+B", нажмем на зеленый икс или на Ctrl+N, видим окно настройки переменной, дадим переменной название "RandomReal" и поставим тип "Реальная", также можно использовать тип "Целочисленная". Все! Переменная создана, теперь нужно присвоить ей значение, для этого добавляем действие, "Set Variable" Указываем туда нашу переменную и приравниваем ее к
Математика- Random Number- Random real number between 0.00 to 100.00




  • 1 это собственно количество создаваемых юнитов
  • 2 это тип юнита
  • 3 это игрок ,которому будут принадлежать юниты,
  • "Owner of (Triggering unit)" это функция ,которая возвращает значение того кому принадлежит юнит активировавший триггер
  • 4 это точка где будет создаваться юнит
  • "Position of Triggering unit" - точка позиции юнита включившего триггер
  • "offset by 100.00" это расстояние сдвига от "Position of Triggering unit"
  • "towards ((Real(Cycle))x60)degrees) " - это направление сдвига, оно будет зависеть от переменной Cycle
  • 5 это поворот создаваемого юнита



Приступаем ко второму эффекту, он намного проще и не требует циклов,
В Иначе Добавляем еще один
"If / Then / Else, Multiple Functions"
Если-УсловияRandomReal больше 50
RandomReal меньше или равно 90
При таких условиях будет 40% шанс превратится в овцу и 10% шанс на то, что ничего не произойдет
То-Действия
Боевая единица- Create 1 ДаммиЮнит for (Owner of (Triggering unit)) at (Position of (Triggering unit )) facing Стандартная ориентация зданий degrees
Боевая единица - Issue order targeting a point - Order (Last created unit) to Волшебница(Альянс)-Полиморф (Triggering unit)

Вот и все первый триггер завершен, хоть и не до конца.



Приступаем ко второму триггеру, ведь нужно же убрать дамми-юнитов для этого пишем такой триггер

Читайте также: