WarCraft 3: пользовательские текстовые триггеры

[HR][/HR]
В этой статье я расскажу вам о текстовых триггерах, о том, что это такое и зачем они нужны.
Warcraft 3 был создан на специфическом языке программирования (скорее всего, C). Создатели игры решили создать редактор worldedit, чтобы облегчить себе и другим создание карт. Для начала они создали свой собственный мини-язык (текстовые триггеры), команды которого позволяли им управлять игрой. Однако такой язык был бы слишком сложен для тех, кто не занимается программированием, поэтому был создан редактор триггеров, который значительно упрощает работу. Вместо того чтобы набирать текстовые команды вручную, разработчик карты выбирает конкретную команду из списка и указывает определенные параметры (на самом деле эти триггеры — из редактора триггеров при сохранении карты автоматически переводятся на другой язык — пользовательский текст — это файлы с расширением .j и затем выполняется).
Итак, пользовательский текст близок к тому языку, на котором был написан warcraft3. Если бы Blizzard сделала хороший редактор триггеров — тогда работа с пользовательским текстом не имела бы смысла.

Однако не все команды из пользовательского текста доступны в редакторе триггеров. Пример: команда добавления таймера жизни блока. Не встречается среди обычных команд Trigger Editor. Есть и другие примеры таких команд.

Другой пример — отсутствие нормальных циклов и ветвлений в редакторе триггеров. Команды For и if then else позволяют выполнять только одно действие. А если действий много? (на самом деле здесь есть хитрость: указать в качестве действия — запустить определенный триггер, который будет реализовывать нужные нам команды).

Команда For настолько неудобна, что мало кто ее использует. Реализован только один вид цикла, причем не самый необходимый.
И, наконец, третий серьезный недостаток редактора триггеров — отсутствие локальных переменных.
Если вы хотите получить доступ к функциям, которые невозможны в Trigger Editor, вам придется научиться работать с пользовательским текстом. К счастью, в Trigger Editor у вас есть возможность превратить обычные триггеры в пользовательский текст (edit>>custom text). Вы можете узнать, как выглядят простые триггеры в пользовательском тексте, а затем изменить их.

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

Для новичков я хочу дать вам несколько советов по работе с текстовыми триггерами.

  1. Сначала напишите обычный триггер, затем переведите его в пользовательский текст и добавьте то, что вам нужно: циклы, новые команды, локальные переменные.
  2. Прежде чем переводить триггер в пользовательский текст — сделайте его копию.
  3. При переводе триггера в текст вы будете предупреждены, что действие необратимо. Ну, вы действительно не можете перевести текст в триггеры, но вы можете отменить сделанное действие с помощью edit>>undo или просто нажать ctrl-z.
  4. Набирайте как можно меньше текста, чтобы уменьшить вероятность ошибки. Допустим, вы уже создали тестовый триггер, что-то в нем изменили и хотите добавить какую-то стандартную команду. Создайте новый нетекстовый триггер, содержащий одну из этих команд, переведите ее в текст. Вы увидите, как выглядит правильная команда. Не вводите их вручную! Используйте буфер обмена: выберите команду, скопируйте edit>>copy (ctrl-ins), вставьте edit>>paste (shift-ins).
  5. Как проверить правильность триггера в тексте?. Вам не нужно запускать скрипт на выполнение каждый раз, когда вы его запускаете. Просто выделите текстовый триггер, сделайте его копию и измените для него свойство enabled. Триггер отключится. Если вы попытаетесь включить его, а в триггере возникнет ошибка, вы будете предупреждены списком ошибок.
  6. Лучше не пытаться перевести в текст триггеры со свойством enabled=off или initialy=off. По крайней мере, пока вы их не поймете. В противном случае вы создадите текстовый триггер, который не будет работать, даже если вы измените его свойства (enabled, initialy). Чтобы все заработало, вам придется удалить конкретную команду триггера.

Когда вы переходите от обычных триггеров к текстовым, меняются названия единиц, констант, переменных. Вместо конкретных юнитов будет какая-то ерунда типа ‘df5b’. Специальные эффекты будут менять свои имена: «abilitiesorc:» — это был какой-то спецэффект. Текст придется взять в кавычки и написать две строки вместо одной: «abilities\orc\:».

Редактор карт World Editor | Триггеры с нуля | Часть 2 — Переменные


Локальные переменные в пользовательском тексте

