Если пользоваться текущим стандартным редактором допустим, от 1.31 и переключиться на Луа, то у меня есть некоторые вопросы.
Во-первых как луа воспринимает номерные константы типа равкодов 'A0E5' ? Их синтаксис позволяет записывать без костылей?
Во-вторых где точка входа? Начав писать на луа, ты пишешь с чистого места, нельзя создать триггер инициализации, который выполнит необходимый код и создаст нужные триггеры. Как создать инициализацию?
И втретьих, глобалки. Они не имеют типов, как их объявлять и где их объявлять так, чтоб в коде они работали как и глобалки в JASS? Не понятно если просто в глобальном пространстве написать например g_TestUnit = nil, то этой переменной все скрипты могут присваивать юнита и оно его сможет также нормально читать? И обязательно ли их здесь объявлять? Объясните пожалуйста

Принятый ответ

Ответ выше - для стандартного редактора WE. Однако, рекомендуется использовать с Lua внешний редактор кода и внешний же сборщик карты. Это чревато маленьким неудобством в виде необходимости запускать карту на проверку только из внешней программы т.к. запуск из WE будет без значительной части кода в карте, но дает огромное преимущество в виде несравнимо более удобной работы с кодом.
К сожалению, пока слишком мало информации об этом на сайте.
Вариант NazarPunk, пока без сборки карты, код придется копировать в карту вручную.

Мой вариант, пока не рабочий т.к. перед релизом нужно исправить несколько багов, но включает в себя и работу с кодом и сборку карты, не нужно вручную копировать код в карту.
Даже здесь на сайте есть еще пара вариантов, но мне лень их искать
И немного саморекламы, как выглядели бы ответы на вопрос выше при использовании моего тулсета
  1. Использовать макрос RAW('A0E5'), который превратит равкод в число при сборке карты.
  2. Инжект в функцию main, с заменой оригинальной функции main на свою и вызовом оригинальной функции изнутри нашей.
  3. Аналогично ответу на этот вопрос для чистого 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()
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
5 лет назад
0
Похожие вопросы:

ответ
но я так и не нашёл в каком чате он это показывал
ответ
В Lua есть таблицы, которые можно использовать как массивы. Читайте документацию Lua.

4
24
5 лет назад
Отредактирован prog
4
Один вопрос - одна тема, но в виде исключения отвечу на все раз уж вопросы по Lua.
  1. В Луа нет формата числа 'A0E5', для Lua это просто строка, как и любой другой текст в одинарных или двойных кавычках. Для превращения строки в равкод используется функция FourCC('A0E5').
  2. Самая ранняя точка входа - начало кода карты, он весь выполняется последовательно, но слишком рано, вроде еще в лобби. Вторая точка входа - функция main, она вызывается при старте игры, пока идет загрузка у всех игроков, отсюда вызывается триггер инициализации и здесь уже безопасно что-то делать, но до main добараться из WE нельзя, только пользуясь внешними редакторами. Для WE остается третий вариант - перехват функции InitGlobals и вставка туда своего кода. Как делать хук на InitGlobals расскажу или кину ссылку чуть позже.
  3. Переменные в луа не имеют явного типа, тип имеют только записаные в переменную значения - можно сперва записать туда юнита, а потом, хотя это и плохая практика, записать что-то другое когда юнит уже не нужен, например строку, или игрока или число. Глобалкам бесполезно присваивать nil, это равносильно "удалению" для глобальной переменной. Но, также, глобалки можно объявлять в любом месте - любая переменная без модификатора local является глобальной, любое присвоение глобальной переменной равносильно её объявлению. При работе с WE глобальные переменные лучше объявлять в WE, для этого близы даже новый способ ввели, их можно отдельными строками в списке триггеров держать, а не в одном уродливом окошке. Обращение к таким переменным, как и раньше, по имени udg_ИмяПеременной.
0
28
5 лет назад
Отредактирован PT153
0
'A0E5'
В Lua одинарные кавычки означают строку. Нужно либо вручную переводить равкоды в числа, либо воспользоваться встроенной функцией FourCC, которая сконвертирует строку в равкод во время выполнения.
0
24
5 лет назад
Отредактирован prog
0
Ответ выше - для стандартного редактора WE. Однако, рекомендуется использовать с Lua внешний редактор кода и внешний же сборщик карты. Это чревато маленьким неудобством в виде необходимости запускать карту на проверку только из внешней программы т.к. запуск из WE будет без значительной части кода в карте, но дает огромное преимущество в виде несравнимо более удобной работы с кодом.
К сожалению, пока слишком мало информации об этом на сайте.
Вариант NazarPunk, пока без сборки карты, код придется копировать в карту вручную.

Мой вариант, пока не рабочий т.к. перед релизом нужно исправить несколько багов, но включает в себя и работу с кодом и сборку карты, не нужно вручную копировать код в карту.
Даже здесь на сайте есть еще пара вариантов, но мне лень их искать
И немного саморекламы, как выглядели бы ответы на вопрос выше при использовании моего тулсета
  1. Использовать макрос RAW('A0E5'), который превратит равкод в число при сборке карты.
  2. Инжект в функцию main, с заменой оригинальной функции main на свою и вызовом оригинальной функции изнутри нашей.
  3. Аналогично ответу на этот вопрос для чистого 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()
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.