Disconnect из-за пакетов в KeyBindings

Версия Minecraft
1.7.10
1,159
38
544
Добрый день. Пишу GUI, попутно изучая пакеты в Minecraft.

Проблема: В игре, при нажатии "B", происходит дисконнект. Мне кажется, что проблема связана с каким-либо недочетом к коде класса PacketOpenRSStatsInventory.

KeyHandler
Код:
package rsstats.common.event;

import cpw.mods.fml.client.FMLClientHandler;
import cpw.mods.fml.client.registry.ClientRegistry;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent.Phase;
import cpw.mods.fml.common.gameevent.TickEvent.PlayerTickEvent;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.settings.KeyBinding;


import org.lwjgl.input.Keyboard;
import rsstats.common.network.PacketHandler;
import rsstats.common.network.PacketOpenRSStatsInventory;


public class KeyHandler {
 
 public KeyBinding key = new KeyBinding("keybind.rsstatsinventory", 
 Keyboard.KEY_B, "key.categories.inventory");
 
 public KeyHandler() {
 ClientRegistry.registerKeyBinding(key);
 }

 @SideOnly(Side.CLIENT)
 @SubscribeEvent
 public void playerTick(PlayerTickEvent event) {
 if (event.side == Side.SERVER) return;
 if (event.phase == Phase.START ) {
 if (key.isPressed() && FMLClientHandler.instance().getClient().inGameHasFocus) {
 PacketHandler.INSTANCE.sendToServer(new PacketOpenRSStatsInventory(event.player));
                        }
 }
 }
}

PacketHandler:
Код:
package rsstats.common.network;

import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper;
import cpw.mods.fml.relauncher.Side;
import rsstats.common.RSStats;

public class PacketHandler
{
    public static final SimpleNetworkWrapper INSTANCE = NetworkRegistry.INSTANCE.newSimpleChannel(RSStats.MODID.toLowerCase());

    public static void init()
    { 
        INSTANCE.registerMessage(PacketOpenRSStatsInventory.class, PacketOpenRSStatsInventory.class, 0, Side.SERVER);
      
    }
    
    
}

PacketOpenRSStatsInventory:
Код:
package rsstats.common.network;

import cpw.mods.fml.common.network.simpleimpl.IMessage;
import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
import cpw.mods.fml.common.network.simpleimpl.MessageContext;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayer;
import rsstats.common.RSStats;

public class PacketOpenRSStatsInventory implements IMessage, IMessageHandler<PacketOpenRSStatsInventory, IMessage> {
 
 public PacketOpenRSStatsInventory() {}
 
 public PacketOpenRSStatsInventory(EntityPlayer player) {}

 @Override
 public void toBytes(ByteBuf buffer) {}

 @Override
 public void fromBytes(ByteBuf buffer) {}

 @Override
 public IMessage onMessage(PacketOpenRSStatsInventory message, MessageContext ctx) {
            ctx.getServerHandler().playerEntity.openGui(RSStats.instance, RSStats.GUI, ctx.getServerHandler().playerEntity.worldObj, (int)ctx.getServerHandler().playerEntity.posX, (int)ctx.getServerHandler().playerEntity.posY, (int)ctx.getServerHandler().playerEntity.posZ);
            //ctx.getServerHandler().playerEntity.ope
            return null;
 }


}

З.Ы. Буду рад любым советам и исправлениям.
 
Решение
Решил проблему. Вы были правы - пакет не был зарегистрировал. Для этого в главном классе мода в методе preInit нужно было вызвать PacketHandler, который в свою очередь и регистрировал гуи.

RSStats
@EventHandler
    public void preInit(FMLPreInitializationEvent event) {
        PacketHandler.init();
        //this.proxy.preInit(event);
    }

PacketHandler:
Код:
package rsstats.common.network;

import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper;
import cpw.mods.fml.relauncher.Side;
import rsstats.common.RSStats;

public class PacketHandler
{
    public static final SimpleNetworkWrapper INSTANCE =...

timaxa007

Модератор
5,831
409
672
Возможно, у тебя проблемы с открытием GUI, а не пакета.


(Так как пакет работает, а вот твоего GUI нет для проверки.)


Или по какой-то причине не зарегистрирован пакет.
 
1,159
38
544
timaxa007 написал(а):
Возможно, у тебя проблемы с открытием GUI, а не пакета.


(Так как пакет работает, а вот твоего GUI нет для проверки.)


Или по какой-то причине не зарегистрирован пакет.




Вот класс ГУИ. Даже не могу предположить какие тут могут быть проблемы
StatsAndInvTabGui:
Код:
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package rsstats.client.gui;

import net.minecraft.client.renderer.InventoryEffectRenderer;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.util.ResourceLocation;
import rsstats.common.container.StatsAndInvContainer;

/**
 *
 * @author rares
 */
public class StatsAndInvTabGui extends InventoryEffectRenderer {
    public static final ResourceLocation background = 
 new ResourceLocation("RSStats","textures/gui/StatsAndInvTab.png");
    
