Jump to content

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


Recommended Posts

Posted

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.

Posted

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.

Posted

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.

Posted

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.

Posted

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.

Posted

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.

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
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.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • log: https://mclo.gs/QJg3wYX as stated in the title, my game freezes upon loading into the server after i used a far-away waystone in it. The modpack i'm using is better minecraft V18. Issue only comes up in this specific server, singleplayer and other servers are A-okay. i've already experimented with removing possible culprits like modernfix and various others to no effect. i've also attempted a full reinstall of the modpack profile. Issue occurs shortly after the 'cancel' button dissapears on the 'loading world' section of the loading screen.   thanks in advance.
    • You would have better results asking a more specific question. What have you done? What exactly do you need help with? Please also read the FAQ regarding posting logs.
    • Hi, this is my second post with the same content as no one answered this and it's been a long time since I made the last post, I want to make a client-only mod, everything is ok, but when I use shaders, none of the textures rendered in RenderLevelStageEvent nor the crow entity model are rendered, I want them to be visible, because it's a horror themed mod I've already tried it with different shaders, but it didn't work with any of them and I really want to add support for shaders Here is how i render the crow model in the CrowEntityRenderer<CrowEntity>, by the time i use this method, i know is not the right method but i don't think this is the cause of the problem, the renderType i'm using is entityCutout @Override public void render(CrowEntity p_entity, float entityYaw, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight) { super.render(p_entity, entityYaw, partialTick, poseStack, bufferSource, packedLight); ClientEventHandler.getClient().crow.renderToBuffer(poseStack, bufferSource.getBuffer(ClientEventHandler.getClient().crow .renderType(TEXTURE)), packedLight, OverlayTexture.NO_OVERLAY, Utils.rgb(255, 255, 255)); } Here renderLevelStage @Override public void renderWorld(RenderLevelStageEvent e) { horrorEvents.draw(e); } Here is how i render every event public void draw(RenderLevelStageEvent e) { for (HorrorEvent event : currentHorrorEvents) { event.tick(e.getPartialTick()); event.draw(e); } } Here is how i render the crow model on the event @Override public void draw(RenderLevelStageEvent e) { if(e.getStage() == RenderLevelStageEvent.Stage.AFTER_ENTITIES) { float arcProgress = getArcProgress(0.25f); int alpha = (int) Mth.lerp(arcProgress, 0, 255); int packedLight = LevelRenderer.getLightColor(Minecraft.getInstance().level, blockPos); VertexConsumer builder = ClientEventHandler.bufferSource.getBuffer(crow); Crow<CreepyBirdHorrorEvent> model = ClientEventHandler .getClient().crow; model.setupAnim(this); RenderHelper.renderModelInWorld(model, position, offset, e.getCamera(), e.getPoseStack(), builder, packedLight, OverlayTexture.NO_OVERLAY, alpha); builder = ClientEventHandler.bufferSource.getBuffer(eyes); RenderHelper.renderModelInWorld(model, position, offset, e.getCamera(), e.getPoseStack(), builder, 15728880, OverlayTexture.NO_OVERLAY, alpha); } } How i render the model public static void renderModelInWorld(Model model, Vector3f pos, Vector3f offset, Camera camera, PoseStack matrix, VertexConsumer builder, int light, int overlay, int alpha) { matrix.pushPose(); Vec3 cameraPos = camera.getPosition(); double finalX = pos.x - cameraPos.x + offset.x; double finalY = pos.y - cameraPos.y + offset.y; double finalZ = pos.z - cameraPos.z + offset.z; matrix.pushPose(); matrix.translate(finalX, finalY, finalZ); matrix.mulPose(Axis.XP.rotationDegrees(180f)); model.renderToBuffer(matrix, builder, light, overlay, Utils .rgba(255, 255, 255, alpha)); matrix.popPose(); matrix.popPose(); } Thanks in advance
    • I am trying to develop a modpack for me and my friends to use on our server. Does anyone know how to develop a modpack for a server or could they help take a look at my modpack to potentially help at all?
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.