[HR][/HR]
Вы уже знаете, что такое глобальные переменные. Все переменные, которые вы создаете в редакторе триггеров, являются глобальными. На глобальные переменные можно ссылаться из всех триггеров. Глобальные переменные создаются в начале игры и действуют до конца игры.
Что касается локальных переменных, то это переменные, которые создаются внутри определенного триггера (даже не триггера, а его части). Они создаются при запуске триггера и прекращают свое существование по окончании действия триггера.
Если вы запускаете триггер на выполнение несколько раз, то при каждом запуске вы создаете свой собственный набор локальных переменных, которые никак не связаны с другими наборами.
Редактор триггеров не позволяет создавать локальные переменные, что очень жаль.

Читайте также:  Что можно подарить в варкрафте

Позвольте мне объяснить на примере.
Предположим, я хочу создать юнита, который стреляет огнем (огнемет). Предположим также, что я выбрал такой способ: когда я атакую огнемет, он создает специальный эффект огня на земле. Затем мы определяем, есть ли юниты в радиусе действия, и наносим урон.
Создать такой триггер не так уж сложно. (см. триггер из примера ниже). И все бы хорошо, но: Что если мы хотим сделать два юнита — огнеметчика? Создайте для него другой триггер, с новыми переменными: И если есть 10 или более огнеметчиков?? Если мы хотим иметь возможность производить этот блок в казарме, нам придется создать специальный эффект?
Хотелось бы свести все к одному триггеру, но мы не можем. Если в игре есть несколько огнеметов, и они атакуют одновременно, мы запишем сначала один спецэффект, а затем другой спецэффект в одни и те же переменные. Но поскольку спецэффект первого огнемета не успел исчезнуть, они останутся. Получится своего рода «вечный огонь». Более того, если наш огнемет атакует достаточно быстро, то старые спецэффекты не успеют исчезнуть до появления новых (огонь должен гореть пару секунд).
Эту проблему очень сложно (но возможно) решить с помощью обычных триггеров. Однако с локальными переменными эта проблема решается в мгновение ока.
Я не буду объяснять, как я научился делать эти вещи — это приходит с опытом, когда учишься программировать.

Нам нужно, чтобы любой огонь из огнемета в игре горел несколько секунд, а затем гас. Мы уже добились этого для одного огнемета с помощью стандартных триггеров и глобальных переменных.
Переведите наш триггер в пользовательский текст. Прежде всего, мы должны поместить каждый параметр, имеющий отношение к конкретному случаю использования огнеметной единицы, в локальные переменные типа unit.
Например — event response attacking unit и event response attacked unit. Если огнемет будет использоваться другим юнитом, то значения этих функций будут совершенно другими.
Затем переменные со спецэффектами. В каждом случае нам нужно создать свой собственный спецэффект с огнем, поэтому нам нужны некоторые локальные переменные типа спецэффекта.
и последний нужный нам параметр — угол между атакующим и атакованным юнитами — в локальную переменную вещественного типа.

Создайте локальные переменные с помощью этой команды:
локальный

local integer i — создаст переменную i целочисленного типа local real r — создаст переменную r вещественного типа local effect s — создаст переменную s вещественного типа local effect u — создаст переменную u единичного типа

Итак, мы создали переменные, а затем поместили в них необходимые данные:
Set = — помещает определенное значение в переменную. Вы можете использовать функции типа EventResponseAttacking unit.

Замените глобальные переменные и функции на локальные.переменные.
Давайте посмотрим, что у нас тут есть.

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

Статья скопирована с сайта:

Источник: yougame.biz

Как создавать триггеры в Warcraft

Повелитель вредоносных программ

Из-за большого количества вопросов, как писать триггеры или как сделать rpg, я решил написать эту статью.
Все играли в Warchasers? Наверное, многие после этого хотели сделать что-то похожее или более оригинальное, но не знали, как сделать стартовые 5 рабочих + главное здание, а чуть более продвинутые — как можно сделать выбор героя Все это делается с помощью триггеров, даже тех самых 5 кренделей с домиком.
Триггеры — это функции, написанные на Jass, языке, созданном Blizzard для удобства создания карт в редакторе World Editor. Я понимаю, что не все хотят учить целый язык для создания собственной карты, а если этот человек никогда не программировал, то это вдвойне проблематично.

Читайте также:  Какие герои есть в варкрафте

Чтобы продвинуть Warcraft в массы и придать ему большую живучесть со временем, Blizzard создала специальный конструктор триггеров. С его помощью написание триггера сводится к выделению мышкой соответствующих «кубиков», которые в Jass являются аналогами строк. Кроме того, «кубики» имеют более понятный вид, так как содержат большее количество взаимосвязанных слов, чем в оригинальном языке.

