package jp.plusplus.fbs.tileentity; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import jp.plusplus.fbs.Registry; import jp.plusplus.fbs.block.BlockCore; import jp.plusplus.fbs.container.ContainerDummy; import jp.plusplus.fbs.item.ItemCore; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.*; /** * Created by pluslus_F on 2015/06/14. */ public class TileEntityFBSWorkbench extends TileEntity implements ISidedInventory,IFluidHandler { public static final int TANK_CAPACITY=4000; public TankFBS tank=new TankFBS(TANK_CAPACITY); private static final int[] slotsMaterial=new int[]{0,1,2,3,4,5,6,7,8}, slotsProduct=new int[]{9}, slotsMana=new int[]{10,11}; public ItemStack[] itemStacks=new ItemStack[12]; public Container dummy=new ContainerDummy(); public InventoryCrafting dummyInv=new InventoryCrafting(dummy,3,3); public Registry.RecipePair product; @Override public void readFromNBT(NBTTagCompound par1NBTTagCompound){ super.readFromNBT(par1NBTTagCompound); NBTTagList nbttaglist = (NBTTagList)par1NBTTagCompound.getTag("Items"); itemStacks = new ItemStack[getSizeInventory()]; for (int i=0;i=0 && b0 ec.getMaxStackSize()) return; ec.stackSize+=emptyContainer.stackSize; } else { setInventorySlotContents(slotsMana[1], emptyContainer); } } fc.stackSize--; if(fc.stackSize<=1){ setInventorySlotContents(slotsMana[0], null); } fill(ForgeDirection.UNKNOWN, fluid2, true); markDirty(); } } else{ FluidStack fluid = tank.getFluid(); if (fluid != null && fluid.getFluid() != null) { ItemStack get = FluidContainerRegistry.fillFluidContainer(fluid.copy(), fc); if (get != null) { int cap = FluidContainerRegistry.getContainerCapacity(get); if (fluid.amount < cap) return; if (ec != null) { if (!ec.isItemEqual(get)) return; if (ec.stackSize + get.stackSize > fc.getMaxStackSize()) return; } if (ec == null || ec.stackSize <= 0) { setInventorySlotContents(slotsMana[1], get); } else { ec.stackSize += get.stackSize; } fc.stackSize--; if (fc.stackSize <= 1) { setInventorySlotContents(slotsMana[0], null); } drain(ForgeDirection.UNKNOWN, cap, true); markDirty(); } } } } //----------------------------------------------------------------------------- @Override public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { if (resource == null || resource.getFluid() == null){ return 0; } FluidStack current = tank.getFluid(); FluidStack resourceCopy = resource.copy(); if (current != null && current.amount > 0 && !current.isFluidEqual(resourceCopy)){ return 0; } int i = 0; int used = tank.fill(resourceCopy, doFill); resourceCopy.amount -= used; i += used; return i; } @Override public FluidStack drain(ForgeDirection forgeDirection, FluidStack resource, boolean doDrain) { if (resource == null) { return null; } if (tank.getFluidType() == resource.getFluid()) { return tank.drain(resource.amount, doDrain); } return null; } @Override public FluidStack drain(ForgeDirection forgeDirection, int max, boolean b) { return tank.drain(max, b); } @Override public boolean canFill(ForgeDirection from, Fluid fluid) { return fluid == BlockCore.mana; } @Override public boolean canDrain(ForgeDirection from, Fluid fluid) { return !tank.isEmpty(); } @Override public FluidTankInfo[] getTankInfo(ForgeDirection from) { return new FluidTankInfo[0]; } @SideOnly(Side.CLIENT) public IIcon getFluidIcon(){ Fluid fluid = tank.getFluidType(); return fluid != null ? fluid.getIcon() : null; } public void onInventoryChange() { for (int i = 0; i < slotsMaterial.length; i++) { dummyInv.setInventorySlotContents(i, itemStacks[slotsMaterial[i]]); } product = Registry.FindMatchingRecipe(dummyInv, worldObj); if (product != null && tank.getFluidAmount()>=product.mana) setInventorySlotContents(slotsProduct[0], product.recipe.getCraftingResult(dummyInv)); else setInventorySlotContents(slotsProduct[0], null); } //------------------------------------------------------------------ @Override public int getSizeInventory() { return itemStacks.length; } @Override public ItemStack getStackInSlot(int i) { return itemStacks[i]; } @Override public ItemStack decrStackSize(int i, int j) { if (itemStacks[i] != null){ ItemStack itemstack; if (itemStacks[i].stackSize <= j){ itemstack = itemStacks[i]; itemStacks[i] = null; if(i==slotsProduct[0] && product!=null){ tank.drain(product.mana*itemstack.stackSize, true); } onInventoryChange(); markDirty(); return itemstack; } else{ itemstack = itemStacks[i].splitStack(j); if (itemStacks[i].stackSize == 0){ itemStacks[i] = null; } if(i==slotsProduct[0] && product!=null){ tank.drain(product.mana*itemstack.stackSize, true); } onInventoryChange(); markDirty(); return itemstack; } } else{ return null; } } @Override public ItemStack getStackInSlotOnClosing(int i) { if (itemStacks[i] != null){ ItemStack itemstack = itemStacks[i]; itemStacks[i] = null; markDirty(); return itemstack; } else{ return null; } } @Override public void setInventorySlotContents(int i, ItemStack itemStack) { itemStacks[i] = itemStack; if (itemStack != null && itemStack.stackSize > this.getInventoryStackLimit()){ itemStack.stackSize = getInventoryStackLimit(); } if(i!=slotsProduct[0]) onInventoryChange(); markDirty(); } @Override public String getInventoryName() { return BlockCore.workbench.getLocalizedName(); } @Override public boolean hasCustomInventoryName() { return false; } @Override public int getInventoryStackLimit() { return 64; } @Override public boolean isUseableByPlayer(EntityPlayer entityPlayer) { return worldObj.getTileEntity(xCoord, yCoord, zCoord) != this ? false : entityPlayer.getDistanceSq((double)xCoord+0.5D, (double)yCoord+0.5D, (double)zCoord+0.5D) <= 64.0D; } @Override public void openInventory() { } @Override public void closeInventory() { } @Override public boolean isItemValidForSlot(int i, ItemStack itemstack) { if(i==10){ FluidStack f=FluidContainerRegistry.getFluidForFilledItem(itemstack); return f!=null && f.getFluid()==BlockCore.mana; } return false; } @Override public int[] getAccessibleSlotsFromSide(int p_94128_1_) { return slotsMana; } @Override public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_) { if(p_102007_1_!=slotsMana[0]) return false; FluidStack fc=FluidContainerRegistry.getFluidForFilledItem(p_102007_2_); return fc!=null && fc.getFluid()==BlockCore.mana; } @Override public boolean canExtractItem(int p_102008_1_, ItemStack p_102008_2_, int p_102008_3_) { return p_102008_1_==slotsMana[1]; } }