package crazypants.enderio.machine.generator.stirling;
import net.minecraft.block.Block;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityFurnace;
import net.minecraftforge.common.util.ForgeDirection;
import com.enderio.core.api.common.util.IProgressTile;
import com.enderio.core.common.util.BlockCoord;
import crazypants.enderio.ModObject;
import crazypants.enderio.config.Config;
import crazypants.enderio.machine.SlotDefinition;
import crazypants.enderio.machine.generator.AbstractGeneratorEntity;
import crazypants.enderio.network.PacketHandler;
import crazypants.enderio.power.Capacitors;
import crazypants.enderio.power.PowerDistributor;
public class TileEntityStirlingGenerator extends AbstractGeneratorEntity implements ISidedInventory, IProgressTile {
// public for alloy smelter
public static final String SOUND_NAME = "generator.stirling";
/** How many ticks left until the item is burnt. */
public int burnTime = 0;
public int totalBurnTime;
private PowerDistributor powerDis;
public TileEntityStirlingGenerator() {
super(new SlotDefinition(1, 0));
}
@Override
public String getMachineName() {
return ModObject.blockStirlingGenerator.unlocalisedName;
}
@Override
public String getInventoryName() {
return "Stirling Generator";
}
@Override
public boolean isMachineItemValidForSlot(int i, ItemStack itemstack) {
return TileEntityFurnace.isItemFuel(itemstack);
}
@Override
public int[] getAccessibleSlotsFromSide(int var1) {
return new int[] { 0 };
}
@Override
public boolean canInsertItem(int i, ItemStack itemstack, int j) {
return isItemValidForSlot(i, itemstack);
}
@Override
public boolean canExtractItem(int i, ItemStack itemstack, int j) {
return !TileEntityFurnace.isItemFuel(itemstack);
}
@Override
public boolean isActive() {
return burnTime > 0;
}
@Override
public float getProgress() {
if(totalBurnTime <= 0) {
return 0;
}
return (float) burnTime / (float) totalBurnTime;
}
@Override
public void setProgress(float progress) {
burnTime = (int) (totalBurnTime * progress);
}
@Override
public TileEntity getTileEntity() {
return this;
}
@Override
public String getSoundName() {
return SOUND_NAME;
}
@Override
public void readCustomNBT(NBTTagCompound nbtRoot) {
super.readCustomNBT(nbtRoot);
burnTime = nbtRoot.getInteger("burnTime");
totalBurnTime = nbtRoot.getInteger("totalBurnTime");
}
@Override
public void writeCustomNBT(NBTTagCompound nbtRoot) {
super.writeCustomNBT(nbtRoot);
nbtRoot.setInteger("burnTime", burnTime);
nbtRoot.setInteger("totalBurnTime", totalBurnTime);
}
@Override
public void onNeighborBlockChange(Block blockId) {
super.onNeighborBlockChange(blockId);
if(powerDis != null) {
powerDis.neighboursChanged();
}
}
@Override
public int getPowerUsePerTick() {
return Math.round(Config.stirlingGeneratorBaseRfPerTick * getEnergyMultiplier());
}
public int getBurnTime(ItemStack item) {
return Math.round(TileEntityFurnace.getItemBurnTime(item) * getBurnTimeMultiplier());
}
@Override
protected boolean processTasks(boolean redstoneCheckPassed) {
boolean needsUpdate = false;
boolean sendBurnTimePacket = false;
if(burnTime > 0) {
if(getEnergyStored() < getMaxEnergyStored()) {
setEnergyStored(getEnergyStored() + getPowerUsePerTick());
}
burnTime--;
sendBurnTimePacket = shouldDoWorkThisTick(20,-1) || burnTime == 0;
}
transmitEnergy();
if(redstoneCheckPassed) {
if(burnTime <= 0 && getEnergyStored() < getMaxEnergyStored()) {
if(inventory[0] != null && inventory[0].stackSize > 0) {
burnTime = getBurnTime(inventory[0]);
if(burnTime > 0) {
totalBurnTime = burnTime;
ItemStack containedItem = inventory[0].getItem().getContainerItem(inventory[0]);
if(containedItem != null) {
inventory[0] = containedItem;
} else {
decrStackSize(0, 1);
}
needsUpdate = true;
}
}
}
}
if(!needsUpdate && sendBurnTimePacket) {
PacketHandler.sendToAllAround(new PacketBurnTime(this), this);
}
return needsUpdate;
}
@Override
protected boolean doPush(ForgeDirection dir) {
if(inventory[0] == null) {
return false;
}
if(!shouldDoWorkThisTick(20)) {
return false;
}
if(!canExtractItem(0, inventory[0], 0)) {
return false;
}
BlockCoord loc = getLocation().getLocation(dir);
TileEntity te = worldObj.getTileEntity(loc.x, loc.y, loc.z);
return doPush(dir, te, 0, 0);
}
public static float getEnergyMultiplier(Capacitors capacitorType) {
if(capacitorType == Capacitors.ACTIVATED_CAPACITOR) {
return Config.stirlingGeneratorEnergyMultiplierT2;
} else if(capacitorType == Capacitors.ENDER_CAPACITOR) {
return Config.stirlingGeneratorEnergyMultiplierT3;
}
return Config.stirlingGeneratorEnergyMultiplierT1;
}
private float getEnergyMultiplier() {
return getEnergyMultiplier(getCapacitorType());
}
public static float getBurnTimeMultiplier(Capacitors capacitorType) {
if(capacitorType == Capacitors.ACTIVATED_CAPACITOR) {
return Config.stirlingGeneratorBurnTimeMultiplierT2;
} else if(capacitorType == Capacitors.ENDER_CAPACITOR) {
return Config.stirlingGeneratorBurnTimeMultiplierT3;
}
return Config.stirlingGeneratorBurnTimeMultiplierT1;
}
public float getBurnTimeMultiplier() {
return getBurnTimeMultiplier(getCapacitorType());
}
//private PowerDistributor powerDis;
private boolean transmitEnergy() {
if(powerDis == null) {
powerDis = new PowerDistributor(new BlockCoord(this));
}
int canTransmit = Math.min(getEnergyStored(), getPowerUsePerTick() * 2);
if(canTransmit <= 0) {
return false;
}
int transmitted = powerDis.transmitEnergy(worldObj, canTransmit);
setEnergyStored(getEnergyStored() - transmitted);
return transmitted > 0;
}
@Override
public boolean hasCustomInventoryName() {
return false;
}
}