Пакетная система

Версия Minecraft
1.16.5
API
Forge
10
0
Здравствуйте товарищи, начал писать мод для одного прибора чтобы взаимодействие с миром майнкрафта было более красочным...
Нужно сделать чтобы при поломки блока данные отправлялись к персонажу поломавшему блок. Понимаю что нужно использовать пакетную систему, так как ивент поломки блока, видимо, находится на сервере и надо чтобы сервер отправлял месседж клиенту и потом эти данные я к примеру выведу для отладки в консоль. Но к сожалению пока в тупике. Причем реализацию для однопользовательского режима сделал, но все ломается как только персонаж теряет свою уникальность

Сам ивент
Event:
@SubscribeEvent
    public static void onBlockBreak(final BlockEvent.BreakEvent event)
    {
        String playerName = event.getPlayer().getName().getString();
        String block = event.getState().getBlock().asItem().toString();

        Packet.INSTANCE.send(PacketDistributor.TRACKING_CHUNK.with(()->event.getPlayer().getServer().), new ClientBoundBlock(event.getPos()));
    }

Класс пакета
Packet:
public final class Packet
{
    private static final String PROTOCOL_VERSION = "1";

    public static final SimpleChannel INSTANCE = NetworkRegistry.newSimpleChannel(
            new ResourceLocation(EmptyMod.MOD_ID, "main"), () -> PROTOCOL_VERSION,
            PROTOCOL_VERSION::equals, PROTOCOL_VERSION::equals);

    private Packet(){}

    public static void init()
    {
        int index = 0;
        INSTANCE.messageBuilder(ServerBoundBlock.class, index, NetworkDirection.PLAY_TO_SERVER)
                .encoder(ServerBoundBlock::encode).decoder(ServerBoundBlock::decode)
                .consumer(ServerBoundBlock::handle).add();
        INSTANCE.messageBuilder(ClientBoundBlock.class, index++, NetworkDirection.PLAY_TO_CLIENT)
                .encoder(ClientBoundBlock::encode).decoder(ClientBoundBlock::decode)
                .consumer(ClientBoundBlock::handle).add();
    }

}

Класс клиента
ClientBoundBlock:
public class ClientBoundBlock
{
    public final BlockPos blockPos;

    public ClientBoundBlock(BlockPos blockPos)
    {
        this.blockPos = blockPos;
    }

    public ClientBoundBlock(PacketBuffer buffer)
    {
        this(buffer.readBlockPos());
    }

    public void encode(PacketBuffer buffer)
    {
        buffer.writeBlockPos(this.blockPos);
    }

    public static ClientBoundBlock decode(PacketBuffer buffer)
    {
        return new ClientBoundBlock(buffer.readBlockPos());
    }

    public boolean handle(Supplier<NetworkEvent.Context> ctx)
    {
        final AtomicBoolean success = new AtomicBoolean(false);
        ctx.get().enqueueWork(()->{
            DistExecutor.unsafeRunWhenOn(Dist.CLIENT,
                    () -> () -> success.set(true));

            System.out.println("Server watch breaking block!!!");
        });

        ctx.get().setPacketHandled(true);
        return success.get();
    }
}

Класс сервера
ServerBoundBlock:
public class ServerBoundBlock
{
    public final BlockPos blockPos;

    public ServerBoundBlock(BlockPos blockPos)
    {
        this.blockPos = blockPos;
    }

    public void encode(PacketBuffer buffer)
    {
        buffer.writeBlockPos(this.blockPos);
    }

    public static ServerBoundBlock decode(PacketBuffer buffer)
    {
        return new ServerBoundBlock(buffer.readBlockPos());
    }

    public boolean handle(Supplier<NetworkEvent.Context> ctx)
    {
        final AtomicBoolean success = new AtomicBoolean(false);
        ctx.get().enqueueWork(()->{
            System.out.println("Server watch breaking block!!!");
            success.set(true);
        });

        ctx.get().setPacketHandled(true);
        return success.get();
    }
}
 
