Added support for AE2 power, closes #508.

This commit is contained in:
Florian Nücke 2014-09-24 22:18:51 +02:00
parent 224cef4f0b
commit 4a447996e8
10 changed files with 185 additions and 10 deletions

View File

@ -75,6 +75,7 @@ configurations {
} }
dependencies { dependencies {
provided "appeng:appliedenergistics2:${config.ae2.version}:dev"
provided "codechicken:CodeChickenLib:${config.minecraft.version}-${config.ccl.version}:dev" provided "codechicken:CodeChickenLib:${config.minecraft.version}-${config.ccl.version}:dev"
provided "codechicken:ForgeMultipart:${config.minecraft.version}-${config.fmp.version}:dev" provided "codechicken:ForgeMultipart:${config.minecraft.version}-${config.fmp.version}:dev"
provided "codechicken:NotEnoughItems:${config.minecraft.version}-${config.nei.version}:dev" provided "codechicken:NotEnoughItems:${config.minecraft.version}-${config.nei.version}:dev"

View File

@ -1,11 +1,12 @@
minecraft.version=1.7.10 minecraft.version=1.7.10
forge.version=10.13.0.1180 forge.version=10.13.0.1208
oc.version=1.3.5 oc.version=1.3.5
oc.subversion=dev oc.subversion=dev
ccl.version=1.1.1.95 ccl.version=1.1.1.104
fmp.version=1.1.0.299 fmp.version=1.1.0.307
nei.version=1.0.3.51 nei.version=1.0.3.56
wrcbe.version=1.4.0.7 wrcbe.version=1.4.0.7
ae2.version=+
bc.version=6.0.18 bc.version=6.0.18
ic2.version=2.2.+ ic2.version=2.2.+
maven.url=file:///var/www/users/fnuecke/maven.cil.li maven.url=file:///var/www/users/fnuecke/maven.cil.li

View File

@ -642,6 +642,7 @@ opencomputers {
# Power values for different power systems. # Power values for different power systems.
value { value {
AppliedEnergistics2: 100.0
BuildCraft: 500.0 BuildCraft: 500.0
Factorization: 6.5 Factorization: 6.5
Galacticraft: 24.0 Galacticraft: 24.0

View File

@ -168,6 +168,7 @@ class Settings(config: Config) {
val pistonCost = config.getDouble("power.cost.pistonPush") max 0 val pistonCost = config.getDouble("power.cost.pistonPush") max 0
// power.value // power.value
private val valueAppliedEnergistics2 = config.getDouble("power.value.AppliedEnergistics2")
private val valueBuildCraft = config.getDouble("power.value.BuildCraft") private val valueBuildCraft = config.getDouble("power.value.BuildCraft")
private val valueFactorization = config.getDouble("power.value.Factorization") private val valueFactorization = config.getDouble("power.value.Factorization")
private val valueGalacticraft = config.getDouble("power.value.Galacticraft") private val valueGalacticraft = config.getDouble("power.value.Galacticraft")
@ -178,6 +179,7 @@ class Settings(config: Config) {
private val valueInternal = valueBuildCraft private val valueInternal = valueBuildCraft
val ratioAppliedEnergistics2 = valueAppliedEnergistics2 / valueInternal
val ratioBuildCraft = valueBuildCraft / valueInternal val ratioBuildCraft = valueBuildCraft / valueInternal
val ratioFactorization = valueFactorization / valueInternal val ratioFactorization = valueFactorization / valueInternal
val ratioGalacticraft = valueGalacticraft / valueInternal val ratioGalacticraft = valueGalacticraft / valueInternal

View File

@ -44,6 +44,15 @@ object EventHandler {
} }
} }
@Optional.Method(modid = Mods.IDs.UniversalElectricity)
def scheduleAE2Add(tileEntity: power.AppliedEnergistics2) {
if (SideTracker.isServer) pending.synchronized {
pending += (() => if (!tileEntity.isInvalid) {
tileEntity.getGridNode(ForgeDirection.UNKNOWN).updateState()
})
}
}
@Optional.Method(modid = Mods.IDs.IndustrialCraft2) @Optional.Method(modid = Mods.IDs.IndustrialCraft2)
def scheduleIC2Add(tileEntity: power.IndustrialCraft2Experimental) { def scheduleIC2Add(tileEntity: power.IndustrialCraft2Experimental) {
if (SideTracker.isServer) pending.synchronized { if (SideTracker.isServer) pending.synchronized {

View File

@ -18,6 +18,7 @@ class ClassTransformer extends IClassTransformer {
private val log = LogManager.getLogger("OpenComputers") private val log = LogManager.getLogger("OpenComputers")
private lazy val powerTypes = Map[Mod, Array[String]]( private lazy val powerTypes = Map[Mod, Array[String]](
Mods.AppliedEnergistics2 -> Array("appeng/api/networking/IGridHost"),
Mods.BuildCraftPower -> Array("buildcraft/api/power/IPowerReceptor"), Mods.BuildCraftPower -> Array("buildcraft/api/power/IPowerReceptor"),
Mods.Factorization -> Array("factorization/api/IChargeConductor"), Mods.Factorization -> Array("factorization/api/IChargeConductor"),
Mods.Galacticraft -> Array("micdoodle8/mods/galacticraft/api/power/IEnergyHandlerGC"), Mods.Galacticraft -> Array("micdoodle8/mods/galacticraft/api/power/IEnergyHandlerGC"),

View File

@ -2,6 +2,7 @@ package li.cil.oc.common.tileentity.traits
trait PowerAcceptor trait PowerAcceptor
extends power.Common extends power.Common
with power.AppliedEnergistics2
with power.BuildCraft with power.BuildCraft
with power.Factorization with power.Factorization
with power.Galacticraft with power.Galacticraft

View File

@ -0,0 +1,128 @@
package li.cil.oc.common.tileentity.traits.power
import java.util
import appeng.api.AEApi
import appeng.api.config.{Actionable, PowerMultiplier}
import appeng.api.networking._
import appeng.api.networking.energy.IEnergyGrid
import appeng.api.util.{AECableType, AEColor, DimensionalCoord}
import cpw.mods.fml.common.Optional
import li.cil.oc.Settings
import li.cil.oc.common.EventHandler
import li.cil.oc.util.mods.Mods
import net.minecraft.nbt.NBTTagCompound
import net.minecraftforge.common.util.ForgeDirection
import scala.collection.convert.WrapAsJava._
trait AppliedEnergistics2 extends Common {
private lazy val useAppliedEnergistics2Power = isServer && Mods.AppliedEnergistics2.isAvailable
// 'Manual' lazy val, because lazy vals mess up the class loader, leading to class not found exceptions.
private var node: Option[AnyRef] = None
override def updateEntity() {
super.updateEntity()
if (useAppliedEnergistics2Power && world.getTotalWorldTime % Settings.get.tickFrequency == 0) {
updateEnergy()
}
}
@Optional.Method(modid = Mods.IDs.AppliedEnergistics2)
private def updateEnergy() {
val grid = getGridNode(ForgeDirection.UNKNOWN).getGrid
if (grid != null) {
val cache = grid.getCache(classOf[IEnergyGrid]).asInstanceOf[IEnergyGrid]
if (cache != null) {
for (side <- ForgeDirection.VALID_DIRECTIONS) {
val demand = (globalBufferSize(side) - globalBuffer(side)) / Settings.get.ratioAppliedEnergistics2
if (demand > 1) {
val power = cache.extractAEPower(demand, Actionable.MODULATE, PowerMultiplier.CONFIG)
tryChangeBuffer(side, power * Settings.get.ratioAppliedEnergistics2)
}
}
}
}
}
override def validate() {
super.validate()
if (useAppliedEnergistics2Power) EventHandler.scheduleAE2Add(this)
}
override def invalidate() {
super.invalidate()
if (useAppliedEnergistics2Power) securityBreak()
}
override def onChunkUnload() {
super.onChunkUnload()
if (useAppliedEnergistics2Power) securityBreak()
}
// ----------------------------------------------------------------------- //
override def readFromNBT(nbt: NBTTagCompound) {
super.readFromNBT(nbt)
if (useAppliedEnergistics2Power) loadNode(nbt)
}
@Optional.Method(modid = Mods.IDs.AppliedEnergistics2)
private def loadNode(nbt: NBTTagCompound): Unit = {
getGridNode(ForgeDirection.UNKNOWN).loadFromNBT(Settings.namespace + "ae2power", nbt)
}
override def writeToNBT(nbt: NBTTagCompound) {
super.writeToNBT(nbt)
if (useAppliedEnergistics2Power) saveNode(nbt)
}
@Optional.Method(modid = Mods.IDs.AppliedEnergistics2)
private def saveNode(nbt: NBTTagCompound): Unit = {
getGridNode(ForgeDirection.UNKNOWN).saveToNBT(Settings.namespace + "ae2power", nbt)
}
// ----------------------------------------------------------------------- //
@Optional.Method(modid = Mods.IDs.AppliedEnergistics2)
def getGridNode(side: ForgeDirection) = node match {
case Some(gridNode: IGridNode) => gridNode
case _ =>
val gridNode = AEApi.instance.createGridNode(new AppliedEnergistics2GridBlock(this))
node = Option(gridNode)
gridNode
}
@Optional.Method(modid = Mods.IDs.AppliedEnergistics2)
def getCableConnectionType(side: ForgeDirection) = AECableType.SMART
@Optional.Method(modid = Mods.IDs.AppliedEnergistics2)
def securityBreak() {
getGridNode(ForgeDirection.UNKNOWN).destroy()
}
}
class AppliedEnergistics2GridBlock(val tileEntity: AppliedEnergistics2) extends IGridBlock {
override def getIdlePowerUsage = 0.0
override def getFlags = util.EnumSet.noneOf(classOf[GridFlags])
override def isWorldAccessable = true
override def getLocation = new DimensionalCoord(tileEntity)
override def getGridColor = AEColor.Transparent
override def onGridNotification(p1: GridNotification) {}
override def setNetworkStatus(p1: IGrid, p2: Int) {}
override def getConnectableSides = util.EnumSet.copyOf(ForgeDirection.VALID_DIRECTIONS.filter(tileEntity.canConnectPower).toList)
override def getMachine = tileEntity.asInstanceOf[IGridHost]
override def gridChanged() {}
override def getMachineRepresentation = null
}

View File

@ -2,8 +2,10 @@ package li.cil.oc.common.tileentity.traits.power
import buildcraft.api.power.{IPowerReceptor, PowerHandler} import buildcraft.api.power.{IPowerReceptor, PowerHandler}
import cpw.mods.fml.common.Optional import cpw.mods.fml.common.Optional
import li.cil.oc.util.ExtendedNBT._
import li.cil.oc.util.mods.Mods import li.cil.oc.util.mods.Mods
import li.cil.oc.{OpenComputers, Settings} import li.cil.oc.{OpenComputers, Settings}
import net.minecraft.nbt.NBTTagCompound
import net.minecraftforge.common.util.ForgeDirection import net.minecraftforge.common.util.ForgeDirection
trait BuildCraft extends Common { trait BuildCraft extends Common {
@ -16,6 +18,12 @@ trait BuildCraft extends Common {
override def updateEntity() { override def updateEntity() {
super.updateEntity() super.updateEntity()
if (useBuildCraftPower && world.getTotalWorldTime % Settings.get.tickFrequency == 0) { if (useBuildCraftPower && world.getTotalWorldTime % Settings.get.tickFrequency == 0) {
updateEnergy()
}
}
@Optional.Method(modid = Mods.IDs.BuildCraftPower)
private def updateEnergy() {
for (side <- ForgeDirection.VALID_DIRECTIONS) { for (side <- ForgeDirection.VALID_DIRECTIONS) {
val demand = (globalBufferSize(side) - globalBuffer(side)) / Settings.get.ratioBuildCraft val demand = (globalBufferSize(side) - globalBuffer(side)) / Settings.get.ratioBuildCraft
if (demand > 1) { if (demand > 1) {
@ -24,6 +32,27 @@ trait BuildCraft extends Common {
} }
} }
} }
// ----------------------------------------------------------------------- //
override def readFromNBT(nbt: NBTTagCompound) {
super.readFromNBT(nbt)
if (useBuildCraftPower) loadHandler(nbt)
}
@Optional.Method(modid = Mods.IDs.BuildCraftPower)
private def loadHandler(nbt: NBTTagCompound): Unit = {
Option(getPowerProvider).foreach(_.readFromNBT(nbt.getCompoundTag(Settings.namespace + "bcpower")))
}
override def writeToNBT(nbt: NBTTagCompound) {
super.writeToNBT(nbt)
if (useBuildCraftPower) saveHandler(nbt)
}
@Optional.Method(modid = Mods.IDs.BuildCraftPower)
private def saveHandler(nbt: NBTTagCompound): Unit = {
Option(getPowerProvider).foreach(h => nbt.setNewCompoundTag(Settings.namespace + "bcpower", h.writeToNBT))
} }
// ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- //

View File

@ -9,6 +9,7 @@ import scala.collection.mutable
object Mods { object Mods {
object IDs { object IDs {
final val AppliedEnergistics2 = "appliedenergistics2"
final val BattleGear2 = "battlegear2" final val BattleGear2 = "battlegear2"
final val BuildCraftPower = "BuildCraftAPI|power" final val BuildCraftPower = "BuildCraftAPI|power"
final val ComputerCraft = "ComputerCraft" final val ComputerCraft = "ComputerCraft"
@ -41,6 +42,7 @@ object Mods {
lazy val isPowerProvidingModPresent = knownMods.exists(mod => mod.providesPower && mod.isAvailable) lazy val isPowerProvidingModPresent = knownMods.exists(mod => mod.providesPower && mod.isAvailable)
val AppliedEnergistics2 = new SimpleMod(IDs.AppliedEnergistics2)
val BattleGear2 = new SimpleMod(IDs.BattleGear2) val BattleGear2 = new SimpleMod(IDs.BattleGear2)
val BuildCraftPower = new SimpleMod(IDs.BuildCraftPower, providesPower = true) val BuildCraftPower = new SimpleMod(IDs.BuildCraftPower, providesPower = true)
val ComputerCraft = new SimpleMod(IDs.ComputerCraft) val ComputerCraft = new SimpleMod(IDs.ComputerCraft)