Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[SOLVED]: Player inventory bound to GUI wont allow items to move


Recommended Posts

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

Neoublie

Author of Codename: Project Shadow

 

if you do models and textures pm me. looking for some assistance.

Link to post
Share on other sites

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.

 

Neoublie

Author of Codename: Project Shadow

 

if you do models and textures pm me. looking for some assistance.

Link to post
Share on other sites

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?

 

Neoublie

Author of Codename: Project Shadow

 

if you do models and textures pm me. looking for some assistance.

Link to post
Share on other sites

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.

BEWARE OF GOD

---

Co-author of Pentachoron Labs' SBFP Tech.

Link to post
Share on other sites

Silly me. Why don't I post it here, in case someone else wants to see it?

 

Container code:

 

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:

 

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:

 

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:

 

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.

BEWARE OF GOD

---

Co-author of Pentachoron Labs' SBFP Tech.

Link to post
Share on other sites

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.

Neoublie

Author of Codename: Project Shadow

 

if you do models and textures pm me. looking for some assistance.

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.