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

Версия Minecraft
1.7.10
Доброго времени суток. Хотелось бы сделать так, чтобы за наигранное время давалось что-нибудь (чтоб что-то получить, надо нажать на кнопку в гуи). Для этого в серверную часть добавил ивент, который считает наигранное время(тут еще хотел бы узнать, можно ли вытащить как-нибудь EntityPlayerMP, а то получилось только ники в стринг)
код на подсчет наигранного времени:
@SubscribeEvent
    public void onTick(TickEvent.ServerTickEvent e) {
        if (e.phase == TickEvent.Phase.END) {
            if (tick % 20 == 0) {
                String arr[] = MinecraftServer.getServer().getAllUsernames();
                for (String name : arr) {
                    PlayerData data = DiverseThings.instance.serverUtils.getPlayerData(name);
                    if (data == null) {
                        data = new PlayerData(name, 0, true);
                        DiverseThings.instance.serverUtils.toCache(data);
                    }
                    data.setTime(data.getTime() + 20);
                }
            }
            tick++;
            if (tick == Integer.MAX_VALUE - 1) {
                tick = 0;
            }
        }
    }

Далее... есть гуи, где можно нажать на кнопку(чтобы получить вознаграждение). Тут я хочу отправить пакет на сервер с игроком, который нажал по кнопке

Код при нажатии на кнопку в гуи:
@Override
    protected void actionPerformed(GuiButton button) {
        switch (button.id) {
            case 1:
                CPacket cPacket = new CPacket();
                cPacket.client(Minecraft.getMinecraft().thePlayer);
                break;
        }
        super.actionPerformed(button);
    }

Класс клиентского пакета:
public class CPacket extends SimplePacket {

    private long time;
    private EntityPlayer playerMP;

    public CPacket() {
        time = 0;
    }

    public CPacket(long time) {
        this.time = time;
    }

    @Override
    public void client(EntityPlayer player) {
        playerMP = player;
        PacketNetwork.sendToServer(this);
    }
}
}

Далее мне надо просто обработать данный пакет и вернуть в ответ число, но, я пока даже не могу нормально принять пакет на стороне сервера
Логи:
io.netty.handler.codec.EncoderException: java.lang.NullPointerException
    at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:107) ~[MessageToMessageEncoder.class:?]
    at io.netty.handler.codec.MessageToMessageCodec.write(MessageToMessageCodec.java:116) ~[MessageToMessageCodec.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.invokeWrite(DefaultChannelHandlerContext.java:644) ~[DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.write(DefaultChannelHandlerContext.java:698) ~[DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.writeAndFlush(DefaultChannelHandlerContext.java:688) ~[DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.writeAndFlush(DefaultChannelHandlerContext.java:717) ~[DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelPipeline.writeAndFlush(DefaultChannelPipeline.java:893) ~[DefaultChannelPipeline.class:?]
    at io.netty.channel.AbstractChannel.writeAndFlush(AbstractChannel.java:239) ~[AbstractChannel.class:?]
    at cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper.sendToServer(SimpleNetworkWrapper.java:236) [SimpleNetworkWrapper.class:?]
    at me.Sa1ZeR_.DiverseThings.utils.packets.PacketNetwork.sendToServer(PacketNetwork.java:27) [PacketNetwork.class:?]
    at me.Sa1ZeR_.DiverseThings.utils.packets.client.CPacket.client(CPacket.java:25) [CPacket.class:?]
    at me.Sa1ZeR_.DiverseThings.GUI.WandererScreen.actionPerformed(WandererScreen.java:51) [WandererScreen.class:?]
    at net.minecraft.client.gui.GuiScreen.mouseClicked(GuiScreen.java:252) [GuiScreen.class:?]
    at net.minecraft.client.gui.GuiScreen.handleMouseInput(GuiScreen.java:344) [GuiScreen.class:?]
    at net.minecraft.client.gui.GuiScreen.handleInput(GuiScreen.java:313) [GuiScreen.class:?]
    at net.minecraft.client.Minecraft.runTick(Minecraft.java:1731) [Minecraft.class:?]
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1039) [Minecraft.class:?]
    at net.minecraft.client.Minecraft.run(Minecraft.java:962) [Minecraft.class:?]
    at net.minecraft.client.main.Main.main(Main.java:164) [Main.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_231]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_231]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_231]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_231]
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
    at net.minecraftforge.gradle.GradleStartCommon.launch(Unknown Source) [start/:?]
    at GradleStart.main(Unknown Source) [start/:?]
Caused by: java.lang.NullPointerException
    at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:824) ~[AbstractByteBuf.class:?]
    at me.Sa1ZeR_.DiverseThings.utils.packets.SimplePacket.toBytes(SimplePacket.java:35) ~[SimplePacket.class:?]
    at cpw.mods.fml.common.network.simpleimpl.SimpleIndexedCodec.encodeInto(SimpleIndexedCodec.java:11) ~[SimpleIndexedCodec.class:?]
    at cpw.mods.fml.common.network.simpleimpl.SimpleIndexedCodec.encodeInto(SimpleIndexedCodec.java:7) ~[SimpleIndexedCodec.class:?]
    at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.encode(FMLIndexedMessageToMessageCodec.java:51) ~[FMLIndexedMessageToMessageCodec.class:?]
    at io.netty.handler.codec.MessageToMessageCodec$1.encode(MessageToMessageCodec.java:67) ~[MessageToMessageCodec$1.class:?]
    at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:89) ~[MessageToMessageEncoder.class:?]
    ... 26 more
