Nxs0000 Posted August 10, 2016 Posted August 10, 2016 Hey, I recently stared working on a TileEntity vitrine that display an item/itemBlock on it when it does contain one. Basically the TileEntity contains 2 properties: private ItemStack contained; private EntityItem image; the "image" is created from the "contained" with the it's property stackSize set to 1. Now i wanted to add a Gui that would allow me to change the contained easily, so i created both the GuiContainer class and the Container one (and registered in the GuiHandler class) To do all that i just followed bedrockminer's tutorials, changing what needed to be changed, but now i have some wierd issues: (all tested in a single player world) - when i open the Container, the first Item in my Hotbar gets change into the item that is contained in the TileEntity, even though the item is still in it and clicking on the item in the contained slot take the one in my hotbar. - when i close the Gui, this first item don't gets back to what it was before openning, and, when i open my inventory (in survival) i can see that some on the items from my hotbar got copied to the armor slots and crafting slots. - I have to relog to get my inventory back right, as before i even openned the Container. Here is my VitrineContainer construtor. The class is extending Container, have a property theVitr where I store the VitrineTileEntity. public VitrineContainer(VitrineTileEntity vitr, IInventory player) { this.theVitr = vitr; theVitr.openInventory(((InventoryPlayer)player).player); //Player inventory for(int x = 0; x<9; x++){ this.addSlotToContainer(new Slot(player, x, 8+x*18, 49+58)); } for(int y = 0; y<3; y++){ for(int x = 0; x<9; x++){ this.addSlotToContainer(new Slot(player, 9+x+y*9, 8+x*18, 49 +18*y)); } } this.addSlotToContainer(new Slot(vitr, 0, 8, 18)); // TileEntity's slot, top left of the Gui } I don't think the error could come from other classes since I barely created the Gui class just to draw a 1-row chest, and my VitrineBlock and VitrineTileEntity work fine and don't have much to do with the Container, exept for the TileEntity that extends IInventory so I completed the newly genereted methods to return the correct objects (slot 0 returning the contained ItemStack). Maybe it only is an issue of synchronizing Server and Client since reloging correct the Inventory mess. Before: Open the Container: Clicking on the contained Item: Opening the inventory after closing the Container: What is/could be wrong ? Thank you for any help Quote
Xerus Posted August 10, 2016 Posted August 10, 2016 I dont know if that is the problem, but I would recommend you to add the slots in this order: 1. Slot(s) of the TileEntity 2. Player Inventory 3. Player Hotbar Since the Container uses a List of Slots it may be the problem Also, what does theVitr.openInventory do? Quote
Nxs0000 Posted August 10, 2016 Author Posted August 10, 2016 the openInventory call a method from the TileEntity that needed to be override, for now i left it empty. I tried what you said: Before: After: This really is weird: The inventory looks messed up but the item are just showed in the wrong place: for exemple, when i click on the second slot from the first row i get the 59 blaze powder... Plus, even so the slot for the Container displays the wool, clicking on it does nothing. It seem to be a display issue now Quote
Nxs0000 Posted August 10, 2016 Author Posted August 10, 2016 btw, i don't have the armor slot and crafting slots filled up anymore... must be display/sync issue Quote
MCenderdragon Posted August 10, 2016 Posted August 10, 2016 is looks like the Hotbar is somehow saved in the armor and crafting slots. How do you open your container ? Quote catch(Exception e) { } Yay, Pokémon exception handling, gotta catch 'em all (and then do nothing with 'em).
Nxs0000 Posted August 10, 2016 Author Posted August 10, 2016 yea, it seems I open the Cotainer by right-clicking on the Vitrine Block, then using this in "onBlockActivated" if (!worldIn.isRemote) { playerIn.openGui(Main.instance, GuiHandler.getID(15), worldIn, pos.getX(), pos.getY(), pos.getZ()); //15 correspond to my Vitrine } GuiHandler @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { if(ID == 15) return new VitrineContainer((VitrineTileEntity) world.getTileEntity(new BlockPos(x,y,z)) , player.inventory); return null; } @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { if(ID == 15) return new GuiVitrine((VitrineTileEntity) world.getTileEntity(new BlockPos(x,y,z)) , player.inventory); return null; } Quote
MCenderdragon Posted August 10, 2016 Posted August 10, 2016 This looks correct. Maybe the gui class is wrong Quote catch(Exception e) { } Yay, Pokémon exception handling, gotta catch 'em all (and then do nothing with 'em).
Nxs0000 Posted August 10, 2016 Author Posted August 10, 2016 that could be the drawScreen, that doesn't display the item right since it doesn't understand my slots? Since i left if that way : @Override public void drawScreen(int mouseX, int mouseY, float partialTicks) { super.drawScreen(mouseX, mouseY, partialTicks); } Quote
Nxs0000 Posted August 10, 2016 Author Posted August 10, 2016 ok... fml... I'm dumb Thanks for the help guys! i juste messed up from the start >.< The real issue was that I did @Override the initGui() to add my stuff and forgot to call the super back... This caused the inventory to appear weird, which i tried to correct by changing the order in which the slots are registered. Thanks for your time everyone, Have a nice day ! Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.