package slimeknights.tconstruct.gadgets.tileentity; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraft.util.ITickable; import net.minecraft.util.math.AxisAlignedBB; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.items.wrapper.SidedInvWrapper; import javax.annotation.Nonnull; import slimeknights.tconstruct.library.TinkerRegistry; import slimeknights.tconstruct.library.tileentity.IProgress; public class TileDryingRack extends TileItemRack implements ITickable, ISidedInventory, IProgress { private static final String TAG_TIME = "Time"; private static final String TAG_MAXTIME = "MaxTime"; int currentTime; int maxTime; public TileDryingRack() { super("gui.dryingrack.name", 2); // two slots, an input and an output. Should never both have something, output is just to stop item tranfer // use a SidedInventory Wrapper to respect the canInsert/Extract calls this.itemHandler = new SidedInvWrapper(this, EnumFacing.DOWN); } @Override public float getProgress() { if(getStackInSlot(0) != null && currentTime < maxTime) { return (float) currentTime / (float) maxTime; } return 0; } @Override public void update() { //only run on the server side and if a recipe is available if(maxTime > 0 && currentTime < maxTime) { currentTime++; if(currentTime >= maxTime && !getWorld().isRemote) { // add the result to slot 1 and remove the original from slot 0 setInventorySlotContents(1, TinkerRegistry.getDryingResult(getStackInSlot(0))); setInventorySlotContents(0, null); //drying time updated in setInventorySlotContents // comparator update this.getWorld().notifyNeighborsOfStateChange(this.pos, this.getBlockType()); } } } @Override public void setInventorySlotContents(int slot, ItemStack stack) { // if there is no drying recipe, just place the item directly into the output slot for item output and tick efficiency if(slot == 0 && !isStackInSlot(1) && stack != null && TinkerRegistry.getDryingResult(stack) == null) { slot = 1; } super.setInventorySlotContents(slot, stack); if(slot == 0) { updateDryingTime(); } else if(this.getWorld() != null) { // comparator update this.getWorld().notifyNeighborsOfStateChange(this.pos, this.getBlockType()); } } @Override public ItemStack decrStackSize(int slot, int quantity) { ItemStack stack = super.decrStackSize(slot, quantity); maxTime = 0; currentTime = 0; return stack; } public void updateDryingTime() { currentTime = 0; ItemStack stack = getStackInSlot(0); if(stack != null) { maxTime = TinkerRegistry.getDryingTime(stack); } else { maxTime = -1; } //worldObj.scheduleUpdate(pos, blockType, 0); } @Nonnull @Override @SideOnly(Side.CLIENT) public AxisAlignedBB getRenderBoundingBox() { return new AxisAlignedBB(pos.getX(), pos.getY() - 1, pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1); } @Nonnull @Override public int[] getSlotsForFace(@Nonnull EnumFacing side) { return new int[]{0, 1}; } @Override public boolean canInsertItem(int index, @Nonnull ItemStack itemStackIn, @Nonnull EnumFacing direction) { // Only allow inserting if there is no stack in the result slot return index == 0 && !isStackInSlot(1); } @Override public boolean canExtractItem(int index, @Nonnull ItemStack stack, @Nonnull EnumFacing direction) { return index == 1; } /** * @return The current comparator strength based on if an output exists */ public int comparatorStrength() { return isStackInSlot(1) ? 15 : 0; } /* Saving and Loading */ @Override public void readFromNBT(NBTTagCompound tags) { super.readFromNBT(tags); currentTime = tags.getInteger(TAG_TIME); maxTime = tags.getInteger(TAG_MAXTIME); } @Nonnull @Override public NBTTagCompound writeToNBT(NBTTagCompound tags) { tags = super.writeToNBT(tags); tags.setInteger(TAG_TIME, currentTime); tags.setInteger(TAG_MAXTIME, maxTime); return tags; } }