Что такое триггер в доте

Обновлено: 05.07.2024

Trigger дословно переводится на русский как «вызывать» или «спусковой крючок». Если же адаптировать, то это слово скорее будет звучать как «зацепка». А triggered, в свою очередь, «быть зацепленным чем-то». То есть, то, что вас цепляет, задевает или обижает.

•Мем “триггер” появился еще в начале 2000-х годов на сайте Livejournal. Его пользователи ради шутки начали добавлять к своим постам напоминание о том, что «их пост может кого-нибудь тригернуть». Так блогеры шутили в основном над анорексиками и булимистами, выкладывая посты про еду.

•После анорексичек объектами шуток стали феминистки. И тут у мема triggered впервые появилось «лицо». Им стала девушка в очках с красными волосами по имени Чанти Бинкс. Именно с ней чаще всего ассоциируют мем триггеред в России. Кто она, и причем тут этот мем? Непонятно. Просто в какой-то момент пользователи сети взяли самую ярую феминистку и начали использовать ее для шуток. Например о том, что увидев в каком-либо слове намек на мужское начало (Fe[men]ism), она люто триггерится.

•До Чанти Бинкс олицетворением мема triggered на Западе была американка Мелоди Хенсли (Melody Hensley). В качестве шаблона использовалась ее фотография с сайта Getty Images, загруженная 6 ноября 2013 года. Мемом она стала в 2014 году, когда публично заявила об онлайн-травле из-за ее феминистических взглядов. Но пользователи не прекратили свои нападки, а наоборот усилили эффект, взяв фото Мелоди за основу мема . Хватит думаю и 2% до сюда не прочтут ₽

Создание юнита

Такой результат получен с помощью невидимого блока trigger_dota, который запускает функцию npc_dota_base, выпускающую стрелу в его сторону. Звучит немного сложно, но на самом деле все проще, чем кажется. Первым делом нам нужен юнит-пустышка. Мы создадим его в текстовом файле cripts\npcs\npc_units_custom.txt , который находится в папке с нашей картой.

Самая важная часть в создании ловушки это добавить ей способность dota_ability_trap_arrow. Вторая способность unseletable делает юнита невидимым и некликабельным, но можно обойтись без нее.

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

Как сделать ловушку через триггеры

Эта статья содержит поэтапные указания, в результате которых должна получится некая ловушка, основанная на триггерах в workshop tools. Также она является примером того, как работают триггеры и как ими пользоваться. Это переведенная статья и картинки и видео взяты с оригинала, ссылка на который находится внизу.

Триггеры

После следующих действий, так будет выглядеть наша ловушка в редакторе:

Первым делом поставим npc_dota_base в то место, откуда вы хотите, чтобы вылетали стрелы:

И затем мы изменяем его Object Properties (Свойства объекта) так, чтобы у него было особое имя и наш trigger_dota работал вместе с npc_dota_base и присваиваем ему Entity Script arrow_trap_ai.lua, который мы доделаем позже. Наконец, можно поставить Unit Name (Имя юнита) npc_dota_arrow_trap , чтобы ловушка работала корректно.

Наш NPC готов метать стрелы, но нужно, чтобы ему что-то приказывало это делать. Это что-то будет trigger_dota . Для этого мы выбираем toolsstrigger.vmat материал для нашего блока и ставим его на карту:

Дальше мы жмем “Tie Selected Meshes To Entity” и меняем сущность объекта на trigger_dota . (У меня этот пункт стоит по дефолту, т.к. я настроил свой редактор, у вас, возможно, стоит trigger_multiply)

Жмем Alt+Enter, и открывается окно свойств объекта trigger_dota. Теперь мы выбираем вкладку Outputs и жмем Add, чтобы создать новый output. Нам нужно, чтобы ловушка реагировала на героя и запускала триггер, поэтому в поле My output named выбираем OnTrigger. В следующем поле Target entities named выбираем то имя, которым мы назвали свойство, в данном случае это npc_arrow_trap1. В окне Via this input выбираем пункт CallScriptFunction, который будет вызывать функцию из Entity Scripts, которая относится к нему. И в последнем пункте (который мы заполним) With a parameter override of назовем функцию Fire.

Можно добавить немного декораций, чтобы смотрелось лучше, но это уже на ваш выбор.

Precache

Наконец, как и все другие пункты в д2 модмейкинге, предварительное кэширование играет очень важную роль.

Так как мы используем стрелу мираны, то мы должны создать видимость и звук этой стрелы. Если вы не сделаете этого, то не увидите и не услышите ее. Это делается достаточно легко, путем редактирования Precache функции в scripts\vscripts\addon_game_mode.lua

Если вы все сделали согласно этому уроку, то ваша ловушка должна работать как на первом видео.

Что такое триггер в доте

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

Contents

Картостроение

Существует много типов триггеров-брашей, которые могут быть созданы в редакторе карт Hammer; просмотрите Special:PrefixIndex/trigger для полного списка.

Одни из самых главных триггеров-брашей это trigger_once, trigger_multiple, trigger_look and trigger_proximity. У них всех одинаковые свойства и выводы:

Tools/ToolsTrigger Каждый триггер должен использовать один материал. Filters Энтити-фильтры могут быть использованы для определения, что должен активировать триггер. Filter Flags Есть список флагов, которые позволять триггеру быстро фильтровать без дополнительного энтити. OnStartTouch OnEndTouch Вывод происходит, когда любое энтити заходит в триггер или выходит из него. Этот энтити будет числится, как !caller. OnStartTouchAll OnEndTouchAll Вывод происходит, как с выше перечисленным, но только, если отфильтрованные энтити не касаются триггера. OnTouching OnNotTouching Один из выводов будет запущен в ответ на TouchTest ввод. Все триггеры имеют эту команду, однако, немногие из них имеют эту команду в списке.FGD. OnTrigger Срабатывает всякий раз, когда энтити соответствует всем критериям триггера.

