, , Гильдия «Черамор»

WarCraft 3 Reforged: [Lua] Совместная работа над WC3 проектами

» Раздел: Основы
» Автор оригинала: NazarPunk
Рано или поздно любой разработчик (Даже в Вар3 модмейкинге) начинает работать в команде, и современные технологии, как всегда помогают облегчить этот процесс. И так встречайте, ультра дешовый, быстрый, крутой, современный, супер, бупер, дупер сборщик карт, на lua и для lua через обмен данных Гихаб.

Сheapack

Сборщик позволяет работать как на версии 131, так и на Reforged версии

Нам потребуется:

  1. Программа для работы с кодом - IntelliJ IDEA , устанавливаем отсюда
  2. Программа для работы с Git репозиториями
  3. Регистрация на Github и создание первого проекта
  4. Перевести карту в режим папки
  5. Установить Chepack
  6. Настройка конфигурационного файла build.lua под свой компьютер или под компьютер нескольких пользователей, если вы работаете в команде

Поехали

Когда все файлы и программы скачаны, чимичанги съедены и на кактусе не осталось колючек, можно приступить к настройке и объединению всего этого в 1 кучу запускаем IntelliJ IDEA и создаём новый проект по кнопке Get From Version Control
Если окно с запросом URL репозитория не открылось, и вас снова просят установить Git - перезагружаем компьютер, и пробуем ещё раз
В качестве URL будет ссылка на ГИТ вашего нового проекта, или проекта другого человека, с кем вы работает в команде
Ссылка будет выглядеть так
Если же вы работает первый раз, создаём новый проект
В итоге должно получиться вот так вот
И нажимаем кнопку
Clone
А потом Далее=>Далее =>Далее => Далее=>Готово (если не понимаете, что там от вас хотят)
в конечном итоге получится вот так:

Проект это просто папка

И её нужно немножко подготовить
Переименовываем нашу папку-карту в map.w3x и перемещаем в папку с проектом
Создаём папку src в ней будут храниться наши скрипты
Можно туда положить конфигурационный файл build.lua в конечном итоге получиться вот так:

Cheapack

Пришло время настроить сборщика!
Да, вот так всё плохо, кнопочку сделать всё хорошо придётся прикручивать самому
Распаковываем Chepack в любую удобную папку и создаём новую конфигурацию в Idea, нажав на Add Configuration
  1. Путь к файлу lua53.exe из папки cheapack-master
  2. Путь к проекту в котором мы работает
  3. Путь к build.lua
  4. Создать
И теперь чтобы запускать сборщика, достаточно нажать 1 на кнопку
Но скорее всего получите много ошибок, а это означает, что пришло время настроить конфигурационный файл

Настраиваем Build.lua

Рассмотрим сразу более сложный вариант, для работы с несколькими пользователями
» build.lua
local pack     = require 'cheapack'

local username = os.getenv('USERNAME')
local config   = {
	nazarpunk   = { -- необходимо указать реальное имя пользователя
		[[D:\Games\Warcraft III\x86_64]],
		[[C:\Users\nazarpunk\IdeaProjects\SF]]
	},
	Bergi       = { -- нескольких пользователей
		[[D:\Games\Blizzard\Warcraft III Beta\x86_64]],
		[[C:\Users\Bergi\IdeaProjects\SpellFighters]]
	},
	['Василий'] = { -- если у пользователя русское имя
		[[E:\Games\Warcraft III Beta\x86_64]],
		[[E:\Idea]]
	}
}
local param    = config[username]

