package crazypants.enderio.machine.buffer;
import net.minecraft.block.Block;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;
import com.enderio.core.common.util.BlockCoord;
import crazypants.enderio.config.Config;
import crazypants.enderio.machine.AbstractPowerConsumerEntity;
import crazypants.enderio.machine.IoMode;
import crazypants.enderio.machine.SlotDefinition;
import crazypants.enderio.machine.painter.IPaintableTileEntity;
import crazypants.enderio.machine.painter.PainterUtil;
import crazypants.enderio.power.IInternalPowerHandler;
import crazypants.enderio.power.PowerDistributor;
public class TileBuffer extends AbstractPowerConsumerEntity implements IPaintableTileEntity, IInternalPowerHandler {
private Block sourceBlock;
private int sourceBlockMetadata;
private boolean hasPower, hasInventory, isCreative;
private PowerDistributor dist;
private int maxOut = Config.powerConduitTierThreeRF;
private int maxIn = maxOut;
public TileBuffer() {
super(new SlotDefinition(9, 0, 0));
}
@Override
public String getMachineName() {
return BlockItemBuffer.Type.get(this).getUnlocalizedName();
}
@Override
protected boolean isMachineItemValidForSlot(int i, ItemStack itemstack) {
return true;
}
@Override
public boolean isActive() {
return false;
}
@Override
protected boolean processTasks(boolean redstoneCheckPassed) {
if(getEnergyStored() <= 0 || !redstoneCheckPassed) {
return false;
}
if(dist == null) {
dist = new PowerDistributor(new BlockCoord(this));
}
int transmitted = dist.transmitEnergy(worldObj, Math.min(getMaxOutput(), getEnergyStored()));
if (!isCreative()) {
setEnergyStored(getEnergyStored() - transmitted);
}
return false;
}
@Override
public void setIoMode(ForgeDirection faceHit, IoMode mode) {
super.setIoMode(faceHit, mode);
if(dist != null) {
dist.neighboursChanged();
}
}
@Override
public void clearAllIoModes() {
super.clearAllIoModes();
if(dist != null) {
dist.neighboursChanged();
}
}
@Override
public void writeToItemStack(ItemStack stack) {
super.writeToItemStack(stack);
stack.setItemDamage(BlockItemBuffer.Type.get(this).ordinal());
}
@Override
public boolean canInsertItem(int slot, ItemStack var2, int side) {
return hasInventory() && getIoMode(ForgeDirection.VALID_DIRECTIONS[side]).canRecieveInput() && isMachineItemValidForSlot(slot, var2);
}
@Override
public boolean canExtractItem(int slot, ItemStack itemstack, int side) {
return hasInventory() && getIoMode(ForgeDirection.VALID_DIRECTIONS[side]).canOutput() && canExtractItem(slot, itemstack);
}
@Override
public boolean canConnectEnergy(ForgeDirection from) {
return hasPower;
}
@Override
public int getMaxEnergyRecieved(ForgeDirection dir) {
return maxIn;
}
@Override
public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate) {
return hasPower() && getIoMode(from).canRecieveInput() ? super.receiveEnergy(from, maxReceive, isCreative() || simulate) : 0;
}
@Override
public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate) {
return 0;
}
@Override
protected boolean doPull(ForgeDirection dir) {
ItemStack[] invCopy = new ItemStack[inventory.length];
for (int i = 0; i < inventory.length; i++) {
invCopy[i] = inventory[i] == null ? null : inventory[i].copy();
}
boolean ret = super.doPull(dir);
if(isCreative()) {
inventory = invCopy;
}
return ret;
}
@Override
protected boolean doPush(ForgeDirection dir) {
if(!shouldDoWorkThisTick(20)) {
return false;
}
ItemStack[] invCopy = new ItemStack[inventory.length];
for (int i = 0; i < inventory.length; i++) {
invCopy[i] = inventory[i] == null ? null : inventory[i].copy();
}
BlockCoord loc = getLocation().getLocation(dir);
TileEntity te = worldObj.getTileEntity(loc.x, loc.y, loc.z);
boolean ret = super.doPush(dir, te, slotDefinition.minInputSlot, slotDefinition.maxInputSlot);
if(isCreative()) {
inventory = invCopy;
}
return ret;
}
@Override
public void writeCustomNBT(NBTTagCompound nbtRoot) {
super.writeCustomNBT(nbtRoot);
nbtRoot.setBoolean("hasInv", hasInventory);
nbtRoot.setBoolean("hasPower", hasPower);
nbtRoot.setBoolean("creative", isCreative);
}
@Override
public void writeCommon(NBTTagCompound nbtRoot) {
super.writeCommon(nbtRoot);
PainterUtil.setSourceBlock(nbtRoot, sourceBlock, sourceBlockMetadata);
nbtRoot.setInteger("maxIn", maxIn);
nbtRoot.setInteger("maxOut", maxOut);
}
@Override
public void readCustomNBT(NBTTagCompound nbtRoot) {
super.readCustomNBT(nbtRoot);
this.hasInventory = nbtRoot.getBoolean("hasInv");
this.hasPower = nbtRoot.getBoolean("hasPower");
this.isCreative = nbtRoot.getBoolean("creative");
}
@Override
public void readCommon(NBTTagCompound nbtRoot) {
super.readCommon(nbtRoot);
this.sourceBlock = PainterUtil.getSourceBlock(nbtRoot);
this.sourceBlockMetadata = PainterUtil.getSourceBlockMetadata(nbtRoot);
this.maxIn = nbtRoot.getInteger("maxIn");
this.maxOut = nbtRoot.getInteger("maxOut");
}
@Override
public void setSourceBlockMetadata(int sourceBlockMetadata) {
this.sourceBlockMetadata = sourceBlockMetadata;
}
@Override
public int getSourceBlockMetadata() {
return sourceBlockMetadata;
}
@Override
public void setSourceBlock(Block sourceBlock) {
this.sourceBlock = sourceBlock;
}
@Override
public Block getSourceBlock() {
return sourceBlock;
}
public boolean hasInventory() {
return hasInventory;
}
public void setHasInventory(boolean hasInventory) {
this.hasInventory = hasInventory;
}
@Override
public boolean hasPower() {
return hasPower;
}
public void setHasPower(boolean hasPower) {
this.hasPower = hasPower;
}
public boolean isCreative() {
return isCreative;
}
public void setCreative(boolean isCreative) {
this.isCreative = isCreative;
if (isCreative) {
this.setEnergyStored(getMaxEnergyStored() / 2);
}
}
public void setIO(int in, int out) {
this.maxIn = in;
this.maxOut = out;
}
public int getMaxInput() {
return maxIn;
}
public int getMaxOutput() {
return maxOut;
}
}