Смотрите также

Программирование

Все энтити могут отвечать на соприкосновение с другими энтити (смотрите Touch() ). Если вы хотите соприкосновения без коллизии, то у вас есть два выбора:

SetSolid(SOLID_NONE) и AddSolidFlags(FSOLID_TRIGGER) Энтити будет отвечать на соприкосновения с вещами, которые походят через него. CollisionProp()->UseTriggerBounds(true,iBloatSize) Энтити будет иметь триггер-бокс который продлевает его коробки коллизии с помощью iBloatSize юнитов в X/Y и (iBloatSize/2) в +Z (-Z остается прежним). Триггер-бокс выравнен миром и будет работать независимо от твёрдости объекта и его группы коллизии. Он будет видим, как светящаяся, голубая коробочка, когда консольная команда ent_bbox использована. Valve использует триггер-бокс для всех предметов. Их Их размер коллизии составляет 24, довольно большая цифра.

Что-бы сделать новый триггер-браш, который использует форму его браша заместо коробки коллизии, нужно взять CBaseTrigger и вызвать InitTrigger() .

Триггеры

Триггеры - энтити, которые отвечают на запросы других энтити. Триггеры-браши могут быть созданы картоделами, а программисты могут сделать что угодно их триггеров.

Функция Fire

Ловушка почти готова! Осталось только создать функцию Fire в scripts\vscripts\arrow_trap_ai.lua.

Скрипт получает доступ к определению объекта, связанному с ним через переменную thisEntity. Кроме того, если Output запускает функцию через CallScriptFunction, то запускаемое определение передается в параметры как вызов. Благодаря этим двум вещам, мы можем использовать функцию CastAbilityOnPosition, которая выстреливает стрелой по направлению к Origin (Точка начала координат) области trigger_dota, когда игрок входит в нее.

Замечание: хочу заметить, что способность кастуется по направлению к началу координат trigger_dota. Чтобы узнать, где это находится нужно выбрать Translate tool (Перемещение), и вы увидите три оси, выходящих из одной точки. Это и будет Origin области trigger_dota. В данном примере эта точка находится ровно по центру, но это не принципиально, и вы можете поставить ее где хотите.

Способности для ловушки

Следующим нашим шагом будет создать способности dota_ability_trap_arrow и unseletable в текстовом файле scripts\npcs\npc_abilities_custom.txt:

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

Рассмотрим некоторые модификации, которые мы сделали. Заметьте, что наша стреляющая ловушка не имеет маны, поэтому на каст стрелы мы установили 0 AbilityManaCost (Затрачиваемая мана), чтобы не делать способность бесполезной. Также стоит обратить на AbilityCastPoint (Задержка каста), которой мы тоже присвоили значение 0. Даже наша ловушка может иметь задержку перед кастом, а это значит, что она будет стрелять немного позже того момента, когда герой вступит на область. Поэтому, если хотите, чтобы стрела выпускалась мгновенно, то в этом поле стоит оставить 0. Хотя вы можете поэкспериментировать и выставить любое другое значение, подходящее вам.

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

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

Общее

  1. Сделано полностью на GUI
  2. Без локальных переменных
  3. Без CS вставок
  4. Один таймер на всю работу
  5. Минимум переменных
  6. Максимально просто (малый обьём)
  7. Полный MUI, вплоть до 2х и более предметов у одного героя (или двух героев в предметами у одного игрока)
  8. Принцип работы - MUI-массификация хД
  9. Есть небольшая погрешность до 0.1 сек, НО это регулируемый момент.
  10. С данном случаи идёт уничтожение даггера и создание нового аналогичного, имейте это ввиду!

kd_A - целое число, для работы в цикле, в данном случаи важно уменьшать число тела цикла (intA/B)
KD_Mui - число которое считает количество даггеров с которыми работает в данный момент времени
KD_Timer - таймер, которые каждые 0.1 сек работает со временем и делает нужные действия
KD_Group - группа, в которую заносятся все герои которые получают Даггер, для того чтобы не записывать их дважды (и более раз) в событие на получение урона!
KD_hero[_] - юнит, герой, который получил урон и у него был отобран Даггер!
KD_slot[_] - слот, из которого был изьят Даггер и в который он будет возвращён
KD_time[_] - время которое постепенно истекает, в результате чего Даггер будет возвращён

05.07.2012 в 14:48 - Добавил скрины триггеров, ну так, кому лень качать :)

05.07.2012 в 17:34 - Исправил такую ошибку как невозможность вернуть предмет умершему герою, я просто в момент получения урона смотрю - если урон убьёт героя, то преждевременно возвращаю нормальный даггер герою. Так же залил новый скрин триггера "damage" (старый не удалял) хД

06.07.2012 в 17:16 - Нашёл грубую ошибку из-за которой могла разлететься вся работа (допустил из-за невнимательности во время перекомпановки содержимого цикла). Добавил индикатор времени блокировки предмета (сам придумал) хД

09.07.2012 в 13:13 - изменил принцип возвращения предмта в случаи смерти, ранее было мгновенное возвращение, теперь же - просто заморозка времени таймера пока герой не оживёт.

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