ФЭНДОМ


В этой статье описаны основные шаги по созданию пользовательского мода для игры Aurora RL. В качестве примера приведен простой мод, добавляющий возможность найти в одной из звездных систем обломки корабля, в которых содержится полезный предмет.

Данный мод-пример уже включен в игру, его исходный код можно посмотреть в репозитории в папке sample_mod

Требования Править

Для создания модов вам понадобится:

  • Java SDK и среда разработки (например Intellij Idea или Eclipse)
  • Файл aurora.jar содержащий классы игры, находится в папке lib в директории куда игра установлена

Структура мода Править

Мод для Aurora RL имеет следующую структуру:

Mod structure

В папке lib хранятся jar-файлы с кодом мода и необходимых для его работы дополнительных библиотек.

В папке resources хранятся ресурсы мода: изображения, звуки, файлы с конфигурацией. Папка resources будет добавлена в classpath, так что к находящимся там файлам можно будет получить доступ через getResourceAsStream().

Здесь же может находиться дефолтный конфигурационный файл mod.properties. Это обычный файл properties, доступ к которому из кода упрощен специальными методами-обертками, так что это наилучшее место для хранения текстовой конфигурации мода.

manifest.json содержит описание мода: его название, версию и полное имя главного класса. Для тестового мода он выглядит как

{
"modName": "Sample Mod",
"modVersion": "0.1",
"mainClassName": "ru.game.aurora.modding.sample.SampleMod"
}

Главный класс Править

Главный класс мода указывается в манифесте и должен реализовывать интерфейс ru.game.aurora.modding.ModInterface. Этот интерфейс определяет три основных метода, вызываемых игрой в ключевые моменты. А именно при загрузке мода, при создании новой игры и при загрузке существующей.

Используя эти нотификации мод может влиять на игровой мир, например при создании новой игры добавить какие-то новые игровые объекты (корабли инопланетян, артефакты или целые звездные системы).

При загрузке уже созданной игры мод может проверить, что все эти дополнения в ней уже есть и добавить их при необходимости (например если загруженная игра была создана еще без участия данного мода). Именно этим и занимается главный класс SampleMod

package ru.game.aurora.modding.sample;

import ru.game.aurora.modding.ModException;
import ru.game.aurora.modding.ModInterface;
import ru.game.aurora.world.GameEventListener;
import ru.game.aurora.world.World;


public class SampleMod implements ModInterface {
@Override
public void onModLoaded() throws ModException {

}

@Override
public void onNewGameStarted(World world) throws ModException {
/**
* Добавляем слушателя игровых событий, который будет отслеживать факт посещения игроком новой звездной системы
*/
world.addListener(new SampleModEventListener());
}

@Override
public void onGameLoaded(World world) throws ModException {
}
}

Вся реальная игровая логика содержится в SampleModEventListener, который является слушателем игровых событий (паттерн Listener)

Игровые события Править

Игра позволяет модам отслеживать различные события: что игрок приземлился на планету, покинул звездную систему, атаковал противника и т.п.

Для того чтобы подписаться на игровые события необходимо отнаследоваться от класса GameEventListener, переопределить необходимые методы, а затем зарегистрироваться с помощью world.addListener().

У каждого слушателя есть protected-член isAlive. Объекты с isAlive = false автоматически удаляются игрой, поэтому когда ваш слушатель вам более не нужен - установите это свойство.

Для реализации нашего простейшего мода нам понадобится отслеживать событие входа в звездную систему. Приведем полный код SampleModEventListener с комментариями:


public class SampleModEventListener extends GameEventListener {
public SampleModEventListener() { // Задаем группу, к которой принадлежит данный слушатель // Это необязательное действие. Только один слушатель из группы может внести изменения в игровой мир в ответ на одно событие // Это может использоваться для того чтобы несколько случайных встреч не происходили одновременно
setGroups(EventGroup.ENCOUNTER_SPAWN);
}

// Этот метод будет вызван игрой когда игрок переходит со звездной карты в систему
@Override
public boolean onPlayerEnterStarSystem(World world, StarSystem ss) {
// Проверяем не является ли эта система квестовой, например родным миром инопланетян. // В таких системах случайные события обычно не должны появляться
if (ss.isQuestLocation()) {
return false;
}

// Проверяем что в данную систему игрок входит впервые
if (ss.isVisited()) {
return false;
}

// Итак система нам подходит, бросим кости и проверим, повезло ли игроку // Данная строчка читает свойство spawn_chance из дефолтного конфигурационного файла mod.properties, лежащего в папке resources мода
final String stringValue = ModManager.getModConfiguration(this).getProperty("spawn_chance");
double probability = Double.parseDouble(stringValue);


if (CommonRandom.getRandom().nextDouble() >= probability) {
// Не повезло
return false;
}

// Повезло, создаем объект "обломки корабля" и вкладываем в него один предмет "энергетическая установка" производства Борков
SpaceDebris.ItemDebris debris = new SpaceDebris.ItemDebris(new ShipLootItem(ShipLootItem.Type.ENERGY, BorkGenerator.NAME));

// Размещаем обломки на случайную свободную клетку в системе, в пределах от 0.1 до 0.3 ее радиуса от центра
ss.setRandomEmptyPosition(debris, 0.1, 0.3);

// Собственно добавляем обломки в список игровых объектов, с этого момента они начнут рисоваться и обновляться
ss.getObjects().add(debris);
// Извещаем игру что слушатель свою работу выполнил и более не нужен. // Если эту строчку убрать то он останется и будет делать то же самое при входе в каждую последующую подходящую систему
isAlive = false;
// Поскольку мы изменили состояние мира то должны вернуть true
return true;
}
}

Править

Сборка и установка мода Править

После написания всего необходимого кода, создания ресурсов и заполнения manifest.json все это необходимо расположить в порядке, указанном в разделе "Структура проекта". Полученную папку затем нужно поместить в папку mods в корне игры.

Игра автоматически загружает все моды из mods, так что все что надо сделать игроку - скачать ваш архив и распаковать его себе в mods.