Добавлен
Почему невозможно писать кодом на ЛУА карту в Reforged?? Нельзя конвертировать в текст триггер...Что делать?

Конвертировать триггер в текст в режиме Lua действительно нельзя. Для этого создается специальный Custom Script блок
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
21
prog, поэтому я написал:
Если так заработает, то переместите потом туда, где у вас инициализируется всё остальное.
15
prog:
ScopteRectuS, Drulia_san, Вот только такая конструкция вызывается ДО инициализации и при срабатывании сборщика мусора триггеры созданые таким образом могут потеряться. Будете потом ловить странный сложно воспроизводимый баг "триггеры вдруг перестали работать, что делать". Поэтому нужен инжект в оригинальный процесс инициализации.
Сборщик мусора уничтожает луашные объекты и ссылки, объекты типа триггер, юнит и прочее - живут совсем в других местах, которые сборщик мусора не имеет права трогать, они уничтожаются по ссылке функциями типа DestroySomething Он может максимум обнулить глобальную ссылку на триггер gg_trg_MyTrigger, но сам триггер никто не зачистит. Он останется жив и будет работать, функции которые он дергает впитать в себя он уже успел, если вдруг триггер станет nil - на него просто нельзя будет получить ссылку, он останется изолирован в памяти, но по сути его трогать-то больше и не надо.
24
DopaMine, попробую пояснить более понятно:
В JASS функция InitTrig_PickHeroes это не какая-то магия или особый синтаксис, это просто функция. Чтобы функция работала нужно чтобы её кто-то вызвал. WE сам добавляет вызов функций инициализации каждого триггера внутрь скрытой от пользователя функции InitTriggers. Но в Lua этого не происходит т.к. мы не конвертировали гуи триггер, для которого автоматически добавится вызов функции инициализации, а создали блок кода. Поэтому надо самостоятельно вызывать InitTrig_PickHeroes.
И вот тут есть два способа
Первый - просто написать InitTrig_PickHeroes() после функции, не внутри, а после, там где в жассе ничего писать нельзя было - все что не обернуто в функции в Lua просто выполнится при старте карты. У этого способа есть большая проблема - он годится только для тестовых целей, а в реальной карте рано или поздно произойдет сбор мусора и созданные таким образом триггеры удалятся т.к. формально они созданы до инициализации и считаются мусором.
Второй - использовать хук, описаный в моей статье, которую я кидал выше ссылкой. С помощью хука мы добавляем код, который вызовется при выполнении другой функции, а именно - InitGlobals, которая является частью процесса инициализации и созданные там триггеры не считаются мусором и не исчезнут сами в случайный момент времени. Внутрь хука пишем либо сам код создания триггера либо вызов функции инициализации триггера, это уже дело вкуса.

Drulia_san, вот только экспериментально проверено и доказано - созданные до инициализации объекты умирают при сборке мусора. Это не теория, это практические результаты - в момент вызова сборщика у людей умирали триггеры, булэкспры, таймеры, если они были созданы до инициализации.
28
а именно - InitGlobals
Да можно и саму InitCustomTriggers переписать, внутри сделав вызов оригинала.
24
PT153, а разве InitTriggers выше пользовательского кода находится? Вроде из WE её только двухшаговым инжектом достать можно, если я правильно помню. А при внешнем сборщике лучше сразу main инжектить.
28
prog, верно, InitGlobals действительно большая находка, единственная функция, которая генерируется редактором и находится выше любого скрипта автора.
24
PT153, еще вполне можно хукать SetMapName и перехватывать двухшаговым инжектом почти все что угодно, кроме config, но это сложнее. Тут бы вдолбить людям в голову хотябы почему нельзя обойтись без хука InitGlobals...
33
Но в Lua этого не происходит т.к. мы не конвертировали гуи триггер, для которого автоматически добавится вызов функции инициализации, а создали блок кода. Поэтому надо самостоятельно вызывать InitTrig_PickHeroes.
А это так и должно быть? Выглядит костыльно.
28
Кет, костыльно делать из триггера блок кода, как до 1.31. В Lua режиме нельзя сконвертировать триггер в год.
24
Кет, а для меня костыльно выглядит необходимость инициализацию каждого триггера в отдельную функцию заворачивать в жассе.
Возможно, когда допилят кнопку конвертации гуи триггера в луа триггер - будет и этот магический "синтаксис" с автоматической записью функции инициализации в InitTriggers.
21
В идеале, имхо, в редакторе триггеров должен быть по дефолту триггер/блок кода с функцией config и main. Чтобы картостроитель сам решал, что ему нужно. Что-то подобное уже реализовано в стандартных мили картах, где есть триггер "Иниц. сражения", где создаётся всё необходимое. Естественно, нужно поставить запрет на удаление этих триггеров/блока кодов.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.