[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\

Комментарии