Лимит триггеров с событием Unit enters playable map area?(WH40k)
Всем привет!
Делаю карту по мотивам WH40k где в зависимости от Ордена на космодесантика навешиваются соответсвующие доспехи и оружие (сделано путем простого добавления абилки с соответствующим спецэффектом при появлении юнита)
Скриншот триггера, вроде как очень простого, приведен на скриншоте. При этом если включено больше чем 21 такой триггер, например 23 то карта багается - сами триггеры перестают работать, юниты сливаются в одну кучу и игра жутко лагает и Warcraft 3 пересатет отвечать.
Неужели в редакторе есть ограничение на количество триггеров начинающихся с Unit enters playable map area с которым может справитсья игра?
При этом, на карте вообще может не быть юнитов которые бы запускали триггер, однако само их наличие во включенном состоянии крашит карту.
Кто-то может помочь разобраться в чем проблема? Задача очень простая - в при появлении юнита, давать ему N абилок в зависимости от игрока владельца. Но уже самих орденов сделано около 30..И это не считая хаоситов. Таких триггеров нужно много...
Карта прилагается (ссылка внизу) в варианте который который заставляет игру глючить при запуске. Для того чтобы все было нормально нужно отключить пару любых триггеров на обвес маринов. Сама карта еще достаточно пустая, но я сделал очень много моделей и решил начать собирать их в игре.




Просмотров: 312

» Лучшие комментарии


quq_CCCP #1 - 1 месяц назад 0
У тебя лимит потока просто, из за того что много триггеров.
Diazon #2 - 1 месяц назад 0
quq_CCCP, спасибо!
А что можно с этим сделать?
То есть я вообще не могу в карте включить больше триггеров с событием Unit enters region?
8gabriel8 #3 - 1 месяц назад 1   
Нужно объединять. Делаешь вместо всех 23 триггеров 1 с событием входа, условия убираешь, а в действиях ставишь много If/Then/Else (multiple...), куда ставишь условия и действия триггеров, Else оставляй пустым.

В If/Then/Else тоже делай объединение, например, первым If проверяешь орден, если Black Templars, Then дать чёрный цвет юниту, Armour и Shoulders (если общие для всех), потом опять If/Then/Else уже с проверкой на тип юнита, когда навешиваешь остальное.
lizzardfyll #4 - 1 месяц назад 0
23 триггера это конечно жестоко, объедини все в один и все норм будет, вырезаешь и вставляешь, и все
Diazon #5 - 1 месяц назад (отредактировано ) 0
8gabriel8, lizzardfyll, Спасибо за мнение!
Именно так и было у меня изначально. Да, когда у меня было 5 огромных триггеров карта работала но..
Сам триггер получался очень лагучим сам по себе. Любое действие внутри него подгружалось секунды 3 и что-то в нем искать было тоже трудно когда этих If/Then/Else стало больше 40
И это только на обычных Десатников.............
Я тогда решил разбить на мелкие...
Что можно в итоге суммировать? Даже делая огромные триггеры с перебором условий мне нужно деражть в голове что не более 20 таких может быть?

Vlod #6 - 1 месяц назад (отредактировано ) 2   
Diazon, под какую делаешь версию вара, владеешь каким-нибудь языком программирования?
Diazon #7 - 1 месяц назад (отредактировано ) 0
Vlod, привет! Нет, я умею делать модели и текстуры рисовать. В триггерах только на ГУИ разбираюсь :х
Делаю в Рефорджевском редакторе карт
lizzardfyll #8 - 1 месяц назад 0
если ты шаришь в модельках, то в варике тогда лучше делать все это через смену скинов, а не добавлении способностей
Morningstar #9 - 1 месяц назад (отредактировано ) 0
зачем ты даешь им абилки? я полагаю у тебя есть очень веская причина не добавлять их через РО. Но некоторую оптимизацию ты всё же можешь сделать.
во-первых, если у всех космодесантников есть общие абилки (рюкзак, общие айтемы), то их добавь в РО, чтобы в триггерах было как можно меньше строчек.
Во-вторых не обязательно сразу давать абилку, как только он появился. Можешь сделать систему очереди. То есть когда юнит появляется, он ставится в очередь. А очередь определяет тип юнита и вызывает необходимую функцию добавления абилок.
Как сделать?
1. Добавляются в очередь юниты как раз таки событием Unit enters playable map area и "Занести в очередь".
2. Очередь вызывается таймером каждые (0.05, условно) сек и проходится по юнитам, которые в неё добавлены.
Тут всё обойдется минимальным джассом, но это не сложно и будет тебе только в большой плюс.
Определяет их тип, допустим десантник хаоса и добавлят ему абилки которые ему нужны.
Допустим у тебя будет массив переменных Desantnik_chaos из ability, и там будут нужные для него абилки. Так вот триггер пройдется по массиву и каждый раз будет добавлять абилку, до окончания массива. (Допустим у него 4 способности, то цикл будет состоять из 4х итераций и по итогу добавится 4 абилки).
Условно, когда юнит заносится в очередь она вытаскивает абилки из этого массива и добавляет их юниту.
Если сказать просто, то у тебя будет база данных для каждого юнита. И очередь будет смотреть что это десантник хаоса и вытаскивать из базы какие абилки у него есть и добавлять ему.
Таким образом ты избавишься от создания кучи триггеров и получишь что-то вроде базы данных, когда не надо будет в случае патча менять во всех триггерах, а просто настроить кому что будет даваться. Убиваешь сразу много зайцев.
Разумеется я полагаю у тебя все несколько сложнее, но и структуру ты должен сформировать локально чисто для твоего случая.
Bergi_Bear #10 - 1 месяц назад 1   
Кароче надо все переписать на жасс или луа, и сделать через добавление эффектов а не абил
Vlod #11 - 1 месяц назад 2   
quq_CCCP:
У тебя лимит потока просто, из за того что много триггеров.
Разве каждый триггер не в отдельном потоке?
8gabriel8 #12 - 1 месяц назад 0
Насколько понял его систему, у него изначально существует одна раса для космодесантников, а при старте игры игроки выбирают орден, за который предстоит выступать. Выбранный орден становится именем игрока. То есть у всех игроков за расу космодесанта одни и те же юниты в казармах, но при завершении обучения на них через способности навешиваются соответствующие элементы.