Другими словами, каждый «кубик» визуально представляет собой небольшое, хотя и криво звучащее, предложение. Суть каждого триггера — реагировать на какое-то общее событие, заданное для него (кто-то умер, кто-то атакован, кто-то вошел в регион, прошло определенное количество времени и т.д.).).д.). Триггер активируется событием или событиями, затем он проверяет условия и, если все в порядке, выполняет действие.
В начале было слово..
Редактор триггеров вызывается значком «a» на панели инструментов быстрого запуска. Если вы не нашли его, нажмите F4
Вы все еще здесь? Итак, давайте подробнее рассмотрим появившееся окно Он делится на три окна: слева — список всех триггеров на карте, справа вверху — комментарий к триггеру, выделенному в списке (или к карте, если она выделена вместо триггера), а справа внизу — редактирование самого триггера.

В окне списка все выглядит как дерево, как в проводнике Windows, начиная с самой карты и заканчивая папками, содержащими триггеры. Если вы нажмете на карту, вы можете написать пользовательский текстовый код в правом нижнем окне. По-русски это блок кода в Jass, который будет выполняться перед триггерами с условием инициализации карты.

На данный момент у нас есть папка Initialization и триггер инициализации Melee в ней. Мы не хуже и можем создавать собственные папки, триггеры и даже целые отдельные комментарии. Все это может быть полезно для более удобной группировки ваших триггеров. Все триггеры и отдельные комментарии могут быть созданы только в папках.

