Как вы возможно знаете, в версии варкрафта на PTR 1.31 добавилась возможность писать код на Lua и вместе с тем возник один неприятный нюанс - для этого необходимо отключить JassHelper, а значит ни импорт, ни инжекты ни vjass с Lua совершенно несовместимы.
Ложь, вранье и провокация! JassHelper исправно отрабатывает свой хлеб, беда в проверке синтаксиса через pjass, которая выполняется после него. Лечением этой проблемы мы сейчас и займемся.
Самым простым вариантом была бы замена pjass.exe а то и всего JassHelper-а чем-то своим, но беда в том, что они подписаны цифровым сертификатом и чем попало их не заменить. Но есть костыль - можно в настройках JassHelpera сказать что проверку синтаксиса должен делать кто-то другой вместо pjass, например программа-пустышка, которая закрывается сразу после старта. На этом все, проблема решена - карта успешно сохраняется, JassHelper работает, можно уничтожать Lua запихивая в него костыли на vJass.
Да вот фиг вам! Директива импорта рассчитана на jass и добавляет комментарии с информацией о том что же мы импортировали, комментарии естественно jass-стайл, что совершенно неприемлемо для импорта внутрь блока кода на Lua. Можно было бы забить и объявлять блоки луа кода внутри файлов, но такое не очень нравится внешним редакторам кода, ради которых обычно и затевается чехарда с импортом. Решение есть и довольно простое - добавить свой парсер, который будет находить такие комментарии и уничтожать их. И так уж получилось, что у нас какраз есть свободный слот под этот парсер - та самая программа-пустышка, которой мы заменяем pjass.
пример написаного на коленке парсера для этой цели
#include "pch.h"
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main(int argc, char* argv[])
{
	string tmpf = "tempwar3map.j";
    cout << "Hello Jass!\n"; 
	cout << argc << endl << argv[0]<<endl<< argv[1] << endl << argv[2] << endl << argv[3]<<endl;
	string inf = "logs/outputwar3map.j";// argv[1];

	ifstream infile(inf);
	ofstream outfile(tmpf);

	string line;
	bool lua = false;
	while (getline(infile, line)) {
		if (line.rfind("//!endusercode", 0) == 0) {
			lua = false;
		} else if (lua) {
			if (line.rfind("//", 0) == 0) {
				line.replace(0, 2, "--");
			}
		} else if (line.rfind("//!beginusercode", 0) == 0) {
			lua = true;
		}
		cout << line << endl;
		outfile<< line << endl;
	}
	infile.close();
	outfile.close();

	ifstream source(tmpf, ios::binary);
	ofstream dest(inf, ios::binary);

	istreambuf_iterator<char> begin_source(source);
	istreambuf_iterator<char> end_source;
	ostreambuf_iterator<char> begin_dest(dest);
	copy(begin_source, end_source, begin_dest);

	source.close();
	dest.close();
}
За код сильно не пинайте - писалось в перерывах между работой и по хорошему должно быть полностью переделано - задачу решает и ладно.
Для ленивых и рисковых - в архиве exe файл и конфиг жассхелпера. Складывать в папку жассхелпера в клиенте игры. Для удобства еще надо бы настроить пути поиска импорта, а то по по умолчанию он ищет файлы для импорта в "C:\Users\Username\Documents\Warcraft III Public Test\JassHelper\" если не указан полный путь, но это в следующий раз.
Работоспособность НЕ ГАРАНТИРОВАНА! Качать на свой страх и риск. В архиве только x64 версия, под x86 может не взлететь.
ВАЖНО
Конфиг жассхелпера лучше складывать в "C:\Users\Username\Documents\Warcraft III Public Test\JassHelper\" иначе вар может в любой момент решить что надо выкачать оригинальный конфиг заново.

Кто не знает как пользоваться директивой импорта в жассхелпере - сходите в документацию по vJass.
//! import "file.lua"
Пробел между ! и import обязателен! Двойные кавычки вроде тоже.

В планах на будущее - научить этот парсер конвертировать равкоды в числа в Lua коде при сохранении карты.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
37
5 лет назад
Отредактирован ScorpioT1000
0
научить этот парсер конвертировать равкоды в числа в Lua коде при сохранении карты.
Это совершенно не нужно, можно написать функцию, которая будет делать это из строки, но это user-level ответственность.

Вообще я за то, чтобы парсер не трогал юзер-левел.
Лучше заняться пакетным менеджментом, ведь для луа уже есть такой luarocks.org
Я бы предложил сделать так, чтобы твой (пока) парсер умел его запускать, читать .rockspec и подгружать модули из luarocks.org/modules

После этого надо очень сильно всё это дело пиарить на хайве, чтобы сделать мейнстримом. И написать всё надёжно и по стандартам. А то получится как с cJass.
0
24
5 лет назад
Отредактирован prog
0
ScorpioT1000, Ты немного путаеш задачи которые я решал этим костылем - я пилил мелкую утилиту для удобства пользования тем что есть, без наполеоновских планов. Все что она сейчас делает - исправляет мелкий косяк из-за которого невозможно было пользоваться JassHelper-ом одновременно с Lua. Запланированный конверт равкодов - задача того-же уровня - исправление мелкого недочета, который почти наверняка и так будет пофикшен.
А пакет менеджмент и пиар на хайве - это не моя задача от слова совсем. К её решению я бы подходил немного иначе - проталкивал бы близам через хайв обнову жассхелпера и фикс его уже существующей но слегка поломаной функциональности по подтягиванию внешних утилит.