pack.build(
		param[1], -- путь к Warcraft3
		param[2], -- путь к папке проекта
		'map.w3x',
		{
			'src', --поиск всех файлов в папке src
			--'src\\InitGlobals.lua',
			--'src\\3dBar.lua',
			--'src\\Entire.lua',
			--'src\\GameCore.lua',
			--'src\\SpellCastVMP.lua',
			--'src\\DamageSystem.lua',
			--'src\\Math.lua',
			--'src\\Period.lua',
			--'src\\AICast.lua',
		},
		'editor', -- game - для запуска игры, editor - для запуска редактора, любое другое значение - для простой сборки
		true-- true, если у вас Reforged, false, если у вас 131
)
Думаю тут всё интуитивно понятно, если указать напрямую имена файлов, а не просто путь к папке src, то файлы будут помещены в кастом код именно в этом порядке.
Если всё правильно, правильно, запустится игра или редактор, а в файле war3map.lua появиться обновлённый код из src
Если же нет, то внимательно читаем лог ошибок, и задаём вопросы в этой теме
При первой сборке укажите editor. Если всё правильно то в custom code карты появится собранный код, обязательно сохраните карту в редакторе, чтоб обновить war3map.lua. При последующих сборках код в war3map.lua будет заменяться автоматически и можно будет запускать карту в игре прям из IntelliJ IDEA

Так в чем же суть совместной работы?

Опыта как такового у меня совсем не много, я ещё не успел проникнуться всеми прелестями современных IDE
Но для того, чтобы ваш напарник получил ваш код (или же вы получили изменения, что внёс напарник), ну или просто вы сами поместили новый код в облако нужно просто...
нажать вот это
Но у вас не будет прав изменить файлы и папки в проекте (даже в своём), пока вы не авторизуетесь. Для своего проекта просто вводим учетные данные от сайта github.com, для чужого проекта, руководителю проекта необходимо добавить существующего другого пользователя

Просмотров: 1 169

» Лучшие комментарии


Это сообщение удалено
Hodor #2 - 2 месяца назад 1   
а где гуи?
NazarPunk #3 - 2 месяца назад 2   
а где гуи?
В редакторе триггеров.
tysch_tysch #4 - 2 месяца назад -3   
Непоянтно только зачем это объяснять + проблема совместной работы не в коде как правило, а в сборке карты. Вместо объектов — SLK (xml не запилили случаем?), модели и текстуры всегда пересохраняются полностью и так далее.
NazarPunk #5 - 2 месяца назад (отредактировано ) 1   
Непоянтно только зачем это объяснять
Смотря кому объяснять.
проблема совместной работы не в коде как правило, а в сборке карты
У меня какраз в коде, что я для себя этим сборщиком и решил.

В будущем думаю запилить конвертацию war3map.w3u/.w3t/.w3b/.w3d/.w3a/.w3h/.w3q в json и обратно, чтоб вообще редактор не открывать)
tysch_tysch #7 - 2 месяца назад -2   
Гоу пилить четвёртый
Msey #8 - 2 месяца назад 0
Тут пацаны скоро хгм2 запилят)
Это сообщение удалено
Nelloy #10 - 2 месяца назад (отредактировано ) 0
tysch_tysch, лови) С ограничениями, но с compiletime функцией, если есть интерес к подобному могу выложить еще и либу по редактированию w3u и w3a
Прикрепленные файлы
NazarPunk #11 - 2 месяца назад 0
Nelloy, что это и как им пользоваться?
Nelloy #12 - 1 месяц назад (отредактировано ) 0
NazarPunk, этот файл возвращает функцию Compile(src, dst). Функция ищет файл war3map.lua в папке src и выполняет его как обычный lua код. При этом на основе выполненных require (в файле war3map.lua, и в его зависимостях) создает список всех использованных файлов. Весь этот список объединяется в один файл war3map.lua и сохраняется в папке dst. Сохраняются они по следующему принципу:
package_files['package.name'] = function()
	...
end

package_files['other.package.name'] = function()
	...
end
Так же в игре становится доступна функция require, которая подгружает эти функции при первом использовании.
{src}/some/package.lua
local test = print
return test
{src}/wa3map.lua
local test = require('some.package')
...
function main()
	...
	test('Some text here.')
