Как работать с триггерами в варкрафт 3

Обновлено: 05.07.2024

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

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

Примечание: на мой взгляд, осваивать триггеры нужно поэтапно. Первый этап – для новичка разобраться сто же такое триггеры и как их создавать. Второй этап – освоить основные триггерные команды, попрактиковаться и поэкспериментировать с их применением. Третий этап – освоить редактор, на уровне языка программирования, научиться ставить задачи и находить их решения. В освоении первого и третьего этапа вам помогут первая и вторая части этой статьи соответственно. Но не забывайте, что между ними пропущен еще один этап – ваша самостоятельная работа.

Триггерные Заклинания

Зачем это все надо

В "движок" Варкрафта входят разные стандартные спеллы. А в редакторе объектов можно изменять параметры их. Но принципиально их таким образом не изменить. Если нам нужно создать какой-то полностью новый спелл, то нам приходят на помощь триггеры или JASS.

Примечание: про триггеры вы можете почитать в статьях Сергея и RaZ'а,а про язык JASS - в статьях Cacodemon'a
Данное руководство будет разделено на две части для удобства прочтения и написания. Итак:

Часть 1. Основы Основ.

В любом деле есть что-то что обязательно знать тому, кто этим занимается. Это правило действует и на триггерные спеллы.
Сейчас мы будем говорить про триггеры, а точнее, про:
События(Events)
В триггерных спеллах будут чаще всего использоваться так называемые
Unit - Generic Unit Events
Эти события относятся ко всем юнитам которые подходят под условие события (говорю слегка путано, но сейчас вы поймете, что я имел в виду).
Самые важные из них для нас это:

У них достаточно сходное действие, но автор предпочитает именно
Unit - A unit Begins casting an ability
Это событие запускает триггер, когда вы выбрали заклинание и цель (если нужно). Пока вы только начинаете заниматься триггерными спеллами, советую вам тоже им пользоваться.
ОК, теперь перейдем к следующей секции.

Условия(Conditions)
Здесь будет совсем просто, обычно следует пользоваться только этими условиями:

Теперь поясню значения выделенных слов:
Unit - как правило либо Casting Unit (Маг) либо Target of Ability being Cast (Жертва заклинания)
Unit-Type - если вы хотите сделать заклинание, которое может сделать не один юнит,а много однотипных юнитов (например, вы хотите создать новую расу магов), то вместо Unit-Type вставляйте тип требуемого юнита
Ability - тип заклинания, может быть как выбран в списке, так и задан переменной

Действия(Actions)
Примечание: Автор много расписывал, что делают те или иные действия, но я не буду повторять статьи о триггерах (см. выше) и буду такие моменты пропускать

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

Мы подошли к следующему подразделу:
Переменные + Mассивы
Примечание: я решил слегка видоизменить пример (для наглядности), кроме того, сам пример можно найти ниже
Итак, что мы собираемся сделать:
При колдовании заклинания создать пять пехотинцев, занести их в массив, а затем 3 из 5 убить :).
Это простейший пример того, для чего нужны массивы и переменные.
Заготовка для такого триггера должна быть примерно такой:

Что тут делается, думаю, объяснять не нужно. Теперь еще немного подготовительной работы. Создадим массив из unit'ов размером в 5 человек, назовем его George. Хорошо. Для начала этих пресловутых пехотинцев надо создать. Кроме того, их сразу же нужно заносить в массив, пока ссылка на Last Created Unit указывает на действительно требуемый юнит. То есть, мы это будем делать примерно так:

Теперь, хотите - верьте, хотите - нет, у нас в массиве "лежат" те пехотинцы, которых мы создали. Теперь давайте,чтобы удостовериться в этом убьем их, причем не с 1 по 3,а с 3 по 5:

Заметьте, если делать то же самое, но не циклом, то получится 10 действий, а тут 2 действия,но повторенные 5 раз. Удобно, не правда ли? :)
Если вам пока трудно освоиться, то для вас чуть ниже лежит архив с картой-примером. Наслаждайтесь и ждите 2-й части! :)

Триггерные заклинания. Advanced

