diff --git a/src/main/java/com/hbm/tileentity/TileEntityMachineElectricFurnace.java b/src/main/java/com/hbm/tileentity/TileEntityMachineElectricFurnace.java new file mode 100644 index 000000000..1f0aadfb8 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/TileEntityMachineElectricFurnace.java @@ -0,0 +1,389 @@ +package com.hbm.tileentity.machine; + +import com.hbm.blocks.machine.MachineElectricFurnace; +import com.hbm.inventory.UpgradeManager; +import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; +import com.hbm.lib.Library; +import com.hbm.packet.AuxElectricityPacket; +import com.hbm.packet.AuxGaugePacket; +import com.hbm.packet.PacketDispatcher; +import com.hbm.tileentity.TileEntityMachineBase; + +import api.hbm.energy.IBatteryItem; +import api.hbm.energy.IEnergyUser; +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import net.minecraft.entity.player.EntityPlayer; +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.minecraftforge.common.util.ForgeDirection; + +public class TileEntityMachineElectricFurnace extends TileEntityMachineBase implements ISidedInventory, IEnergyUser { + + private ItemStack slots[]; + + public int dualCookTime; + public long power; + public static final long maxPower = 100000; + public int MaxProgress = 100; + int consumption = 50; + int progress = 100; + + private static final int[] slots_top = new int[] {1}; + private static final int[] slots_bottom = new int[] {2, 0}; + private static final int[] slots_side = new int[] {0}; + + private String customName; + + public TileEntityMachineElectricFurnace(){ + super(4); + slots = new ItemStack[4]; + } + + @Override + public int getSizeInventory() { + return slots.length; + } + + @Override + public ItemStack getStackInSlot(int i) { + return slots[i]; + } + + @Override + public ItemStack getStackInSlotOnClosing(int i) { + if(slots[i] != null) + { + ItemStack itemStack = slots[i]; + slots[i] = null; + return itemStack; + } else { + return null; + } + } + + @Override + public void setInventorySlotContents(int i, ItemStack itemStack) { + slots[i] = itemStack; + if(itemStack != null && itemStack.stackSize > getInventoryStackLimit()) + { + itemStack.stackSize = getInventoryStackLimit(); + } + } + + @Override + public String getInventoryName() { + return this.hasCustomInventoryName() ? this.customName : "container.electricFurnace"; + } + + @Override + public boolean hasCustomInventoryName() { + return this.customName != null && this.customName.length() > 0; + } + + public void setCustomName(String name) { + this.customName = name; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) { + if(worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) + { + return false; + }else{ + return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <=64; + } + } + + //You scrubs aren't needed for anything (right now) + @Override + public void openInventory() {} + @Override + public void closeInventory() {} + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemStack) { + if(i == 0) + if(itemStack.getItem() instanceof IBatteryItem) + return true; + + if(i == 1) + return true; + + return false; + } + + @Override + public ItemStack decrStackSize(int i, int j) { + if(slots[i] != null) + { + if(slots[i].stackSize <= j) + { + ItemStack itemStack = slots[i]; + slots[i] = null; + return itemStack; + } + ItemStack itemStack1 = slots[i].splitStack(j); + if (slots[i].stackSize == 0) + { + slots[i] = null; + } + + return itemStack1; + } else { + return null; + } + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + NBTTagList list = nbt.getTagList("items", 10); + + this.power = nbt.getLong("powerTime"); + this.dualCookTime = nbt.getInteger("cookTime"); + slots = new ItemStack[getSizeInventory()]; + + for(int i = 0; i < list.tagCount(); i++) + { + NBTTagCompound nbt1 = list.getCompoundTagAt(i); + byte b0 = nbt1.getByte("slot"); + if(b0 >= 0 && b0 < slots.length) + { + slots[b0] = ItemStack.loadItemStackFromNBT(nbt1); + } + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setLong("powerTime", power); + nbt.setInteger("cookTime", dualCookTime); + NBTTagList list = new NBTTagList(); + + for(int i = 0; i < slots.length; i++) + { + if(slots[i] != null) + { + NBTTagCompound nbt1 = new NBTTagCompound(); + nbt1.setByte("slot", (byte)i); + slots[i].writeToNBT(nbt1); + list.appendTag(nbt1); + } + } + nbt.setTag("items", list); + } + + @Override + public int[] getAccessibleSlotsFromSide(int p_94128_1_) + { + return p_94128_1_ == 0 ? slots_bottom : (p_94128_1_ == 1 ? slots_top : slots_side); + } + + @Override + public boolean canInsertItem(int i, ItemStack itemStack, int j) { + return this.isItemValidForSlot(i, itemStack); + } + + @Override + public boolean canExtractItem(int i, ItemStack itemStack, int j) { + if(i == 0) + if (itemStack.getItem() instanceof IBatteryItem && ((IBatteryItem)itemStack.getItem()).getCharge(itemStack) == 0) + return true; + if(i == 2) + return true; + + return false; + } + + public int getDiFurnaceProgressScaled(int i) { + return (dualCookTime * i) / MaxProgress; + } + + public long getPowerRemainingScaled(long i) { + return (power * i) / maxPower; + } + + public boolean hasPower() { + return power > 0; + } + + public boolean isProcessing() { + return this.dualCookTime > 0; + } + + public boolean canProcess() { + if(slots[1] == null) + { + return false; + } + ItemStack itemStack = FurnaceRecipes.smelting().getSmeltingResult(this.slots[1]); + + if(itemStack == null) + { + return false; + } + + if(slots[2] == null) + { + return true; + } + + if(!slots[2].isItemEqual(itemStack)) { + return false; + } + + if(slots[2].stackSize < getInventoryStackLimit() && slots[2].stackSize < slots[2].getMaxStackSize()) { + return true; + }else{ + return slots[2].stackSize < itemStack.getMaxStackSize(); + } + } + + private void processItem() { + if(canProcess()) { + ItemStack itemStack = FurnaceRecipes.smelting().getSmeltingResult(this.slots[1]); + + if(slots[2] == null) + { + slots[2] = itemStack.copy(); + }else if(slots[2].isItemEqual(itemStack)) { + slots[2].stackSize += itemStack.stackSize; + } + + for(int i = 1; i < 2; i++) + { + if(slots[i].stackSize <= 0) + { + slots[i] = new ItemStack(slots[i].getItem().setFull3D()); + }else{ + slots[i].stackSize--; + } + if(slots[i].stackSize <= 0) + { + slots[i] = null; + } + } + } + } + + @Override + public void updateEntity() { + this.hasPower(); + boolean flag1 = false; + + if(!worldObj.isRemote) { + + this.updateConnections(); + + this.consumption = 50; + this.progress = 100; + + UpgradeManager.eval(slots, 3, 3); + + int speedLevel = UpgradeManager.getLevel(UpgradeType.SPEED); + int powerLevel = UpgradeManager.getLevel(UpgradeType.POWER); + + progress -= speedLevel * 25; + consumption += speedLevel * 50; + progress += powerLevel * 10; + consumption -= powerLevel * 20; + + this.MaxProgress = progress; + + } + + NBTTagCompound data = new NBTTagCompound(); + data.setLong("powerTime", this.power); + data.setInteger("progress", this.progress); + data.setInteger("MaxProgress", this.MaxProgress); + this.networkPack(data, 50); + { + if(hasPower() && canProcess()) + { + dualCookTime++; + + power -= consumption; + + if(this.dualCookTime == MaxProgress) + { + this.dualCookTime = 0; + this.processItem(); + flag1 = true; + } + }else{ + dualCookTime = 0; + } + + boolean trigger = true; + + if(hasPower() && canProcess() && this.dualCookTime == 0) + { + trigger = false; + } + + if(trigger) + { + flag1 = true; + MachineElectricFurnace.updateBlockState(this.dualCookTime > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord); + } + + power = Library.chargeTEFromItems(slots, 0, power, maxPower); + + } + + + if(flag1) + { + this.markDirty(); + } + } + + public void networkPack(NBTTagCompound data, int i) { + // TODO Auto-generated method stub + + } + + private void updateConnections() { + + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) + this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); + } + + public void networkUnpack(NBTTagCompound nbt) { + this.power = nbt.getLong("power"); + this.MaxProgress = nbt.getInteger("MaxProgress"); + this.progress = nbt.getInteger("progress"); + + } + @Override + public void setPower(long i) { + power = i; + + } + + @Override + public long getPower() { + return power; + + } + + @Override + public long getMaxPower() { + return maxPower; + } + + @Override + public String getName() { + // TODO Auto-generated method stub + return null; + } +} \ No newline at end of file