Как вы возможно знаете, в версии варкрафта на 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
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() {}
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.