Раздел:
Триггеры и объекты

Предисловие

Как только вы разобрались, как настроить такую несомненно интересную вещь как UjAPI и решили использовать Warcraft III - Lua, неизбежно возникает вопрос - как организовать код?
Если с подсветкой в IDE разобраться не так уж и сложно, то что делать дальше?
Здесь то нам и пригодится одна весьма полезная функция:

require

function require(modname) end
Для начала, необходимо настроить UjAPI, что-бы можно было запускать lua в DevMode.
Что-бы разобраться как она работает, создадим для примера карту MyAwesomeMap.w3x. Для работы lua в корне карты должен быть файл war3map.lua. Так что создадим его с таким содержимым и положим в карту
printc(package.path)
Если всё работает как нужно, то в консоли, запустившейся вместе с игрой, вы должны увидеть следущее:
D:\Warcraft III\lua\?.lua;
D:\Warcraft III\lua\?\init.lua;
D:\Warcraft III\?.lua;
D:\Warcraft III\?\init.lua;
D:\Warcraft III\..\share\lua\5.4\?.lua;
D:\Warcraft III\..\share\lua\5.4\?\init.lua;
.\?.lua;
.\?\init.lua
Это пути, по которым lua будет искать файл для подключения, заменяя ? на переданный путь. Поиск будет прекращён при первом нахождении файла.
Учтите, что D:\Warcraft III это путь к игре у меня. У вас он может отличаться.
Из всего вышеперечисленного, нас интересуют только эти адреса:
D:\Warcraft III\lua\?.lua;
D:\Warcraft III\lua\?\init.lua;
Заменим содержимое war3map.lua на следующее:
require 'MyAwesomeMap.main'
При запуске карты, игра будет искать файлы по следующим путям:
D:\Warcraft III\lua\MyAwesomeMap\main.lua;
D:\Warcraft III\lua\MyAwesomeMap\main\init.lua;
Как мы видим, точка заменяется на разделитель директорий. Поэтому не используйте точку в пути, если не хотите постигнуть всю прелесть костылей.
Создадим папку D:\Warcraft III\lua\MyAwesomeMap и выложим её на GitHub для контроля версий и бэкапов.
Создадим в ней файл main.lua из которого и будем подключать остальные файлы. Заполним его содержимым:
printc 'main.lua'
require 'MyAwesomeMap.test'
Так же, для дальнейших примеров, создадим test.lua:
printc 'test.lua'
При запуске карты в консоли должно появиться следущее:
main.lua
test.lua
Если вы всё сделали правильно, то можно переходить к

package.loaded

Все вызовы require кешируются и вы можете легко проверить, загружен ли модуль:
main.lua:
printc 'main.lua'

printc(package.loaded['MyAwesomeMap.test'])
require 'MyAwesomeMap.test'
printc(package.loaded['MyAwesomeMap.test'])
test.lua:
printc 'test.lua'
Console:
main.lua
nil
test.lua
true
Как видим, второй вызов printc(package.loaded['MyAwesomeMap.test']) вернул true, но можно возвращать любое значение использовав

return

В lua решили не изобретать велосипед и переиспользовать return вместо унылого export.
main.lua:
local a, b = require 'MyAwesomeMap.test'
printc(a)
printc(b)
printc(package.loaded['MyAwesomeMap.test'])
test.lua:
return 1, 2
Console:
1
D:\Warcraft III\lua\MyAwesomeMap\test.lua
1
Как видим, в отличие от функций, множественный return недоступен, поэтому рекомендуется использовать

Модули

По сути модуль это обычная таблица, которая удобно помещена в отдельный файл.
main.lua:
local a = require 'MyAwesomeMap.test'
a.test();
test.lua:
local module = {}

function module.test()
    printc 'test module'
end

return module
Console:
test module
О поставляемых UjAPI модулях можно прочитать здесь.

Послесловие

Проекты активно разрабатываются силами всего лишь нескольких человек и они не всегда успевают вовремя вносить в них правки. Так что не стесняйтесь поддерживать авторов рублём и писать комментарии.
Ваша поддержка очень важна!
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
1
10 месяцев назад
0
Обязательно до war3.exe указывать путь? У меня что-то с ним не пашет, только через Frozen Throne.exe, но с ним lua, кажется, не работает. Еще и лаунчер через раз запускается, приходить завершать процесс принудительно, в диспетчере задач.
0
29
10 месяцев назад
0
WriteCoin,
  • Если же у вас приложение не запускается, то скачайте и установите: .NET Framework 4.7.2.
  • Если же ни в игре, ни в World Editor UjAPI не работает, то скачайте и установите: C++ Redistributables 2012
0
1
10 месяцев назад
0
Возможна только эта проблема?
Загруженные файлы
Чтобы оставить комментарий, пожалуйста, войдите на сайт.