Extract battery interface into IBatteryObject

This commit is contained in:
Prototik 2014-05-09 13:59:57 +08:00
parent 6ffd45f3d7
commit bed9b59b0e
11 changed files with 137 additions and 59 deletions

View file

@ -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> T[] concat(T[] first, T[] second) {
T[] result = Arrays.copyOf(first, first.length + second.length);

View file

@ -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);
}

View file

@ -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();
}

View file

@ -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;
}

View file

@ -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));
}

View file

@ -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;
}

View file

@ -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);

View file

@ -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);

View file

@ -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));

View file

@ -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());

View file

@ -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);