/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* 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
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.core.gadgets;
import buildcraft.api.tiles.IHasWork;
import cpw.mods.fml.common.Optional;
import forestry.core.fluids.tanks.StandardTank;
import forestry.core.interfaces.IPowerHandler;
import forestry.core.interfaces.IRenderableMachine;
import forestry.core.network.ClassMap;
import forestry.core.network.IndexInPayload;
import forestry.core.network.PacketPayload;
import forestry.core.proxy.Proxies;
import forestry.core.utils.EnumTankLevel;
import forestry.energy.EnergyManager;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidContainerRegistry.FluidContainerData;
@Optional.Interface(iface = "buildcraft.api.tiles.IHasWork", modid = "BuildCraft|Core")
public abstract class TilePowered extends TileBase implements IRenderableMachine, IPowerHandler, IHasWork {
public static int WORK_CYCLES = 4;
@Override
public PacketPayload getPacketPayload() {
if (!ClassMap.classMappers.containsKey(this.getClass()))
ClassMap.classMappers.put(this.getClass(), new ClassMap(this.getClass()));
ClassMap classmap = ClassMap.classMappers.get(this.getClass());
PacketPayload payload = new PacketPayload(classmap.intSize, classmap.floatSize, classmap.stringSize);
try {
classmap.setData(this, payload.intPayload, payload.floatPayload, payload.stringPayload, new IndexInPayload(0, 0, 0));
} catch (Exception ex) {
ex.printStackTrace();
}
return payload;
}
@Override
public void fromPacketPayload(PacketPayload payload) {
if (payload.isEmpty())
return;
if (!ClassMap.classMappers.containsKey(this.getClass()))
ClassMap.classMappers.put(this.getClass(), new ClassMap(this.getClass()));
ClassMap classmap = ClassMap.classMappers.get(this.getClass());
try {
classmap.fromData(this, payload.intPayload, payload.floatPayload, payload.stringPayload, new IndexInPayload(0, 0, 0));
} catch (Exception ex) {
ex.printStackTrace();
}
}
protected final EnergyManager energyManager;
public TilePowered(int maxTransfer, int energyPerWork, int capacity) {
this.energyManager = new EnergyManager(maxTransfer, energyPerWork, capacity);
this.energyManager.setReceiveOnly();
}
/* STATE INFORMATION */
public abstract boolean isWorking();
public boolean hasResourcesMin(float percentage) {
return false;
}
public boolean hasFuelMin(float percentage) {
return false;
}
public abstract boolean hasWork();
private int workCounter;
@Override
public void updateEntity() {
super.updateEntity();
if (!Proxies.common.isSimulating(worldObj))
return;
if (workCounter < WORK_CYCLES && energyManager.consumeEnergyToDoWork()) {
workCounter++;
}
if (workCounter >= WORK_CYCLES && worldObj.getTotalWorldTime() % 5 == 0) {
if (workCycle())
workCounter = 0;
}
}
public abstract boolean workCycle();
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
energyManager.writeToNBT(nbt);
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
energyManager.readFromNBT(nbt);
}
/* LIQUID CONTAINER HANDLING */
/**
@deprecated Use FluidHelper
*/
@Deprecated
protected ItemStack bottleIntoContainer(ItemStack canStack, ItemStack outputStack, FluidContainerData container, StandardTank tank) {
if (tank.getFluidAmount() < container.fluid.amount)
return outputStack;
if (canStack.stackSize <= 0)
return outputStack;
if (outputStack != null && !outputStack.isItemEqual(container.filledContainer))
return outputStack;
if (outputStack != null && outputStack.stackSize >= outputStack.getMaxStackSize())
return outputStack;
tank.drain(container.fluid.amount, true);
canStack.stackSize--;
if (outputStack == null)
outputStack = container.filledContainer.copy();
else
outputStack.stackSize++;
return outputStack;
}
// / ADDITIONAL LIQUID HANDLING
@Override
public EnumTankLevel getPrimaryLevel() {
return EnumTankLevel.EMPTY;
}
@Override
public EnumTankLevel getSecondaryLevel() {
return EnumTankLevel.EMPTY;
}
/* IPowerHandler */
@Override
public EnergyManager getEnergyManager() {
return energyManager;
}
@Override
public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate) {
return energyManager.receiveEnergy(from, maxReceive, simulate);
}
@Override
public int extractEnergy(ForgeDirection from, int maxReceive, boolean simulate) {
return energyManager.extractEnergy(from, maxReceive, simulate);
}
@Override
public int getEnergyStored(ForgeDirection from) {
return energyManager.getEnergyStored(from);
}
@Override
public int getMaxEnergyStored(ForgeDirection from) {
return energyManager.getMaxEnergyStored(from);
}
@Override
public boolean canConnectEnergy(ForgeDirection from) {
return energyManager.canConnectEnergy(from);
}
}