Posted June 14, 201312 yr Hey, So im working on a mod wich adds a new machine wich uses Buildcraft Energy to fill buckets from liquids in its Tank. The problem is when I try to read the liquidStack from the liquidTank in the GUI it always returns null. I just wanted to display how much liquid and wich type of its in my machine is. The (in my oppinion) relevant Code: BucketFillerEntity public class BucketFillerEntity extends TileEntity implements ISidedInventory,ITankContainer,IPowerReceptor{ ItemStack[] inventory = new ItemStack[2]; private IPowerProvider powerProvider; private int maxLiquid = LiquidContainerRegistry.BUCKET_VOLUME*5; private LiquidTank liqTank; public BucketFillerEntity() { super(); liqTank = new LiquidTank(maxLiquid); } @Override public int getSizeInventory() { // TODO Auto-generated method stub return inventory.length; } @Override public ItemStack getStackInSlot(int i) { return inventory[i]; } @Override public ItemStack decrStackSize(int par1, int par2) { if (this.inventory[par1] != null) { ItemStack itemstack; if (this.inventory[par1].stackSize <= par2) { itemstack = this.inventory[par1]; this.inventory[par1] = null; return itemstack; } else { itemstack = this.inventory[par1].splitStack(par2); if (this.inventory[par1].stackSize == 0) { this.inventory[par1] = null; } return itemstack; } } else { return null; } } @Override public ItemStack getStackInSlotOnClosing(int i) { if (this.inventory[i] != null) { ItemStack itemstack = this.inventory[i]; this.inventory[i] = null; return itemstack; } else { return null; } } @Override public void setInventorySlotContents(int i, ItemStack itemstack) { this.inventory[i] = itemstack; if (itemstack != null && itemstack.stackSize > this.getInventoryStackLimit()) { itemstack.stackSize = this.getInventoryStackLimit(); } } @Override public String getInvName() { // TODO Auto-generated method stub return "Bucket Filler"; } @Override public boolean isInvNameLocalized() { // TODO Auto-generated method stub return true; } @Override public int getInventoryStackLimit() { // TODO Auto-generated method stub return 64; } @Override public boolean isUseableByPlayer(EntityPlayer entityplayer) { // TODO Auto-generated method stub return this.worldObj.getBlockTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : entityplayer.getDistanceSq((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D) <= 64.0D; } @Override public void openChest() { // TODO Auto-generated method stub } @Override public void closeChest() { // TODO Auto-generated method stub } @Override public boolean isStackValidForSlot(int i, ItemStack itemstack) { if(i==1){ return itemstack.itemID==Item.bucketEmpty.itemID?true:false; } else return false; } @Override public int[] getAccessibleSlotsFromSide(int var1) { int sides1[]={1}; int sides2[]={0}; return var1!=0? sides1:sides2; } @Override public boolean canInsertItem(int slot, ItemStack itemstack, int side) { // TODO Auto-generated method stub return (side>0&&this.isStackValidForSlot(slot, itemstack))?true:false; } @Override public boolean canExtractItem(int i, ItemStack itemstack, int j) { // TODO Auto-generated method stub return i!=1; } @Override public void setPowerProvider(IPowerProvider paramIPowerProvider) { powerProvider=paramIPowerProvider; } @Override public IPowerProvider getPowerProvider() { // TODO Auto-generated method stub return powerProvider; } @Override public void doWork() { if(powerProvider.getEnergyStored()<1) return; if(!canFill()) return; if(powerProvider.useEnergy(1, 1, true)==1) fillBucket(); } @Override public int powerRequest(ForgeDirection paramForgeDirection) { // TODO Auto-generated method stub if (isActive) { return (int)Math.ceil(Math.min(getPowerProvider().getMaxEnergyReceived(), getPowerProvider().getMaxEnergyStored() - getPowerProvider().getEnergyStored())); } return 0; } @Override public void updateEntity(){ super.updateEntity(); powerProvider.update(this); } private boolean canFill(){ if(liqTank.getLiquid()!=null &&inventory[1]!=null&&inventory[0]!=null&&liqTank.getLiquid().amount>1000){ if(inventory[1].itemID==Item.bucketEmpty.itemID&&inventory[0].stackSize<inventory[0].getItem().getItemStackLimit() ){ return true; } }else if(liqTank.getLiquid()!=null &&inventory[1]!=null&&inventory[0]==null&&liqTank.getLiquid().amount>1000){ if(inventory[1].itemID==Item.bucketEmpty.itemID ){ return true; } } return false; } private void fillBucket(){ LiquidStack drainedLiq =liqTank.drain(LiquidContainerRegistry.BUCKET_VOLUME, true); inventory[0]=LiquidContainerRegistry.fillLiquidContainer(drainedLiq, inventory[1]); inventory[1].stackSize--; if(inventory[1].stackSize==0) inventory[1]=null; System.out.println(liqTank.getLiquid().asItemStack().getDisplayName()); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); NBTTagList nbttaglist = nbt.getTagList("Inventory"); for (int i = 0; i < nbttaglist.tagCount(); ++i) { NBTTagCompound nbttagcompound1 = (NBTTagCompound)nbttaglist.tagAt(i); byte b0 = nbttagcompound1.getByte("Slot"); if (b0 >= 0 && b0 < this.inventory.length) { this.inventory[b0] = ItemStack.loadItemStackFromNBT(nbttagcompound1); } else if(b0==inventory.length){ liqTank.readFromNBT(nbttagcompound1); } } } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); NBTTagList nbttaglist = new NBTTagList(); for (int i = 0; i < this.inventory.length+1; ++i) { if(i<inventory.length){ if (this.inventory[i] != null) { NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("Slot", (byte)i); this.inventory[i].writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); } } else if(i==inventory.length){ NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("Slot", (byte)i); liqTank.writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); } } nbt.setTag("Inventory", nbttaglist); } @Override public int fill(ForgeDirection from, LiquidStack resource, boolean doFill) { int ret =liqTank.fill(resource, doFill); liquidName=liqTank.getLiquidName(); return ret; } @Override public int fill(int tankIndex, LiquidStack resource, boolean doFill) { return liqTank.fill(resource, doFill); } @Override public LiquidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { // TODO Auto-generated method stub return null; } @Override public LiquidStack drain(int tankIndex, int maxDrain, boolean doDrain) { // TODO Auto-generated method stub return null; } @Override public ILiquidTank[] getTanks(ForgeDirection direction) { LiquidTank[] a={liqTank}; return a ; } @Override public ILiquidTank getTank(ForgeDirection direction, LiquidStack type) { return liqTank; } public String getLiquidType(){ if(liqTank.getLiquid()==null) return ""; System.out.println(liqTank.getLiquid().asItemStack().getDisplayName()); return liqTank.getLiquid().asItemStack().getDisplayName(); } public float getLiquidLevel(){ float level; if(liqTank.getLiquid()==null) return 0; level=this.maxLiquid/liqTank.getLiquid().amount; return level; } public float getProgress(){ return powerProvider.getEnergyStored(); } } BucketFillerGui package org.rainbowmodding.advancedbc; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.StatCollector; import org.lwjgl.opengl.GL11; import org.rainbowmodding.advancedbc.entity.BucketFillerEntity; public class BucketFillerGui extends GuiContainer { BucketFillerEntity tileEnt; public BucketFillerGui (InventoryPlayer inventoryPlayer, TileEntity tileEntity) { //the container is instanciated and passed to the superclass for handling super(new ContainerBucketFiller(inventoryPlayer,(BucketFillerEntity) tileEntity)); tileEnt=(BucketFillerEntity)tileEntity; } @Override protected void drawGuiContainerForegroundLayer(int param1, int param2) { //draw text and stuff here //the parameters for drawString are: string, x, y, color fontRenderer.drawString("Tiny", 8, 6, 4210752); //draws "Inventory" or your regional equivalent fontRenderer.drawString(StatCollector.translateToLocal("container.inventory"), 8, ySize - 96 + 2, 4210752); } @Override protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { //draw your Gui here, only thing you need to change is the path int texture = mc.renderEngine.getTexture("/mods/advancedBC/textures/gui/GUIBucketFiller.png"); GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // This is the method to bind the picture you defined above to the background, this is required to have a background on // On the screen this.mc.renderEngine.bindTexture("/mods/advancedBC/textures/gui/GUIBucketFiller.png"); // This is the x value of the picture, it will be used later int x = (width - xSize) / 2; // This is the y value of the picture, it will be used later int y = (height - ySize) / 2; // This is the method to draw the rectangle to the screen that allows the texture, copy this, because it will be pretty // Much the same for every Gui int i1,i2; String liqType=tileEnt.getLiquidType();// String liqType is null if(liqType.equals("Lava")){ i1=178; i2=1; } else{ i1=190; i2=1; } float progress=tileEnt.getProgress(); float liqLevel=tileEnt.getLiquidLevel(); this.drawTexturedModalRect(x+68,y- 37+Math.round((37*progress)), i1, i2, 11, 11); this.drawTexturedModalRect(x+86,y+ 34, i1, i2, 11, Math.round(liqLevel)*28); this.drawTexturedModalRect(x, y, 0, 0, xSize, ySize); // } } GuiHandler package org.rainbowmodding.advancedbc; import org.rainbowmodding.advancedbc.entity.BucketFillerEntity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import cpw.mods.fml.common.network.IGuiHandler; public class GuiHandler implements IGuiHandler { //returns an instance of the Container you made earlier @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 instanceof BucketFillerEntity){ return new ContainerBucketFiller(player.inventory, (BucketFillerEntity) tileEntity); //The liquidTank of tileEntity is filled } return null; } //returns an instance of the Gui you made earlier @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 instanceof BucketFillerEntity){ return new BucketFillerGui(player.inventory, (BucketFillerEntity) tileEntity); //The liquidTank of tileEntity isn't filled } return null; } } I just dont get it why it works for me. Thank you for trying to read, understand and help me with my code! EDIT: It works now... i had to load the entity from the server and not from the client world. So the working GuiHander : package org.rainbowmodding.advancedbc; import org.rainbowmodding.advancedbc.entity.BucketFillerEntity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.src.ModLoader; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import cpw.mods.fml.common.network.IGuiHandler; public class GuiHandler implements IGuiHandler { //returns an instance of the Container you made earlier @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 instanceof BucketFillerEntity){ return new ContainerBucketFiller(player.inventory, (BucketFillerEntity) tileEntity); } return null; } //returns an instance of the Gui you made earlier @Override public Object getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) { TileEntity tileEntity = ModLoader.getMinecraftServerInstance().worldServers[player.dimension].getBlockTileEntity(x, y, z); if(tileEntity instanceof BucketFillerEntity){ return new BucketFillerGui(player.inventory, (BucketFillerEntity) tileEntity); } return null; } }
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.