Что такое триггеры warcraft 3
Создание триггерных скилов:Отряд/цикл/ифзен
для тех,кто ниже среднего
Итак,это уже третья статья из цикла «по созданию триггерных скилов»,так что пора уже изучать серьёзные вещи.Хотя,они скорее не серьёзные,а очень полезные и упрощающие работу.
Все вы наверняка слышали о скиле Канал,это абсолютно пустой скил,который не делает ничего.Его польза в том,что ему можно выставить любой id приказа и он не будет юзаться одновременно как если дать герою две абилки с основой на «Лик смерти».Что ж,давайте создадим нужную нам абилку.
Установка канала,параметры: у способности канал( нейтрально-враждебные,герои,ниже абилки «кабан» ) есть 5 параметров,которые нам нужно настроить:
——
•Изображение — если галка стоит,то в игре у юнита,владеющего скилом,будет иконка это способности.Параметр обязателен,если вы делаете юзабельный скил.
•Изображение указателя цели — если стоит галка,то при использовании у вас будет круг,как у всех массовых заклинаний;»огненный столб»,»огненный дождь»,»ЗовСила природы».Если мы ставим этот параметр,то нужно так же ставить величину этой самой области.В графе «область воздействия» ставим нужный диапазон.
World editor warcraft 3 гайд [атакующие иллюзии/смена типа боя/триггерные спеллы]
•Материальное заклинание — точно не изученная вещь,но,если я не ошибаюсь,то если галка стоит скил не работает на остралоподобные скилы,»Изгнание в астрал» к примеру
•Универсальное заклинание — если галка стоит,то скил будет действовать на неуязвимых к магии чертов.Ежели нет,вы получите игровое сообщение о том,что цель неуязвима.
•Только ручное применение — этот параметр определяет суть приказа группе.Если у вас группа юнитов с этой абилкой,то если параметр стоит для каждого юнита нуждно указать цель,иначе,они будут юзать скил одновременно.
Итак,вот что получилось у меня:
Вы увидели ещё один параметр,который я изменял: Данные: Тип цели .Если там выбрано «нет»,то скил срабатывает сразу при нажатие,как «божественный щит» или «удар по земле».Если тип «боевая единица» то целью будет считаться только юнит как в скилах «молот бурь» и «лик смерти»,если «точка»,то только точка,как к примеру «волна силы» или «тёмная стая».Если «Точка или боевая единица» то целью могут служить юниты и точки одновременно,как сборный пункт у зданий,к примеру.
Данные: Следовать в течении времени .Если ваш скил кастуемый,то тут вы устанавливаете нужное кол-во времени на его прокастовку.
Данные: Отключить прочие способности .Если галка стоит,то у вас отнимается контроль над юнитом и заклинание не возможно отменить.К примеру скил
World Editor 20 Урок Создаем разные триггеры
Данные: Длительность графики .Периодичность графики.То бишь на указанное время на цель будет кидаться указанная вами графика.
Эффекты:
При касте способности на мага будет 1 раз наложен эффект, обозначенный в «Графика — Маг».
На цель эффект накладывается периодически, с периодом обозначенным в «Данные: Длительность графики». Установите значение 0, чтобы эффект наложился 1 раз (при касте).
Если ваша цель — юнит, то наложенный спецэффект берется из «Графика — цель», если точка — то берется из «Графика — Эффект». Куда будет приложен эффект для мага (над головой, к руке и.т.п), настраивается в «Графика — точки приложения заклинания 1» (и «точки приложения заклинания 2»). Куда будет приложен эффект для цели выбирается в «Графика — воздействие на цель 1» (и до 6).
——
За выделенный кусок статьи,я благодарен ShadowTheAge .
Теперь,когда у нас есть сама способность,кстати,вот что получилось у меня:
,мы можем приступить к созданию действий.
Итак,триггеры:
Для начала создадим нужные нам переменные:
Достаточно большое кол-во переменных,неправда ли?))Ну прежде чем создавать скил я объясню что именно за скил мы делаем,опишу его.
Суть скила такова: юнит указывает область,в которой будет взрыв.Взрыв наносит определённый урон и в центре зоны появляется 5 вихрей.Вихри идут по 5 разным направлениям и засасывают к себе всех врагов.
Кажется 5 вихрей,которых нужно двигать,и враги,которых нужно двигать относительно вихрей! Ужос!Но тут нам помогают 3 очень важные функции: «Выбрать отряд»,»Для каждого числа А делать»,»если/то/иначе».
Итак,приступим.
Первый триггер выглядит вот так:
Это самый большой триггер,так что можно вздохнуть.Что тут происходит,расписываю по порядку.
•Да бы не было осложнений я выключаю триггер сразу.Когда мы «выключаем триггер» мы выключаем не действия,а событие,то бишь действия которые ниже пойдут,но они не начнутся заново,т.к. выключено событие.
•Устанавливаю переменные для угла поворота наших вихрей.
•Устанавливаю нашего кастера
•Теперь важная переменная.Я об этом ещё не говорил.Выглядит оно вот так:
Собственно это эпицентр нашего заклинания.То бишь точка-центр области заклинания.
•И устанавливаю отряд.Число 350 потому,что в способности диапазон области тоже равен 350.
•Далее уже знакомый нм CS,на удаление утечки отряда.
•Выбираю каждого юнита в нужном нам отряде и наношу урон.Я поставил просто 200,но если вы делаете заклинание проявите смекалку и знание арифметики.К примеру: (LvL of abiliti*50).
•Создаём эффект этого «взрыва» и отмечаем его в переменную
•Далее первое применение цикла.Тут я создаю юнита(я создал на основе пехотинца,заменил модель на Торнадо,дал неуязвимость и способность москиты),помечаю его в переменную,и нахожу конечную точку в которую он должен попасть(позже поясню).Так как Location5 нам уже не понадобится я её удаляю.
•Включаю триггер движения
•Запускаю таймер на триггер очищения утечек
—Next—
Следующий триггер ответственен за движение вихрей и юнитов вокруг них:
•И сразу цикл.Суть в том,что я даю команды сразу 5 вихрям,а команды для них одинаковы.Но то,что делает их разными это те самые конечные точки.Как помните они зависят от угла поворота,который мы настраивали в начале.
•Итак,поворачиваем нашего юнита к конечной точке чтоб во время движения он не сбивался с круса
•Устанавливаем позицию и смешение нашего юнита,двигаем
•Далее знакомый CS и блок функций,пихаем под цикл отряд,а под отряд ифзенку.
•Условия,как видно,убирают из целей всех союзников,здания,и юнитов игрока кастера
•устанавливаем переменные смещения,двигаем,удаляем утечки.Тут что касается движения.С этой формулой мне сильно помог H_A_PK .Итак о формуле.
Установить Location7 равно (полярное смещение,Location3, (расстояние между точками Location6 и Location3)-4, (угол между точками Location6 и Location3) + 14.40)
•вот тут внимательно,ставим удаление точки не в ифзенку с отрядом,а после них,но в цикл.
—Next—
Теперь очищающий триггер.
Он работает по прицепу таймера с событием на его истечение:
•Выключаем «двигатель»
•Удаляем эффект взрыва
•Удаляем вихра,обнуляем переменную.Об этом я говорил раньше,если у нас переменная массивная,то удаляем её циклом по данному CS.
•Включаем триггер который начнёт всё сначала
•Удаляем точки,которые неизменны.Но тут ошибка.Location2 я должен удалить не тут,а в триггере Движения,там же где и Location3.
Ну собственно всё)).Теперь при юзе скила у вас враги в области получат нужный урон.Появятся торнадо и они пойдут в разные стороны,засасывая врагов)
Если со стороны систематики,то всё достаточно просто.
Наш юнит смотрит в уже установленную нами сторону и смещается до «конечной точки»,которую мы тоже уже рассчитали.Рассчитали мы её для того,чтоб направлять юнита туда,ибо если не заставлять его поворачивать,он сойдёт с курса,агрясь на врагов.Двигаем наших юнитов относительно их угла поворота туда,попутно ловя всех кто в диапазоне 180 от них.Как только засекли гада,что посмел приблизиться,мы проверяем подходит ли он по условиям,ежели да крутим по формуле.Собственно как только таймер динь-динь мы убиваем наших юнитов и выключаем всё кручение.
Вот наработка скила,тут всё сделано как показано на скринах.
Спасибо за прочтение,автор статьи: Sun Creep
- Цитировать
- Сб, 30.07.11, 16:40
Источник: rewar.me
Что такое триггеры warcraft 3
Этот триггер позволяет соединять предметы в одной ячейки .
события:
Боевая единица — A unit получает предмет
условия:
((Hero manipulating item) has an item of type (Item-type of (Item being manipulated))) равно да
(Item being manipulated) не равно (Item carried by (Hero manipulating item) of type (Item-type of (Item being manipulated)))
(Item-class of (Item being manipulated)) равно Подлежащие продаже
действия:
Предмет — Set charges remaining in (Item carried by (Hero manipulating item) of type (Item-type of (Item being manipulated))) to ((Charges remaining in (Item carried by (Hero manipulating item) of type (Item-type of (Item being manipulated)))) + (Charges remaining in (Item being manipulated)))
Предмет — Remove (Item being manipulated)
Для тех кто ничего не понял, я сделал наработку (http://rghost.ru/4658776)
P/s Сори за не особо хороший ланд, я сонный и усталый был))
_____________________________________________________________________________________________________
Пример разговора с вариантами ответа .
Для начала нам нужно пойти в «Редактор Переменных». Создаём там переменную-массив типа «Кнопка» («Button») размером 3 ячейки, переменную типа «Диалог» («Dialog»), и две переменных типа «Боевая единица» («Unit»). Массив кнопок назовём «Buttons», наш диалог «Dialog», одну переменную юнита назовём «Footman», а другую «Paladin»:
Далее создаём папку триггеров «Dialog». Там создаём 5 триггеров: «Init», «ShowDialog», «ClickFirst», «ClickSecond» и «ClickThird». Заходим в триггер «Init». Ставим событием «Elapsed time in 0.01» («Времени прошло 0.01 секунд»). Назначаем там переменной «Footman» пехотинца, а «Paladin» паладина соответственно.
Теперь нам надо назначить описание для диалога и кнопок. Но для начала позвольте мне разъяснить некоторый момент – я поставил событие не Инициализацию карты, потому что диалоги, как и мультиборды/таблицы рекордов не могут работать с событием Инициализации, поэтому надо использовать событие «Elapsed time».
Итак, продолжим. Назначаем текст диалогу действием «Диалог – Change title». А для назначения кнопкам текста надо использовать 2 действия – сначала мы создаём кнопку действием «Диалог – Create Dialog Button»,а потом занесём её в переменную «Set Buttons [1/2/3] = Last Created Dialog Button». Давайте поставим текст диалогу «Выберите ответ:», а кнопкам «Привет!», «Ты кто?» и «Пошёл вон!».
Дальше нам надо сделать так, чтобы при определённых действиях это окно показывалось, верно? Для примера, я сделаю, чтобы оно показывалось во время разговора между Пехотинцем и Паладином, а данный разговор начинался, когда Пехотинец входит в нашу зону «Paladin». Итак, идём в триггер «ShowDialog», там ставим событие «Боевая единица – A unit enters region». В регион ставим нашу область «Paladin». Далее, в условиях, выбираем «Unit Comparison» и ставим там «(Entering unit) равно (==) Footman».
Потом в действиях включаем ролик действием «Спецэффекты – Cinematic Mode». Потом делаем так, чтобы паладин говорил Пехотинцу «Здраствуй.». Тут нам поможет действие «Спецэффекты – Transmission from Unit». Ну а теперь можно и показывать диалог. Если всё правильно, то триггер «ShowDialog»
Теперь мы должны сделать, чтобы при нажатии определённых кнопок диалога, паладин реагировал по-разному. Для начала идём в «ClickFirst». Ставим событие «Диалог – A dialog button is clicked for Dialog». Теперь мы должны поставить условие, что нажатая кнопка, это «Buttons[1]». То же самое мы будем делать и с другими кнопками.
Ставим «Dialog Button Comparison» где проставляет значения таким образом: «(Clicked dialog button) равно (==) Buttons [1]».
Потом нам надо сделать, чтобы Пехотинец говорил нужную фразу, в данном случае это «Привет!». А паладин должен будет ему ответить. У нас диалог небольшой, поэтому паладин ответит один раз. Его фразой будет «Извини, я спешу. До встречи!».
А Пехотинец ответит «Ну до встречи. ». Ну и в конце выключаем режим ролика.
Далее ставим в триггер «ClickedSecond» те же самые события и условия, но в условии заменяем «Buttons [1]» на «Buttons [2]». Но теперь паладин будет отвечать по другому, то есть у нас выйдет вот такой коротенький разговор
Пехотинец: Ты кто?
Паладин: Я Паладин армии Альянса.
Пехотинец: Ясно…
Ну и наконец, третий ответ. В нём пехотинец отвечает грубо, поэтому и ответ паладина будет грубым 😉
Источник: wc3-maps.ru
Что такое триггеры warcraft 3
Вход на портал
PanDaemonАeon
——————————- Введение ——————————-
Если Вы являетесь новичком в создании карт для любимой, большинством играющего населения планеты, игры Warcraft III, то вам должно быть интересно как устроена система «программирования» для неё. специально для игр этой серии, мастерами из «Blizzard» был создан язык скриптов под названием Jass. В принципе он очень похож на остальные языки программирования и если Вам приходилось раньше писать программы, то он не должен показаться вам очень сложным в освоении. Для облегчения работы с ним были созданы специальные надстройки — GUI(Триггеры).
Для начала работы вам необходимо создатьоткрыть уже существующую карту и запустить «Редактор Триггеров». Чтобы это сделать, необходимо найти на панели инструментов иконку с изображением буквы «а» или нажать на клавишу «F4» находясь в окне редактора. Итак, начнём по порядку. Редактор триггеров состоит из нескольких блоков:
Панель управления, с вынесенными на неё основными клавишами. Для работы с триггерами используются только семь кнопок: Переменные (Cntr+B), Новая категория (Cntr+G), Новый триггер (Cntr+Е), Новый комментарий к триггеру (Cntr+M), Новое событие (Cntr+E), Новое условие (Cntr+D) и Новое действие (Cntr+R). Остальные являются общими и используется во всех окнах редактора
Список триггеров. Для удобства работы с ними можно создавать различные категории, в будущем, при компиляции кода они не будут учитываться и поэтому названия могут содержать в себе кириллицу, а вот названия триггеров не могут содержать в себе кириллических букв, а также не могут повторяться, даже находясь в различных категориях.
Текстовая зона , в ней находиться описание триггера. В ней Вы можете написать основные принципы работы триггера, действия, которые он выполняет, список переменных, которые нужно создать, чтобы перенести этот триггер в другие карты. В общем любую информацию
Окно кода триггера. Пожалуй, самая важная часть редактора триггеров. В ней Вы можете редактировать и создавать код карты. Подробнее о нем узнаем в следующей главе
Каждый триггер состоит из 3 частей:
* События (Events)
* Условия (Condition)
* Действия (Actions)
События.Чтобы триггер начал свою работу необходимо заполнить поле События (Events). Основными и наиболее часто используемыми событиями являются:
* “Map Initialization” (Срабатывает при загрузке карты)
* “Periodic Event” (Срабатывает каждый раз, когда таймер будет равен нулю)
* “Time Elapsed” (Срабатывает один раз, когда таймер будет равен нулю)
* “Generic Unit Event” (Срабатывает при выполнении юнитом какого-либо действия)
Также часто используемым событием является “Specific Unit Event”, оно очень похоже на “Generic Unit Event”, но с тем условием, что отслеживаются действия не всех юнитов, а только определённого.
Условия.Следующим этапом будет заполнение пункта “Условия”. Это необходимо для сужения области применения триггера.
Например, вам необходимо отследить применение какого-либо заклинания, тогда нужно создать событие ( щелкнув для этого правой кнопкой мыши и выбрав пункт “Новое событие(New Event)”) “Generic Unit Event”, выбрав там пункт “Начинает Применять Способность”. Далее нужно создать новое условие (аналогично созданию события) и выбрать там пункт “Ability Comparison”, после чего триггер примет примерно такой вид :
События:
“Боевая единица – A unit Начинает Применять Способность ”
Условиея:
“(Ability being cast) равно ”
Действия. Это является самой главной частью любого кода. Благо действий в редакторе карт достаточно чтобы превратить 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 частей. Первая часть это условие, вторая часть это действие, если условие вернёт истину, то оно будет выполняться, а третья часть это действия, но только те, которые будут выполняться, если вернётся лож. Теперь попытаюсь объяснить это всё на примере:
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Если — Условия:
рано 0
То – Действия:
Set = 1
Иначе – Действия:
Set = 0
Теперь при исполнении данного условия будет меняться значение переменной, если она была равна нулю, то станет равна единице и наоборот, если она была равна единице, то станет равна нулю.
Следующим шагом будет изучение циклов. Они также являются практически неотемлемой частью любого кода. Если в вашей карте не будут использованы условия и циклы, то скорее всего ваша карта даже не доживёт до релиза и если честно я не встречал ни одной хорошей карты, в которой бы не было циклов или условий. И так начнём.
Циклы используются в картостроении для выполнения однотипных действий. Примером может служить изменение переменных массива. Циклами являются все действия начинающиеся на “For Each…”, всего их 6 и каждая имеет свой синтаксис написания. В принципе они все похожи и разбирать каждую в отдельность нет смысла, поэтому мы остановимся на самой первой “ For Each Integer A, Do Multiple Action”.
Удобство работы с этой функцией заключается в том, что можно менять не весь код функции сразу, как в “ For Each Integer A, Do Action ”, а по отдельности каждую строку. Число, равное количеству раз выполнения цикла, является переменная типа “Integer (Целочисленная)”. Чтобы получить её значение необходимо использовать вместо переменной функцию “For Loop Integer A”. Для примера используем вот такой код:
For each (Integer A) from 1 to 12, do (Actions)
Цикл – Действия:
Set Hero[(Integer A)] = “Нет боевой единицы”
Данный пример очищает переменные “Hero[1]”, “Hero[2]” , “Hero[3]”, … , “Hero[12]” от всех записанных в них значений. Также есть ещё одна интересная функция, функция “ For Each Integer Variable, Do Multiple Action”. Она нужна для замены переменной “A” на любую вашу переменную типа “Integer (Целочисленная)”. Синтаксис этой функции отличается от ранее рассмотренной и поэтому я приведу пример кода
For each (<Имя вашей переменной>) from 1 to 12, do (Actions)
Цикл – Действия:
Set Hero[(<Имя вашей переменной>)] = “Нет боевой единицы”
Я думаю все нашли отличия этих функций, но если перевести эти функции в Jass, то вы не найдёте никаких отличий за исключением названий переменных. Для первого примера создается локальная переменная с названием “bj_forLoopAIndex”, а во втором примере вместо этой переменной просто используется ваша. А вообще все эти шесть функций в текстовом виде выглядят одинаково и созданы в триггерном виде лишь для упрощения работы с циклами.
Как уже говорилось ранее, возможности триггеров практически безграничны. Большинство задач, которые казалось бы невозможны, можно с их помощью реализовать. На основе Warcrat’а были созданы множество других жанров. Начиная с гонок и заканчивая логическими играми. Некоторые секреты я и попытаюсь реализовать в этой главе.
Когда я только начинал программировать для этой игры, мне казалось что сборные артефакты это стандартная функция варкрафта. Это было реализовано практически во всех картах, в которые я играл. На самом же деле все не так просто. Или все же просто? Вот пример кода собирающего два и более артефактов в один:
События:
Боевая единица — A unit Получает предмет
Условия:
Действия:
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Если — Условия:
((Triggering unit) has an item of type ) равно Да
((Triggering unit) has an item of type ) равно Да
То — Действие:
Предмет — Remove (Item carried by (Triggering unit) of type )
Предмет — Remove (Item carried by (Triggering unit) of type )
Герой — Create and give it to (Triggering unit)
Иначе — Действие:
Do nothing
Теперь буду объяснять что здесь написано. Во-первых необходимо отследить получение юнитом предмета, для этого используется событие “Generic Unit Event ”с выбранным “Получает предмет ”. Далее мы проверяем нахождение у юнита определённых артефактов и если они есть, то забираем их и даём другой. Все просто, но эта система далеко не универсальна, а точнее с помощью неё нельзя отследить нахождение у юнита два одинаковых артефакта. Самый распространенный способ это сканирование всех слотов на артефакты. Для этого мы создадим переменную типа “Целочисленная (Integer)”, назовём её “ ItemCount ” и рассмотрим этот код:
События:
Боевая единица — A unit Получает предмет
Условия:
Действия:
Set ItemCount = 0
For each (Integer A) from 1 to 6, do (Actions)
Цикл — Действия:
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Если — Условия:
(Item-type of (Item carried by (Triggering unit) in slot (Integer A))) равно
То — Действие:
Set ItemCount = (ItemCount + 1)
Иначе — Действие:
Do nothing
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Если — Условия:
ItemCount больше или равно 2
То — Действие:
Предмет — Remove (Item carried by (Triggering unit) of type )
Предмет — Remove (Item carried by (Triggering unit) of type )
Герой — Create and give it to (Triggering unit)
Иначе — Действие:
Do nothing
В начале, как и в прошлом действии, мы отследили получение юнитом предмета. Потом очистили переменную “ItemCount” от значения, вписанного в неё ранее. Следующем действием было сканирование слотов героя на нахождение определённого артефакта и если он находить у героя, то увеличиваем значение переменной “ ItemCount” на единицу. Далее проверяем значение переменной и если оно окажется больше или равно 2, то забираем 2 раза артефакт и даём другой. Вот и все, теперь и Вы можете создавать реалистичные системы артефактов используя данный код.
Источник: wowjp.net