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.item.ItemBookSorcery; import jp.plusplus.fbs.item.ItemCore; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; 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.*; /** * Createdby pluslus_Fon 2015/06/14. */ public class TileEntityFillingTable extends TileEntity implements ISidedInventory,IFluidHandler { public static final int TANK_CAPACITY=4000; public TankFBS tank=new TankFBS(TANK_CAPACITY); private static final int[] slotsBook=new int[]{0}, slotsFluid=new int[]{1,2}; public ItemStack[] itemStacks=new ItemStack[3]; public static final short MAX_PROGRESS=20*10; public short progress; @Override public void readFromNBT(NBTTagCompound par1NBTTagCompound){ super.readFromNBT(par1NBTTagCompound); progress= par1NBTTagCompound.getShort("Progress"); NBTTagList nbttaglist = (NBTTagList)par1NBTTagCompound.getTag("Items"); itemStacks = new ItemStack[getSizeInventory()]; for (int i=0;i=0 && b0=amount){ if (progress >= MAX_PROGRESS) { tank.drain(amount, true); //一定確率で失敗する float pr; if(bd.lv<=5) pr=1.0f; else if(bd.lv<40) pr=1.0f-0.02f*(bd.lv-5); else pr=0.3f; if(worldObj.rand.nextFloat() itemStacks[2].getMaxStackSize()) return; itemStacks[2].stackSize+=emptyContainer.stackSize; } else { setInventorySlotContents(2, emptyContainer); } } itemStacks[1].stackSize--; if(itemStacks[1].stackSize<=1){ setInventorySlotContents(1, null); } fill(ForgeDirection.UNKNOWN, fluid2, true); markDirty(); } } else{ FluidStack fluid = tank.getFluid(); if (fluid != null && fluid.getFluid() != null) { ItemStack get = FluidContainerRegistry.fillFluidContainer(fluid.copy(), itemStacks[1]); if (get != null) { int cap = FluidContainerRegistry.getContainerCapacity(get); if (fluid.amount < cap) return; if (itemStacks[2] != null) { if (!itemStacks[2].isItemEqual(get)) return; if (itemStacks[2].stackSize + get.stackSize > itemStacks[1].getMaxStackSize()) return; } if (itemStacks[2] == null || itemStacks[2].stackSize <= 0) { setInventorySlotContents(2, get); } else { itemStacks[2].stackSize += get.stackSize; } itemStacks[1].stackSize--; if (itemStacks[1].stackSize <= 1) { setInventorySlotContents(1, 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]; } public int getProgressScaled(int par1){ return par1*this.progress/MAX_PROGRESS; } @SideOnly(Side.CLIENT) public IIcon getFluidIcon(){ Fluid fluid = tank.getFluidType(); return fluid != null ? fluid.getIcon() : 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; markDirty(); return itemstack; } else{ itemstack = itemStacks[i].splitStack(j); if (itemStacks[i].stackSize == 0){ itemStacks[i] = null; } 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(); } markDirty(); } @Override public String getInventoryName() { return BlockCore.fillingTable.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==0) { return itemstack.getItem()==ItemCore.bookSorcery; } else if(i==1){ if(itemstack.getItem()==ItemCore.bookSorcery) return false; FluidStack f=FluidContainerRegistry.getFluidForFilledItem(itemstack); return f!=null && f.getFluid()==BlockCore.mana; } return false; } @Override public int[] getAccessibleSlotsFromSide(int var1) { if(var1==0 || var1==1) return slotsBook; return slotsFluid; } @Override public boolean canInsertItem(int i, ItemStack itemstack, int j) { return i!=2 && isItemValidForSlot(i, itemstack); } @Override public boolean canExtractItem(int i, ItemStack itemstack, int j) { return i==0 || i==2; } }