Пакетики да сумочки

Версия Minecraft
1.7.10

GoogleTan

Картошка :3
1,354
43
310
Есть у меня пакет:
Java:
public class MovingPacket implements IMessage, IMessageHandler<MovingPacket, MovingPacket>
{
    private ByteBuf buf;
    private int key;

    public MovingPacket()
    {
       key = -1;
    }

    public MovingPacket(int keyIn)
    {
        key = keyIn;
    }

    @Override
    public MovingPacket onMessage(MovingPacket message, MessageContext ctx)
    {
        if (ctx.side.isServer())
            message.server(ctx.getServerHandler().playerEntity, key);
        else
            message.client(clientPlayer());
        return null;
    }

    public void client(EntityPlayer player)
    {
    }

    public void server(EntityPlayerMP player, int keyIn)
    {
        if(player.ridingEntity instanceof MinitrixEntity)
        {
            MinitrixEntity entity = (MinitrixEntity) player.ridingEntity;
            switch (keyIn) {
                case 3:
                    entity.motionX -= 1;
                    break;
                case 4:
                    entity.motionZ -= 1;
                    break;
                default:
                    entity.motionY += 1;
            }
        }
    }

    @Override
    public final void fromBytes(ByteBuf buf)
    {
        try{
            key = buf.readInt();
        }catch (Exception e)
        {
            e.printStackTrace();
            key = -1;
        }
    }

    @Override
    public final void toBytes(ByteBuf buf)
    {
        if(buf == null)
            buf = Unpooled.buffer();
        try {
            buf.writeByte(key);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @SideOnly(Side.CLIENT)
    private EntityPlayer clientPlayer()
    {
        return Minecraft.getMinecraft().thePlayer;
    }
}
Хендлер:
Java:
public final class NetworkHandler {
    private static short id;

    /**
     *  ChannelName - название канала. Канал должен быть один на весь мод, создавать дополнительные каналы не нужно!
     */
    public static SimpleNetworkWrapper NETWORK;

    public static void initNetwork()
    {
        NETWORK = NetworkRegistry.INSTANCE.newSimpleChannel("HYDRA");
        register(MovingPacket.class, Side.SERVER);
    }
    /**
     * Получение дистанции от определённой точки в мире.
     * @param world - мир
     * @param updateDistance - радиус в котором будет действовать пакет
     * @return позиция
     */
    public static void sendKeysToServer(MovingPacket packet) {
        NETWORK.sendToServer(packet);
    }

    /**
     * Регистрация пакета через один метод.
     * @param packet - класс пакета
     * @param side - сторона (клиент/сервер)
     */
    private static void register(Class<? extends MovingPacket> packet, Side side) {
        try {
            NETWORK.registerMessage(packet.newInstance(), packet, id++, side);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
И эррор. Что делаю я не так?
 
Краш-лог
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: java.lang.IndexOutOfBoundsException: readerIndex(0) + length(4) exceeds writerIndex(1): SlicedByteBuf(ridx: 0, widx: 1, cap: 1/1, unwrapped: UnpooledHeapByteBuf(ridx: 1, widx: 2, cap: 2/2))
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: at io.netty.buffer.AbstractByteBuf.checkReadableBytes(AbstractByteBuf.java:1160)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: at io.netty.buffer.AbstractByteBuf.readInt(AbstractByteBuf.java:611)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: at com.hydramod.network.MovingPacket.fromBytes(MovingPacket.java:62)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: at cpw.mods.fml.common.network.simpleimpl.SimpleIndexedCodec.decodeInto(SimpleIndexedCodec.java:17)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: at cpw.mods.fml.common.network.simpleimpl.SimpleIndexedCodec.decodeInto(SimpleIndexedCodec.java:7)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:77)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:17)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: at io.netty.handler.codec.MessageToMessageCodec$2.decode(MessageToMessageCodec.java:81)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:89)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: at cpw.mods.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:86)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752)
Краш-лог:
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: java.lang.IndexOutOfBoundsException: readerIndex(0) + length(4) exceeds writerIndex(1): SlicedByteBuf(ridx: 0, widx: 1, cap: 1/1, unwrapped: UnpooledHeapByteBuf(ridx: 1, widx: 2, cap: 2/2))
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: 	at io.netty.buffer.AbstractByteBuf.checkReadableBytes(AbstractByteBuf.java:1160)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: 	at io.netty.buffer.AbstractByteBuf.readInt(AbstractByteBuf.java:611)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: 	at com.hydramod.network.MovingPacket.fromBytes(MovingPacket.java:62)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: 	at cpw.mods.fml.common.network.simpleimpl.SimpleIndexedCodec.decodeInto(SimpleIndexedCodec.java:17)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: 	at cpw.mods.fml.common.network.simpleimpl.SimpleIndexedCodec.decodeInto(SimpleIndexedCodec.java:7)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: 	at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:77)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: 	at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:17)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: 	at io.netty.handler.codec.MessageToMessageCodec$2.decode(MessageToMessageCodec.java:81)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: 	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:89)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: 	at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: 	at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: 	at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: 	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: 	at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: 	at cpw.mods.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:86)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: 	at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: 	at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: 	at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: 	at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: 	at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: 	at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485)
[21:13:40] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:749]: 	at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752)
Последнее редактирование:
Решение
3,005
192
592
Последнее редактирование:
1,159
38
544
1) Зачем в register() ты делаешь newInstance()? NETWORK.registerMessage принимает класс обработчика и класс пакета, а не инстансы этих классов.
2) Твой Message реализует и IMessage, и IMessageHandler. Это логически неверно. Как посылка может быть получателем самой себя? Имхо, это вносит чрезмерную путаницу.
3) в дженерике IMessageHandler<MovingPacket, MovingPacket>первый тип является классом пакета, которые принимается хандлером, а второй - типом который отсылается назад. Т.к. ты шлешь назад null то сделай второй тип просто IMessage, чтобы путаницу не усиливать.
4) @ロ[B]ロ[B]ロ [/B][/B]верно говорит: ты пишешь байт, а читаешь инт. втф? (И да, чувак, смени уже ник с этих ущербных квадратиков. Вообще не понятно что ты за зверь. Ты это сделал чтобы пипл тебя не упоминал в постах?)
5) Зачем ты создаешь новый буфер когда входной null? Он ведь не может быть равен null. Ты где-то дергаешь toBytes() самостоятельно? Ну так и сделай null-проверку до вызова toBytes().

