Этим утром я попал в частный случай, который никогда не случался со мной раньше. Я разрабатываю плагин для Minecraft с использованием API сервера Minecraft, который обычно называется NMS со ссылкой на имя его пакетов (например, net.minecraft.server.v1_13_R1 для версии 1.13).
Основная проблема с использованием API сервера minecraft заключается в том, что сложно написать код кросс-версии: в действительности имя пакетов меняется с каждой новой версией.
Когда плагин поддерживает только две версии, обычно проще использовать интерфейсы для написания двух разных кодов в зависимости от версии. Но когда вам нужно поддерживать дюжину разных версий (и это мой случай), это плохая идея (плагин будет слишком тяжелым, ему придется импортировать каждый jar в IDE, и мне придется переделывать код с каждой новой версией).
В этих случаях я обычно использую отражение, но я не думаю, что это возможно здесь:
packet = packetConstructor.newInstance(
new MinecraftKey("q", "q") {
@Override
public String toString() {
return "FML|HS";
}
},
packetDataSerializerConstructor.newInstance(Unpooled.wrappedBuffer(data)));
Как вы, наверное, догадались, MinecraftKey - это класс из NMS, и мне сказали использовать API динамического прокси Java. Я никогда не использовал это и хотел бы знать, если бы вы знали место, которое объяснило бы мне, как это сделать просто? Если вы знаете другой лучший метод, который меня тоже интересует!
Когда я думаю об этом, я думаю, что это действительно большая проблема для крошечного куска кода x)
РЕДАКТИРОВАТЬ:
Мой плагин использует PacketPlayOutCustomPayload (также называемые сообщениями плагинов) для связи с модами игроков. Это позволяет мне отправить сообщение (байт []) по определенному каналу (строка). Но в версии 1.13 эта строка была заменена на MinecraftKey (оболочка для строки, которая заменяет некоторые символы и требует использования ":"). Это создает проблему, когда игроки подключаются к 1.12 на моем сервере 1.13, поэтому у меня нет выбора: в этом случае мне нужно переопределить объект MinecraftKey.