Diazon, а почему не сделал через разных юнитов в разных казармах у каждого ордена?
quq_CCCP #13 - 1 месяц назад 0
Vlod, изучи суть проблемы, ибо 100500 раз опысывалось, а потом про потоки пиши.
Diazon #14 - 1 месяц назад 0
8gabriel8, да, так!
Даже если учесть что 10 разных юнитов в ростере, то на 30 орденов получается около 300..
Основа у всех одна. Орден дает визуал + некоторое количество специфических улучшений +/- иногда пару дополнительных юнитов.
В целом, очень удобно в текущей системе.
prog #15 - 1 месяц назад (отредактировано ) 1   
Есть альтернативный путь - выдать всем юнитам все эти способности с визуалом сразу в РО, но отключить их изначально для всех игроков, а потом включить каждому игроку только те способности, которые соответствуют его ордену. Это позволит полностью избавиться от триггеров на вход юнитов на карту.
Morningstar #16 - 1 месяц назад (отредактировано ) -1   
prog:
Есть альтернативный путь - выдать всем юнитам все эти способности с визуалом сразу в РО, но отключить их изначально для всех игроков, а потом включить каждому игроку только те способности, которые соответствуют его ордену. Это позволит полностью избавиться от триггеров на вход юнитов на карту.
гений, хорошее решение

Либо реально делай 300 юнитов, ничего страшного, делов то часа на 4-5
Vlod #17 - 1 месяц назад 3   
А если потом понадобиться удалить/добавить общую способность у всех космодесантников? В коде это делается за несколько секунд.
Diazon, послушай лучше Bergi_Bear, время на код сполна окупится.
quq_CCCP, инициализация триггеров происходит в общем потоке инициализации, который также имеет лимит , так трудно было это написать)
Extremator #18 - 1 месяц назад (отредактировано ) 0
Если проблема только лишь в обрыве потока, то всё решается его распилом.
А огромное количество одинаковых триггеров убирается за счёт 2-3х БД.
8gabriel8 #19 - 1 месяц назад 0
Ещё можно абилки распихать по заблокированным спеллбукам, которые раздавать юнитам.
quq_CCCP #20 - 1 месяц назад 0
Vlod, это писалось 100500 раз, не вижу смысла учить классике. Кому надо знает, кто не знает - гуглит за 30 сёк. Таких вопросов было десятки если не сотни.
Diazon #21 - 1 месяц назад (отредактировано ) 0
Спасибо всем кто поделился мнением!
Для себя вижу решением откатиться в один гигантский триггер с перебором условий If then else в промышленном маштабе. Там я надесь игра справится с перебором условий даже в большом обьеме.
Bergi_Bear #22 - 1 месяц назад 0
Diazon, если бы ты хотел перейти на луа, я бы набросал тебе шаблон, в котором ты в событии входа бы через if else потипу юнита + фракция, расписывал какие бы эффекты куда приаттачить, кароче была бы большая БД.
Под шаблоном я понимаю 2 условия... дальше тебе нужно было бы просто копировать условие, и менять в нём названия переменных...
Кодом это сделать гораздо проще...
Но вы гуишники не хотите быть счастливыми (программистом тут быть не надо)
жду дизлайк от бога Гуи
Extremator #23 - 1 месяц назад (отредактировано ) 0
quq_CCCP #24 - 1 месяц назад 0
Diazon, Если что 1 одного триггера может быть множество разных событий, и 1 триггером с помощью ветвления можно делать несколько вещей, к примеру не обязательно делать 10 триггеров для движения юнитов по областям, достаточно сделать 1 триггер с событием входа юнита во все области, а чтобы определить в какую зашел юнит - можно проверить его координаты или принадлежность к определенной группе.