Из-за лимита операций периодически отключаются триггеры.
Новых уже давно не создаётся глобально, всё пишется в кастом коде карты сверху.
Но "старые" глобальные триггеры периодически продолжают отключаться.
Пожимая плечами, прописываю соответствующий call InitTrig_XX() в глобальном триггере на инициализацию карты (он один из первых, так что в ближайшее время отключаться не собирается, а если отключится, это станет видно мгновенно), переписываю триггер на локальный и пихаю в кастом код, заодно и уменьшая обфускацию текстовыми подсказками и по возможности оптимизируя код.
Но немного утомило уже. Обфускация уменьшена немало, производительность и так явно не худшая в мире.
А вопросов, короче, два.
  1. Допустим, обнаруживаю я, что триггер KUKARACHA какой-нибудь глобальный отключается (из-за лимита операций, больше не из-за чего). Достаточно ли оставить его глобальным, ничего не менять и просто пропихнуть call InitTrig_KUKARACHA() в тот самый глобальный триггер на инициализацию?
  1. Если я так и буду продолжать все пихать в один триггер на инициализацию, возможно ли, что у меня из-за лимита и там все отключаться начнёт? Надо ли по частям распихивать? (В принципе так-то есть куда...)
Я так думаю, что:
  1. Да, можно оставить триггер глобальным и просто перенести его инициализацию вверх, т. к. триггер остаётся работоспособным, из-за лимита отключается-то только его инициализация. Фактически машина рабочая, просто топливо до нее не доносят.
  2. Вот тут хз, но скорее думаю, что да, возможно. Тогда надо будет сделать подсказочные блоки "Инициализация первого блока доп. триггеров", "Инициализация второго блока доп. триггеров" и т. д.
А, и ВОТ ЕЩЕ!!! ТРЕТЬЕ!!! Что будет, если функция, создающая ГЛОБАЛЬНЫЙ триггер, будет вызвана ДВАЖДЫ?
Мой вариант ответа: 3. Т. к. строго говоря, триггер - это глобалка в теле карты, такая же, как глобальные переменные, глобальный триггер просто перезапишется и ничего страшного не произойдёт (ну кроме утечки триггера, мб).

Принятый ответ

в самой последней строке самой последней функции присваивай какое-то значение глобалке и будет тебе счастье знать, что всё закончилось успешно
0
20
7 лет назад
0
Можешь свой грандиозный основной триггер запустить при инициализации в отдельном потоке, как вариант. Тогда меньше возни будет.
0
21
7 лет назад
Отредактирован ClotPh
0
Diaboliko, грандиозный основной триггер - это кастом код сверху?
Там не один триггер, там дофига триггеров и функций. Просто изначально там были функции типа старого домемхаковского GetUnitArmor + немного своих, потом добавился мемхак и еще чуть раньше из-за лимита все подряд туда полезло :D
Вообще, я так понимаю, нет ведь разницы особой, что где написано, вопрос, что где инициализируется?
Меня интересуют конкретные и максимально четкие ответы на вопросы.
//////////
Если на третий вопрос у меня ответ правильный, так я вообще думаю, может, открыть war3map.j и скопипастить все из InitCustomTriggers (ну кроме триггера инициализации карты) в другое место и все? Ну останется там утечка XX триггеров. Не смертельно повлияет на производительность, если вообще окажется замечено, ведь триггеры-то эти не будут вызываться (если я, опять же, все верно понимаю). Зато про геморрой забуду.
0
20
7 лет назад
0
Видимо я неверно тебя понял. Мне показалось ты имел ввиду что у тебя большая часть кода инициализаций находятся в одном триггере.
Надо ли по частям распихивать?
Да. По крайней мере цикличные действия распихивать будет не лишним.
А, и ВОТ ЕЩЕ!!! ТРЕТЬЕ!!! Что будет, если функция, создающая ГЛОБАЛЬНЫЙ триггер, будет вызвана ДВАЖДЫ?
Либо ты имеешь в виду нечто иное чем set gg_trg_triggerName, либо у тебя просто будет один триггер в памяти висеть просто так, да. Только не представляю что тебе мешает залатать эту дыру собственноручно?
0
16
7 лет назад
0
не знаю, как там это в редакторе устроено, но тебе жизненно необходимо создавать треды. ExecuteFunc / ForForce к вашим услугам
0
21
7 лет назад
Отредактирован ClotPh
0
DracoL1ch, пока в этом не удалось разобраться.
Diaboliko, а, ну да-да, пока что все, что инициализируется не дефолтно через InitCustomTriggers, инициализируется в другом триггере, и этот другой триггер один. Только он сам по себе не особенно грандиозный, просто все перенесенные инициализации именно там.
Ну то есть пока понято так по ответам на мои вопросы:
  1. Да.
  2. Да, надо распихивать, ну ок, буду, не сильно проблема.
  3. Да, только триггер утечёт.