end
Такой код напечает 'Some text here.' при старте карты.
Так же в этом сборщике есть глобальные функции Compiletime(func, ...), IsCompiletime(), GetSrcDir(), GetDstDir(). они предназначены для работы с другими файлами карты.
Сейчас создание нового типа юнита выглядит так
local unit_type = Compiletime(function()
    ---@type ObjectEdit
    local ObjEdit = require('compiletime.ObjectEdit')
    local WeUnit = ObjEdit.Unit
    local unit_type = WeUnit.new(ObjEdit.getUnitId(), 'hfoo', 'JustDebugName')
    unit_type:setField(WeUnit.Field.Name, 'Paladin')
    unit_type:setField(WeUnit.Field.ArmorSoundType, 'Flesh')
    return unit_type:toRuntime()
end)
в конечном war3map.lua получается
local unit_type = {['name'] = 'JustDebugName',['id'] = 'x##$',['Name'] = 'Paladin',['base_id'] = 'hfoo',}
ScorpioT1000 #13 - 1 месяц назад 0
А можно было объединиться
Nelloy #14 - 1 месяц назад (отредактировано ) 1   
ScorpioT1000, командная разработка - крайне сложно огранизационно... Собрать команду, выбрать лидера, выбрать систему документирования кода. На данный момент ни EmmyLua, ни Lua 0.15.4 от sumneko не дают необходимых инструментов. Необходимо совместно разработать стандарт кодирования. А люди на добровольных неоплачиваемых началах не склонных уделять достаточное время подобным вещам. Нам всем гораздо интереснее процесс созидания, нежели грамотная его организация. А в связи с тем что сейчас идет бета тестирование, все разработанное может устареть с выходом релиза или даже просто нового патча.
NazarPunk #15 - 1 месяц назад 2   
А можно было объединиться
Объединиться можно всегда. Только подход к написанию кода у всех разный. Я исходил из критериев
  • никакой ереси с эмуляцией require и расширением языка
  • независимость от IDE
  • совместимость со стандартным редактором
  • простота в использовании
  • использование lua для сборки
Собрать команду, выбрать лидера
Если люди и так хотят объединиться, то с этим как-бы проблем нет.
На данный момент ни EmmyLua, ни Lua 0.15.4 от sumneko не дают необходимых инструментов.
Как то не дают? Есть же нотации
А люди на добровольных неоплачиваемых началах не склонных уделять достаточное время подобным вещам
Вообщето уделяют, когда у них тупо есть на это время.
Нам всем гораздо интереснее процесс созидания, нежели грамотная его организация.
Я бы не говорил за всех.
А в связи с тем что сейчас идет бета тестирование, все разработанное может устареть с выходом релиза или даже просто нового патча.
Как это lua сможет устареть?
Прикрепленные файлы
ScorpioT1000 #16 - 1 месяц назад 0
Но у нас всех есть вещи, которые повторяют друг друга. Можно было бы разбить на компоненты и выпускать разные конвейерные "сборки" продуктов. Как делают JetBrains с phpstorm / webstorm / pycharm - это просто разные компоновки с пересечениями наборов модулей.

Язык терминала и файловой системы один для всех языков. Не важно, на каком языке написано. Главное, чтобы можно было вызвать из консоли и передать нужные пути.

Когда будет свободное время, я протестирую все способы разработки и попробую найти что-то общее.
Nelloy #17 - 1 месяц назад 0
NazarPunk, может не у всех так, но у меня нотации от sumneko в vscode захлебываются и перестаются адекватно работать на примерно 50-70 файлах. Аналогично с EmmyLua в PyCharm. На счет подхода к написаю кода соглашусь. Что для тебя ересь (require или ООП на lua), то для меня наиболее адекватное решение. Lua, конечно, не устареет быстро, но вот выкатят близы патч с возможностью использовать несколько .lua файлов, и все системы сборки станут неактуальны.
NazarPunk #18 - 1 месяц назад 0
Но у нас всех есть вещи, которые повторяют друг друга. Можно было бы разбить на компоненты и выпускать разные конвейерные "сборки" продуктов.
С нашим свободным временем я бы выпускал одну мега сборку. Главное дать пользователю удобное API, а что под капотом уже неважно - лишь бы работало.
но у меня нотации от sumneko в vscode захлебываются и перестаются адекватно работать на примерно 50-70 файлах
Что для тебя ересь (require или ООП на lua), то для меня наиболее адекватное решение.
Так системе сборки на это по большому счёту плевать. Туда можно по вкусу всякой ереси добавить.
вот выкатят близы патч с возможностью использовать несколько .lua файлов, и все системы сборки станут неактуальны.
Учитывая тенденцию метелицы по выкатыванию полезных штук, врятли. Да и сборщики всёравно будут актуальны, например для добавления 100500 объектов в РО для какой-то системы/библиотеки/заклинания.


