| /** | |
| * Copyright (c) SpaceToad, 2011 | |
| * http://www.mod-buildcraft.com | |
| * | |
| * BuildCraft is distributed under the terms of the Minecraft Mod Public | |
| * License 1.0, or MMPL. Please check the contents of the license located in | |
| * http://www.mod-buildcraft.com/MMPL-1.0.txt | |
| */ | |
| package buildcraft.api.power; | |
| import buildcraft.api.core.Orientations; | |
| import buildcraft.api.core.SafeTimeTracker; | |
| import net.minecraft.src.NBTTagCompound; | |
| import net.minecraft.src.TileEntity; | |
| public abstract class PowerProvider implements IPowerProvider { | |
| protected int latency; | |
| protected int minEnergyReceived; | |
| protected int maxEnergyReceived; | |
| protected int maxEnergyStored; | |
| protected int minActivationEnergy; | |
| protected float energyStored = 0; | |
| protected int powerLoss = 1; | |
| protected int powerLossRegularity = 100; | |
| public SafeTimeTracker timeTracker = new SafeTimeTracker(); | |
| public SafeTimeTracker energyLossTracker = new SafeTimeTracker(); | |
| public int[] powerSources = { 0, 0, 0, 0, 0, 0 }; | |
| @Override public SafeTimeTracker getTimeTracker() { return this.timeTracker; } | |
| @Override public int getLatency() { return this.latency; } | |
| @Override public int getMinEnergyReceived() { return this.minEnergyReceived; } | |
| @Override public int getMaxEnergyReceived() { return this.maxEnergyReceived; } | |
| @Override public int getMaxEnergyStored() { return this.maxEnergyStored; } | |
| @Override public int getActivationEnergy() { return this.minActivationEnergy; } | |
| @Override public float getEnergyStored() { return this.energyStored; } | |
| @Override | |
| public void configure(int latency, int minEnergyReceived, int maxEnergyReceived, int minActivationEnergy, int maxStoredEnergy) { | |
| this.latency = latency; | |
| this.minEnergyReceived = minEnergyReceived; | |
| this.maxEnergyReceived = maxEnergyReceived; | |
| this.maxEnergyStored = maxStoredEnergy; | |
| this.minActivationEnergy = minActivationEnergy; | |
| } | |
| @Override | |
| public void configurePowerPerdition(int powerLoss, int powerLossRegularity) { | |
| this.powerLoss = powerLoss; | |
| this.powerLossRegularity = powerLossRegularity; | |
| } | |
| @Override | |
| public boolean update(IPowerReceptor receptor) { | |
| if (!preConditions(receptor)) { | |
| return false; | |
| } | |
| TileEntity tile = (TileEntity) receptor; | |
| boolean result = false; | |
| if (energyStored >= minActivationEnergy) { | |
| if (latency == 0) { | |
| receptor.doWork(); | |
| result = true; | |
| } else { | |
| if (timeTracker.markTimeIfDelay(tile.worldObj, latency)) { | |
| receptor.doWork(); | |
| result = true; | |
| } | |
| } | |
| } | |
| if (powerLoss > 0 && energyLossTracker.markTimeIfDelay(tile.worldObj, powerLossRegularity)) { | |
| energyStored -= powerLoss; | |
| if (energyStored < 0) { | |
| energyStored = 0; | |
| } | |
| } | |
| for (int i = 0; i < 6; ++i) { | |
| if (powerSources[i] > 0) { | |
| powerSources[i]--; | |
| } | |
| } | |
| return result; | |
| } | |
| @Override | |
| public boolean preConditions(IPowerReceptor receptor) { | |
| return true; | |
| } | |
| @Override | |
| public float useEnergy(float min, float max, boolean doUse) { | |
| float result = 0; | |
| if (energyStored >= min) { | |
| if (energyStored <= max) { | |
| result = energyStored; | |
| if (doUse) { | |
| energyStored = 0; | |
| } | |
| } else { | |
| result = max; | |
| if (doUse) { | |
| energyStored -= max; | |
| } | |
| } | |
| } | |
| return result; | |
| } | |
| @Override | |
| public void readFromNBT(NBTTagCompound nbttagcompound) { | |
| latency = nbttagcompound.getInteger("latency"); | |
| minEnergyReceived = nbttagcompound.getInteger("minEnergyReceived"); | |
| maxEnergyReceived = nbttagcompound.getInteger("maxEnergyReceived"); | |
| maxEnergyStored = nbttagcompound.getInteger("maxStoreEnergy"); | |
| minActivationEnergy = nbttagcompound.getInteger("minActivationEnergy"); | |
| try { | |
| energyStored = nbttagcompound.getFloat("storedEnergy"); | |
| } catch (Throwable c) { | |
| energyStored = 0; | |
| } | |
| } | |
| @Override | |
| public void writeToNBT(NBTTagCompound nbttagcompound) { | |
| nbttagcompound.setInteger("latency", latency); | |
| nbttagcompound.setInteger("minEnergyReceived", minEnergyReceived); | |
| nbttagcompound.setInteger("maxEnergyReceived", maxEnergyReceived); | |
| nbttagcompound.setInteger("maxStoreEnergy", maxEnergyStored); | |
| nbttagcompound.setInteger("minActivationEnergy", minActivationEnergy); | |
| nbttagcompound.setFloat("storedEnergy", energyStored); | |
| } | |
| @Override | |
| public void receiveEnergy(float quantity, Orientations from) { | |
| powerSources[from.ordinal()] = 2; | |
| energyStored += quantity; | |
| if (energyStored > maxEnergyStored) { | |
| energyStored = maxEnergyStored; | |
| } | |
| } | |
| @Override | |
| public boolean isPowerSource(Orientations from) { | |
| return powerSources[from.ordinal()] != 0; | |
| } | |
| } |