Добавлен nazarpunk,
опубликован
Раздел:
Триггеры и объекты
Предисловие
Как только вы разобрались, как настроить такую несомненно интересную вещь как UjAPI и решили использовать Warcraft III - Lua, неизбежно возникает вопрос - как организовать код?
Если с подсветкой в IDE разобраться не так уж и сложно, то что делать дальше?
Здесь то нам и пригодится одна весьма полезная функция:
require
function require(modname) end
Что-бы разобраться как она работает, создадим для примера карту 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
Послесловие
Проекты активно разрабатываются силами всего лишь нескольких человек и они не всегда успевают вовремя вносить в них правки. Так что не стесняйтесь поддерживать авторов рублём и писать комментарии.
Ваша поддержка очень важна!
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
Раскольник
10 месяцев назад
0
Обязательно до war3.exe указывать путь? У меня что-то с ним не пашет, только через Frozen Throne.exe, но с ним lua, кажется, не работает. Еще и лаунчер через раз запускается, приходить завершать процесс принудительно, в диспетчере задач.
0
nazarpunk
10 месяцев назад
0
WriteCoin,
- Если же у вас приложение не запускается, то скачайте и установите: .NET Framework 4.7.2.
- Если же ни в игре, ни в World Editor UjAPI не работает, то скачайте и установите: C++ Redistributables 2012
0
Раскольник
10 месяцев назад
0
Возможна только эта проблема?
Загруженные файлы
- image.png
- image_copy1.png
Чтобы оставить комментарий, пожалуйста, войдите на сайт.