И у тебя почти каждый метод в try'е. Твой код выглядит так, как будто его склеили изолентой.
 
3,005
192
592

GoogleTan

Картошка :3
1,354
43
310
1) Зачем в register() ты делаешь newInstance()? NETWORK.registerMessage принимает класс обработчика и класс пакета, а не инстансы этих классов.
registerMessage(IMessageHandler<? super REQ, ? extends REPLY> messageHandler, Class<REQ> requestMessageType, int discriminator, Side side)
2) Твой Message реализует и IMessage, и IMessageHandler. Это логически неверно. Как посылка может быть получателем самой себя? Имхо, это вносит чрезмерную путаницу.
Наоборот. Весь пакет целиком в 1 классе. Везде где я видела ванильную систему так было. И в гайде на форуме тоже)))
 
3,005
192
592
message.server(ctx.getServerHandler().playerEntity, key);
И мне кажется, key нужно брать из message. Т.Е. message.key.
Потому чтоо... Хотя, хз, может и он отдает этот же объект.
🤔
Но, вызов переменной server берется из message, а не из this. )
 
1,159
38
544
Везде где я видела ванильную систему так было
В ванильных пакетах не содержатся методы, реализующие логику пакета. Там только есть processPacket() который дергает нужный метод в обработчике, которыми является NetHandlerPlayClient или NetHandlerPlayServer. При этом сам пакет не является своим обработчиком как таковым.

Наоборот. Весь пакет целиком в 1 классе
Ты можешь достичь такого же результата, создав Nested-класс, реализующий IMessageHadler. Тогда весь код пакета будет находится в одном файле, но при этом сам пакет и его обработчик будут разными сущностями, как и должно быть.

И в гайде на форуме тоже)))
Это не делает реализацию и месседжа, и хандлера в одном классе логически верным.

registerMessage(IMessageHandler<? super REQ, ? extends REPLY> messageHandler, Class<REQ> requestMessageType, int discriminator, Side side)
Там есть версия метода, которому достаточно передать классы. Это удобнее, чем создавать инстанс самому
void registerMessage(Class<? extends IMessageHandler<REQ, REPLY>> messageHandler, Class<REQ> requestMessageType, int discriminator, Side side)
 
Сверху