/******************************************************************************* * AbyssalCraft * Copyright (c) 2012 - 2017 Shinoow. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v3 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl-3.0.txt * * Contributors: * Shinoow - implementation ******************************************************************************/ package com.shinoow.abyssalcraft.common.blocks.tile; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; import net.minecraft.inventory.ItemStackHelper; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.ITickable; import net.minecraft.util.NonNullList; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentString; import net.minecraft.util.text.TextComponentTranslation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import com.shinoow.abyssalcraft.api.item.ItemEngraving; import com.shinoow.abyssalcraft.api.recipe.EngraverRecipes; import com.shinoow.abyssalcraft.common.blocks.BlockEngraver; public class TileEntityEngraver extends TileEntity implements ISidedInventory, ITickable { private static final int[] slotsTop = new int[] {0}; private static final int[] slotsBottom = new int[] {2, 1}; private static final int[] slotsSides = new int[] {1}; private NonNullList<ItemStack> engraverItemStacks = NonNullList.<ItemStack>withSize(3, ItemStack.EMPTY); public int engraverProcessTime; private String containerName; @Override public int getSizeInventory() { return engraverItemStacks.size(); } @Override public ItemStack getStackInSlot(int var1) { return engraverItemStacks.get(var1); } @Override public ItemStack decrStackSize(int var1, int var2) { return ItemStackHelper.getAndSplit(engraverItemStacks, var1, var2); } @Override public ItemStack removeStackFromSlot(int index) { return ItemStackHelper.getAndRemove(engraverItemStacks, index); } @Override public void setInventorySlotContents(int var1, ItemStack var2) { engraverItemStacks.set(var1, var2); if(var2 != null && var2.getCount() > getInventoryStackLimit()) var2.setCount(getInventoryStackLimit()); } @Override public String getName() { return hasCustomName() ? containerName : "container.abyssalcraft.engraver"; } @Override public boolean hasCustomName() { return containerName != null && containerName.length() > 0; } @Override public ITextComponent getDisplayName() { return hasCustomName() ? new TextComponentString(getName()) : new TextComponentTranslation(getName(), new Object[0]); } public void func_145951_a(String par1) { containerName = par1; } @Override public void readFromNBT(NBTTagCompound par1) { super.readFromNBT(par1); engraverItemStacks = NonNullList.withSize(getSizeInventory(), ItemStack.EMPTY); ItemStackHelper.loadAllItems(par1, engraverItemStacks); engraverProcessTime = par1.getShort("ProcessTime"); if (par1.hasKey("CustomName", 8)) containerName = par1.getString("CustomName"); } @Override public NBTTagCompound writeToNBT(NBTTagCompound par1) { super.writeToNBT(par1); par1.setShort("ProcessTime", (short)engraverProcessTime); ItemStackHelper.saveAllItems(par1, engraverItemStacks); if (hasCustomName()) par1.setString("CustomName", containerName); return par1; } @Override public int getInventoryStackLimit() { return 64; } @SideOnly(Side.CLIENT) public int getProcessProgressScaled(int par1) { return engraverProcessTime * par1 / 200; } public boolean isEngraving(){ return !engraverItemStacks.get(1).isEmpty(); } @Override public void update() { boolean flag1 = false; if (!world.isRemote) { if (isEngraving() && canEngrave()) { ++engraverProcessTime; if (engraverProcessTime == 200) { engraverProcessTime = 0; engraveItem(); flag1 = true; engraverItemStacks.get(1).setItemDamage(engraverItemStacks.get(1).getItemDamage() + 1); if (engraverItemStacks.get(1).getItemDamage() == engraverItemStacks.get(1).getMaxDamage()) engraverItemStacks.set(1, engraverItemStacks.get(1).getItem().getContainerItem(engraverItemStacks.get(1))); } } else engraverProcessTime = 0; if (engraverProcessTime > 0) { flag1 = true; BlockEngraver.updateEngraverBlockState(world, pos); } } if (flag1) markDirty(); } /** * Returns true if the engraver can engrave an item, i.e. has a source item, destination stack isn't full, etc. */ private boolean canEngrave() { if (engraverItemStacks.get(0).isEmpty() || EngraverRecipes.instance().getEngravingResult(engraverItemStacks.get(0), (ItemEngraving)engraverItemStacks.get(1).getItem()).isEmpty()) return false; else { ItemStack itemstack = EngraverRecipes.instance().getEngravingResult(engraverItemStacks.get(0), (ItemEngraving)engraverItemStacks.get(1).getItem()); if (itemstack.isEmpty()) return false; if (engraverItemStacks.get(2).isEmpty()) return true; if (!engraverItemStacks.get(2).isItemEqual(itemstack)) return false; int result = engraverItemStacks.get(2).getCount() + itemstack.getCount(); return result <= getInventoryStackLimit() && result <= engraverItemStacks.get(2).getMaxStackSize(); } } /** * Turn one item from the engraver source stack into the appropriate processed item in the engraver result stack */ public void engraveItem() { if (canEngrave()) { ItemStack itemstack = EngraverRecipes.instance().getEngravingResult(engraverItemStacks.get(0), (ItemEngraving)engraverItemStacks.get(1).getItem()); if (engraverItemStacks.get(2).isEmpty()) engraverItemStacks.set(2, itemstack.copy()); else if (engraverItemStacks.get(2).getItem() == itemstack.getItem()) engraverItemStacks.get(2).grow(itemstack.getCount()); engraverItemStacks.get(0).shrink(1); if (engraverItemStacks.get(0).getCount() <= 0) engraverItemStacks.set(0, ItemStack.EMPTY); } } @Override public boolean isUsableByPlayer(EntityPlayer par1EntityPlayer) { return world.getTileEntity(pos) != this ? false : par1EntityPlayer.getDistanceSq(pos.getX() + 0.5D, pos.getY() + 0.5D, pos.getZ() + 0.5D) <= 64.0D; } @Override public boolean isItemValidForSlot(int par1, ItemStack par2ItemStack) { return par1 == 2 ? false : par1 == 1 ? par2ItemStack.getItem() instanceof ItemEngraving : true; } @Override public int[] getSlotsForFace(EnumFacing side){ return side == EnumFacing.DOWN ? slotsBottom : side == EnumFacing.UP ? slotsTop : slotsSides; } @Override public boolean canInsertItem(int index, ItemStack stack, EnumFacing direction) { return isItemValidForSlot(index, stack); } @Override public boolean canExtractItem(int index, ItemStack stack, EnumFacing direction) { return false; } @Override public void openInventory(EntityPlayer player) {} @Override public void closeInventory(EntityPlayer player) {} @Override public int getField(int id) { return 0; } @Override public void setField(int id, int value) {} @Override public int getFieldCount() { return 0; } @Override public void clear() {} @Override public boolean isEmpty() { for (ItemStack itemstack : engraverItemStacks) if (!itemstack.isEmpty()) return false; return true; } }