From bed9b59b0e893ad78ddc0609df9d06d7d1cfbb93 Mon Sep 17 00:00:00 2001 From: Prototik Date: Fri, 9 May 2014 13:59:57 +0800 Subject: [PATCH] Extract battery interface into IBatteryObject --- api/buildcraft/api/core/JavaTools.java | 3 + api/buildcraft/api/mj/IBatteryObject.java | 78 +++++++++++++++++++ api/buildcraft/api/mj/IBatteryProvider.java | 13 ++++ api/buildcraft/api/mj/MjAPI.java | 63 ++++++--------- api/buildcraft/api/mj/MjAPILegacy.java | 8 +- api/buildcraft/api/power/PowerHandler.java | 10 ++- .../energy/TileEnergyConverter.java | 3 +- .../buildcraft/energy/TileEnergyReceiver.java | 4 +- common/buildcraft/energy/TileEngine.java | 4 +- .../transport/PipeTransportPower.java | 6 +- .../transport/gates/GateExpansionPulsar.java | 4 +- 11 files changed, 137 insertions(+), 59 deletions(-) create mode 100644 api/buildcraft/api/mj/IBatteryObject.java create mode 100644 api/buildcraft/api/mj/IBatteryProvider.java diff --git a/api/buildcraft/api/core/JavaTools.java b/api/buildcraft/api/core/JavaTools.java index 4123033a..bf2214b9 100755 --- a/api/buildcraft/api/core/JavaTools.java +++ b/api/buildcraft/api/core/JavaTools.java @@ -16,6 +16,9 @@ import java.util.Arrays; import java.util.List; public class JavaTools { + public static double bounds(double value, double min, double max) { + return Math.max(min, Math.min(value, max)); + } public static T[] concat(T[] first, T[] second) { T[] result = Arrays.copyOf(first, first.length + second.length); diff --git a/api/buildcraft/api/mj/IBatteryObject.java b/api/buildcraft/api/mj/IBatteryObject.java new file mode 100644 index 00000000..b7d27f8e --- /dev/null +++ b/api/buildcraft/api/mj/IBatteryObject.java @@ -0,0 +1,78 @@ +/** + * Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team + * 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.mj; + +public interface IBatteryObject { + /** + * @return Current energy requirement for keeping machine state + */ + double getEnergyRequested(); + + /** + * Add energy to this battery + * + * @param mj Energy amount + * @return Used energy + */ + double addEnergy(double mj); + + /** + * Add energy to this battery + * + * @param mj Energy amount + * @param ignoreCycleLimit Force add all energy even if "maxReceivedPerCycle" limit is reached + * @return Used energy + */ + double addEnergy(double mj, boolean ignoreCycleLimit); + + /** + * @return Current stored energy amount in this battery + */ + double getEnergyStored(); + + /** + * Set current stored energy amount. + * Doesn't use it for your machines! Decrease your battery field directly. + * + * @param mj New energy amount + */ + void setEnergyStored(double mj); + + /** + * Can be overrided via {@link #reconfigure(double, double, double)} + * + * @return Maximal energy amount for this battery. + */ + double maxCapacity(); + + /** + * Can be overrided via {@link #reconfigure(double, double, double)} + * + * @return Minimal energy amount for keep your machine in active state + */ + double minimumConsumption(); + + /** + * Can be overrided via {@link #reconfigure(double, double, double)} + * + * @return Maximal energy received per one tick + */ + double maxReceivedPerCycle(); + + /** + * Allow to dynamically reconfigure your battery. + * Usually it's not very good change battery parameters for already present machines, but if you want... + * + * @param maxCapacity {@link #maxCapacity()} + * @param maxReceivedPerCycle {@link #maxReceivedPerCycle()} + * @param minimumConsumption {@link #minimumConsumption()} + * @return Current battery object instance + */ + IBatteryObject reconfigure(final double maxCapacity, final double maxReceivedPerCycle, final double minimumConsumption); +} diff --git a/api/buildcraft/api/mj/IBatteryProvider.java b/api/buildcraft/api/mj/IBatteryProvider.java new file mode 100644 index 00000000..4b4f9d6b --- /dev/null +++ b/api/buildcraft/api/mj/IBatteryProvider.java @@ -0,0 +1,13 @@ +/** + * Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team + * 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.mj; + +public interface IBatteryProvider { + IBatteryObject getMjBattery(); +} \ No newline at end of file diff --git a/api/buildcraft/api/mj/MjAPI.java b/api/buildcraft/api/mj/MjAPI.java index 11aa4114..0d5e3ea8 100755 --- a/api/buildcraft/api/mj/MjAPI.java +++ b/api/buildcraft/api/mj/MjAPI.java @@ -28,23 +28,18 @@ public final class MjAPI { BatteryKind kind; } - public interface IBatteryProvider { - BatteryObject getMjBattery(); - } - - public static class BatteryObject { + public static class BatteryObject implements IBatteryObject { private Field f; private Object o; private MjBattery b; /** - * @return Current energy requirement for keeping machine state + * {@inheritDoc} */ + @Override public double getEnergyRequested() { try { - double contained = f.getDouble(o); - double max = b.maxCapacity(); - return Math.max(Math.min(max - contained, b.maxReceivedPerCycle()), b.minimumConsumption()); + return JavaTools.bounds(b.maxCapacity() - f.getDouble(o), b.minimumConsumption(), b.maxReceivedPerCycle()); } catch (IllegalAccessException e) { e.printStackTrace(); } @@ -52,22 +47,17 @@ public final class MjAPI { } /** - * Add energy to this battery - * - * @param mj Energy amount - * @return Used energy + * {@inheritDoc} */ + @Override public double addEnergy(double mj) { return addEnergy(mj, false); } /** - * Add energy to this battery - * - * @param mj Energy amount - * @param ignoreCycleLimit Force add all energy even if "maxReceivedPerCycle" limit is reached - * @return Used energy + * {@inheritDoc} */ + @Override public double addEnergy(double mj, boolean ignoreCycleLimit) { try { double contained = f.getDouble(o); @@ -88,8 +78,9 @@ public final class MjAPI { } /** - * @return Current stored energy amount in this battery + * {@inheritDoc} */ + @Override public double getEnergyStored() { try { return f.getDouble(o); @@ -100,11 +91,9 @@ public final class MjAPI { } /** - * Set current stored energy amount. - * Doesn't use it for your machines! Decrease your battery field directly. - * - * @param mj New energy amount + * {@inheritDoc} */ + @Override public void setEnergyStored(double mj) { try { f.setDouble(o, mj); @@ -114,41 +103,33 @@ public final class MjAPI { } /** - * Can be overrided via {@link #reconfigure(double, double, double)} - * - * @return Maximal energy amount for this battery. + * {@inheritDoc} */ + @Override public double maxCapacity() { return b.maxCapacity(); } /** - * Can be overrided via {@link #reconfigure(double, double, double)} - * - * @return Minimal energy amount for keep your machine in active state + * {@inheritDoc} */ + @Override public double minimumConsumption() { return b.minimumConsumption(); } /** - * Can be overrided via {@link #reconfigure(double, double, double)} - * - * @return Maximal energy received per one tick + * {@inheritDoc} */ + @Override public double maxReceivedPerCycle() { return b.maxReceivedPerCycle(); } /** - * Allow to dynamically reconfigure your battery. - * Usually it's not very good change battery parameters for already present machines, but if you want... - * - * @param maxCapacity {@link #maxCapacity()} - * @param maxReceivedPerCycle {@link #maxReceivedPerCycle()} - * @param minimumConsumption {@link #minimumConsumption()} - * @return Current battery object instance + * {@inheritDoc} */ + @Override public BatteryObject reconfigure(final double maxCapacity, final double maxReceivedPerCycle, final double minimumConsumption) { b = new MjBattery() { @Override @@ -181,13 +162,13 @@ public final class MjAPI { private MjAPI() { } - public static BatteryObject getMjBattery(Object o) { + public static IBatteryObject getMjBattery(Object o) { if (o == null) { return null; } if (o instanceof IBatteryProvider) { - BatteryObject battery = ((IBatteryProvider) o).getMjBattery(); + IBatteryObject battery = ((IBatteryProvider) o).getMjBattery(); if (battery != null) { return battery; } diff --git a/api/buildcraft/api/mj/MjAPILegacy.java b/api/buildcraft/api/mj/MjAPILegacy.java index 9d125399..fb0cf05f 100644 --- a/api/buildcraft/api/mj/MjAPILegacy.java +++ b/api/buildcraft/api/mj/MjAPILegacy.java @@ -20,7 +20,7 @@ public class MjAPILegacy implements IPowerReceptor { private final PowerHandler powerHandler; private final World world; - protected MjAPILegacy(World world, MjAPI.BatteryObject battery, PowerHandler.Type type) { + protected MjAPILegacy(World world, IBatteryObject battery, PowerHandler.Type type) { if (battery == null) { throw new NullPointerException(); } @@ -28,7 +28,7 @@ public class MjAPILegacy implements IPowerReceptor { this.powerHandler = new PowerHandler(this, type, battery); } - public static MjAPILegacy from(World world, MjAPI.BatteryObject battery, PowerHandler.Type type) { + public static MjAPILegacy from(World world, IBatteryObject battery, PowerHandler.Type type) { return new MjAPILegacy(world, battery, type); } @@ -40,8 +40,8 @@ public class MjAPILegacy implements IPowerReceptor { return new MjAPILegacy(tileEntity.getWorldObj(), battery(tileEntity), type); } - private static MjAPI.BatteryObject battery(Object object) { - MjAPI.BatteryObject battery = MjAPI.getMjBattery(object); + private static IBatteryObject battery(Object object) { + IBatteryObject battery = MjAPI.getMjBattery(object); if (battery == null) { throw new IllegalArgumentException(String.format("Object %s not using MjAPI, can't create legacy wrapper", object)); } diff --git a/api/buildcraft/api/power/PowerHandler.java b/api/buildcraft/api/power/PowerHandler.java index b10dfa55..f774359c 100644 --- a/api/buildcraft/api/power/PowerHandler.java +++ b/api/buildcraft/api/power/PowerHandler.java @@ -13,6 +13,8 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; import buildcraft.api.core.SafeTimeTracker; +import buildcraft.api.mj.IBatteryObject; +import buildcraft.api.mj.IBatteryProvider; import buildcraft.api.mj.MjAPI; import buildcraft.api.mj.MjBattery; @@ -32,7 +34,7 @@ import buildcraft.api.mj.MjBattery; * @see IPowerReceptor * @see IPowerEmitter */ -public final class PowerHandler implements MjAPI.IBatteryProvider { +public final class PowerHandler implements IBatteryProvider { public static enum Type { @@ -132,7 +134,7 @@ public final class PowerHandler implements MjAPI.IBatteryProvider { private PerditionCalculator perdition; private final PowerReceiver receiver; private final Type type; - private MjAPI.BatteryObject battery; + private IBatteryObject battery; // Tracking private double averageLostPower = 0; private double averageReceivedPower = 0; @@ -148,7 +150,7 @@ public final class PowerHandler implements MjAPI.IBatteryProvider { this.receiver = new PowerReceiver(); this.perdition = DEFAULT_PERDITION; - if (battery instanceof MjAPI.BatteryObject) { + if (battery instanceof IBatteryObject) { this.battery = (MjAPI.BatteryObject) battery; } else if (battery != null) { this.battery = MjAPI.getMjBattery(battery); @@ -182,7 +184,7 @@ public final class PowerHandler implements MjAPI.IBatteryProvider { } @Override - public MjAPI.BatteryObject getMjBattery() { + public IBatteryObject getMjBattery() { return battery; } diff --git a/common/buildcraft/energy/TileEnergyConverter.java b/common/buildcraft/energy/TileEnergyConverter.java index 3962630e..0bc900e6 100644 --- a/common/buildcraft/energy/TileEnergyConverter.java +++ b/common/buildcraft/energy/TileEnergyConverter.java @@ -18,6 +18,7 @@ import net.minecraft.util.ChatComponentText; import net.minecraftforge.common.util.ForgeDirection; import buildcraft.api.core.NetworkData; +import buildcraft.api.mj.IBatteryObject; import buildcraft.api.mj.MjAPI; import buildcraft.api.mj.MjBattery; import buildcraft.api.power.IPowerReceptor; @@ -121,7 +122,7 @@ public class TileEnergyConverter extends TileBuildCraft implements IPowerRecepto if (tile instanceof TileEnergyConverter) { continue; } - MjAPI.BatteryObject object = MjAPI.getMjBattery(tile); + IBatteryObject object = MjAPI.getMjBattery(tile); if (object != null && mjStored > 0) { double wantToUse = Math.min(mjStored, object.getEnergyRequested()); object.addEnergy(wantToUse); diff --git a/common/buildcraft/energy/TileEnergyReceiver.java b/common/buildcraft/energy/TileEnergyReceiver.java index 3c1b51ff..7eedfa66 100755 --- a/common/buildcraft/energy/TileEnergyReceiver.java +++ b/common/buildcraft/energy/TileEnergyReceiver.java @@ -14,8 +14,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; +import buildcraft.api.mj.IBatteryObject; import buildcraft.api.mj.MjAPI; -import buildcraft.api.mj.MjAPI.BatteryObject; import buildcraft.api.power.IPowerEmitter; import buildcraft.api.power.IPowerReceptor; import buildcraft.api.power.PowerHandler; @@ -74,7 +74,7 @@ public class TileEnergyReceiver extends TileBuildCraft implements IPipeConnectio energyStored = 0; } } else if (tile != null) { - BatteryObject battery = MjAPI.getMjBattery(tile); + IBatteryObject battery = MjAPI.getMjBattery(tile); if (battery != null) { battery.addEnergy(energyStored); diff --git a/common/buildcraft/energy/TileEngine.java b/common/buildcraft/energy/TileEngine.java index 19736f01..c4c85315 100644 --- a/common/buildcraft/energy/TileEngine.java +++ b/common/buildcraft/energy/TileEngine.java @@ -22,8 +22,8 @@ import buildcraft.BuildCraftEnergy; import buildcraft.api.core.NetworkData; import buildcraft.api.gates.IOverrideDefaultTriggers; import buildcraft.api.gates.ITrigger; +import buildcraft.api.mj.IBatteryObject; import buildcraft.api.mj.MjAPI; -import buildcraft.api.mj.MjAPI.BatteryObject; import buildcraft.api.power.IPowerEmitter; import buildcraft.api.power.IPowerReceptor; import buildcraft.api.power.PowerHandler; @@ -307,7 +307,7 @@ public abstract class TileEngine extends TileBuildCraft implements IPowerRecepto extractEnergy(receptor.getMinEnergyReceived(), needed, true); } } else { - BatteryObject battery = MjAPI.getMjBattery(tile); + IBatteryObject battery = MjAPI.getMjBattery(tile); battery.addEnergy(extractEnergy(0, battery.maxReceivedPerCycle(), true)); diff --git a/common/buildcraft/transport/PipeTransportPower.java b/common/buildcraft/transport/PipeTransportPower.java index 88fb6220..0be0e5f1 100644 --- a/common/buildcraft/transport/PipeTransportPower.java +++ b/common/buildcraft/transport/PipeTransportPower.java @@ -21,8 +21,8 @@ import buildcraft.BuildCraftCore; import buildcraft.BuildCraftTransport; import buildcraft.api.core.SafeTimeTracker; import buildcraft.api.gates.ITrigger; +import buildcraft.api.mj.IBatteryObject; import buildcraft.api.mj.MjAPI; -import buildcraft.api.mj.MjAPI.BatteryObject; import buildcraft.api.power.IPowerEmitter; import buildcraft.api.power.IPowerReceptor; import buildcraft.api.power.PowerHandler.PowerReceiver; @@ -202,7 +202,7 @@ public class PipeTransportPower extends PipeTransport { internalPower[i] -= watts; } else if (tiles[j] != null) { // Look for the simplified power framework - BatteryObject battery = MjAPI.getMjBattery(tiles [j]); + IBatteryObject battery = MjAPI.getMjBattery(tiles [j]); if (battery != null) { watts = (internalPower[i] / totalPowerQuery) @@ -250,7 +250,7 @@ public class PipeTransportPower extends PipeTransport { } if (tile != null) { - BatteryObject battery = MjAPI.getMjBattery(tile); + IBatteryObject battery = MjAPI.getMjBattery(tile); if (battery != null) { requestEnergy(dir, battery.getEnergyRequested()); diff --git a/common/buildcraft/transport/gates/GateExpansionPulsar.java b/common/buildcraft/transport/gates/GateExpansionPulsar.java index cbaca907..a0b93881 100644 --- a/common/buildcraft/transport/gates/GateExpansionPulsar.java +++ b/common/buildcraft/transport/gates/GateExpansionPulsar.java @@ -17,8 +17,8 @@ import buildcraft.BuildCraftTransport; import buildcraft.api.gates.GateExpansionController; import buildcraft.api.gates.IAction; import buildcraft.api.gates.IGateExpansion; +import buildcraft.api.mj.IBatteryObject; import buildcraft.api.mj.MjAPI; -import buildcraft.api.mj.MjAPI.BatteryObject; import buildcraft.transport.TileGenericPipe; import buildcraft.transport.triggers.ActionEnergyPulsar; import buildcraft.transport.triggers.ActionSingleEnergyPulse; @@ -97,7 +97,7 @@ public final class GateExpansionPulsar extends GateExpansionBuildcraft implement return; } - BatteryObject battery = MjAPI.getMjBattery(pipeTile); + IBatteryObject battery = MjAPI.getMjBattery(pipeTile); if (battery != null && (!singlePulse || !hasPulsed)) { ((TileGenericPipe) pipeTile).pipe.gate.setPulsing(true);