diff --git a/src/main/resources/application.conf b/src/main/resources/application.conf index 59ea08c4b..1406628e9 100644 --- a/src/main/resources/application.conf +++ b/src/main/resources/application.conf @@ -463,6 +463,13 @@ opencomputers { # controls the speed at which items are disassembled, basically. disassemblerTickAmount: 25 + # If you don't want OpenComputers to accept power from one or more of the + # supported power mods, for example because it doesn't suit the vision + # of your mod pack, you can disable support for them here. To stop + # OpenComputers accepting power from a mod, enter its mod id here, e.g. + # `BuildCraftAPI|power`, `IC2`, `factorization`, ... + modBlacklist: [] + # Default "buffer" sizes, i.e. how much energy certain blocks can store. buffer { # The amount of energy a single capacitor can store. diff --git a/src/main/scala/li/cil/oc/Settings.scala b/src/main/scala/li/cil/oc/Settings.scala index 214e2cdd1..df2179802 100644 --- a/src/main/scala/li/cil/oc/Settings.scala +++ b/src/main/scala/li/cil/oc/Settings.scala @@ -111,13 +111,14 @@ class Settings(config: Config) { // power val pureIgnorePower = config.getBoolean("power.ignorePower") - val ignorePower = pureIgnorePower || !Mods.isPowerProvidingModPresent + lazy val ignorePower = pureIgnorePower || !Mods.isPowerProvidingModPresent val tickFrequency = config.getDouble("power.tickFrequency") max 1 val chargeRate = config.getDouble("power.chargerChargeRate") val generatorEfficiency = config.getDouble("power.generatorEfficiency") val solarGeneratorEfficiency = config.getDouble("power.solarGeneratorEfficiency") val assemblerTickAmount = config.getDouble("power.assemblerTickAmount") max 1 val disassemblerTickAmount = config.getDouble("power.disassemblerTickAmount") max 1 + val powerModBlacklist = config.getStringList("power.modBlacklist") // power.buffer val bufferCapacitor = config.getDouble("power.buffer.capacitor") max 0 diff --git a/src/main/scala/li/cil/oc/client/Proxy.scala b/src/main/scala/li/cil/oc/client/Proxy.scala index ea860e1a2..f8e6c9d07 100644 --- a/src/main/scala/li/cil/oc/client/Proxy.scala +++ b/src/main/scala/li/cil/oc/client/Proxy.scala @@ -2,7 +2,7 @@ package li.cil.oc.client import cpw.mods.fml.client.registry.{ClientRegistry, RenderingRegistry} import cpw.mods.fml.common.FMLCommonHandler -import cpw.mods.fml.common.event.{FMLInitializationEvent, FMLPostInitializationEvent, FMLPreInitializationEvent} +import cpw.mods.fml.common.event.{FMLInitializationEvent, FMLPreInitializationEvent} import cpw.mods.fml.common.network.NetworkRegistry import li.cil.oc.client.renderer.block.BlockRenderer import li.cil.oc.client.renderer.item.ItemRenderer @@ -27,7 +27,7 @@ private[oc] class Proxy extends CommonProxy { override def init(e: FMLInitializationEvent) { super.init(e) - NetworkRegistry.INSTANCE.registerGuiHandler(OpenComputers, GuiHandler) + OpenComputers.channel.register(client.PacketHandler) Settings.blockRenderId = RenderingRegistry.getNextAvailableRenderId RenderingRegistry.registerBlockHandler(BlockRenderer) @@ -48,25 +48,20 @@ private[oc] class Proxy extends CommonProxy { MinecraftForgeClient.registerItemRenderer(Items.multi, ItemRenderer) - OpenComputers.channel.register(client.PacketHandler) - ClientRegistry.registerKeyBinding(KeyBindings.extendedTooltip) ClientRegistry.registerKeyBinding(KeyBindings.materialCosts) ClientRegistry.registerKeyBinding(KeyBindings.clipboardPaste) - } - - override def postInit(e: FMLPostInitializationEvent) { - super.postInit(e) - - FMLCommonHandler.instance.bus.register(Audio) - FMLCommonHandler.instance.bus.register(HologramRenderer) - FMLCommonHandler.instance.bus.register(PetRenderer) - FMLCommonHandler.instance.bus.register(ScreenRenderer) - FMLCommonHandler.instance.bus.register(TextBufferRenderCache) MinecraftForge.EVENT_BUS.register(PetRenderer) MinecraftForge.EVENT_BUS.register(ServerRack) MinecraftForge.EVENT_BUS.register(TextBuffer) MinecraftForge.EVENT_BUS.register(WirelessNetworkDebugRenderer) + + NetworkRegistry.INSTANCE.registerGuiHandler(OpenComputers, GuiHandler) + + FMLCommonHandler.instance.bus.register(Audio) + FMLCommonHandler.instance.bus.register(HologramRenderer) + FMLCommonHandler.instance.bus.register(PetRenderer) + FMLCommonHandler.instance.bus.register(TextBufferRenderCache) } } \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/common/Proxy.scala b/src/main/scala/li/cil/oc/common/Proxy.scala index ab47b3048..38db96c1a 100644 --- a/src/main/scala/li/cil/oc/common/Proxy.scala +++ b/src/main/scala/li/cil/oc/common/Proxy.scala @@ -67,6 +67,9 @@ class Proxy { } def init(e: FMLInitializationEvent) { + OpenComputers.channel = NetworkRegistry.INSTANCE.newEventDrivenChannel("OpenComputers") + OpenComputers.channel.register(server.PacketHandler) + OpenComputers.log.info("Initializing OpenComputers drivers.") api.Driver.add(driver.item.FileSystem) api.Driver.add(driver.item.GraphicsCard) @@ -115,19 +118,26 @@ class Proxy { OpenComputers.log.info("Initializing recipes.") Recipes.init() + OpenComputers.log.info("Initializing event handlers.") ForgeChunkManager.setForcedChunkLoadingCallback(OpenComputers, ChunkloaderUpgradeHandler) - OpenComputers.channel = NetworkRegistry.INSTANCE.newEventDrivenChannel("OpenComputers") - OpenComputers.channel.register(server.PacketHandler) - Loot.init() + FMLCommonHandler.instance.bus.register(EventHandler) + FMLCommonHandler.instance.bus.register(SimpleComponentTickHandler.Instance) + FMLCommonHandler.instance.bus.register(Tablet) MinecraftForge.EVENT_BUS.register(AngelUpgradeHandler) MinecraftForge.EVENT_BUS.register(ChunkloaderUpgradeHandler) - MinecraftForge.EVENT_BUS.register(RobotCommonHandler) + MinecraftForge.EVENT_BUS.register(EventHandler) MinecraftForge.EVENT_BUS.register(ExperienceUpgradeHandler) + MinecraftForge.EVENT_BUS.register(Loot) + MinecraftForge.EVENT_BUS.register(RobotCommonHandler) + MinecraftForge.EVENT_BUS.register(SaveHandler) + MinecraftForge.EVENT_BUS.register(Tablet) + MinecraftForge.EVENT_BUS.register(WirelessNetwork) MinecraftForge.EVENT_BUS.register(WirelessNetworkCardHandler) + if (Mods.TinkersConstruct.isAvailable) { OpenComputers.log.info("Initializing Tinker's Construct tool support.") MinecraftForge.EVENT_BUS.register(TinkersConstructToolHandler) @@ -136,13 +146,6 @@ class Proxy { OpenComputers.log.info("Initializing electric tool support.") MinecraftForge.EVENT_BUS.register(UniversalElectricityToolHandler) } - MinecraftForge.EVENT_BUS.register(Loot) - - if (Mods.Waila.isAvailable) { - OpenComputers.log.info("Initializing Waila support.") - FMLInterModComms.sendMessage("Waila", "register", "li.cil.oc.util.mods.Waila.init") - } - if (Mods.VersionChecker.isAvailable) { UpdateCheck.info onSuccess { case Some(release) => @@ -156,19 +159,15 @@ class Proxy { FMLInterModComms.sendRuntimeMessage(OpenComputers.ID, Mods.IDs.VersionChecker, "addUpdate", nbt) } } + if (Mods.Waila.isAvailable) { + OpenComputers.log.info("Initializing Waila support.") + FMLInterModComms.sendMessage("Waila", "register", "li.cil.oc.util.mods.Waila.init") + } } def postInit(e: FMLPostInitializationEvent) { // Don't allow driver registration after this point, to avoid issues. driver.Registry.locked = true - - FMLCommonHandler.instance.bus.register(EventHandler) - FMLCommonHandler.instance.bus.register(SimpleComponentTickHandler.Instance) - FMLCommonHandler.instance.bus.register(Tablet) - MinecraftForge.EVENT_BUS.register(EventHandler) - MinecraftForge.EVENT_BUS.register(WirelessNetwork) - MinecraftForge.EVENT_BUS.register(SaveHandler) - MinecraftForge.EVENT_BUS.register(Tablet) } private def registerExclusive(name: String, items: ItemStack*) { diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/power/BuildCraft.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/power/BuildCraft.scala index aaa6b2d30..5178f0b2f 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/power/BuildCraft.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/power/BuildCraft.scala @@ -7,9 +7,9 @@ import li.cil.oc.util.mods.Mods import net.minecraftforge.common.util.ForgeDirection trait BuildCraft extends Common { - private var powerHandler: Option[AnyRef] = None + private lazy val useBuildCraftPower = isServer && Mods.BuildCraftPower.isAvailable - private lazy val useBuildCraftPower = isServer && !Settings.get.ignorePower && Mods.BuildCraftPower.isAvailable + private var powerHandler: Option[AnyRef] = None // ----------------------------------------------------------------------- // @@ -30,7 +30,7 @@ trait BuildCraft extends Common { @Optional.Method(modid = Mods.IDs.BuildCraftPower) def getPowerProvider = { - if (powerHandler.isEmpty) { + if (Mods.BuildCraftPower.isAvailable && powerHandler.isEmpty) { val handler = new PowerHandler(this.asInstanceOf[IPowerReceptor], PowerHandler.Type.MACHINE) if (handler != null) { handler.configure(1, 320, Float.MaxValue, 640) @@ -45,7 +45,7 @@ trait BuildCraft extends Common { @Optional.Method(modid = Mods.IDs.BuildCraftPower) def getPowerReceiver(side: ForgeDirection) = - if (canConnectPower(side)) + if (Mods.BuildCraftPower.isAvailable && canConnectPower(side)) getPowerProvider.getPowerReceiver else null diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/power/Factorization.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/power/Factorization.scala index a505a37e1..9491592b1 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/power/Factorization.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/power/Factorization.scala @@ -7,11 +7,11 @@ import li.cil.oc.util.mods.Mods import net.minecraftforge.common.util.ForgeDirection trait Factorization extends Common { + private lazy val useFactorizationPower = isServer && Mods.Factorization.isAvailable + @Optional.Method(modid = Mods.IDs.Factorization) private lazy val charge: AnyRef = new Charge(this.asInstanceOf[IChargeConductor]) - private lazy val useFactorizationPower = isServer && !Settings.get.ignorePower && Mods.Factorization.isAvailable - // ----------------------------------------------------------------------- // override def updateEntity() { @@ -45,7 +45,7 @@ trait Factorization extends Common { // ----------------------------------------------------------------------- // @Optional.Method(modid = Mods.IDs.Factorization) - def getCharge = charge.asInstanceOf[Charge] + def getCharge = if (Mods.Factorization.isAvailable) charge.asInstanceOf[Charge] else null @Optional.Method(modid = Mods.IDs.Factorization) def getInfo = "" diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/power/IndustrialCraft2Classic.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/power/IndustrialCraft2Classic.scala index 3da8f8c6d..a87a7a39a 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/power/IndustrialCraft2Classic.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/power/IndustrialCraft2Classic.scala @@ -11,7 +11,7 @@ import net.minecraftforge.common.util.ForgeDirection trait IndustrialCraft2Classic extends Common with IndustrialCraft2Common { private var lastInjectedAmount = 0.0 - private lazy val useIndustrialCraft2ClassicPower = isServer && !Settings.get.ignorePower && Mods.IndustrialCraft2Classic.isAvailable + private lazy val useIndustrialCraft2ClassicPower = isServer && Mods.IndustrialCraft2Classic.isAvailable // ----------------------------------------------------------------------- // @@ -39,7 +39,7 @@ trait IndustrialCraft2Classic extends Common with IndustrialCraft2Common { def getMaxSafeInput = Integer.MAX_VALUE @Optional.Method(modid = Mods.IDs.IndustrialCraft2Classic) - def acceptsEnergyFrom(emitter: TileEntity, direction: Direction) = canConnectPower(direction.toForgeDirection) + def acceptsEnergyFrom(emitter: TileEntity, direction: Direction) = Mods.IndustrialCraft2Classic.isAvailable && canConnectPower(direction.toForgeDirection) @Optional.Method(modid = Mods.IDs.IndustrialCraft2Classic) def injectEnergy(directionFrom: Direction, amount: Int) = { @@ -57,7 +57,7 @@ trait IndustrialCraft2Classic extends Common with IndustrialCraft2Common { @Optional.Method(modid = Mods.IDs.IndustrialCraft2Classic) def demandsEnergy = { - if (Settings.get.ignorePower || isClient) 0 + if (!useIndustrialCraft2ClassicPower) 0 else { var force = false val demand = ForgeDirection.VALID_DIRECTIONS.map(side => { diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/power/IndustrialCraft2Experimental.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/power/IndustrialCraft2Experimental.scala index e2a6a5060..7a24d2ee3 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/power/IndustrialCraft2Experimental.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/power/IndustrialCraft2Experimental.scala @@ -9,7 +9,7 @@ import net.minecraftforge.common.util.ForgeDirection trait IndustrialCraft2Experimental extends Common with IndustrialCraft2Common { private var lastInjectedAmount = 0.0 - private lazy val useIndustrialCraft2Power = isServer && !Settings.get.ignorePower && Mods.IndustrialCraft2.isAvailable + private lazy val useIndustrialCraft2Power = isServer && Mods.IndustrialCraft2.isAvailable // ----------------------------------------------------------------------- // @@ -34,7 +34,7 @@ trait IndustrialCraft2Experimental extends Common with IndustrialCraft2Common { def getSinkTier = Int.MaxValue @Optional.Method(modid = Mods.IDs.IndustrialCraft2) - def acceptsEnergyFrom(emitter: net.minecraft.tileentity.TileEntity, direction: ForgeDirection) = canConnectPower(direction) + def acceptsEnergyFrom(emitter: net.minecraft.tileentity.TileEntity, direction: ForgeDirection) = Mods.IndustrialCraft2.isAvailable && canConnectPower(direction) @Optional.Method(modid = Mods.IDs.IndustrialCraft2) def injectEnergy(directionFrom: ForgeDirection, amount: Double, voltage: Double): Double = { @@ -52,7 +52,7 @@ trait IndustrialCraft2Experimental extends Common with IndustrialCraft2Common { @Optional.Method(modid = Mods.IDs.IndustrialCraft2) def getDemandedEnergy = { - if (Settings.get.ignorePower || isClient) 0 + if (!useIndustrialCraft2Power) 0 else { var force = false val demand = ForgeDirection.VALID_DIRECTIONS.map(side => { diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/power/Mekanism.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/power/Mekanism.scala index 5d7a060cc..3cd103e8f 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/power/Mekanism.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/power/Mekanism.scala @@ -7,10 +7,12 @@ import net.minecraftforge.common.util.ForgeDirection trait Mekanism extends Common { @Optional.Method(modid = Mods.IDs.Mekanism) - def canReceiveEnergy(side: ForgeDirection) = canConnectPower(side) + def canReceiveEnergy(side: ForgeDirection) = Mods.Mekanism.isAvailable && canConnectPower(side) @Optional.Method(modid = Mods.IDs.Mekanism) - def transferEnergyToAcceptor(side: ForgeDirection, amount: Double) = tryChangeBuffer(side, amount * Settings.ratioMekanism) / Settings.ratioMekanism + def transferEnergyToAcceptor(side: ForgeDirection, amount: Double) = + if (!Mods.Mekanism.isAvailable) 0 + else tryChangeBuffer(side, amount * Settings.ratioMekanism) / Settings.ratioMekanism @Optional.Method(modid = Mods.IDs.Mekanism) def getMaxEnergy = ForgeDirection.VALID_DIRECTIONS.map(globalBufferSize).max / Settings.ratioMekanism diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/power/RedstoneFlux.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/power/RedstoneFlux.scala index fc3941768..58dbb44f9 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/power/RedstoneFlux.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/power/RedstoneFlux.scala @@ -7,11 +7,12 @@ import net.minecraftforge.common.util.ForgeDirection trait RedstoneFlux extends Common { @Optional.Method(modid = Mods.IDs.RedstoneFlux) - def canConnectEnergy(from: ForgeDirection) = canConnectPower(from) + def canConnectEnergy(from: ForgeDirection) = Mods.RedstoneFlux.isAvailable && canConnectPower(from) @Optional.Method(modid = Mods.IDs.RedstoneFlux) def receiveEnergy(from: ForgeDirection, maxReceive: Int, simulate: Boolean) = - (tryChangeBuffer(from, maxReceive * Settings.ratioRedstoneFlux, !simulate) / Settings.ratioRedstoneFlux).toInt + if (!Mods.RedstoneFlux.isAvailable) 0 + else (tryChangeBuffer(from, maxReceive * Settings.ratioRedstoneFlux, !simulate) / Settings.ratioRedstoneFlux).toInt @Optional.Method(modid = Mods.IDs.RedstoneFlux) def getEnergyStored(from: ForgeDirection) = (globalBuffer(from) / Settings.ratioRedstoneFlux).toInt diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/power/UniversalElectricity.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/power/UniversalElectricity.scala index 4ce1958af..57c886dbf 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/power/UniversalElectricity.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/power/UniversalElectricity.scala @@ -8,9 +8,9 @@ import universalelectricity.api.core.grid.electric.IElectricNode import universalelectricity.api.core.grid.{INode, INodeProvider} trait UniversalElectricity extends Common { - private lazy val ueNode: AnyRef = universalelectricity.api.core.grid.NodeRegistry.get(this.asInstanceOf[INodeProvider], classOf[IElectricNode]) + private lazy val useUniversalElectricityPower = isServer && Mods.UniversalElectricity.isAvailable - private lazy val useUniversalElectricityPower = isServer && !Settings.get.ignorePower && Mods.BuildCraftPower.isAvailable + private lazy val ueNode: AnyRef = universalelectricity.api.core.grid.NodeRegistry.get(this.asInstanceOf[INodeProvider], classOf[IElectricNode]) // ----------------------------------------------------------------------- // @@ -33,8 +33,8 @@ trait UniversalElectricity extends Common { @Optional.Method(modid = Mods.IDs.UniversalElectricity) def getNode[N <: INode](nodeType: Class[N], from: ForgeDirection) = { - if (canConnectPower(from) && nodeType == classOf[IElectricNode]) ueNode.asInstanceOf[N] - else null.asInstanceOf[N] + if (Mods.UniversalElectricity.isAvailable && canConnectPower(from) && nodeType == classOf[IElectricNode]) ueNode.asInstanceOf[N] + else null } @Optional.Method(modid = Mods.IDs.UniversalElectricity) diff --git a/src/main/scala/li/cil/oc/util/mods/Mods.scala b/src/main/scala/li/cil/oc/util/mods/Mods.scala index 440d434da..cd935d21a 100644 --- a/src/main/scala/li/cil/oc/util/mods/Mods.scala +++ b/src/main/scala/li/cil/oc/util/mods/Mods.scala @@ -2,6 +2,7 @@ package li.cil.oc.util.mods import cpw.mods.fml.common.versioning.VersionParser import cpw.mods.fml.common.{Loader, ModAPIManager} +import li.cil.oc.Settings import scala.collection.mutable @@ -84,7 +85,9 @@ object Mods { else ModAPIManager.INSTANCE.hasAPI(version.getLabel) } - override def isAvailable = isModLoaded + protected val isPowerModEnabled = !providesPower || (!Settings.get.pureIgnorePower && !Settings.get.powerModBlacklist.contains(id)) + + override def isAvailable = isModLoaded && isPowerModEnabled } }