From cb3b3d1fced9a73d7bec3c31ce7d63a3625da9a8 Mon Sep 17 00:00:00 2001 From: Prototik Date: Sat, 10 May 2014 12:49:52 +0800 Subject: [PATCH] Add support for sided batteries --- api/buildcraft/api/mj/BatteryObject.java | 3 +- api/buildcraft/api/mj/IBatteryObject.java | 2 +- .../api/mj/ISidedBatteryProvider.java | 15 ++++ api/buildcraft/api/mj/MjAPI.java | 85 ++++++++++++++++--- api/buildcraft/api/mj/MjAPILegacy.java | 15 ++-- .../energy/TileEnergyConverter.java | 2 +- common/buildcraft/energy/TileEngine.java | 6 +- .../transport/PipeTransportPower.java | 8 +- 8 files changed, 101 insertions(+), 35 deletions(-) create mode 100644 api/buildcraft/api/mj/ISidedBatteryProvider.java diff --git a/api/buildcraft/api/mj/BatteryObject.java b/api/buildcraft/api/mj/BatteryObject.java index 0d060bf5..bb440740 100755 --- a/api/buildcraft/api/mj/BatteryObject.java +++ b/api/buildcraft/api/mj/BatteryObject.java @@ -124,8 +124,7 @@ public class BatteryObject implements IBatteryObject { * {@inheritDoc} */ @Override - public BatteryObject reconfigure(final double maxCapacity, final double maxReceivedPerCycle, - final double minimumConsumption) { + public BatteryObject reconfigure(final double maxCapacity, final double maxReceivedPerCycle, final double minimumConsumption) { batteryData = new MjBattery() { @Override public double maxCapacity() { diff --git a/api/buildcraft/api/mj/IBatteryObject.java b/api/buildcraft/api/mj/IBatteryObject.java index b7d27f8e..e397f1fb 100644 --- a/api/buildcraft/api/mj/IBatteryObject.java +++ b/api/buildcraft/api/mj/IBatteryObject.java @@ -74,5 +74,5 @@ public interface IBatteryObject { * @param minimumConsumption {@link #minimumConsumption()} * @return Current battery object instance */ - IBatteryObject reconfigure(final double maxCapacity, final double maxReceivedPerCycle, final double minimumConsumption); + IBatteryObject reconfigure(double maxCapacity, double maxReceivedPerCycle, double minimumConsumption); } diff --git a/api/buildcraft/api/mj/ISidedBatteryProvider.java b/api/buildcraft/api/mj/ISidedBatteryProvider.java new file mode 100644 index 00000000..e41958d6 --- /dev/null +++ b/api/buildcraft/api/mj/ISidedBatteryProvider.java @@ -0,0 +1,15 @@ +/** + * Copyright (c) 2014, Prototik and the BuildFactory Team + * http://buildfactory.org/ + * + * BuildFactory 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://buildfactory.org/license + */ +package buildcraft.api.mj; + +import net.minecraftforge.common.util.ForgeDirection; + +public interface ISidedBatteryProvider extends IBatteryProvider { + IBatteryObject getMjBattery(ForgeDirection direction); +} diff --git a/api/buildcraft/api/mj/MjAPI.java b/api/buildcraft/api/mj/MjAPI.java index 40783541..da8553d9 100755 --- a/api/buildcraft/api/mj/MjAPI.java +++ b/api/buildcraft/api/mj/MjAPI.java @@ -9,10 +9,13 @@ package buildcraft.api.mj; import java.lang.reflect.Field; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; +import net.minecraftforge.common.util.ForgeDirection; + import buildcraft.api.core.BCLog; import buildcraft.api.core.JavaTools; @@ -24,8 +27,9 @@ import buildcraft.api.core.JavaTools; */ public final class MjAPI { public static final String DEFAULT_POWER_FRAMEWORK = "buildcraft.kinesis"; - private static Map mjBatteries = new HashMap(); + private static Map mjBatteries = new HashMap(); private static Map> mjBatteryKinds = new HashMap>(); + private static final BatteryField invalidBatteryField = new BatteryField(); /** * Deactivate constructor @@ -48,19 +52,37 @@ public final class MjAPI { * power framework if possible. */ public static IBatteryObject getMjBattery(Object o, String kind) { + return getMjBattery(o, kind, ForgeDirection.UNKNOWN); + } + + /** + * Returns the battery related to the object given in parameter. For + * performance optimization, it's good to cache this object in the providing + * power framework if possible. + */ + public static IBatteryObject getMjBattery(Object o, String kind, ForgeDirection side) { if (o == null) { return null; } if (o instanceof IBatteryProvider) { - IBatteryObject battery = ((IBatteryProvider) o).getMjBattery(); + IBatteryObject battery; + + if (o instanceof ISidedBatteryProvider) { + battery = ((ISidedBatteryProvider) o).getMjBattery(side); + if (battery == null && side != ForgeDirection.UNKNOWN) { + battery = ((ISidedBatteryProvider) o).getMjBattery(ForgeDirection.UNKNOWN); + } + } else { + battery = ((IBatteryProvider) o).getMjBattery(); + } if (battery != null) { return battery; } } - BatteryField f = getMjBatteryField(o.getClass()); + BatteryField f = getMjBatteryField(o.getClass(), kind); if (f == null) { return null; @@ -85,7 +107,7 @@ public final class MjAPI { } } else { try { - return getMjBattery(f.field.get(o)); + return getMjBattery(f.field.get(o), kind, side); } catch (IllegalAccessException e) { e.printStackTrace(); return null; @@ -94,16 +116,22 @@ public final class MjAPI { } public static IBatteryObject[] getAllMjBatteries(Object o) { + return getAllMjBatteries(o, ForgeDirection.UNKNOWN); + } + + public static IBatteryObject[] getAllMjBatteries(Object o, ForgeDirection direction) { IBatteryObject[] result = new IBatteryObject[mjBatteries.size()]; int id = 0; for (String kind : mjBatteryKinds.keySet()) { - result[id] = getMjBattery(o, kind); - id++; + result[id] = getMjBattery(o, kind, direction); + if (result[id] != null) { + id++; + } } - return result; + return Arrays.copyOfRange(result, 0, id); } public static void registerMJBatteryKind(String kind, Class clas) { @@ -119,20 +147,50 @@ public final class MjAPI { Value, Container } + private static final class BatteryHolder { + private String kind; + private Class clazz; + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + BatteryHolder that = (BatteryHolder) o; + + return kind.equals(that.kind) && clazz.equals(that.clazz); + } + + @Override + public int hashCode() { + int result = kind.hashCode(); + result = 31 * result + clazz.hashCode(); + return result; + } + } + private static class BatteryField { public Field field; public MjBattery battery; public BatteryKind kind; } - private static BatteryField getMjBatteryField(Class c) { - BatteryField bField = mjBatteries.get(c); + private static BatteryField getMjBatteryField(Class c, String kind) { + BatteryHolder holder = new BatteryHolder(); + holder.clazz = c; + holder.kind = kind; + + BatteryField bField = mjBatteries.get(holder); if (bField == null) { for (Field f : JavaTools.getAllFields(c)) { MjBattery battery = f.getAnnotation(MjBattery.class); - if (battery != null) { + if (battery != null && kind.equals(battery.kind())) { f.setAccessible(true); bField = new BatteryField(); bField.field = f; @@ -147,16 +205,15 @@ public final class MjAPI { bField.kind = BatteryKind.Container; } - mjBatteries.put(c, bField); + mjBatteries.put(holder, bField); return bField; } } - - mjBatteries.put(c, null); + mjBatteries.put(holder, invalidBatteryField); } - return bField; + return bField == invalidBatteryField ? null : bField; } static { diff --git a/api/buildcraft/api/mj/MjAPILegacy.java b/api/buildcraft/api/mj/MjAPILegacy.java index fb0cf05f..55cf56a5 100644 --- a/api/buildcraft/api/mj/MjAPILegacy.java +++ b/api/buildcraft/api/mj/MjAPILegacy.java @@ -29,23 +29,18 @@ public class MjAPILegacy implements IPowerReceptor { } public static MjAPILegacy from(World world, IBatteryObject battery, PowerHandler.Type type) { + if (battery == null) { + return null; + } return new MjAPILegacy(world, battery, type); } public static MjAPILegacy from(World world, Object object, PowerHandler.Type type) { - return new MjAPILegacy(world, battery(object), type); + return from(world, MjAPI.getMjBattery(object), type); } public static MjAPILegacy from(TileEntity tileEntity, PowerHandler.Type type) { - return new MjAPILegacy(tileEntity.getWorldObj(), battery(tileEntity), type); - } - - 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)); - } - return battery; + return from(tileEntity.getWorldObj(), MjAPI.getMjBattery(tileEntity), type); } @Override diff --git a/common/buildcraft/energy/TileEnergyConverter.java b/common/buildcraft/energy/TileEnergyConverter.java index 0bc900e6..0981472d 100644 --- a/common/buildcraft/energy/TileEnergyConverter.java +++ b/common/buildcraft/energy/TileEnergyConverter.java @@ -122,7 +122,7 @@ public class TileEnergyConverter extends TileBuildCraft implements IPowerRecepto if (tile instanceof TileEnergyConverter) { continue; } - IBatteryObject object = MjAPI.getMjBattery(tile); + IBatteryObject object = MjAPI.getMjBattery(tile, MjAPI.DEFAULT_POWER_FRAMEWORK, side.getOpposite()); if (object != null && mjStored > 0) { double wantToUse = Math.min(mjStored, object.getEnergyRequested()); object.addEnergy(wantToUse); diff --git a/common/buildcraft/energy/TileEngine.java b/common/buildcraft/energy/TileEngine.java index c4c85315..1aa5e887 100644 --- a/common/buildcraft/energy/TileEngine.java +++ b/common/buildcraft/energy/TileEngine.java @@ -285,7 +285,7 @@ public abstract class TileEngine extends TileBuildCraft implements IPowerRecepto return extractEnergy(receptor.getMinEnergyReceived(), receptor.getMaxEnergyReceived(), false); } else { - return extractEnergy(0, MjAPI.getMjBattery(tile) + return extractEnergy(0, MjAPI.getMjBattery(tile, MjAPI.DEFAULT_POWER_FRAMEWORK, orientation.getOpposite()) .getEnergyRequested(), false); } } @@ -307,7 +307,7 @@ public abstract class TileEngine extends TileBuildCraft implements IPowerRecepto extractEnergy(receptor.getMinEnergyReceived(), needed, true); } } else { - IBatteryObject battery = MjAPI.getMjBattery(tile); + IBatteryObject battery = MjAPI.getMjBattery(tile, MjAPI.DEFAULT_POWER_FRAMEWORK, orientation.getOpposite()); battery.addEnergy(extractEnergy(0, battery.maxReceivedPerCycle(), true)); @@ -522,7 +522,7 @@ public abstract class TileEngine extends TileBuildCraft implements IPowerRecepto } else if (tile instanceof IPowerReceptor) { return ((IPowerReceptor) tile).getPowerReceiver(side.getOpposite()) != null; } else { - return MjAPI.getMjBattery(tile) != null; + return MjAPI.getMjBattery(tile, MjAPI.DEFAULT_POWER_FRAMEWORK, orientation.getOpposite()) != null; } } diff --git a/common/buildcraft/transport/PipeTransportPower.java b/common/buildcraft/transport/PipeTransportPower.java index 0be0e5f1..8ecb2ed0 100644 --- a/common/buildcraft/transport/PipeTransportPower.java +++ b/common/buildcraft/transport/PipeTransportPower.java @@ -112,7 +112,7 @@ public class PipeTransportPower extends PipeTransport { } } - if (MjAPI.getMjBattery(tile) != null) { + if (MjAPI.getMjBattery(tile, MjAPI.DEFAULT_POWER_FRAMEWORK, side.getOpposite()) != null) { return true; } @@ -177,7 +177,7 @@ public class PipeTransportPower extends PipeTransport { if (tiles[j] != null && (tiles[j] instanceof TileGenericPipe || tiles[j] instanceof IPowerReceptor || MjAPI - .getMjBattery(tiles[j]) != null)) { + .getMjBattery(tiles[j], MjAPI.DEFAULT_POWER_FRAMEWORK, ForgeDirection.VALID_DIRECTIONS[j].getOpposite()) != null)) { totalPowerQuery += powerQuery[j]; } } @@ -202,7 +202,7 @@ public class PipeTransportPower extends PipeTransport { internalPower[i] -= watts; } else if (tiles[j] != null) { // Look for the simplified power framework - IBatteryObject battery = MjAPI.getMjBattery(tiles [j]); + IBatteryObject battery = MjAPI.getMjBattery(tiles[j], MjAPI.DEFAULT_POWER_FRAMEWORK, ForgeDirection.VALID_DIRECTIONS[j].getOpposite()); if (battery != null) { watts = (internalPower[i] / totalPowerQuery) @@ -250,7 +250,7 @@ public class PipeTransportPower extends PipeTransport { } if (tile != null) { - IBatteryObject battery = MjAPI.getMjBattery(tile); + IBatteryObject battery = MjAPI.getMjBattery(tile, MjAPI.DEFAULT_POWER_FRAMEWORK, dir.getOpposite()); if (battery != null) { requestEnergy(dir, battery.getEnergyRequested());