Добавлен prog,
опубликован
Как вы возможно знаете, в версии варкрафта на 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 может не взлететь.
Работоспособность НЕ ГАРАНТИРОВАНА! Качать на свой страх и риск. В архиве только x64 версия, под x86 может не взлететь.
ВАЖНО
Конфиг жассхелпера лучше складывать в "C:\Users\Username\Documents\Warcraft III Public Test\JassHelper\" иначе вар может в любой момент решить что надо выкачать оригинальный конфиг заново.
Конфиг жассхелпера лучше складывать в "C:\Users\Username\Documents\Warcraft III Public Test\JassHelper\" иначе вар может в любой момент решить что надо выкачать оригинальный конфиг заново.
Кто не знает как пользоваться директивой импорта в жассхелпере - сходите в документацию по vJass.
//! import "file.lua"
Пробел между ! и import обязателен! Двойные кавычки вроде тоже.
В планах на будущее - научить этот парсер конвертировать равкоды в числа в Lua коде при сохранении карты.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован ScorpioT1000
Лучше заняться пакетным менеджментом, ведь для луа уже есть такой luarocks.org
Я бы предложил сделать так, чтобы твой (пока) парсер умел его запускать, читать .rockspec и подгружать модули из luarocks.org/modules
Отредактирован prog
В результате важное уточнение для тех кто решит пользоваться этим костылем - конфиг жассхелпера лучше складдывать в "C:\Users\Username\Documents\Warcraft III Public Test\JassHelper\" - оттуда его тоже подтягивает, а инсталлер его там руками трогать не должен, по идее.
Это сработает только для mas as a directory, но всё же. Зато никаких хакингов и нарушения лицензии, чисто сторонняя тулза и чисто для твоего контента.
Отредактирован prog
Но если уж идти путем выстраивания среды разработки вокруг внешнего набора тулзов - можно что угодно там наворотить снаружи.
Отредактирован prog
С этим уже можно работать.
Отредактирован prog
Отредактирован ScorpioT1000
ПМ готов со всеми зависимостями и подкачкой, осталось билд дописать
Отредактирован ScorpioT1000