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. Чтобы картостроитель сам решал, что ему нужно. Что-то подобное уже реализовано в стандартных мили картах, где есть триггер "Иниц. сражения", где создаётся всё необходимое. Естественно, нужно поставить запрет на удаление этих триггеров/блока кодов.
ScopteRectuS, ну а пока этого нет - в Lua есть инжекты, вполне решающие эту задачу. Функцию конфиг трогать руками это скорее для продвинутых разработчиков - работающим в WE и только в WE и так сгенерится приемлимый config на основе настроек карты, а для тех кому нужно больше в любом случае есть смысл переходить на внешнюю сборку карты.
В JASS функция InitTrig_PickHeroes это не какая-то магия или особый синтаксис, это просто функция. Чтобы функция работала нужно чтобы её кто-то вызвал. WE сам добавляет вызов функций инициализации каждого триггера внутрь скрытой от пользователя функции InitTriggers. Но в Lua этого не происходит т.к. мы не конвертировали гуи триггер, для которого автоматически добавится вызов функции инициализации, а создали блок кода. Поэтому надо самостоятельно вызывать InitTrig_PickHeroes.
И вот тут есть два способа
Первый - просто написать InitTrig_PickHeroes() после функции, не внутри, а после, там где в жассе ничего писать нельзя было - все что не обернуто в функции в Lua просто выполнится при старте карты. У этого способа есть большая проблема - он годится только для тестовых целей, а в реальной карте рано или поздно произойдет сбор мусора и созданные таким образом триггеры удалятся т.к. формально они созданы до инициализации и считаются мусором.
Второй - использовать хук, описаный в моей статье, которую я кидал выше ссылкой. С помощью хука мы добавляем код, который вызовется при выполнении другой функции, а именно - InitGlobals, которая является частью процесса инициализации и созданные там триггеры не считаются мусором и не исчезнут сами в случайный момент времени. Внутрь хука пишем либо сам код создания триггера либо вызов функции инициализации триггера, это уже дело вкуса.
Ред. PT153
Ред. PT153
Возможно, когда допилят кнопку конвертации гуи триггера в луа триггер - будет и этот магический "синтаксис" с автоматической записью функции инициализации в InitTriggers.
Ред. scopterectus
Ред. Кет