Добавлен , опубликован
Программы
Предназначение:
Работа с кодом
Версия игры: 1.26a
При помощи этой системы можно встроить в карту динамические библиотеки (Win32/DLL).
Это может помочь тем, кто не хочет писать сценарий карты на JASS, а предпочитает другие языки как: C, C++, Rust, Pascal... Если поднапрячься с загрузкой виртуальной машины, то можно использовать и языки вроде Python, Lua, Ruby, C#, Java.
Нет нужды просить игроков установить специальные лаунчеры — всё уже встроено в карту.

Работа системы

Сначала, предоставленный JASS-скрипт, используя уязвимости в виртуальной машине, выделяет исполняемую память и записывает туда мини-программу, которая распаковывает и загружает библиотеку "bin\Loader.dll", после чего вызывает её функцию "DoIt". Та же, в свою очередь, распаковывает и загружает библиотеки, перечисленные в списке "libraries" файла "config.json".
Когда игра собирается уничтожить главный поток JASS-скрипта, система выгружает все ранее загруженные библиотеки в обратном порядке и удаляет их файлы из временной директории.
Также чистка временного хранилища происходит при начале работы системы, на случай, если в прошлый раз мусор не был удален из-за нештатного завершения игры.
Поддерживается запуск множества экземпляров игры — у каждого процесса своё личное хранилище.
По завершению игры загрузчик остается в памяти, так как он не может выгрузить сам себя.
При запуске, система проверяет остался ли с прошлого раза висящий загрузчик и если обнаруживает такой, то выгружает его. Так что, они не будут накапливаться.

Установка

  • Скачайте архив и распакуйте куда-нибудь.
  • Импортируйте в карту "bin\Loader.dll" и "scripts\common.j".
  • Импортируйте в карту требуемые библиотеки.
  • Пропишите путь к своим библиотекам в "config.json" и импортируйте его тоже.
  • Скопируйте в карту код из "loader.j" (используется cjass).

Пример

Можете ознакомиться с моим примером:
  • pascal.w3x — карта со внедренными библиотеками.
  • ExampleSource.zip — исходники библиотеки со сценарием на FreePascal.
На карте создается толпа вражеских рабочих и один злой работник для вас.
Когда он смотрит на других, применяя свою способность, их разрывает в клочья.
Для работы с нативками используются JassAPI и RedirectCalls.

Генератор кода

В примере выше используется файл "jass_common_j.pas" сгенерированный на основе "common.j".
Прикладываю исходники генератора на python'е (зависит от funcparserlib) на случай, если кто-то захочет сгенерировать привязку для других языков.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
1
14
6 месяцев назад
1
Vampir_kolik, создание юнита для локального игрока вызовет десинк на любом языке.
На игровом клиенте красного игрока создается юнит, принадлежащий игроку красному, а на клиенте синего - синему. В итоге состояние мира отличается и они играют в разные игры.
В моём примере главный работник создается для красного игрока, а прочие для игроков 1-10.
Вижу, ты цитируешь старую версию исходников библиотеки со скриптом, советую скачать последнюю.
0
9
6 месяцев назад
0
А, как работать с общими данными для всех машин на одной машине?
1
14
6 месяцев назад
1
Библиотека с твоим скриптом загружается и исполняется паралельно у всех игроков.
Просто пиши код также, как ты делал это на JASS'е. Правила те же: все действия должны быть одинаковы на компьютерах всех игроков. Локально можно делать лишь некоторые, такие как смена цвета/размера юнита.
0
9
6 месяцев назад
0
То есть основная база данных должна быть на JASS'e?
1
14
6 месяцев назад
1
Хранить данные ты можешь где угодно и делать что захочешь до тех пор, пока состояние всех игровых клиентов одинаковое. И не важно, на C++ ты пишешь или же на JASS'е, в итоге, если ты сделал опасные изменения локально лишь у одного игрока, то его отсоединит от остальных.
Используй нативку GetLocalPlayer с осторожностью.
0
9
6 месяцев назад
0
Т.е. если писать бота, то только через чат обмениваться данными между ботами?
0
14
6 месяцев назад
0
Какими данными? Зачем?
Складывается такое впечатление, будто ты не писал прежде на JASS'е, а иначе почему даже простое создание юнита вызывает у тебя проблемы?
Попробуй сначала почитать статьи и сделать простенькую карту на нём или изучить уже существующие, а уже потом на C++ перейти как окрепнешь.
0
9
6 месяцев назад
0
Какими данными? Зачем?
Складывается такое впечатление, будто ты не писал прежде на JASS'е, а иначе почему даже простое создание юнита вызывает у тебя проблемы?
Попробуй сначала почитать статьи и сделать простенькую карту на нём или изучить уже существующие, а уже потом на C++ перейти как окрепнешь.
Переслать команду от одного ИИ другому ИИ помоги в таких то координатах и 4 точки переслать которые прописаны в DLL. Я так думаю только с помощью сообщений можно это сделать. Мне чистый бот на JASS'e не нужен.
0
14
6 месяцев назад
0
Зачем синхронизировать то, что и так есть на клиентах всех игроков?
Если скрипт на компьютере одного игрока решит, что нужно запросить помощь, то и на других компьютерах те прийдут к тому же выводу, ведь всё исполняется синхронно.
0
9
6 месяцев назад
0
Проблема с синхронизацией была в сишных потоках и __stdcall освобождал память после завершения функции.
0
9
6 месяцев назад
0
IceFog, а ты сможешь сделать перед запуском файла .json определитель ОС и разрядности архитектуры, чтобы запустить разные файлы .json. Это нужно для загрузки на машинах x86 библиотек x86 и x64 соответственно для функций <boost>.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.