[17:56:01] [Client thread/ERROR] [FML]: SimpleChannelHandlerWrapper exception
io.netty.handler.codec.EncoderException: java.lang.NullPointerException
    at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:107) ~[MessageToMessageEncoder.class:?]
    at io.netty.handler.codec.MessageToMessageCodec.write(MessageToMessageCodec.java:116) ~[MessageToMessageCodec.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.invokeWrite(DefaultChannelHandlerContext.java:644) ~[DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.write(DefaultChannelHandlerContext.java:698) ~[DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.writeAndFlush(DefaultChannelHandlerContext.java:688) ~[DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.writeAndFlush(DefaultChannelHandlerContext.java:717) ~[DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelPipeline.writeAndFlush(DefaultChannelPipeline.java:893) ~[DefaultChannelPipeline.class:?]
    at io.netty.channel.AbstractChannel.writeAndFlush(AbstractChannel.java:239) ~[AbstractChannel.class:?]
    at cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper.sendToServer(SimpleNetworkWrapper.java:236) [SimpleNetworkWrapper.class:?]
    at me.Sa1ZeR_.DiverseThings.utils.packets.PacketNetwork.sendToServer(PacketNetwork.java:27) [PacketNetwork.class:?]
    at me.Sa1ZeR_.DiverseThings.utils.packets.client.CPacket.client(CPacket.java:25) [CPacket.class:?]
    at me.Sa1ZeR_.DiverseThings.GUI.WandererScreen.actionPerformed(WandererScreen.java:51) [WandererScreen.class:?]
    at net.minecraft.client.gui.GuiScreen.mouseClicked(GuiScreen.java:252) [GuiScreen.class:?]
    at net.minecraft.client.gui.GuiScreen.handleMouseInput(GuiScreen.java:344) [GuiScreen.class:?]
    at net.minecraft.client.gui.GuiScreen.handleInput(GuiScreen.java:313) [GuiScreen.class:?]
    at net.minecraft.client.Minecraft.runTick(Minecraft.java:1731) [Minecraft.class:?]
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1039) [Minecraft.class:?]
    at net.minecraft.client.Minecraft.run(Minecraft.java:962) [Minecraft.class:?]
    at net.minecraft.client.main.Main.main(Main.java:164) [Main.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_231]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_231]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_231]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_231]
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
    at net.minecraftforge.gradle.GradleStartCommon.launch(Unknown Source) [start/:?]
    at GradleStart.main(Unknown Source) [start/:?]
Caused by: java.lang.NullPointerException
    at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:824) ~[AbstractByteBuf.class:?]
    at me.Sa1ZeR_.DiverseThings.utils.packets.SimplePacket.toBytes(SimplePacket.java:35) ~[SimplePacket.class:?]
    at cpw.mods.fml.common.network.simpleimpl.SimpleIndexedCodec.encodeInto(SimpleIndexedCodec.java:11) ~[SimpleIndexedCodec.class:?]
    at cpw.mods.fml.common.network.simpleimpl.SimpleIndexedCodec.encodeInto(SimpleIndexedCodec.java:7) ~[SimpleIndexedCodec.class:?]
    at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.encode(FMLIndexedMessageToMessageCodec.java:51) ~[FMLIndexedMessageToMessageCodec.class:?]
    at io.netty.handler.codec.MessageToMessageCodec$1.encode(MessageToMessageCodec.java:67) ~[MessageToMessageCodec$1.class:?]
    at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:89) ~[MessageToMessageEncoder.class:?]
    ... 26 more

