Добавлен Drulia_san
Если пользоваться текущим стандартным редактором допустим, от 1.31 и переключиться на Луа, то у меня есть некоторые вопросы.
Во-первых как луа воспринимает номерные константы типа равкодов 'A0E5' ? Их синтаксис позволяет записывать без костылей?
Во-первых как луа воспринимает номерные константы типа равкодов 'A0E5' ? Их синтаксис позволяет записывать без костылей?
Во-вторых где точка входа? Начав писать на луа, ты пишешь с чистого места, нельзя создать триггер инициализации, который выполнит необходимый код и создаст нужные триггеры. Как создать инициализацию?
И втретьих, глобалки. Они не имеют типов, как их объявлять и где их объявлять так, чтоб в коде они работали как и глобалки в JASS? Не понятно если просто в глобальном пространстве написать например g_TestUnit = nil, то этой переменной все скрипты могут присваивать юнита и оно его сможет также нормально читать? И обязательно ли их здесь объявлять? Объясните пожалуйста
Принятый ответ
Ответ выше - для стандартного редактора WE. Однако, рекомендуется использовать с Lua внешний редактор кода и внешний же сборщик карты. Это чревато маленьким неудобством в виде необходимости запускать карту на проверку только из внешней программы т.к. запуск из WE будет без значительной части кода в карте, но дает огромное преимущество в виде несравнимо более удобной работы с кодом.
К сожалению, пока слишком мало информации об этом на сайте.
Вариант NazarPunk, пока без сборки карты, код придется копировать в карту вручную.
Мой вариант, пока не рабочий т.к. перед релизом нужно исправить несколько багов, но включает в себя и работу с кодом и сборку карты, не нужно вручную копировать код в карту.
Даже здесь на сайте есть еще пара вариантов, но мне лень их искать
И немного саморекламы, как выглядели бы ответы на вопрос выше при использовании моего тулсета
- Использовать макрос RAW('A0E5'), который превратит равкод в число при сборке карты.
- Инжект в функцию main, с заменой оригинальной функции main на свою и вызовом оригинальной функции изнутри нашей.
- Аналогично ответу на этот вопрос для чистого WE, но без объявления переменных в WE т.к. то уже не так удобно становится когда код во внешнем редакторе.
Теперь о точках входа и инжекте.
Луа позволяет делать такой финт ушами
do
local f = FunctionName -- записываем функцию в переменную
function FunctionName() -- заменяем оригинальную функцию своей
f() -- вызываем оригинальную функцию из переменной
-- здесь могла быть ваша реклама или ваш код
end
end
Это позволит нам сохранить оригинальную функцию в переменную, заменить оригинал своей функцией и вызвать оригинал из переменной. Применимо к любой функции, которая была объявлена раньше, не работает если функция объявлена после выполнения этого кода. Для создания точки входа отлично подходит InitGlobals, она всегда объявляется раньше кастомного кода в WE и вызывается из main.
У себя в коде я пользуюсь немного более сложным способом, этот код не будет работать в WE т.к. цепляет main, а не InitGlobals и не дает серьеных преимуществ перед описаным выше, привожу просто для расширения кругозора
local function InjectMain()
local alpha_main = main
return function()
local alpha_init = RunInitializationTriggers
RunInitializationTriggers = function() end
alpha_main()
InitLibraries() --моя функция, которая должна быть выполнена после всего, но до триггеров инициализации карты
alpha_init()
end
end
main = InjectMain()
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Ред. prog
Ред. PT153
Ред. prog