[Core] #ModToPlugin
#ModToPlugin - библиотека.
Описание
#ModToPlugin - это библиотека для плагинов, которые могут взаимодействовать с модами. Без ничего она будет бесполезна для вас (конечно, если вы не разработчик).
Для разработчиков:
Итак, вы здесь
Что для вас это даёт?
Вы можете ловить/отправлять "сообщения" от Forge'а, что в итоге даёт возможность использовать некоторые моды как плагины
Как сделать простой пример:
Для начала, пихаем
depend: ModToPlugin
в plugin.yml для того чтобы ваш плагин был точно загружен после #ModToPlugin
Теперь, берём какой-либо мод, декомпилируем(Если вы не нуб, то знаете как это делается)
В нём ищем примерно такой код:
NetworkRegistry.INSTANCE.newSimpleChannel("Тут имя канала");
Находим имя канала в кавычках, затем создаём наш главный класс(Может быть JavaPlugin)
Пример:
public class XXX extends JavaPlugin implements ToPlugin {
public static XXX instance;
List<PacketBridge> bridges = new ArrayList<>(); // Не обязательно, но так мы экономим ресурсы процессора сервера
@Override
public void onEnable() {
instance = this;
bridges.add(new НАШ_ПАКЕТ()); // Заполним позже
MTP.registerPort(this); // Обязательно, это зарегистрирует нас как ToPlugin
}
@Override
public void onDisable() {
instance = null; // Вырубаем
MTP.unregisterPort(this); // Разрегистрируемся для корректного отключения(Может вы захотите использовать менеджер плагинов)
bridges.clear();
}
@Override
public List<PacketBridge> getBridges() {
return bridges;
}
@Override
public String getChannel() {
return "НАШ_КАНАЛ"; // ВАЖНО: Здесь заполняем канал для связи с модом
}
}
Итак, у нас есть главный класс, теперь нужно зарегистрировать сообщения
Находим код типо:
ПЕРЕМЕННАЯ_КАНАЛА_МОЖЕТ_БЫТЬ_РАЗНОЙ.registerMessage(A.class, A.class, 0, Side.SERVER);
Теперь расшифровываем это: A.class - Класс сообщения, его мы должны будем поставить заместо НАШ_ПАКЕТ в главном классе; 0 - id сообщения; Side.SERVER - Чисто символическое значение, пока для него нет применения(Может в Forge и есть, а в MTP - нет).
Итак, у нас есть класс A, нужно его переделать в PacketBridge
Примерное оригинальное содержание из A:
public class A implements IMessageHandler<A, IMessage> {
public A() {
}
@Override
public void fromBytes(ByteBuf buf) {
// Тут будет метод в оригинале
}
@Override
public IMessage onMessage(A packet, MessageContext ctx) {
// Тут будет обработка сообщения
return null;
}
@Override
public void toBytes(ByteBuf buf) {
// Тут будет метод в оригинале
}
}
Итак, выделяем из этого самое важное:
@Override
public IMessage onMessage(A packet, MessageContext ctx) {
// Тут будет обработка сообщения
return null;
}
Этот метод нам нужно будет изменить, меняем на:
@Override
public void handlePacket(PacketBridge arg0, Player player) {
A packet = (A) arg0;
// Меняем ctx.getServerHandler().player => player
// Если нужно отправить новый пакет: MTP.sendPacket(player, new ТУТ_ПАКЕТ(АРГУМЕНТЫ));
// sendToAll => for (Player p : Bukkit.getOnlinePlayers()) MTP.sendPacket(p, ПАКЕТ);
}
Этот метод переделали, теперь добавляем характеристики и изменяем superclass на PacketBridge
public class A extends PacketBridge {
public A() {
}
@Override
public void fromBytes(ByteBuf buf) {
// Тут будет метод в оригинале
}
@Override
public void handlePacket(PacketBridge arg0, Player player) {
A packet = (A) arg0;
// Меняем ctx.getServerHandler().player => player
// Если нужно отправить новый пакет: MTP.sendPacket(player, new ТУТ_ПАКЕТ(АРГУМЕНТЫ));
// sendToAll => for (Player p : Bukkit.getOnlinePlayers()) MTP.sendPacket(p, ПАКЕТ);
}
@Override
public void toBytes(ByteBuf buf) {
// Тут будет метод в оригинале
}
@Override
public byte getId() {
return 0; // Тут id, который мы узнали из регистрации сообщения
}
@Override
public Side getSide() {
return Side.SERVER; // Сторона
}
}
Итак, осталось только почистить import'ы (Eclipse сам покажет красным те, чего не существует в Bukkit)
Установка плагина #ModToPlugin
1) Запихнуть в сервер\plugins\
Комментарии