Dummy Спеллы

Что же такое Dummy спеллы? По-русски - это пустышки, то есть спеллы, которые не имеют эффекта. :)
Существуют следующие типы заклинаний по целям:

  • Без цели (War Stomp,Thunder Clap. )
  • С одиночной целью (Storm Bolt,Frost Nova. )
  • AOE,то есть с некой площадью эффекта (Flame Strike, Silence. )
  • Авто-кастовые (Heal, Slow. )
  • С целью - землей (Shockwave, Blink. )

Чтобы создать пустышку, нужно взять спелл, подходящий по типу, т.к. его в редакторе объектов изменить будет нельзя, и обнулить большинство его хар-к (время действия [Внимание: любое время обнуляется числом 0.01,а не 0.00], урон, итд). Затем, после создания спелла, мы "навешиваем" на него триггер.
В событии следует взять:
Unit - A unit Begins casting an ability
а в условии:
(Ability being cast) Equal to Пустышка
Затем просто создаем необходимые действия.
Здесь статья заканчивается.

Мы же пойдем дальше, мы создадим геройский спелл, сила действия которого будет изменяться с каждым уровнем способности. Для отслеживания уровня способности героя мы будем использовать еще одну числовую переменную.
В качестве примера сложной триггерной способности я предлагаю сделанный мною когда-то Airstrike:
При кастовании способности появляется N вертолетов (N зависит от уровня способности),которые будут кружиться и бомбить землю под собой, а по истечении действия заклинания - взорвутся.
Детали я описывать не буду, но суть заключается в следующем:
Мы создаем вертолеты, задаем в массиве точек позиции круга, по которым они будут двигаться,зададим в массиве эти вертолеты,а затем в цикле будем заставлять их делать "Attack Ground" и "Move" (По кругу). Кроме того, чтобы знать, какой вертолет должен двигаться в какую позицию, мы им зададим Custom Value и вычислять номер точки в массиве, в которую надо двигаться.
Для начала попробуйте сделать данную способность сами, ну а уж затем смотрите пример.
ВНИМАНИЕ! В примере плохо настроены cooldown'ы.

Создание триггерных заклинаний на вероятность в Warcraft 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)

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



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

Как работать с триггерами в варкрафт 3

Григорий Кузнецов

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

Максим Облогин

Григорий, Мм..
Слишком много объяснять. Я могу разве что тезисно объяснить принципы триггеров:
Итак, суть триггера: на определенное СОБЫТИЕ (капсом буду определять понятия) производится отдельная реакция - ДЕЙСТВИЕ. При этом ДЕЙСТВИЕ может реагировать на СОБЫТИЕ при истинности определенных УСЛОВИЙ. Приведу элементарный бытовой пример. Скажем, реакция человека на прикосновение к горячему чайнику. Комментарии буду подставлять в квадратные скобки.
СОБЫТИЕ
- A unit(Человек)[Указываем на определенную персону] дотрагивается до Чайник [то есть происходит событие - прикосновение к чайнику]
УСЛОВИЕ
- Температура_Чайника больше 50°C [Температура_Чайника - переменная(таких бесчисленное множество: Х, Y, Z и т.д. Переменную можно назвать как угодно, и поместить в нее любое значение). Тут мы указали условие, то есть если Температура_Чайника меньше 50°C - то ДЕЙСТВИЯ, указанные внизу, работать не будут. УСЛОВИЕ каждый раз проходит проверку на истинность, когда происходит СОБЫТИЕ.]
ДЕЙСТВИЯ
- A unit(Человек) отдергивает руку [ну, тут все просто - указываем на персону и производим действие]

Именно по такому принципу работают все мыслимые системы триггеров и скриптов. Тебе остается лишь тренироваться, и дальше все поймешь сам) создавай триггеры, пробуй разные варианты(даже если на первый взгляд они кажутся нерабочими), юзай разные условия, события, действия.. Если что будет непонятно, всегда можно спросить)

Григорий Кузнецов

Максим, блин знаю я что такое триггеры. мне интересны сами структуры триггеров для конкретных действий.

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