    /**
     * x size of the inventory window in pixels. Defined as  float, passed as int
     */
    private float xSizeFloat;
    /**
     * y size of the inventory window in pixels. Defined as  float, passed as int.
     */
    private float ySizeFloat;

    public StatsAndInvTabGui(EntityPlayer player) {
        super(new StatsAndInvContainer());
        this.allowUserInput = true;
    }

    /*
    Этот метод нужн только для того, чтобы из ClienPrxy вызывать GUI. Потом этот конструктор следут удалить
    */
    public StatsAndInvTabGui() {
        super(new StatsAndInvContainer());
        this.allowUserInput = true;
    }
    
    /**
     * Called from the main game loop to update the screen.
     */
    @Override 
    public void updateScreen() {
     try {
            //((ContainerPlayerExpanded)inventorySlots).baubles.blockEvents=false;
        } catch (Exception e) { }
    }
    
    
    @Override
    protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) {
        //GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
        this.mc.getTextureManager().bindTexture(background);
        int k = this.guiLeft;
        int l = this.guiTop;
        this.drawTexturedModalRect(k, l, 0, 0, this.xSize, this.ySize);
        
        for (int i1 = 0; i1 < this.inventorySlots.inventorySlots.size(); ++i1)
        {
            Slot slot = (Slot)this.inventorySlots.inventorySlots.get(i1);
            if (slot.getHasStack() && slot.getSlotStackLimit()==1)
            {
             this.drawTexturedModalRect(k+slot.xDisplayPosition, l+slot.yDisplayPosition, 200, 0, 16, 16);
            }
        }
        
        //drawPlayerModel(k + 51, l + 75, 30, (float)(k + 51) - this.xSizeFloat, (float)(l + 75 - 50) - this.ySizeFloat, this.mc.thePlayer);
    
    }
    
}

Пакет ведь регистрируется в PacketHandler?

Не могу приложить весь свой мод из-за ограничений по размеру. Вот ссылка на гитхаб
 
1,159
38
544
Решил проблему. Вы были правы - пакет не был зарегистрировал. Для этого в главном классе мода в методе preInit нужно было вызвать PacketHandler, который в свою очередь и регистрировал гуи.

RSStats
@EventHandler
    public void preInit(FMLPreInitializationEvent event) {
        PacketHandler.init();
        //this.proxy.preInit(event);
    }

PacketHandler:
Код:
package rsstats.common.network;

import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper;
import cpw.mods.fml.relauncher.Side;
import rsstats.common.RSStats;

public class PacketHandler
{
    public static final SimpleNetworkWrapper INSTANCE = NetworkRegistry.INSTANCE.newSimpleChannel(RSStats.MODID.toLowerCase());

    public static void init()
    { 
        INSTANCE.registerMessage(PacketOpenRSStatsInventory.class, PacketOpenRSStatsInventory.class, 0, Side.SERVER);
      
    }
    
    
}


Dahaka написал(а):
Дак исключения никакого не вылетает на клиентской стороне?

Нет. Просто рвется соединение. Без краша игры и без логов.
 
1,159
38
544
Agravaine написал(а):
Хей, есть специальный KeyInputEvent. Не нужно каждый тик проверять.

Честно говоря, я не совсем понимаю хандлеры и ивенты в джаве, так что решил пока не юзать KeyInputEvent. Но спасибо за наводку :)
 
7,099
324
1,510
Из-за таких "не понимаю" потом лагает, так что лучше изучай, тем более, что там легко:
http://forum.mcmodding.ru/%D0%A2%D0%B5%D0%BC%D0%B0-%D0%A7%D1%82%D0%BE-%D1%82%D0%B0%D0%BA%D0%BE%D0%B5-%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F-%D0%B8-%D0%BA%D0%B0%D0%BA-%D0%B8%D1%85-%D0%BB%D0%BE%D0%B2%D0%B8%D1%82%D1%8C-%D0%9A%D0%BE%D1%80%D0%BE%D1%82%D0%BA%D0%B0%D1%8F-%D0%B8-%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%B0%D1%8F-%D1%82%D0%B5%D0%BC%D0%B0--4212
 
7,099
324
1,510
KeyInputEvent отправляется при нажатиях(ну операционной системой они могут отслеживаться каждый системный тик, но там то централизованная система) не так ли?
 
Сверху