Все свертел... Непонятный краш связанный с пакетами.

Версия Minecraft
1.12.2
5,018
47
783
В общем, на днях я узнал, что мой мод не работает на сервере - стал переделывать все туда сюда, заодно и на новую Ивасиковскую систему перешел.Все по гайду. Вроде все ошибки поправил, сервер запускается.
"Ура!" - думаю, наконец то. Но не тут то было. В общем что происходит:
1) Запускаю клиент
2) Захожу в ОДИНОЧНЫЙ мир
3) 2-3 секунды беспробудных лагов
4) выходит из мира с отсоединением от сервера
5) выкидывает в меню СЕТЕВОЙ игры
Код:
[20:01:50] [Netty Local Client IO #0/ERROR] [FML]: There was a critical exception handling a packet on channel realism
java.lang.IndexOutOfBoundsException: readerIndex(0) + length(4) exceeds writerIndex(0): UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf(ridx: 0, widx: 0, cap: 256)
    at io.netty.buffer.AbstractByteBuf.checkReadableBytes0(AbstractByteBuf.java:1396) ~[AbstractByteBuf.class:4.1.9.Final]
    at io.netty.buffer.AbstractByteBuf.readInt(AbstractByteBuf.java:766) ~[AbstractByteBuf.class:4.1.9.Final]
    at com.lg.realism.PSystem.HUDSyncMessage.handleClientSide(HUDSyncMessage.java:19) ~[HUDSyncMessage.class:?]
    at com.lg.realism.PSystem.AbstractPacket.onMessage(AbstractPacket.java:26) ~[AbstractPacket.class:?]
    at com.lg.realism.PSystem.AbstractPacket.onMessage(AbstractPacket.java:1) ~[AbstractPacket.class:?]
    at net.minecraftforge.fml.common.network.simpleimpl.SimpleChannelHandlerWrapper.channelRead0(SimpleChannelHandlerWrapper.java:56) ~[SimpleChannelHandlerWrapper.class:?]
    at net.minecraftforge.fml.common.network.simpleimpl.SimpleChannelHandlerWrapper.channelRead0(SimpleChannelHandlerWrapper.java:36) ~[SimpleChannelHandlerWrapper.class:?]
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) ~[SimpleChannelInboundHandler.class:4.1.9.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) ~[AbstractChannelHandlerContext.class:4.1.9.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) ~[AbstractChannelHandlerContext.class:4.1.9.Final]
Код:
public final class HUDSyncMessage extends AbstractPacket
{
    public HUDSyncMessage() {}
    public HUDSyncMessage(int level)
    {
        buf().writeInt(level);
    }

    @Override
    public void handleClientSide(EntityPlayer player)
    {
        if (player != null)
            player.getCapability(WaterBarProv.LEVEL_CAP, null).setWaterLevel(buf().readInt());
    }
}
 
2,505
81
397
Русским языком же написано, что нельзя прочитать 4 байта, когда записано 0.
Или отправляешь пакет, созданный через конструктор по-умолчанию, или ивасиковская система не работает.
 
5,018
47
783
7,099
324
1,510
5,018
47
783
7,099
324
1,510
CCL легкая в понимании, код не нужно менять от версии к версии
 
5,018
47
783
CCL легкая в понимании, код не нужно менять от версии к версии
В крайнем случае, если будет совсем жопа, воспользуюсь. Пока что ивасиковская мне больше нравится. Да и я уверен, решение этой проблемы простое, просто надо его найти
 
5,018
47
783
Русским языком же написано, что нельзя прочитать 4 байта, когда записано 0.
Или отправляешь пакет, созданный через конструктор по-умолчанию, или ивасиковская система не работает.
Выглядит регистрация примерно так.

Код:
public final class NetworkHandler
{
    private static short id;
    public static final SimpleNetworkWrapper NETWORK = new SimpleNetworkWrapper(Realism.MODID);

    public NetworkHandler()
    {
        register(HUDSyncMessage.class, Side.CLIENT);
        register(HUDSyncMessageServer.class, Side.SERVER);
        register(TemperatureBodyClientMessage.class, Side.CLIENT);
        register(TemperatureBodyServerMessage.class, Side.SERVER);
        register(ColdMessageClient.class, Side.CLIENT);
        register(OpenInventoryMessage.class, Side.SERVER);
    }

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

Пакеты создаю так
NetworkHandler.NETWORK.sendTo(new HUDSyncMessage(capabilities.getWaterLevel()), (EntityPlayerMP)player);
 
7,099
324
1,510
Против разнородных конструкторов и ошибок с ними очень хорошо помогает scala(там их нет)
 
5,018
47
783
5,018
47
783
Java:
public HUDSyncMessage() {}
Видимо когда отправляешь пакет, тогда и юзаешь.
Эм. Я может дурачок. Но я не совсем понимаю, что там должно быть? Все ж есть в родительском классе вроде...
 
5,018
47
783
Если что, есть возможность откатить - благо делаю бекапы))
Но хочется тут разобраться
 
