ScopteRectuS, Drulia_san, Вот только такая конструкция вызывается ДО инициализации и при срабатывании сборщика мусора триггеры созданые таким образом могут потеряться. Будете потом ловить странный сложно воспроизводимый баг "триггеры вдруг перестали работать, что делать". Поэтому нужен инжект в оригинальный процесс инициализации.
Сборщик мусора уничтожает луашные объекты и ссылки, объекты типа триггер, юнит и прочее - живут совсем в других местах, которые сборщик мусора не имеет права трогать, они уничтожаются по ссылке функциями типа DestroySomething Он может максимум обнулить глобальную ссылку на триггер gg_trg_MyTrigger, но сам триггер никто не зачистит. Он останется жив и будет работать, функции которые он дергает впитать в себя он уже успел, если вдруг триггер станет nil - на него просто нельзя будет получить ссылку, он останется изолирован в памяти, но по сути его трогать-то больше и не надо.
DopaMine, попробую пояснить более понятно:
В JASS функция InitTrig_PickHeroes это не какая-то магия или особый синтаксис, это просто функция. Чтобы функция работала нужно чтобы её кто-то вызвал. WE сам добавляет вызов функций инициализации каждого триггера внутрь скрытой от пользователя функции InitTriggers. Но в Lua этого не происходит т.к. мы не конвертировали гуи триггер, для которого автоматически добавится вызов функции инициализации, а создали блок кода. Поэтому надо самостоятельно вызывать InitTrig_PickHeroes.
И вот тут есть два способа
Первый - просто написать InitTrig_PickHeroes() после функции, не внутри, а после, там где в жассе ничего писать нельзя было - все что не обернуто в функции в Lua просто выполнится при старте карты. У этого способа есть большая проблема - он годится только для тестовых целей, а в реальной карте рано или поздно произойдет сбор мусора и созданные таким образом триггеры удалятся т.к. формально они созданы до инициализации и считаются мусором.
Второй - использовать хук, описаный в моей статье, которую я кидал выше ссылкой. С помощью хука мы добавляем код, который вызовется при выполнении другой функции, а именно - InitGlobals, которая является частью процесса инициализации и созданные там триггеры не считаются мусором и не исчезнут сами в случайный момент времени. Внутрь хука пишем либо сам код создания триггера либо вызов функции инициализации триггера, это уже дело вкуса.
Drulia_san, вот только экспериментально проверено и доказано - созданные до инициализации объекты умирают при сборке мусора. Это не теория, это практические результаты - в момент вызова сборщика у людей умирали триггеры, булэкспры, таймеры, если они были созданы до инициализации.
PT153, а разве InitTriggers выше пользовательского кода находится? Вроде из WE её только двухшаговым инжектом достать можно, если я правильно помню. А при внешнем сборщике лучше сразу main инжектить.
PT153, еще вполне можно хукать SetMapName и перехватывать двухшаговым инжектом почти все что угодно, кроме config, но это сложнее. Тут бы вдолбить людям в голову хотябы почему нельзя обойтись без хука InitGlobals...
Но в Lua этого не происходит т.к. мы не конвертировали гуи триггер, для которого автоматически добавится вызов функции инициализации, а создали блок кода. Поэтому надо самостоятельно вызывать InitTrig_PickHeroes.
Кет, а для меня костыльно выглядит необходимость инициализацию каждого триггера в отдельную функцию заворачивать в жассе.
Возможно, когда допилят кнопку конвертации гуи триггера в луа триггер - будет и этот магический "синтаксис" с автоматической записью функции инициализации в InitTriggers.
В идеале, имхо, в редакторе триггеров должен быть по дефолту триггер/блок кода с функцией config и main. Чтобы картостроитель сам решал, что ему нужно. Что-то подобное уже реализовано в стандартных мили картах, где есть триггер "Иниц. сражения", где создаётся всё необходимое. Естественно, нужно поставить запрет на удаление этих триггеров/блока кодов.
Показан только небольшой набор комментариев вокруг указанного.
Перейти к актуальным.
Ред. Drulia_san
В JASS функция InitTrig_PickHeroes это не какая-то магия или особый синтаксис, это просто функция. Чтобы функция работала нужно чтобы её кто-то вызвал. WE сам добавляет вызов функций инициализации каждого триггера внутрь скрытой от пользователя функции InitTriggers. Но в Lua этого не происходит т.к. мы не конвертировали гуи триггер, для которого автоматически добавится вызов функции инициализации, а создали блок кода. Поэтому надо самостоятельно вызывать InitTrig_PickHeroes.
И вот тут есть два способа
Первый - просто написать InitTrig_PickHeroes() после функции, не внутри, а после, там где в жассе ничего писать нельзя было - все что не обернуто в функции в Lua просто выполнится при старте карты. У этого способа есть большая проблема - он годится только для тестовых целей, а в реальной карте рано или поздно произойдет сбор мусора и созданные таким образом триггеры удалятся т.к. формально они созданы до инициализации и считаются мусором.
Второй - использовать хук, описаный в моей статье, которую я кидал выше ссылкой. С помощью хука мы добавляем код, который вызовется при выполнении другой функции, а именно - InitGlobals, которая является частью процесса инициализации и созданные там триггеры не считаются мусором и не исчезнут сами в случайный момент времени. Внутрь хука пишем либо сам код создания триггера либо вызов функции инициализации триггера, это уже дело вкуса.
Ред. PT153
Ред. PT153
Возможно, когда допилят кнопку конвертации гуи триггера в луа триггер - будет и этот магический "синтаксис" с автоматической записью функции инициализации в InitTriggers.
Ред. scopterectus