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\

Скачать плагин #ModToPlugin:



mtp.jar 15,35 Kb

Рекомендуем другие Моды:

Комментарии