package minefantasy.mf2.block.tileentity; import java.util.List; import java.util.Random; import minefantasy.mf2.api.crafting.refine.BloomRecipe; import minefantasy.mf2.api.crafting.refine.QuernRecipes; import minefantasy.mf2.api.helpers.ToolHelper; import minefantasy.mf2.api.knowledge.ResearchLogic; import minefantasy.mf2.api.refine.SmokeMechanics; import minefantasy.mf2.block.tileentity.blastfurnace.TileEntityBlastFC; import minefantasy.mf2.item.heatable.ItemHeated; import minefantasy.mf2.item.list.ComponentListMF; import minefantasy.mf2.knowledge.KnowledgeListMF; import minefantasy.mf2.network.packet.BloomeryPacket; import minefantasy.mf2.util.MFLogUtil; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.FurnaceRecipes; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class TileEntityQuern extends TileEntity implements IInventory, ISidedInventory { private ItemStack[] inv = new ItemStack[3]; private Random rand = new Random(); @Override public void updateEntity() { int max = getMaxRevs(); int levels = max/4; if(postUseTicks > 0) { --postUseTicks; } if(postUseTicks > 0 || !((turnAngle == levels || turnAngle == levels*2 || turnAngle == levels*3 || turnAngle == 0))) { this.turnAngle ++; if(!worldObj.isRemote && (turnAngle == levels || turnAngle == levels*2 || turnAngle == levels*3 || turnAngle == max)) { worldObj.playSoundEffect(xCoord, yCoord, zCoord, "minefantasy2:block.quern", 1.0F, 1.0F); onRevolutionComplete(); } if(turnAngle >= max) { turnAngle = 0; } } } public static final int getMaxRevs() { return 100; } public boolean onUse(EntityPlayer user) { if(!worldObj.isRemote && turnAngle == 0 && postUseTicks == 0) { worldObj.playSoundEffect(xCoord, yCoord, zCoord, "minefantasy2:block.quern", 1.0F, 1.0F); } this.postUseTicks = 10; return true; } public boolean onRevolutionComplete() { QuernRecipes result = this.getResult(inv[0]); if(result != null && inv[1] != null && result.tier <= getTier()) { ItemStack craft = result.result; if(canFitResult(craft)) { if(!worldObj.isRemote) { return tryCraft(craft); } else { worldObj.spawnParticle("smoke", xCoord+0.5F, yCoord+1F, zCoord+0.5F, 0F, 0.2F, 0F); return true; } } } return false; } private int getTier() { return 0; } private boolean canFitResult(ItemStack result) { ItemStack out = inv[2]; if(out == null)return true; if(!out.isItemEqual(result))return false; if(out.stackSize + result.stackSize > result.getMaxStackSize())return false; return true; } private boolean tryCraft(ItemStack result) { worldObj.playSoundEffect(xCoord, yCoord, zCoord, "minefantasy2:block.craftprimitive", 0.5F, 1.2F); /* if(rand.nextFloat() > 0.20F)//20% success rate { worldObj.playSoundEffect(xCoord, yCoord, zCoord, "dig.gravel", 1.0F, 0.5F); return false; } else */ { this.decrStackSize(0, 1); this.decrStackSize(1, 1); ItemStack out = inv[2]; if(out == null) { this.setInventorySlotContents(2, result.copy()); } else { out.stackSize += result.stackSize; } return true; } } @Override public int getSizeInventory() { return inv.length; } @Override public ItemStack getStackInSlot(int slot) { return inv[slot]; } @Override public ItemStack decrStackSize(int slot, int num) { if (this.inv[slot] != null) { ItemStack itemstack; if (this.inv[slot].stackSize <= num) { itemstack = this.inv[slot]; this.inv[slot] = null; return itemstack; } else { itemstack = this.inv[slot].splitStack(num); if (this.inv[slot].stackSize == 0) { this.inv[slot] = null; } return itemstack; } } else { return null; } } @Override public ItemStack getStackInSlotOnClosing(int slot) { return inv[slot]; } @Override public void setInventorySlotContents(int slot, ItemStack item) { inv[slot] = item; } @Override public String getInventoryName() { return "gui.quern.name"; } @Override public boolean hasCustomInventoryName() { return false; } @Override public int getInventoryStackLimit() { return 64; } @Override public boolean isUseableByPlayer(EntityPlayer user) { return user.getDistance(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D) < 8D; } @Override public void openInventory() { } @Override public void closeInventory() { } @Override public boolean isItemValidForSlot(int slot, ItemStack item) { if(item != null && getResult(item) != null) { return slot == 0; } if(item != null && item.getItem() == ComponentListMF.clay_pot) { return slot == 1; } return false; } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); NBTTagList savedItems = nbt.getTagList("Items", 10); this.inv = new ItemStack[this.getSizeInventory()]; for (int i = 0; i < savedItems.tagCount(); ++i) { NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); byte slotNum = savedSlot.getByte("Slot"); if (slotNum >= 0 && slotNum < this.inv.length) { this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); } } } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); NBTTagList savedItems = new NBTTagList(); for (int i = 0; i < this.inv.length; ++i) { if (this.inv[i] != null) { NBTTagCompound savedSlot = new NBTTagCompound(); savedSlot.setByte("Slot", (byte)i); this.inv[i].writeToNBT(savedSlot); savedItems.appendTag(savedSlot); } } nbt.setTag("Items", savedItems); } public static boolean isInput(ItemStack input) { return getResult(input) != null; } private static QuernRecipes getResult(ItemStack input) { return QuernRecipes.getResult(input); } @SideOnly(Side.CLIENT) public String getTextureName() { return "quern_basic"; } public static boolean isPot(ItemStack item) { return item != null && item.getItem() == ComponentListMF.clay_pot; } private int postUseTicks; public int turnAngle; @Override public int[] getAccessibleSlotsFromSide(int side) { return new int[]{0, 1, 2}; } @Override public boolean canInsertItem(int slot, ItemStack item, int side) { return isItemValidForSlot(slot, item); } @Override public boolean canExtractItem(int slot, ItemStack item, int side) { return slot == 2; } }