5,018
47
783
Немного колдовства и совместив куски старой и новой системы я пришел к оптимальному балансу. Ивасиковская система действительно работает неправильно - проблема была из за пустого конструктора. Короче, решил проблему, всем спасибо!

Код:
public final class ColdMessageClient extends AbstractPacket
{
    private static boolean tempTF = false;
    public ColdMessageClient() {}
    public ColdMessageClient(boolean temp)
    {
       tempTF = temp;
    }
    
    @Override
    public void handleClientSide(EntityPlayer player)
    {
        if (player != null)
            player.getCapability(WaterBarProv.LEVEL_CAP, null).setCommonCold(tempTF);
    }
}
 
5,018
47
783
Но все таки еще не конец. Что бы не создавать новую тему, тут напишу
Короче говоря, все запускается, работает. Но при подключении к своему локальному серверу localhost, запущенному одновременно с клиентом, от сервера отсоединяет с такой ошибкой -
Код:
aused by: java.lang.RuntimeException: Attempted to load class net/minecraft/client/entity/EntityPlayerSP for invalid side SERVER
    at net.minecraftforge.fml.common.asm.transformers.SideTransformer.transform(SideTransformer.java:62) ~[forgeSrc-1.12.2-14.23.1.2582-PROJECT(RealismCraft%201.12.2).jar:?]
    at net.minecraftforge.fml.common.asm.ASMTransformerWrapper$TransformerWrapper.transform(ASMTransformerWrapper.java:258) ~[forgeSrc-1.12.2-14.23.1.2582-PROJECT(RealismCraft%201.12.2).jar:?]
    at net.minecraft.launchwrapper.LaunchClassLoader.runTransformers(LaunchClassLoader.java:279) ~[launchwrapper-1.12.jar:?]
    at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:176) ~[launchwrapper-1.12.jar:?]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_151]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_151]
    at com.lg.realism.event.WaterBarEvent.EventThirstUpdate.updateTicker(EventThirstUpdate.java:48) ~[EventThirstUpdate.class:?]
    at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_21_EventThirstUpdate_updateTicker_LivingUpdateEvent.invoke(.dynamic) ~[?:?]
    at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:90) ~[ASMEventHandler.class:?]
    at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:179) ~[EventBus.class:?]
    at net.minecraftforge.common.ForgeHooks.onLivingUpdate(ForgeHooks.java:556) ~[ForgeHooks.class:?]
    at net.minecraft.entity.EntityLivingBase.onUpdate(EntityLivingBase.java:2312) ~[EntityLivingBase.class:?]
    at net.minecraft.entity.player.EntityPlayer.onUpdate(EntityPlayer.java:272) ~[EntityPlayer.class:?]
    at net.minecraft.entity.player.EntityPlayerMP.onUpdateEntity(EntityPlayerMP.java:423) ~[EntityPlayerMP.class:?]
    ... 9 more

Вот класс, в котором ошибка. Простите,пока в пакетах не силен, я конечно понимаю, что ошибка типо нельзя клиентского игрока юзать на сервере, но блин, как это фиксить?)
Код:
public class EventThirstUpdate {
    @SubscribeEvent
    public void updateTicker(LivingUpdateEvent event) {
        if(event.getEntity() instanceof EntityPlayer && !FMLCommonHandler.instance().getEffectiveSide().isClient()) {

            EntityPlayer player = (EntityPlayer)event.getEntity();
            IBarLevel capabilities = player.getCapability(WaterBarProv.LEVEL_CAP, null);

            if(player.ticksExisted % ConfigManager.powerThirst == 0) {
                
                Biome biome = player.getEntityWorld().getBiomeForCoordsBody(new BlockPos(player));
                
                if((biome == Biomes.DESERT_HILLS || biome == Biomes.DESERT)){
                    if(player.isSprinting()) {
                        capabilities.addWaterLevel(30);
            
                    } else
                        capabilities.addWaterLevel(20);
                        
                } else
                    if(player.isSprinting()) {
                        capabilities.addWaterLevel(20);
            
                    } else
                        capabilities.addWaterLevel(10);

                NetworkHandler.INSTANCE.sendTo(new HUDSyncMessage(capabilities.getWaterLevel()),(EntityPlayerMP)player);

                capabilities.incrementTicker();
            }
        }
    }
}
 
5,018
47
783
Божечки. Вот это решение. Долго думал?
дело было так - сначала ждал помощи, потом понял, что нихрена не помогут, и сделал сам, за 10 минут)
Глянь предыдущий ответ, чего думаешь по проблеме?
 
Сверху