Невозможно создать папку, поэтому для того, чтобы разделить большое количество триггеров внутри одной папки, очень полезно использовать комментарии. Теперь вернемся к нашим баранам. Melee Initialization — триггер, инициализирующий игру в обычном режиме ближнего боя. Собственно, об этом написано в комментариях внутри. Сам триггер теперь выглядит следующим образом
Инициализация рукопашного боя
События
Инициализация карты
Условия
Действия
Игра в ближний бой — Используйте время суток для ближнего боя (для всех игроков)
Игра в ближнем бою — ограничить количество героев до 1 на каждый тип героя (для всех игроков)
Melee Game — Дать обученным героям свиток городского портала (для всех игроков)
Игра в ближнем бою — установить стартовые ресурсы (для всех игроков)
Игра в ближнем бою — Удалить крипов и тварей с используемых стартовых локаций (для всех игроков)
Игра в ближнем бою — создание стартовых юнитов (для всех игроков)
Игра в ближний бой — запуск скриптов ИИ ближнего боя (для компьютерных игроков)
Melee Game — Ввести условия победы/поражения (для всех игроков)
(Я не буду писать русскую версию — мне лень переводить и переписывать ее. Во что бы то ни стало, учите английский, в жизни пригодится )
На этом примере давайте рассмотрим структуру триггера.
События
Движение — жизнь
События, описанные выше, активируют триггер. В некоторых случаях можно обойтись и без него, но об этом я напишу позже. Каждое событие имеет комментарий, чтобы помочь разработчикам, поэтому я просто напишу об общих группах. Надеюсь, ни у кого не возникнет проблем с добавлением или изменением события (иначе вы на пути к чтению «Компьютер для чайников» ).
Опишу группы событий более подробно. Всего типов групп девять, и первые три также встречаются в условиях и действиях (у меня английская версия редактора, поэтому русские эквиваленты встречающихся в статье названий могут быть другими):
Все — Это не требует пояснений, здесь отображается весь список событий;
Поиск текста — поиск нужного события по его названию в списке;
Общие — здесь только инициализация карты. Это событие выполняется при загрузке карты.
Остальные шесть — это события, сгруппированные по каким-либо критериям
Destructible — это список событий, связанных с разрушаемыми объектами (деревьями, бочками, словом, всем тем, что находится в соответствующем меню палитры Doodads);
Dialog (диалоговое окно) — здесь только событие «нажата кнопка диалогового окна»;
Game — события, связанные с определенными нюансами игровой оболочки (реакция на время суток здесь);
Игрок — события, связанные с действиями игрока;
Время — события, связанные со временем;
Unit (единица) — события, касающиеся единиц (кто-то умер, кто-то вошел в регион, кто-то напал).
Вы можете создать сразу несколько событий, тогда триггер будет запускаться каждый раз, когда происходит любое из них.
Условия
Быть или не быть?
Иногда возникают ситуации, когда события необходимо каким-то образом ограничить. Например, нам нужно, чтобы все мертвые лакеи превратились в скелеты (пусть этот игрок получит скелеты). События не могут указывать тип юнита, поэтому нам нужно условие. Вот как это будет выглядеть (без спецэффектов):
пример
События
Единица — Единица Умирает
Условия
(Тип юнита (Умирающий юнит) Равен Лакею
Действия
Отряд — Создайте 1 скелета-воина для (Владелец (Убивающего отряда)) на (Позиция (Умирающего отряда)) лицом к (Лицо (Умирающего отряда)) градусов

Читайте также:  Warcraft 3 читы dota allstars

Поскольку нет события, связанного с типом блока, мы используем условие, может проверить его. Если умирающий юнит не является лакеем, то скелет не появится. Но используя такой триггер, игрок может убить своих пехотинцев и получить скелетов для себя Это можно исправить, добавив другое событие:
пример
События
Единица — Единица умирает
Условия
(Тип юнита (Умирающего юнита) равен Лакею
(Владелец (Убивающего юнита)) Не равно (Владелец (Умирающего юнита))
Действия
Отряд — Создайте 1 скелета-воина для (Владелец (Убивающий отряд)) на (Позиция (Умирающий отряд)) лицом к (Лицо (Умирающий отряд)) градусам
Теперь, убивая своих собственных футсменов (даже случайно, например, от уронных брызг из собственной мортиры людей или катапульты орков), игрок не получит бесплатного скелета (в случае случайного самоубийства скелета не будет вообще).
Все условия также сгруппированы, рассматривать каждую группу долго, так что разберетесь сами. Там нет ничего сложного, все расписано, нужно только немного изучить, какое условие что проверяет в самом редакторе.
В самом низу списка условий находятся AND и OR. Это чисто из программирования, создано, чтобы быть более конкретным, избежать лишних строк кода и не ломать голову над тем, как реализовать многоусловия. Короче говоря, AND — это объединение. Необходимо для унификации (круто, да?) из нескольких условий. Чтобы запустить триггер, все условия в AND должны выполняться одновременно.

Что касается OR, то для выполнения триггера достаточно, чтобы одно из связанных с ним условий было истинным. Есть еще AND и OR для множественных условий — на мой взгляд, это удобнее в любом случае. Вы узнаете, почему.
Вы, вероятно, задаетесь вопросом, почему я не использовал AND в своем примере. Ответ прост — в редакторе триггеров это не нужно. Все эти условия автоматически объединяются в невидимое AND, i.e. вы должны убедиться, что каждый из них выполнен. Поэтому использование AND практически никогда не требуется.
Действия Они убивают Кенни. (с)
Самой большой частью триггера является. Здесь расписаны все действия Их много Просто посмотрите на каждую группу, могу сказать одно — главное думать, что вам нужно, и как это сделать — смотрите в списке и комментариях к каждому действию.

Единственное, что стоит отметить, это то, что есть возможность включить триггеры, выключить их, принудительно запустить (группа Триггеры или Триггеры). То есть, вы можете принудительно вызвать триггер, даже если у него нет событий или вы просто хотите их проигнорировать. У вас хватило терпения прочитать здесь? Что ж, это значит, что мое время не было потрачено зря.

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

пользователь: weekless
пропуск: wowjpnetort

Сообщение # 1 написано 01.02.2011 в 10:46

Источник: wowjp.сеть

Как создавать триггеры в Warcraft

В этом уроке давайте научимся использовать простые триггеры для более эффективного создания заклинаний.
Давайте подробнее рассмотрим некоторые действия из категории «Анимации», и что из них мы действительно можем использовать в заклинаниях, а что можно установить в RO.

Animation — Play Unit Animation — я настоятельно не рекомендую использовать это для проигрывания анимации кастеру, это можно сделать через поле Object Editor. Эта функция полезна для воспроизведения анимации на Dummy-юнитах, о которых мы поговорим гораздо позже.
Animation — Play Unit Animation (Specify Rarity) — Также хорошо подходит для воспроизведения анимации дамажащих юнитов.
Анимация — Изменить размер юнита — изменяет размер юнита.
Animation — Change Unit Vertex Coloring — Здесь нам нужно установить прозрачность блока.
Анимация — Изменить высоту полета юнита — поднимает юнита в воздух. Очень полезные вещи.

Вот, в принципе, и весь сегодняшний материал. Изучите эти возможности и выполните задания.

Источник: wc3-maps.ru