Чтение пакетов на клиенте, из мода.

Версия Minecraft
1.12.2
API
Forge
Здравствуйте пользователи McModding! Пытаюсь найти информацию по получению пакетов из кода мода.

В более новых версия насколько я понял есть event - PacketReceivedEvent. Но у меня 1.12.2 с Forge API 14.23.5

Большинство документаций включая ваш учебник ссылаются на создание собственных пакетов на стороне клиента.

Но меня интересует именно стандартный пакет под именем SPacketUpdateScore.

В логгере событий он выглядит вот так.

SPacketUpdateScore:
Server,SPacketUpdateScore,10:02:21.358,playerName:   §fДенег: §a§l34333$ objective: JampireBoard value: 6 action: CHANGE
Server,SPacketUpdateScore,10:02:21.359,playerName:   §fУбийств: §e§l7⚔ objective: JampireBoard value: 5 action: CHANGE
Server,SPacketUpdateScore,10:02:21.359,playerName:   §fСмертей: §c§l0✝ objective: JampireBoard value: 4 action: CHANGE

Самое близкое к чему смог подойти это - (пример кода). Но это совсем нерабочий вариант.

IMessageHandler? NotWorking!:
public class MoneyStatusUpdateListener implements IMessageHandler<SPacketUpdateScore, IMessage> {
    @Override
    public IMessage onMessage(SPacketUpdateScore message, MessageContext ctx) {
        if (!message.getPlayerName().contains('§fДенег')) {
            return null;
           }
        // Отправить статистику на БД
        return null;
    }
}
 
Решение
В общем я сам нашел решение. Оказалось на github есть неплохой вариант.

Вот чистый пример, как это можно сделать.

Регистрация класса:
MinecraftForge.EVENT_BUS.register(new MoneyStatus());

Класс MoneyStatus, загрузчик хука на пакеты:
public class MoneyStatus {
    @SubscribeEvent
    public void onClientConnectedToServer(FMLNetworkEvent.ClientConnectedToServerEvent event) {
        ServerData server = Minecraft.getMinecraft().getCurrentServerData();
        if (server == null) {
            return;
        }
        Minecraft minecraft = Minecraft.getMinecraft();
        if (!minecraft.isSingleplayer() && minecraft.getCurrentServerData() != null) {
            event.getManager().channel().pipeline().addBefore("fml:packet_handler", "test:packet_handler", new MessageHandler());
        }...
В общем я сам нашел решение. Оказалось на github есть неплохой вариант.

Вот чистый пример, как это можно сделать.

Регистрация класса:
MinecraftForge.EVENT_BUS.register(new MoneyStatus());

Класс MoneyStatus, загрузчик хука на пакеты:
public class MoneyStatus {
    @SubscribeEvent
    public void onClientConnectedToServer(FMLNetworkEvent.ClientConnectedToServerEvent event) {
        ServerData server = Minecraft.getMinecraft().getCurrentServerData();
        if (server == null) {
            return;
        }
        Minecraft minecraft = Minecraft.getMinecraft();
        if (!minecraft.isSingleplayer() && minecraft.getCurrentServerData() != null) {
            event.getManager().channel().pipeline().addBefore("fml:packet_handler", "test:packet_handler", new MessageHandler());
        }
    }
}

Класс MessageHandler, обработчик пакетов от сервера:
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import net.minecraft.network.play.server.SPacketUpdateScore;

public class MessageHandler extends ChannelInboundHandlerAdapter {
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        if (msg == null)
            return;
        if (msg instanceof SPacketUpdateScore) {
            SPacketUpdateScore score = (SPacketUpdateScore) msg;
            System.out.println("%SCORE% : " + score.getPlayerName());
        }
        super.channelRead(ctx, msg);
    }
}
 
Сверху