Posted December 23, 201311 yr I have a multipage chest container. When I shift-click items out of the chest, they flash briefly in my inventory and then disappear. Normal clicking and moving keeps the items until I reopen the container and then they disappear. Shift-clink only does this with full stacks it seems. It should be noted the inventory of the pages is a shared inventory like the Ender Chest. ChestPage package CJTech.inventory; import java.util.logging.Level; import java.util.logging.Logger; import CJTech.tileentity.TileEntityEnderNetTerminal; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; public class EnderNetItemPage implements IInventory{ private TileEntityEnderNetTerminal terminal; private int page; public EnderNetItemPage(TileEntityEnderNetTerminal terminal, int page) { this.terminal = terminal; this.page = page; } @Override public int getSizeInventory() {return 117;} @Override public ItemStack getStackInSlot(int i) { return terminal.GetStackInSlot((page * 117) + i); } @Override public ItemStack decrStackSize(int i, int j) { return terminal.decrStack((page * 117) + i, j); } @Override public ItemStack getStackInSlotOnClosing(int i) {return null;} @Override public void setInventorySlotContents(int i, ItemStack itemstack) { //Treat as AddStack //Logger.getLogger("CJTECH").log(Level.INFO, "Adding: " + itemstack.stackSize); if (itemstack != null) if(CJTech.CJTech.instance.isSimulating()) //server handled by actual EnderNet { terminal.AddStack(itemstack); } else { } } @Override public String getInvName() {return "Ender Net";} @Override public boolean isInvNameLocalized() {return true;} @Override public int getInventoryStackLimit() {return 64;} @Override public void onInventoryChanged() {} @Override public boolean isUseableByPlayer(EntityPlayer entityplayer) {return true;} @Override public void openChest() {} @Override public void closeChest() {} @Override public boolean isItemValidForSlot(int i, ItemStack itemstack) {return true;} } Chest Container package CJTech.inventory; import java.util.List; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.ICrafting; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; public class ContainerEnderNetItemTerminal extends Container{ public EnderNetItemPage itemPages; public ContainerEnderNetItemTerminal(IInventory invPlayer, EnderNetItemPage itemPages) { this.itemPages = itemPages; for(int row = 0; row < 9; row++) { for(int col = 0; col < 13; col++) { addSlotToContainer(new Slot(itemPages, col + row * 13, 12 + col * 18, 8 + row * 18)); } } for(int invPlayerRow = 0; invPlayerRow < 3; invPlayerRow++) { for(int invPlayerCol = 0; invPlayerCol < 9; invPlayerCol++) { addSlotToContainer(new Slot(invPlayer, (invPlayerCol + invPlayerRow * 9) + 9, 48 + invPlayerCol * 18, 174 + invPlayerRow * 18)); } } for(int hotbatSlot = 0; hotbatSlot < 9; hotbatSlot++) { addSlotToContainer(new Slot(invPlayer, hotbatSlot, 48 + hotbatSlot * 18, 232)); } // ItemStorage = new IInventory(); // addSlotToContainer(new Slot(ItemStorage, 0, 228, 232)); //this.inventoryItemStacks.clear(); } @Override public boolean canInteractWith(EntityPlayer entityplayer) { return true; } public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2) { ItemStack itemstack = null; Slot slot = (Slot)this.inventorySlots.get(par2); if (slot != null && slot.getHasStack()) { ItemStack itemstack1 = slot.getStack(); itemstack = itemstack1.copy(); if (par2 < 117) { if (!this.mergeItemStack(itemstack1, 117, this.inventorySlots.size(), true)) { return null; } } else if (!this.mergeItemStack(itemstack1, 0, 117, false)) { return null; } if (itemstack1.stackSize == 0) { slot.putStack((ItemStack)null); } else { slot.onSlotChanged(); } } return itemstack; } } Class used to sync inventory package CJTech.endernet; import java.io.*; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; import CJTech.power.IPowerSink; import CJTech.util.CJTechFileIO; import CJTech.util.DebugLogger; import net.minecraft.client.Minecraft; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; public class EnderNet implements IPowerSink{ String SaveDir; public List<ItemStack> stacks = new ArrayList<ItemStack>(); public long Power = 0; public final long MaxPower = Long.MAX_VALUE; public boolean isLoaded = false; @Override public long RecievePower(long Power, boolean Sim) { this.Power += Power; return 0; } @Override public boolean canRecievePower() { return true; } /** * Removes power from the EnderNet * @param Amount Amount of power to drain/remove */ public void RemovePower(long Amount) { Power -= Amount; if (Power < 0) Power = 0; } /** * Checks if EnderNet has the ItemStack with ID, Meta, and at least a certain stack size * @param stack * @return */ protected boolean ContainsItemStack(ItemStack stack) { for (int f = 0; f < stacks.size(); f++) { if (stacks.get(f).itemID == stack.itemID) { if (stacks.get(f).getItemDamage() == stack.getItemDamage()) { if (stacks.get(f).stackSize >= stack.stackSize) { return true; } } } } return false; } protected int IndexOfStack(ItemStack stack) { if (stack == null) return -1; for (int f = 0; f < stacks.size(); f++) { if (stacks.get(f).itemID == stack.itemID) { if (stacks.get(f).getItemDamage() == stack.getItemDamage()) { return f; } } } return -1; } public ItemStack RetrieveStack(ItemStack stack) { int index = IndexOfStack(stack); if (index == -1) return null; ItemStack R = stacks.get(index).splitStack(stack.stackSize); if (stacks.get(index).stackSize <= 0) stacks.remove(index); return R; //return null; } public ItemStack RetrieveStack(int Slot, int Amount) { if (Slot >= stacks.size()) return null; if (Slot == -1) return null; if (!CJTech.CJTech.instance.isSimulating()) //Client return new ItemStack(stacks.get(Slot).itemID, Amount, stacks.get(Slot).getItemDamage()); else //Server { stacks.get(Slot).stackSize -= Amount; if (stacks.get(Slot).stackSize <= 0) stacks.remove(Slot); return null; } //return null; } public void AddStack(ItemStack stack) { boolean Server = CJTech.CJTech.instance.isSimulating(); DebugLogger.log("ENet Stack Size: " + stack.stackSize); if (stacks.size() == 0) { stacks.add(stack); DebugLogger.log("ENet Stack Added as new Stack, size was 0"); return; } //Try Merging Stacks for (int f = 0; f < stacks.size(); f++) { if (stacks.get(f).itemID == stack.itemID & stacks.get(f).getItemDamage() == stack.getItemDamage()) { if (stacks.get(f).stackSize + stack.stackSize <= stacks.get(f).getMaxStackSize()) { DebugLogger.log("ENet Stack Can Merge...: " + stack.stackSize + "|" + stacks.get(f).stackSize); stacks.get(f).stackSize += stack.stackSize; return; } else { int ToAdd = stacks.get(f).getMaxStackSize() - stacks.get(f).stackSize; DebugLogger.log("ENet Adding: " + ToAdd + " to stack."); stacks.get(f).stackSize += ToAdd; stack.stackSize -= ToAdd; //DebugLogger.log("ENet Putting rest in new stack"); //stacks.add(new ItemStack(stack.itemID, stack.stackSize - ToAdd, stack.getItemDamage())); //return; } } if (stack.stackSize <= 0) return; } //Add New Stack stacks.add(stack); } public ItemStack getStackInSlot(int i) { if (i < stacks.size()) return stacks.get(i); else return null; } public List getInventory() { return stacks; } }
December 24, 201311 yr Author Update: Im almost 100% sure this is a sync issue between the server and client. The problem only occurs when re-opening the gui/container. I checked the inventory of the player when the client gui element is opened, this was the correct inventory. However, the container element didnt have the updated player inventory. How do I ensure the inventory gets synced? I assumed Packet5PlayerInventory would work, then I realized Mojang doesnt handle it.
December 24, 201311 yr You don't need to implement or use any packets to synch inventories. My guess is that somewhere along the line you've improperly set up your gui / container / tileentity classes, but I wouldn't know where to look. Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
December 24, 201311 yr Well first there is the fact that EnderNetItemPage class is useless. It is only passing things to the TileEntity. You can implement the IInventory directly into the TileEntityEnderNetTerminal. Then, we have yet to see how you open the gui and container classes.
December 24, 201311 yr Author The ItemPage isnt useless because you can only access one page of the chest at a time. The container doesnt have access to every ItemStack at once. GuiHandler public class GuiHandler implements IGuiHandler{ @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { TileEntity tile_entity = world.getBlockTileEntity(x, y, z); int BlockID = world.getBlockId(x, y, z); int Meta = world.getBlockMetadata(x, y, z); if (BlockID == Blocks.blockEnderNetTerminal.blockID) { if (Meta == 1) { return new ContainerEnderNetItemTerminal(player, new EnderNetItemPage((TileEntityEnderNetTerminal) tile_entity, 0)); } } return null; } @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { TileEntity tile_entity = world.getBlockTileEntity(x, y, z); int BlockID = world.getBlockId(x, y, z); int Meta = world.getBlockMetadata(x, y, z); if (BlockID == Blocks.blockEnderNetTerminal.blockID) { if (Meta == 1) return new guiENetItemTerminal(player, (TileEntityEnderNetTerminal) tile_entity, 0); } return null; } }
December 24, 201311 yr Author Fixed it myself. I guess in my sleep deprivation, I thought it was a good idea to store the player inventory in a separate field in the container. I have no idea why I did this as I didnt do it for any other container in my mod. Everything seems to work fine now that I fixed that.
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.