Перехват и обработка пакета от мода

Версия Minecraft
1.7.10
78
3
10
Здрасте, ребят.
Есть сервер 1.7.10 KCauldron/Thermos, есть ProtocolLib, есть понимание как перехватывать/отменять/изменять пакеты стандартного протокола майна в плагине.
Есть мод БиблиоКрафт, и мне нужно среагировать на некоторые его пакеты. Причем, часть из них оставить без изменений, часть по условию изменить перед передачей серверному моду, а часть просто отменить. Соответственно нужно реагировать и на имя канала и на имя обёртки.

Я нашел в ведерке интерфейс PluginMessageListener, но он не предоставляет доступ к самому ивенту, и не позволяет изменить пакет.

Вопрос: Как, используя ProtocolLib или штатные механики Bukkit, сделать задуманное? Код писать за меня не нужно, просто ткнуть носом в способ создания PacketAdapter или в штатный интерфейс ведерка - дальше сам разберусь, думаю.

Из клиентского мода пакет отправляется примерно так:
Java:
BiblioCraft.ch_BiblioClipboard = NetworkRegistry.INSTANCE.newEventDrivenChannel("BiblioUpdateInv");
BiblioCraft.ch_BiblioClipboard.sendToServer(new FMLProxyPacket(buffer, "BiblioUpdateInv"));
 
78
3
10
Не лучше ли пропатчить библио?
Вероятно. Это я оставил на крайний случай.
Но пропатчить выйдет только джавассистом, перекомпилить не вариант в моём случае.
На самом деле хочется именно в одном месте собрать все эти проверки протокола, дело не только в библиокрафте, там куча дыр и уязвимостей.
 
78
3
10
Кстати, можно же зарегать модов слушатель на канал и ловить CustomPacketEvent.
Я о таком думал. Но проблема в том, что у меня плагин, а не мог. FML не дает повесить слушателя, потому что не может определить вызывающий мод. А колбасить загрузку фейкового мода вместе с плагином мне не кажется удачным решением - лучше уж тогда весь CUSTOM_PAYLOAD слушать.
 
78
3
10
Дошли руки разобраться. Публикую на случай, если еще кому-то понадобится.
Итак, пакеты каналов нетти и форджа реализованы через клиентский пакет 250 CUSTOM_PAYLOAD, причем все.
Первая строка пакета - имя канала, по которому передается пакет. С помощью ProtocolLib можно вычитать и строку и буфер.
Код на Котлине, но транслировать в джаву проблем не должно быть.

Kotlin:
        private val pcksPlayingFromClient: PacketAdapter = object : PacketAdapter(plugin, ConnectionSide.CLIENT_SIDE, GamePhase.PLAYING, 250) {
            override fun onPacketReceiving(event: PacketEvent) {
                when (event.packet.strings.readSafely(0) as String) {
                    "Waila" -> return // Just spam, not interesting
                    "BiblioRBookLoad" -> {
                        val buffer = Unpooled.buffer().writeBytes(event.packet.byteArrays.readSafely(0)).readerIndex(0)
                        val x = buffer.readInt()
                        val y = buffer.readInt()
                        val z = buffer.readInt()
                        val id = buffer.readInt()
                        HGamesPlugin.warn("BiblioRBookLoad: x=${x}, y=${y}, z=${z}, id=${id}")
                        HGamesPlugin.broadcast("${CC.lightPurple}Player ${event.player.name} using BiblioRBookLoad/FancyWorktable ${CC.gray}{$x $y $z}", true)
                    }
                    //else -> HGamesPlugin.info("Pck: $first")
                }
            }
        }
 
Сверху