Краш-лог
[18:32:31] [Server thread/FATAL] [minecraft/ThreadTaskExecutor]: Error executing task on Server
java.lang.NullPointerException: null
at net.minecraftforge.fml.network.PacketDistributor.lambda$playerConsumer$1(PacketDistributor.java:217) ~[forge-1.16.5-36.2.34_mapped_snapshot_20210309-1.16.5-recomp.jar:?] {re:classloading}
at net.minecraftforge.fml.network.PacketDistributor$PacketTarget.send(PacketDistributor.java:179) ~[forge-1.16.5-36.2.34_mapped_snapshot_20210309-1.16.5-recomp.jar:?] {re:classloading}
at net.minecraftforge.fml.network.simple.SimpleChannel.send(SimpleChannel.java:124) ~[forge-1.16.5-36.2.34_mapped_snapshot_20210309-1.16.5-recomp.jar:?] {re:classloading}
at com.PoNi.emptymod.core.events.AromaEvents.onBlockBreak(AromaEvents.java:30) ~[main/:?] {re:classloading}
at net.minecraftforge.eventbus.ASMEventHandler_1_AromaEvents_onBlockBreak_BreakEvent.invoke(.dynamic) ~[?:?] {}
at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:85) ~[eventbus-4.0.0.jar:?] {}
at net.minecraftforge.eventbus.EventBus.post(EventBus.java:302) ~[eventbus-4.0.0.jar:?] {}
at net.minecraftforge.eventbus.EventBus.post(EventBus.java:283) ~[eventbus-4.0.0.jar:?] {}
at net.minecraftforge.common.ForgeHooks.onBlockBreakEvent(ForgeHooks.java:609) ~[forge:?] {re:classloading}
at net.minecraft.server.management.PlayerInteractionManager.tryHarvestBlock(PlayerInteractionManager.java:239) ~[forge:?] {re:classloading}
at net.minecraft.server.management.PlayerInteractionManager.func_229860_a_(PlayerInteractionManager.java:226) ~[forge:?] {re:classloading}
at net.minecraft.server.management.PlayerInteractionManager.func_225416_a(PlayerInteractionManager.java:155) ~[forge:?] {re:classloading}
at net.minecraft.network.play.ServerPlayNetHandler.processPlayerDigging(ServerPlayNetHandler.java:957) ~[forge:?] {re:classloading}
at net.minecraft.network.play.client.CPlayerDiggingPacket.processPacket(CPlayerDiggingPacket.java:50) ~[forge:?] {re:classloading}
at net.minecraft.network.play.client.CPlayerDiggingPacket.processPacket(CPlayerDiggingPacket.java:12) ~[forge:?] {re:classloading}
at net.minecraft.network.PacketThreadUtil.lambda$checkThreadAndEnqueue$0(PacketThreadUtil.java:19) ~[forge:?] {re:classloading}
at net.minecraft.util.concurrent.TickDelayedTask.run(TickDelayedTask.java:20) ~[forge:?] {re:classloading}
at net.minecraft.util.concurrent.ThreadTaskExecutor.run(ThreadTaskExecutor.java:139) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.util.concurrent.RecursiveEventLoop.run(RecursiveEventLoop.java:22) ~[forge:?] {re:classloading}
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:759) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:159) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.util.concurrent.ThreadTaskExecutor.driveOne(ThreadTaskExecutor.java:109) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.driveOneInternal(MinecraftServer.java:742) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.driveOne(MinecraftServer.java:736) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.util.concurrent.ThreadTaskExecutor.drainTasks(ThreadTaskExecutor.java:97) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.runScheduledTasks(MinecraftServer.java:721) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.func_240802_v_(MinecraftServer.java:668) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.lambda$startServer$0(MinecraftServer.java:233) ~[forge:?] {re:classloading,pl:accesstransformer:B}
Краш-лог:
[18:32:31] [Server thread/FATAL] [minecraft/ThreadTaskExecutor]: Error executing task on Server
java.lang.NullPointerException: null
	at net.minecraftforge.fml.network.PacketDistributor.lambda$playerConsumer$1(PacketDistributor.java:217) ~[forge-1.16.5-36.2.34_mapped_snapshot_20210309-1.16.5-recomp.jar:?] {re:classloading}
	at net.minecraftforge.fml.network.PacketDistributor$PacketTarget.send(PacketDistributor.java:179) ~[forge-1.16.5-36.2.34_mapped_snapshot_20210309-1.16.5-recomp.jar:?] {re:classloading}
	at net.minecraftforge.fml.network.simple.SimpleChannel.send(SimpleChannel.java:124) ~[forge-1.16.5-36.2.34_mapped_snapshot_20210309-1.16.5-recomp.jar:?] {re:classloading}
	at com.PoNi.emptymod.core.events.AromaEvents.onBlockBreak(AromaEvents.java:30) ~[main/:?] {re:classloading}
	at net.minecraftforge.eventbus.ASMEventHandler_1_AromaEvents_onBlockBreak_BreakEvent.invoke(.dynamic) ~[?:?] {}
	at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:85) ~[eventbus-4.0.0.jar:?] {}
	at net.minecraftforge.eventbus.EventBus.post(EventBus.java:302) ~[eventbus-4.0.0.jar:?] {}
	at net.minecraftforge.eventbus.EventBus.post(EventBus.java:283) ~[eventbus-4.0.0.jar:?] {}
	at net.minecraftforge.common.ForgeHooks.onBlockBreakEvent(ForgeHooks.java:609) ~[forge:?] {re:classloading}
	at net.minecraft.server.management.PlayerInteractionManager.tryHarvestBlock(PlayerInteractionManager.java:239) ~[forge:?] {re:classloading}
	at net.minecraft.server.management.PlayerInteractionManager.func_229860_a_(PlayerInteractionManager.java:226) ~[forge:?] {re:classloading}
	at net.minecraft.server.management.PlayerInteractionManager.func_225416_a(PlayerInteractionManager.java:155) ~[forge:?] {re:classloading}
	at net.minecraft.network.play.ServerPlayNetHandler.processPlayerDigging(ServerPlayNetHandler.java:957) ~[forge:?] {re:classloading}
	at net.minecraft.network.play.client.CPlayerDiggingPacket.processPacket(CPlayerDiggingPacket.java:50) ~[forge:?] {re:classloading}
	at net.minecraft.network.play.client.CPlayerDiggingPacket.processPacket(CPlayerDiggingPacket.java:12) ~[forge:?] {re:classloading}
	at net.minecraft.network.PacketThreadUtil.lambda$checkThreadAndEnqueue$0(PacketThreadUtil.java:19) ~[forge:?] {re:classloading}
	at net.minecraft.util.concurrent.TickDelayedTask.run(TickDelayedTask.java:20) ~[forge:?] {re:classloading}
	at net.minecraft.util.concurrent.ThreadTaskExecutor.run(ThreadTaskExecutor.java:139) ~[forge:?] {re:classloading,pl:accesstransformer:B}
	at net.minecraft.util.concurrent.RecursiveEventLoop.run(RecursiveEventLoop.java:22) ~[forge:?] {re:classloading}
	at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:759) ~[forge:?] {re:classloading,pl:accesstransformer:B}
	at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:159) ~[forge:?] {re:classloading,pl:accesstransformer:B}
	at net.minecraft.util.concurrent.ThreadTaskExecutor.driveOne(ThreadTaskExecutor.java:109) ~[forge:?] {re:classloading,pl:accesstransformer:B}
	at net.minecraft.server.MinecraftServer.driveOneInternal(MinecraftServer.java:742) ~[forge:?] {re:classloading,pl:accesstransformer:B}
	at net.minecraft.server.MinecraftServer.driveOne(MinecraftServer.java:736) ~[forge:?] {re:classloading,pl:accesstransformer:B}
	at net.minecraft.util.concurrent.ThreadTaskExecutor.drainTasks(ThreadTaskExecutor.java:97) ~[forge:?] {re:classloading,pl:accesstransformer:B}
	at net.minecraft.server.MinecraftServer.runScheduledTasks(MinecraftServer.java:721) ~[forge:?] {re:classloading,pl:accesstransformer:B}
	at net.minecraft.server.MinecraftServer.func_240802_v_(MinecraftServer.java:668) ~[forge:?] {re:classloading,pl:accesstransformer:B}
	at net.minecraft.server.MinecraftServer.lambda$startServer$0(MinecraftServer.java:233) ~[forge:?] {re:classloading,pl:accesstransformer:B}
Решение
Да канал я регистрировал, но я просто не совсем могу понять именно как распределять пакеты если не сложно можете ли подсказать как его правильнее устроить.
При регистрации пакета я обычно указываю чётко с какой куда он будет отправляться.
Java:
CHANNEL.registerMessage(index++, CodexScreenPacket.class, CodexScreenPacket::save, CodexScreenPacket::load,
        CodexScreenPacket::handle, Optional.of(NetworkDirection.PLAY_TO_CLIENT));
Далее, проверка на!world.isClientSide(), дабы отправилось точно с сервера, а не с клиента.
Java:
if(!world.isClientSide) {
            CompoundNBT tag = player.getItemInHand(hand).getOrCreateTag();
            PacketHandler.CHANNEL.sendTo(new CodexScreenPacket(tag)...
Сверху