Neoublie Posted June 11, 2013 Posted June 11, 2013 I am trying to get my first GUI working correctly. :'( I have the GUI rendering, opening and have the container able to store the items when closed. I am able to shift click items into the GUI's Slots but when I try and pick up the items from the inventory slots or the hot bar in the GUI's they bounce back into the GUI how do I make it so that I can manipulate the slot positions and such like normal? It looks like the GUI has refresh issue that is constantly rebinding the Inventory contents therefore not letting me pull the items out so I can move or split stacks. any assistance you can provide would be appreciated. Thanks. Neoublie Mod [WIP] - Codename: Project Shadow Quote Neoublie Author of Codename: Project Shadow if you do models and textures pm me. looking for some assistance.
ObsequiousNewt Posted June 11, 2013 Posted June 11, 2013 Your Container code would help. Quote BEWARE OF GOD --- Co-author of Pentachoron Labs' SBFP Tech.
Neoublie Posted June 11, 2013 Author Posted June 11, 2013 Sorry I didn't think to put that up there, here is the Container code, http://pastebin.com/m0MhRmRm I have been trying to use EE3 and the forge tutorials as reference but can't seem to see what I am doing wrong EDIT - Looks like I missed a portion that I had added at one stage, but lost at one point with my revising code while trying to get other stuff working. if (slotItemStack.stackSize == itemStack.stackSize){ return null; } slot.onPickupFromSlot(player, slotItemStack); I still have some layout and formatting issues remaining but I think I can tweak them easy enough. Quote Neoublie Author of Codename: Project Shadow if you do models and textures pm me. looking for some assistance.
ObsequiousNewt Posted June 12, 2013 Posted June 12, 2013 I do have to thank you, though. I had decided to look through your code and compare it to ours, at which point I noticed that ours was dreadfully broken, so I fixed it. Quote BEWARE OF GOD --- Co-author of Pentachoron Labs' SBFP Tech.
Neoublie Posted June 12, 2013 Author Posted June 12, 2013 Turns our mine is not exactly working correctly yet. I am still having some issues with being able to grab items and move them. Sometimes I can pick them up and some times they bound right back to the initial slot. It is like the game is going through a loop and binding the items each cycle, but if I can catch it at the right stage of the cycle I can grab and hold onto the item. is there anything I am missing. do you have your code available that I could have a look at if your Gui's slots are working correctly? Quote Neoublie Author of Codename: Project Shadow if you do models and textures pm me. looking for some assistance.
ObsequiousNewt Posted June 14, 2013 Posted June 14, 2013 On 6/12/2013 at 9:41 PM, Neoublie said: Turns our mine is not exactly working correctly yet. I am still having some issues with being able to grab items and move them. Sometimes I can pick them up and some times they bound right back to the initial slot. It is like the game is going through a loop and binding the items each cycle, but if I can catch it at the right stage of the cycle I can grab and hold onto the item. is there anything I am missing. do you have your code available that I could have a look at if your Gui's slots are working correctly? Yes; I replied to your PM. Quote BEWARE OF GOD --- Co-author of Pentachoron Labs' SBFP Tech.
ObsequiousNewt Posted June 15, 2013 Posted June 15, 2013 Silly me. Why don't I post it here, in case someone else wants to see it? Container code: Reveal hidden contents package sbfp.machines.solar; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.Slot; import net.minecraft.inventory.SlotFurnace; import net.minecraft.item.ItemStack; import cpw.mods.fml.common.FMLLog; public class ContainerSolarCharger extends Container{ TileEntitySolarCharger tileEntity; public ContainerSolarCharger(InventoryPlayer inv, TileEntitySolarCharger tileEntity){ this.tileEntity = tileEntity; this.tileEntity.container = this; FMLLog.info("I am being created"); this.addSlotToContainer(new SlotSolarCharger(tileEntity,0,8,32)); this.addSlotToContainer(new SlotSolarCharger(tileEntity,1,26,32)); this.addSlotToContainer(new SlotSolarCharger(tileEntity,2,8,50)); this.addSlotToContainer(new SlotSolarCharger(tileEntity,3,26,50)); this.addSlotToContainer(new SlotFurnace(inv.player,tileEntity,4,134,32)); this.addSlotToContainer(new SlotFurnace(inv.player,tileEntity,5,152,32)); this.addSlotToContainer(new SlotFurnace(inv.player,tileEntity,6,134,50)); this.addSlotToContainer(new SlotFurnace(inv.player,tileEntity,7,152,50)); for(int i = 0; i<3; ++i){ for(int j = 0; j<9; ++j){ this.addSlotToContainer(new Slot(inv,j+i*9+9,8+j*18,140+i*18)); } } for(int i = 0; i<9; ++i){ this.addSlotToContainer(new Slot(inv,i,8+i*18,198)); } } @Override public boolean canInteractWith(EntityPlayer par1EntityPlayer){ return this.tileEntity.isUseableByPlayer(par1EntityPlayer); } /** * Called to transfer a stack from one inventory to the other eg. when shift * clicking. */ @Override public ItemStack transferStackInSlot(EntityPlayer player, int index){ ItemStack stack = null; Slot slot = (Slot) this.inventorySlots.get(index); if(slot!=null&&slot.getHasStack()){ ItemStack slotstack = slot.getStack(); stack = slotstack.copy(); if(index<{ if(!this.mergeItemStack(slotstack,8,this.inventorySlots.size(),false)) return null; }else if(!this.getSlot(0).isItemValid(slotstack)||!this.mergeItemStack(slotstack,0,4,false)) return null; if(slotstack.stackSize==0){ slot.putStack((ItemStack) null); }else{ slot.onSlotChanged(); } if(slotstack.stackSize==stack.stackSize) return null; slot.onPickupFromSlot(player,slotstack); } return stack; } @Override public boolean mergeItemStack(ItemStack stack, int start, int end, boolean reverse){ return super.mergeItemStack(stack,start,end,reverse); } /** * Does the same as mergeItemStack with the same args, except does not * actually merge— just returns the number of items that can be merged * (usually either stack.stackSize or 0, but can be in between) * @param stack * @param start * @param end * @param reverse * @return */ int dryMerge(ItemStack stack, int start, int end, boolean reverse){ boolean flag1 = false; int i = start; if(reverse){ i = end-1; } int quantity = stack.stackSize; Slot slot; ItemStack slotstack; if(stack.isStackable()){ while(stack.stackSize>0&&(!reverse&&i<end||reverse&&i>=start)){ slot = this.getSlot(i); slotstack = slot.getStack(); if(slotstack!=null&&slotstack.itemID==stack.itemID&&(!stack.getHasSubtypes()||stack.getItemDamage()==slotstack.getItemDamage())&&ItemStack.areItemStackTagsEqual(stack,slotstack)){ int l = slotstack.stackSize+stack.stackSize; if(l<=stack.getMaxStackSize()){ quantity -= slotstack.stackSize; }else if(slotstack.stackSize<stack.getMaxStackSize()){ quantity -= (stack.getMaxStackSize() - slotstack.stackSize); } } if(reverse) --i; else ++i; } } if(stack.stackSize>0){ if(reverse){ i = end-1; }else{ i = start; } while(!reverse&&i<end||reverse&&i>=start){ slot = (Slot) this.inventorySlots.get(i); slotstack = slot.getStack(); if(slotstack==null){ quantity = 0; break; } if(reverse){ --i; }else{ ++i; } } } return stack.stackSize-quantity; } } Common Proxy code: Reveal hidden contents package sbfp; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import sbfp.client.GUISolarCharger; import sbfp.machines.solar.ContainerSolarCharger; import sbfp.machines.solar.TileEntitySolarCharger; import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.common.network.IGuiHandler; public class SBCommonProxy implements IGuiHandler{ public void init(){ FMLLog.fine("SBFP Common Proxy loading"); } @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z){ TileEntity tileEntity = world.getBlockTileEntity(x,y,z); if(tileEntity!=null){ if(tileEntity instanceof TileEntitySolarCharger) return new ContainerSolarCharger(player.inventory,(TileEntitySolarCharger) tileEntity); } FMLLog.info("TileEntity is null"); return null; } @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z){ TileEntity tileEntity = world.getBlockTileEntity(x,y,z); if(tileEntity!=null){ if(tileEntity instanceof TileEntitySolarCharger) return new GUISolarCharger(player.inventory,(TileEntitySolarCharger) tileEntity); } return null; } } TE code: Reveal hidden contents package sbfp.machines.solar; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.network.INetworkManager; import net.minecraft.network.packet.Packet250CustomPayload; import net.minecraft.util.StringTranslate; import sbfp.modsbfp; import sbfp.machines.TileEntityProcessor; import com.google.common.io.ByteArrayDataInput; import cpw.mods.fml.common.FMLLog; public class TileEntitySolarCharger extends TileEntityProcessor implements IInventory{ private ItemStack[] inventory = new ItemStack[8]; private boolean hasItem = false; public static final int maxWorkTicks = 45*20; // 45 Seconds to make 1 piece of charged redstone private ItemStack waitingOutput = new ItemStack(modsbfp.itemRedflux,1,3); ContainerSolarCharger container; @Override public void updateEntity(){ super.updateEntity(); if(!this.worldObj.canBlockSeeTheSky(xCoord,yCoord,zCoord)) return; if(this.hasItem){ this.workTicks++; if(this.workTicks==maxWorkTicks){ this.workTicks = 0; this.container.mergeItemStack(this.waitingOutput.copy(),4,8,false); this.hasItem = false; } } try{ if(!this.hasItem&&this.container.dryMerge(this.waitingOutput.copy(),4,8,false)>=this.waitingOutput.stackSize){ for(int i = 0; i<4; i++){ if(this.inventory[i]!=null){ this.inventory[i].stackSize--; if(this.inventory[i].stackSize<=0){ this.inventory[i] = null; } this.hasItem = true; break; } } } }catch(NullPointerException e){ if(this.container==null){ if(!this.playersUsing.isEmpty()){ FMLLog.warning("The TileSolarCharger.container at (%d,%d,%d) is null on side %s!",xCoord,yCoord,zCoord,this.worldObj.isRemote ? "client" : "server"); FMLLog.warning("Players using: %s",this.playersUsing.toArray()); } return; }else throw new RuntimeException(e); } } private boolean hasOutputRoom(ItemStack output){ for(int i = 4; i<8; i++){ if(this.inventory[i]==null) return true; if(this.inventory[i].itemID==output.itemID&&this.inventory[i].getItemDamage()==output.getItemDamage()&&this.inventory[i].stackSize+output.stackSize<output.getItem().getItemStackLimit()) return true; } return false; } @Override public void handleData(INetworkManager network, int type, Packet250CustomPayload packet, EntityPlayer player, ByteArrayDataInput dataStream){ try{ if(this.worldObj.isRemote){ this.workTicks = dataStream.readInt(); } }catch(Exception e){ e.printStackTrace(); } } @Override public int getSizeInventory(){ return this.inventory.length; } @Override public ItemStack getStackInSlot(int index){ return this.inventory[index]; } @Override public ItemStack decrStackSize(int slot, int num){ if(this.inventory[slot]!=null){ ItemStack stack; if(this.inventory[slot].stackSize<=num){ stack = this.inventory[slot]; this.inventory[slot] = null; return stack; }else{ stack = this.inventory[slot].splitStack(num); if(this.inventory[slot].stackSize==0){ this.inventory[slot] = null; } return stack; } }else return null; } @Override public ItemStack getStackInSlotOnClosing(int index){ if(this.inventory[index]!=null){ ItemStack var2 = this.inventory[index]; this.inventory[index] = null; return var2; }else return null; } @Override public void setInventorySlotContents(int index, ItemStack stack){ this.inventory[index] = stack; if(stack!=null&&stack.stackSize>this.getInventoryStackLimit()){ stack.stackSize = this.getInventoryStackLimit(); } } @Override public String getInvName(){ return StringTranslate.getInstance().translateKey("solarcharger.name"); } @Override public boolean isInvNameLocalized(){ return true; } @Override public int getInventoryStackLimit(){ return 64; } @Override public boolean isUseableByPlayer(EntityPlayer player){ return this.worldObj.getBlockTileEntity(this.xCoord,this.yCoord,this.zCoord)!=this ? false : player.getDistanceSq(this.xCoord+0.5D,this.yCoord+0.5D,this.zCoord+0.5D)<=64.0D; } @Override public void openChest(){} @Override public void closeChest(){} @Override public boolean isStackValidForSlot(int i, ItemStack is){ return this.container.getSlot(0).isItemValid(is); } @Override public void writeToNBT(NBTTagCompound tagCompound){ super.writeToNBT(tagCompound); tagCompound.setInteger("workTicks",workTicks); if(this.waitingOutput!=null){ NBTTagCompound ntc2 = new NBTTagCompound(); this.waitingOutput.writeToNBT(ntc2); tagCompound.setTag("waitingOutput",ntc2); } NBTTagList tagList = new NBTTagList(); for(int i = 0; i<this.inventory.length; ++i){ if(this.inventory[i]!=null){ NBTTagCompound ntc3 = new NBTTagCompound(); ntc3.setByte("slot",(byte) i); this.inventory[i].writeToNBT(ntc3); tagList.appendTag(ntc3); } } tagCompound.setTag("items",tagList); } @Override public void readFromNBT(NBTTagCompound tagCompound){ super.readFromNBT(tagCompound); this.workTicks = tagCompound.getInteger("workTicks"); NBTTagCompound ntc2 = tagCompound.getCompoundTag("waitingOutput"); this.waitingOutput = ItemStack.loadItemStackFromNBT(ntc2); NBTTagList var2 = tagCompound.getTagList("items"); for(int i = 0; i<var2.tagCount(); ++i){ NBTTagCompound ntc3 = (NBTTagCompound) var2.tagAt(i); byte slot = ntc3.getByte("slot"); if(slot>=0&&slot<this.inventory.length){ this.inventory[slot] = ItemStack.loadItemStackFromNBT(ntc3); } } } } And the SlotSolarCharger: Reveal hidden contents package sbfp.machines.solar; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; class SlotSolarCharger extends Slot{ public SlotSolarCharger(IInventory par1iInventory, int par2, int par3, int par4){ super(par1iInventory,par2,par3,par4); } @Override public boolean isItemValid(ItemStack is){ return is.itemID==Item.redstone.itemID; } } If you need anything else, you can check out our GitHub repo at https://github.com/Pentachoron-Labs/SBFP-Tech. Quote BEWARE OF GOD --- Co-author of Pentachoron Labs' SBFP Tech.
Neoublie Posted June 19, 2013 Author Posted June 19, 2013 Turns out I was so close to having the inventory slots working correctly. I was only missing 1 line from my mod base class. good old @NetworkMod Thanks to the thread here here I was able to check all the things I thought was wrong with my GUI class, TileEntity, and Container and stumbled across the mention of missing @NetworkMod Thanks all. Quote Neoublie Author of Codename: Project Shadow if you do models and textures pm me. looking for some assistance.
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.