Запуск какрты из IDE тоже полезная штука, которую близы никак не добавят)
Прикрепленные файлы
ScorpioT1000 #19 - 1 месяц назад (отредактировано ) 0
Запуск какрты из IDE тоже полезная штука, которую близы никак не добавят)
Почему? Там есть аргумент loadfile
"C:\Games\Warcraft III\Warcraft III.exe" -loadfile "C:\Games\Warcraft III\Maps\(2)BootyBay.w3m"
NazarPunk #20 - 1 месяц назад (отредактировано ) 0
Почему? Там есть аргумент loadfile
Аргумент то есть, а вот путь к .exe из IDE как получить? Каждый раз вбивать ручками это гемморойно, особенно при совместной работе.
local config   = {
	nazarpunk   = { -- необходимо указать реальное имя пользователя
		[[D:\Games\Warcraft III\x86_64]],
		[[C:\Users\nazarpunk\IdeaProjects\SF]]
	},
	Bergi       = { -- нескольких пользователей
		[[D:\Games\Blizzard\Warcraft III Beta\x86_64]],
		[[C:\Users\Bergi\IdeaProjects\SpellFighters]]
	},
	['Василий'] = { -- если у пользователя русское имя
		[[E:\Games\Warcraft III Beta\x86_64]],
		[[E:\Idea]]
	}
}
ScorpioT1000 #21 - 1 месяц назад (отредактировано ) 0
В реестре HKEY_CURRENT_USER\Software\Blizzard Entertainment\Warcraft III InstallPath
NazarPunk #22 - 1 месяц назад 0
Прикрепленные файлы
ScorpioT1000 #23 - 1 месяц назад (отредактировано ) 0
Можно докопаться через
HKEY_CLASSES_ROOT\.w3x
=> HKEY_CLASSES_ROOT\w3x_auto_file
ScorpioT1000 #25 - 1 месяц назад (отредактировано ) 0
А ярлык поискать?
%ProgramData%\Microsoft\Windows\Start Menu\Programs\Warcraft III

Т.е. уже 2 решения есть:
Поискать installPath. Если нет, поискать ярлык. Если нет, вывести мессаг, что надо указать руками

x86 / x86_64 определять архитектурой ОС
Nelloy #26 - 1 месяц назад 2   
ScorpioT1000, проблема в том что нет ни одного способа, который однозначно даст верный результат
NazarPunk #27 - 1 месяц назад 0
А ярлык поискать?
Он ведёт на лаунчер и нет ярлыка редактора. Да и пользователь мог спокойно его прибить.
Прикрепленные файлы
ScorpioT1000 #28 - 1 месяц назад (отредактировано ) 0
Он ведёт на лаунчер и нет ярлыка редактора
Тогда придется ждать, когда человечество изобретёт substr =(

Nelloy, а зачем однозначный результат? Мы самолёт программируем?)
Nelloy #29 - 1 месяц назад 0
ScorpioT1000, да, иначе код будет работать только на третью ночь после Ивана Купалы.
Vlod #30 - 1 месяц назад 0
Почему путь нельзя подтягивать из конфигурационного файла?
ScorpioT1000 #31 - 1 месяц назад (отредактировано ) 0
Ты ошибаешься, это детектор, который работает в режиме semi-auto.
Есть определенное поведение: либо он точно нашёл папку (installPath, ярлык), либо точно не нашел и просит сконфигурить.
NazarPunk #32 - 1 месяц назад 0
Почему путь нельзя подтягивать из конфигурационного файла?
Потому что этот файл не нужен.
Zetox #33 - 4 дня назад 1   
Реально рабочий вариант. Теперь нет ненужной рутины - копировать код из внешнего редактора. Да и этот редактор нравится намного больше, чем visual code.
Bergi_Bear #34 - 4 дня назад 1   
Zetox, Добро пожаловать на борт
Это сообщение удалено