Подскажите, пожалуйста. где ошибка.
PacketNetwork:
public class PacketNetwork {

    private short id;

    public static final SimpleNetworkWrapper NETWORK = NetworkRegistry.INSTANCE.newSimpleChannel("testpacket");

    public PacketNetwork() {
        register(CPacket.class, Side.CLIENT);
        register(SPacket.class, Side.SERVER);
    }

    public static void sendToAllAround(SimplePacket packet, World world, double x, double y, double z, double distance) {
        NETWORK.sendToAllAround(packet, new NetworkRegistry.TargetPoint(world.provider.dimensionId, x, y, z, distance));
    }

    public static void sendToServer(SimplePacket packet) {
        NETWORK.sendToServer(packet);
    }

    public static void sendToClient(SimplePacket packet, EntityPlayerMP player) {
        NETWORK.sendTo(packet, player);
    }

    private void register(Class<? extends SimplePacket> packet, Side side) {
        try {
            NETWORK.registerMessage(packet.newInstance(), packet, id++, side);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }

}

SimplePacket:
public class SimplePacket implements IMessage, IMessageHandler<SimplePacket, SimplePacket> {

    private ByteBuf buf;

    public void client(EntityPlayer player) {}
    public void server(EntityPlayerMP player) {}
    public void server(PlayerData data) {}

    protected ByteBuf getBuf() {
        return  buf != null ? buf : (buf = Unpooled.buffer());
    }

    @Override
    public void fromBytes(ByteBuf buf) {
        this.buf = buf;
    }

    @Override
    public void toBytes(ByteBuf buf) {
        if(buf != null) {
            buf.writeBytes(this.buf);
        }
    }

    @Override
    public SimplePacket onMessage(SimplePacket message, MessageContext ctx) {
        System.out.println("Я принял пакет");
        if(ctx.side.isServer()) {
            message.server(ctx.getServerHandler().playerEntity);
        } else {
            message.client(clientPlayer());
        }
        return null;
    }

    @SideOnly(Side.CLIENT)
    private EntityPlayer clientPlayer() {
        return Minecraft.getMinecraft().thePlayer;
    }

}
 
Последнее редактирование:
7,099
324
1,510
Свои пакеты делать не обязательно. Можно сделать гуи с контейнером, когда вызову actionPerformed в гуи(клик по кнопке) на сервере будет соответствовать enchantItem в контейнере. Т.к. у тя версия 1.7.10, то в actionPerformed нужно будет добавить такой код:
mc.playerController.sendEnchantPacket(container.windowId, button.id)
 
7,099
324
1,510
Сверху