diff --git a/gradle.properties b/gradle.properties index 7d40ad3ed..df31f4d06 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,3 +20,4 @@ waila_version=1.7.0-B3_1.9.4 # Provided APIs # ######################################################### jei_version=3.12.7.312 +tesla_version=1.10.2-1.2.1.49 diff --git a/gradle/scripts/dependencies.gradle b/gradle/scripts/dependencies.gradle index 27db457a0..fdf4be1c8 100644 --- a/gradle/scripts/dependencies.gradle +++ b/gradle/scripts/dependencies.gradle @@ -28,6 +28,11 @@ repositories { name = "JEI repo" url "http://dvs1.progwml6.com/files/maven" } + + maven { + name = "Tesla repo" + url "http://maven.epoxide.xyz" + } } configurations { @@ -41,6 +46,7 @@ dependencies { // compile against provided APIs compileOnly "mezz.jei:jei_${minecraft_version}:${jei_version}:api" compileOnly "mcp.mobius.waila:Waila:${waila_version}" + compileOnly "net.darkhax.tesla:Tesla:${tesla_version}" // at runtime, use the full JEI jar runtime "mezz.jei:jei_${minecraft_version}:${jei_version}" diff --git a/src/main/java/appeng/tile/powersink/AERootPoweredTile.java b/src/main/java/appeng/tile/powersink/AERootPoweredTile.java index 646a661e8..34efe5fd3 100644 --- a/src/main/java/appeng/tile/powersink/AERootPoweredTile.java +++ b/src/main/java/appeng/tile/powersink/AERootPoweredTile.java @@ -22,9 +22,11 @@ package appeng.tile.powersink; import java.util.EnumSet; import javax.annotation.Nullable; +import net.darkhax.tesla.api.ITeslaConsumer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityInject; import net.minecraftforge.energy.CapabilityEnergy; import net.minecraftforge.energy.IEnergyStorage; @@ -41,6 +43,9 @@ import appeng.tile.events.TileEventType; public abstract class AERootPoweredTile extends AEBaseInvTile implements IAEPowerStorage, IExternalPowerSink { + @CapabilityInject(ITeslaConsumer.class) + private static Capability teslaConsumerCapability; + // values that determine general function, are set by inheriting classes if // needed. These should generally remain static. private double internalMaxPower = 10000; @@ -50,10 +55,14 @@ public abstract class AERootPoweredTile extends AEBaseInvTile implements IAEPowe private double internalCurrentPower = 0; private EnumSet internalPowerSides = EnumSet.allOf( EnumFacing.class ); private final IEnergyStorage forgeEnergyAdapter; + private Object teslaEnergyAdapter; public AERootPoweredTile() { forgeEnergyAdapter = new ForgeEnergyAdapter( this ); + if ( teslaConsumerCapability != null ) { + teslaEnergyAdapter = new TeslaEnergyAdapter( this ); + } } protected EnumSet getPowerSides() @@ -252,6 +261,13 @@ public abstract class AERootPoweredTile extends AEBaseInvTile implements IAEPowe return true; } } + else if( capability == teslaConsumerCapability ) + { + if( this.getPowerSides().contains( facing ) ) + { + return true; + } + } return super.hasCapability( capability, facing ); } @@ -267,6 +283,13 @@ public abstract class AERootPoweredTile extends AEBaseInvTile implements IAEPowe return (T) forgeEnergyAdapter; } } + else if( capability == teslaConsumerCapability ) + { + if( this.getPowerSides().contains( facing ) ) + { + return (T) teslaEnergyAdapter; + } + } return super.getCapability( capability, facing ); } diff --git a/src/main/java/appeng/tile/powersink/TeslaEnergyAdapter.java b/src/main/java/appeng/tile/powersink/TeslaEnergyAdapter.java new file mode 100644 index 000000000..95765ec3a --- /dev/null +++ b/src/main/java/appeng/tile/powersink/TeslaEnergyAdapter.java @@ -0,0 +1,39 @@ +package appeng.tile.powersink; + + +import net.darkhax.tesla.api.ITeslaConsumer; + +import appeng.api.config.PowerUnits; + + +/** + * Adapts an {@link IExternalPowerSink} to Forges {@link net.darkhax.tesla.api.ITeslaConsumer}. + */ +class TeslaEnergyAdapter implements ITeslaConsumer +{ + + private final IExternalPowerSink sink; + + TeslaEnergyAdapter( IExternalPowerSink sink ) + { + this.sink = sink; + } + + @Override + public long givePower( long power, boolean simulated ) + { + // Cut it down to what we can represent in a double + double powerDbl = (double) power; + + double networkDemand = sink.getExternalPowerDemand( PowerUnits.RF, powerDbl ); + long used = (long) Math.min( powerDbl, networkDemand ); + + if( !simulated ) + { + sink.injectExternalPower( PowerUnits.RF, used ); + } + + return used; + } + +}