////////////
Теперь чуть подробнее по третьему. А как ее, собственно, залатать?
При дополнительной инициализации удалять из существующего глобального триггера события, условия и действия и рушить его?
А не будет фатала, если такого триггера не существует?
Просто ведь если он перестанет инициализироваться через InitCustomTriggers, его, ятп, просто не будет существовать...
////////////////////
О-О-О!!! И вот еще внимание сразу 4-й вопрос!!! ПЛЗ!!! Оч легкий.
Верно ли, что лимит операций первыми пришибает последние вызовы? Ятп, по логике да, и вроде и примерно так и выходило (просто они могут фактически быть не последними в редакторе триггеров по списку, но это-то как раз не беда, у меня глобальных триггеров больше вообще не будет).
У меня war3map.j в InitCustomTriggers заканчивает ее так:
...
call InitTrig_EffortsForMulticast()
call InitTrig_FelaAll()
call InitTrig_NastyLightForMulticast()
call InitTrig_DepressionAll()
call InitTrig_LostVikingsAll()
call InitTrig_WaterInTheFaceForMulticast()
call InitTrig_HighTideAll()
call InitTrig_ConsciencePangsForMulticast()
call InitTrig_ChaplainAll()
call InitTrig_ColossusAll()
call InitTrig_KumbhakarnaAll()
call InitTrig_RelictAll()
call InitTrig_ZoroAll()
call InitTrig_AstronomerAll()
call InitTrig_RookieAll()
call InitTrig_PotentAll()
call InitTrig_OuroborosAll()
call InitTrig_MinisnakeAll()
endfunction
Т. е. точно ли, что если я проверяю Минизмейку и она в порядке - больше у меня пока ничего не отключилось?
2
20
7 лет назад
2
Т. е. точно ли, что если я проверяю Минизмейку и она в порядке - больше у меня пока ничего не отключилось?
По идее - да. Но у каждого свои дилдо из костылей, которые могут не работать при определенных обстоятельствах.
Теперь чуть подробнее по третьему. А как ее, собственно, залатать?
При дополнительной инициализации удалять из существующего глобального триггера события, условия и действия и рушить его?
А не будет фатала, если такого триггера не существует?
Просто ведь если он перестанет инициализироваться через InitCustomTriggers, его, ятп, просто не будет существовать...
Чем плоха первичная инициализация? Я не понимаю возникшей ситуации.
0
21
7 лет назад
Отредактирован ClotPh
0
Diaboliko, ладно, забей, тут сложно объяснить... "на будущее" хотелось защититься от отключения триггеров, поэтому и инициализировать их второй раз "заранее", короче говоря, первичная плоха тем, что может отключиться, т. к. она "классическая" через InitCustomTriggers, а если первичную убирать сразу, так это получается то, что я уже и делаю, но тут свои трудности...
Пока буду делать так, короче:
-разбивать все InitTrig_XXX на несколько блоков;
-проверять, сработала ли самая нижняя инициализация в каждом блоке.
Если она сработала, значит, в этом блоке лимит операций превышен не был.
Все правильно? Ятп - ДА.
2
16
7 лет назад
2
в самой последней строке самой последней функции присваивай какое-то значение глобалке и будет тебе счастье знать, что всё закончилось успешно
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.