function Trig_PickHeroes_Actions()
local u = GetTriggerUnit()
if GetUnitTypeId(u) == 'O485' then
PickHayate(u)
Hayate(u)
--elseif
end
end
--===========================================================================
function InitTrig_PickHeroes()
gg_trg_PickHeroes = CreateTrigger( )
TriggerRegisterPlayerSelectionEventBJ( gg_trg_PickHeroes, Player(0), true )
TriggerAddAction( gg_trg_PickHeroes, Trig_PickHeroes_Actions() )
udg_hash = InitHashtable()
end
Проверьте синтаксис плз, правильно? А то почему-то ошибок нет, а кастом код не работает((
Как мне на луа обратиться к региону? На жассе это было gg_rct_Region_001. А как на ЛУА?
Ко всем равкодам нужно теперь добавлять FourCC('XXXX') чтобы из строки сделать обычное представление в виде integer
Ещё неравенство из != превращается в ~=
С регионами вроде бы всё по старому
Ко всем равкодам нужно теперь добавлять FourCC('XXXX') чтобы из строки сделать обычное представление в виде integer
Ещё неравенство из != превращается в ~=
С регионами вроде бы всё по старому
Спасибо! А где можно посмотреть все альтернативы джассу для LUA? Типо как на луа переводить из string в integer, из real в string и т.д.?
У меня всё равно не работает((
Вот код функции, которая вызывается:
--Выбор хаяте
function PickHayate(u)
local h = GetHandleId(u)
if LoadBoolean(udg_hash,h,StringHash("PickBoolean")) == false then
SetUnitPositionLoc( u, GetRectCenter(gg_rct_Hayate) )
PanCameraToTimedLocForPlayer( Player(0), GetRectCenter(gg_rct_Hayate), 0 )
SetUnitOwner( u, Player(0), false )
SaveBoolean(udg_hash,h,StringHash("PickBoolean"), true)
end
end
По синтаксису всё верно? Регион называется "Hayate"
Вот весь кастом код...
--Выбор хаяте
function PickHayate(u)
--local h = GetHandleId(u)
--if LoadBoolean(udg_hash,h,StringHash("PickBoolean")) == false then
SetUnitPositionLoc( u, GetRectCenter(gg_rct_Hayate) )
PanCameraToTimedLocForPlayer( Player(0), GetRectCenter(gg_rct_Hayate), 0 )
SetUnitOwner( u, Player(0), false )
--SaveBoolean(udg_hash,h,StringHash("PickBoolean"), true)
--end
end
function Trig_PickHeroes_Actions()
local u = GetTriggerUnit()
if GetUnitTypeId(u) == FourCC('O485') then
PickHayate(u)
--Hayate(u)
--elseif
end
end
--===========================================================================
function InitTrig_PickHeroes()
gg_trg_PickHeroes = CreateTrigger( )
TriggerRegisterPlayerSelectionEventBJ( gg_trg_PickHeroes, Player(0), true )
TriggerAddAction( gg_trg_PickHeroes, Trig_PickHeroes_Actions() )
udg_hash = InitHashtable()
end
Почему он может не работать?( Камера не переносится, владелец не меняется, перс не перемещается...
В луа не работает бредовый "синтаксис" когда кажддому триггеру создается функция инициализации т.к. не генерируется вызов этих функций, в отличии от жасса, в котором каждому триггеру автоматически генерируется функция инициализации и добавляется вызов этой функции в скрытую от пользователя общую функцию инициализации.
Рекомендую прочитать эту статью чтобы разобраться как обеспечить себе место в коде, которое выполнится при старте карты и куда можно добавить в том числе и инициализацию своего триггера.
Если лень читать статью про инжект точки входа, сделай так:
Создай гуи триггер с событием "Инициализация карты" (Map Initialization), добавь туда действие "Custom script" и вставь в текст скрипта это:
entryPoint()
Потом объяви где-то функцию entryPoint:
function entryPoint()
InitTrig_PickHeroes( )
end
И вызови из неё инит своего триггера, и руками туда добавляешь инит всех своих кастомных триггеров. Если у тебя есть общий код инициализации карты то функцию инициализации тоже вызови из entryPoint
В луа все триггеры ты создаешь вручную, инициализируешь вручную, вызываешь их инит тоже вручную как указано выше. Но глобальные переменные объявлять не надо если что, всё что не локалка - то глобалка.
ScopteRectuS, Drulia_san, Вот только такая конструкция вызывается ДО инициализации и при срабатывании сборщика мусора триггеры созданые таким образом могут потеряться. Будете потом ловить странный сложно воспроизводимый баг "триггеры вдруг перестали работать, что делать". Поэтому нужен инжект в оригинальный процесс инициализации.
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. Чтобы картостроитель сам решал, что ему нужно. Что-то подобное уже реализовано в стандартных мили картах, где есть триггер "Иниц. сражения", где создаётся всё необходимое. Естественно, нужно поставить запрет на удаление этих триггеров/блока кодов.
Как мне на луа обратиться к региону? На жассе это было gg_rct_Region_001. А как на ЛУА?
Ещё неравенство из != превращается в ~=
С регионами вроде бы всё по старому
У меня всё равно не работает((
Вот код функции, которая вызывается:
Вот весь кастом код...
В TriggerAdAction уберите еще скобки у второго аргумента.
Рекомендую прочитать эту статью чтобы разобраться как обеспечить себе место в коде, которое выполнится при старте карты и куда можно добавить в том числе и инициализацию своего триггера.
prog:
Ред. Drulia_san
Создай гуи триггер с событием "Инициализация карты" (Map Initialization), добавь туда действие "Custom script" и вставь в текст скрипта это:
Ред. Drulia_san
Ред. scopterectus
Ред. Drulia_san
В JASS функция InitTrig_PickHeroes это не какая-то магия или особый синтаксис, это просто функция. Чтобы функция работала нужно чтобы её кто-то вызвал. WE сам добавляет вызов функций инициализации каждого триггера внутрь скрытой от пользователя функции InitTriggers. Но в Lua этого не происходит т.к. мы не конвертировали гуи триггер, для которого автоматически добавится вызов функции инициализации, а создали блок кода. Поэтому надо самостоятельно вызывать InitTrig_PickHeroes.
И вот тут есть два способа
Первый - просто написать InitTrig_PickHeroes() после функции, не внутри, а после, там где в жассе ничего писать нельзя было - все что не обернуто в функции в Lua просто выполнится при старте карты. У этого способа есть большая проблема - он годится только для тестовых целей, а в реальной карте рано или поздно произойдет сбор мусора и созданные таким образом триггеры удалятся т.к. формально они созданы до инициализации и считаются мусором.
Второй - использовать хук, описаный в моей статье, которую я кидал выше ссылкой. С помощью хука мы добавляем код, который вызовется при выполнении другой функции, а именно - InitGlobals, которая является частью процесса инициализации и созданные там триггеры не считаются мусором и не исчезнут сами в случайный момент времени. Внутрь хука пишем либо сам код создания триггера либо вызов функции инициализации триггера, это уже дело вкуса.
Ред. PT153
Ред. PT153
Возможно, когда допилят кнопку конвертации гуи триггера в луа триггер - будет и этот магический "синтаксис" с автоматической записью функции инициализации в InitTriggers.
Ред. scopterectus