О, еще сюда можно засунуть фикс краша при наличии %s в lua коде карты - тоже легко делается, а жизнь на PTR немного улучшит пока официального фикса нет.

А если кому-то хочется большего - вперед и с песней - найденный мной метод прост до боли - по тому что есть в посте можно за десять минут свою аналогичную утилиту запилить.
0
37
5 лет назад
0
Это не наполеоновский план, а наша реальность - тут вопрос, кто первый: либо они, либо мы.
0
7
5 лет назад
0
ScorpioT1000, но зачем, если это исправят (я надеюсь) в будущих патчах? Тратить столько сил на то, что мы увидели как бета-версию, ну такое себе
0
24
5 лет назад
0
ScorpioT1000, на меня не рассчитывай - я рабочий способ подсунуть код карты при сохранении в свой парсер нашел и расшарил, но дальше фикса мелких раздражающих лично меня вещей идти не намерен. Максимум - выложу финальный продукт когда-нибудь, если кому-то будут интересны мои мелкие фиксы, ну и подскажу что смогу если кто-то возьмется на основе этого метода свой парсер пилить и уткнется в проблемы.
PornoMishka, и ты тоже не прав - смысл в идее ScorpioT1000 есть - пакет менеджиент штука полезная и удобная. Был бы готовый, я бы тоже им пользовался, если бы я какой-то крупный проект или несколько вел. Но, чего таить - вот прямо сейчас мне это не нужно и не интересно - мой интерес к вару3 сейчас на уровне "пойти потыкать как оно теперь работает с Lua, может заодно какая-нибудь карта получится" - отсюда и быстрый костыльный фикс выедающей мозг проблемы импорта внешних файлов кода при сохранении - замахался я руками код переносить из vscode.

Сегодня вар обрадовал меня необходимостью запустить инсталлер и привести его в тот вид в каком его хотят видеть близы.
В результате важное уточнение для тех кто решит пользоваться этим костылем - конфиг жассхелпера лучше складдывать в "C:\Users\Username\Documents\Warcraft III Public Test\JassHelper\" - оттуда его тоже подтягивает, а инсталлер его там руками трогать не должен, по идее.
4
24
5 лет назад
4

В связи с официальным выходом 131 - расходимся. Там теперь просто блочится жассхелпер в Lua режиме без каких бы то ни было альтернатив. Пора писать внешний скрипт, эх.
0
37
5 лет назад
0
prog, а что если сделать watcher, который будет брать war3map.lua и работать над конечным файлом?
Это сработает только для mas as a directory, но всё же. Зато никаких хакингов и нарушения лицензии, чисто сторонняя тулза и чисто для твоего контента.
0
24
5 лет назад
Отредактирован prog
0
ScorpioT1000, есть простой до боли вариант, но он, имхо, менее удобен в использовании. Пилим внешний скрипт который выполняет сборку карты и запуск варкрафта/редактора по необходимости, прикручиваем это к среде разработки, получаем возможность удобно работать с кодом и чуть менее удобно со всем остальным. Есть даже готовые решения, хотя я бы их напильником доработал очень сильно прежде чем в руки брать.
Но если уж идти путем выстраивания среды разработки вокруг внешнего набора тулзов - можно что угодно там наворотить снаружи.
0
37
5 лет назад
0
Короче кто-то всё за нас сделал уже, лол github.com/nvs/map
0
24
5 лет назад
Отредактирован prog
0
Начал пинать ногами вот этот плагин к vscode
Пока нашел у него темплейты по которым он собирает код карты и выпилил оттуда все лишнее, чтобы он не занимался ерундой изображая пакет менеджмент и просто собирал в один файл по очереди код карты и все наши кастомные lua файлы.
С этим уже можно работать.
Потом попробую его еще кастомизировать по своему, но пока и так сойдет.
0
7
5 лет назад
0
В связи с официальным выходом 131 - расходимся
Так ничего не изменилось - перенесли PTR на основной клиент и все.
0
24
5 лет назад
0
PornoMishka, поясни мне тогда такому глупому, почему стало вот так в Lua режиме, если ничего не изменилось.
Загруженные файлы
0
7
5 лет назад
0
prog, хм, я просто по чейджлогу прошелся, ну ладно, признаю, что не прав.
0
37
5 лет назад
0
Менеджер модулей между тем запилил: github.com/Indaxia/wc3-wlpm-module-manager
Продолжаю делать сам wlpm
0
24
5 лет назад
Отредактирован prog
0
ScorpioT1000, и набуя весь этот оверинжениринг, будто энтерпрайз приложение какое-то писать собрались командой в десять человек, а не карту для варкрафта?
0
37
5 лет назад
Отредактирован ScorpioT1000
0
Его будет включать менеджер пакетов, из коробки.
ПМ готов со всеми зависимостями и подкачкой, осталось билд дописать
0
24
5 лет назад
0
ScorpioT1000, я все понимаю, кроме одного - зачем? Зачем это все в рантайме делать, если оно должно в компайл-тайме работать в реалиях вара, чтобы от него смысл был.
0
37
5 лет назад
Отредактирован ScorpioT1000
0
prog, это дело не 2 дней) будут и транспайлеры, я думаю, но пока это дорого
function asd() {}
Чтобы оставить комментарий, пожалуйста, войдите на сайт.