From 5d9a9fa4e0af7e10e38f2590828aee3af6de8e84 Mon Sep 17 00:00:00 2001 From: CovertJaguar Date: Fri, 3 Jan 2014 16:47:30 -0800 Subject: [PATCH] Add some stat tracking ability to the Power API --- common/buildcraft/api/power/PowerHandler.java | 44 +++++++++++-------- .../builders/filler/pattern/PatternFill.java | 4 -- .../transport/PipeTransportPower.java | 44 +++++++++++++------ 3 files changed, 57 insertions(+), 35 deletions(-) diff --git a/common/buildcraft/api/power/PowerHandler.java b/common/buildcraft/api/power/PowerHandler.java index 6aab1e7b..f9c2eed2 100644 --- a/common/buildcraft/api/power/PowerHandler.java +++ b/common/buildcraft/api/power/PowerHandler.java @@ -21,7 +21,7 @@ import net.minecraftforge.common.ForgeDirection; * If you plan emit power, you need only implement IPowerEmitter. You do not * need a PowerHandler. Engines have a PowerHandler because they can also * receive power from other Engines. - * + * * See TileRefinery for a simple example of a power using machine. * * @see IPowerReceptor @@ -94,12 +94,10 @@ public final class PowerHandler { * @return */ public double applyPerdition(PowerHandler powerHandler, double current, long ticksPassed) { -// float prev = current; current -= powerLoss * ticksPassed; if (current < 0) { current = 0; } -// powerHandler.totalLostPower += prev - current; return current; } @@ -115,6 +113,9 @@ public final class PowerHandler { } } public static final PerditionCalculator DEFAULT_PERDITION = new PerditionCalculator(); + public static final double ROLLING_AVERAGE_WEIGHT = 100.0; + public static final double ROLLING_AVERAGE_NUMERATOR = ROLLING_AVERAGE_WEIGHT - 1; + public static final double ROLLING_AVERAGE_DENOMINATOR = 1.0 / ROLLING_AVERAGE_WEIGHT; private double minEnergyReceived; private double maxEnergyReceived; private double maxEnergyStored; @@ -128,11 +129,10 @@ public final class PowerHandler { private PerditionCalculator perdition; private final PowerReceiver receiver; private final Type type; - // Debug -// private double totalLostPower = 0; -// private double totalReceivedPower = 0; -// private double totalUsedPower = 0; -// private long startTime = -1; + // Tracking + private double averageLostPower = 0; + private double averageReceivedPower = 0; + private double averageUsedPower = 0; public PowerHandler(IPowerReceptor receptor, Type type) { this.receptor = receptor; @@ -242,13 +242,6 @@ public final class PowerHandler { * design around this though if you are aware of the limitations. */ public void update() { -// if (startTime == -1) -// startTime = receptor.getWorld().getTotalWorldTime(); -// else { -// long duration = receptor.getWorld().getTotalWorldTime() - startTime; -// System.out.printf("Power Stats: %s - Stored: %.2f Gained: %.2f - %.2f/t Lost: %.2f - %.2f/t Used: %.2f - %.2f/t%n", receptor.getClass().getSimpleName(), energyStored, totalReceivedPower, totalReceivedPower / duration, totalLostPower, totalLostPower / duration, totalUsedPower, totalUsedPower / duration); -// } - applyPerdition(); applyWork(); validateEnergy(); @@ -256,12 +249,15 @@ public final class PowerHandler { private void applyPerdition() { if (perditionTracker.markTimeIfDelay(receptor.getWorld(), 1) && energyStored > 0) { + double prev = energyStored; double newEnergy = getPerdition().applyPerdition(this, energyStored, perditionTracker.durationOfLastDelay()); if (newEnergy == 0 || newEnergy < energyStored) energyStored = newEnergy; else energyStored = DEFAULT_PERDITION.applyPerdition(this, energyStored, perditionTracker.durationOfLastDelay()); validateEnergy(); + + averageLostPower = (averageLostPower * ROLLING_AVERAGE_NUMERATOR + (prev - energyStored)) * ROLLING_AVERAGE_DENOMINATOR; } } @@ -317,8 +313,8 @@ public final class PowerHandler { validateEnergy(); -// if (doUse) -// totalUsedPower += result; + if (doUse) + averageUsedPower = (averageUsedPower * ROLLING_AVERAGE_NUMERATOR + result) * ROLLING_AVERAGE_DENOMINATOR; return result; } @@ -367,6 +363,18 @@ public final class PowerHandler { return energyStored; } + public double getAveragePowerReceived() { + return averageReceivedPower; + } + + public double getAveragePowerUsed() { + return averageUsedPower; + } + + public double getAveragePowerLost() { + return averageLostPower; + } + public Type getType() { return type; } @@ -416,7 +424,7 @@ public final class PowerHandler { used = Math.min(quantity, maxEnergyReceived); } -// totalReceivedPower += used; + averageReceivedPower = (averageReceivedPower * ROLLING_AVERAGE_NUMERATOR + used) * ROLLING_AVERAGE_DENOMINATOR; return used; } diff --git a/common/buildcraft/builders/filler/pattern/PatternFill.java b/common/buildcraft/builders/filler/pattern/PatternFill.java index 6f23e86b..1ffb51d0 100644 --- a/common/buildcraft/builders/filler/pattern/PatternFill.java +++ b/common/buildcraft/builders/filler/pattern/PatternFill.java @@ -8,12 +8,8 @@ package buildcraft.builders.filler.pattern; import buildcraft.api.core.IBox; -import buildcraft.builders.BuilderProxyClient; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Icon; public class PatternFill extends FillerPattern { diff --git a/common/buildcraft/transport/PipeTransportPower.java b/common/buildcraft/transport/PipeTransportPower.java index e02fe0f0..9e924c2b 100644 --- a/common/buildcraft/transport/PipeTransportPower.java +++ b/common/buildcraft/transport/PipeTransportPower.java @@ -61,6 +61,7 @@ public class PipeTransportPower extends PipeTransport { private float[] internalPower = new float[6]; public float[] internalNextPower = new float[6]; public int maxPower = 8; + private double highestPower; SafeTimeTracker tracker = new SafeTimeTracker(); public PipeTransportPower() { @@ -181,7 +182,7 @@ public class PipeTransportPower extends PipeTransport { } } - double highestPower = 0; + highestPower = 0; for (int i = 0; i < 6; i++) { displayPower[i] = (prevDisplayPower[i] * (DISPLAY_SMOOTHING - 1.0F) + displayPower[i]) / DISPLAY_SMOOTHING; if (displayPower[i] > highestPower) { @@ -309,18 +310,6 @@ public class PipeTransportPower extends PipeTransport { * Power Pipes or a subclass thereof. */ public float receiveEnergy(ForgeDirection from, float val) { - - // Keep this in reserve for if too many idiots start bypassing the API - // Verify that it is BC calling this method. - // If its someone else take all their power and run! - // Note: This should be safe for PipePowerWood subclasses, aka custom input pipes. -// StackTraceElement[] stackTrace = (new Throwable()).getStackTrace(); -// String caller = stackTrace[1].getClassName(); -// if (!caller.equals("buildcraft.transport.PipeTransportPower") -// && !caller.equals("buildcraft.transport.pipes.PipePowerWood")) { -// return val; -// } - step(); if (this.container.pipe instanceof IPipeTransportPowerHook) { float ret = ((IPipeTransportPowerHook) this.container.pipe).receiveEnergy(from, val); @@ -394,4 +383,33 @@ public class PipeTransportPower extends PipeTransport { clientDisplayPower = packetPower.displayPower; overload = packetPower.overload ? OVERLOAD_TICKS : 0; } + + /** + * This can be use to provide a rough estimate of how much power is flowing + * through a pipe. Measured in MJ/t. + * + * @return MJ/t + */ + public double getCurrentPowerTransferRate() { + return highestPower; + } + + /** + * This can be use to provide a rough estimate of how much power is + * contained in a pipe. Measured in MJ. + * + * Max should be around (throughput * internalPower.length * 2), ie 112 MJ for a Cobblestone Pipe. + * + * @return MJ + */ + public double getCurrentPowerAmount() { + double amount = 0.0; + for (double d : internalPower) { + amount += d; + } + for (double d : internalNextPower) { + amount += d; + } + return amount; + } }