Rip out power auto detection.

This commit is contained in:
Florian Nücke 2017-05-14 18:53:47 +02:00
parent e54ae25f89
commit 6a97c012a6
27 changed files with 51 additions and 88 deletions

View File

@ -363,17 +363,6 @@ public final class IMC {
FMLInterModComms.sendMessage(MOD_ID, "blacklistHost", nbt);
}
/**
* Notifies OpenComputers that there is some 3rd-party power system present
* that adds integration on its side.
* <p/>
* This will suppress the "no power system found" message on start up, and
* avoid auto-disabling power use.
*/
public static void registerCustomPowerSystem() {
FMLInterModComms.sendMessage(MOD_ID, "registerCustomPowerSystem", "true");
}
/**
* Register a mapping of program name to loot disk.
* <p/>

View File

@ -142,9 +142,7 @@ class Settings(val config: Config) {
// ----------------------------------------------------------------------- //
// power
var is3rdPartyPowerSystemPresent = false
val pureIgnorePower = config.getBoolean("power.ignorePower")
lazy val ignorePower = pureIgnorePower || (!is3rdPartyPowerSystemPresent && !Mods.isPowerProvidingModPresent)
val ignorePower = config.getBoolean("power.ignorePower")
val tickFrequency = config.getDouble("power.tickFrequency") max 1
val chargeRateExternal = config.getDouble("power.chargerChargeRate")
val chargeRateTablet = config.getDouble("power.chargerChargeRateTablet")

View File

@ -321,7 +321,7 @@ object PacketHandler extends CommonPacketHandler {
if (stack != null) {
Loot.disksForClient += stack
}
if(Mods.JustEnoughItems.isAvailable) {
if(Mods.JustEnoughItems.isModAvailable) {
addDiskToJEI(stack)
}
}

View File

@ -92,7 +92,7 @@ abstract class DynamicGuiContainer[C <: Container](container: C) extends CustomG
}
*/
if (Mods.JustEnoughItems.isAvailable) {
if (Mods.JustEnoughItems.isModAvailable) {
drawJEIHighlights()
}
}
@ -186,7 +186,7 @@ abstract class DynamicGuiContainer[C <: Container](container: C) extends CustomG
override def onGuiClosed(): Unit = {
super.onGuiClosed()
if(Mods.JustEnoughItems.isAvailable) {
if(Mods.JustEnoughItems.isModAvailable) {
resetJEIHighlights()
}
}

View File

@ -211,9 +211,6 @@ object EventHandler {
if (!LuaStateFactory.isAvailable) {
player.addChatMessage(Localization.Chat.WarningLuaFallback)
}
if (!Settings.get.pureIgnorePower && Settings.get.ignorePower) {
player.addChatMessage(Localization.Chat.WarningPower)
}
if (Recipes.hadErrors) {
player.addChatMessage(Localization.Chat.WarningRecipes)
}
@ -232,7 +229,7 @@ object EventHandler {
})
// Do update check in local games and for OPs.
val server = FMLCommonHandler.instance.getMinecraftServerInstance
if (!Mods.VersionChecker.isAvailable && (!server.isDedicatedServer || server.getPlayerList.canSendCommands(player.getGameProfile))) {
if (!Mods.VersionChecker.isModAvailable && (!server.isDedicatedServer || server.getPlayerList.canSendCommands(player.getGameProfile))) {
Future {
UpdateCheck.info onSuccess {
case Some(release) => player.addChatMessage(Localization.Chat.InfoNewVersion(release.tag_name))

View File

@ -94,10 +94,6 @@ object IMC {
case t: Throwable => OpenComputers.log.warn("Failed registering ink provider.", t)
}
}
else if (message.key == "registerCustomPowerSystem" && message.isStringMessage) {
OpenComputers.log.info(s"Was told there is an unknown power system present by mod ${message.getSender}.")
Settings.get.is3rdPartyPowerSystemPresent = message.getStringValue == "true"
}
else if (message.key == "registerProgramDiskLabel" && message.isNBTMessage) {
OpenComputers.log.info(s"Registering new program location mapping for program '${message.getNBTValue.getString("program")}' being on disk '${message.getNBTValue.getString("label")}' from mod ${message.getSender}.")
ProgramLocations.addMapping(message.getNBTValue.getString("program"), message.getNBTValue.getString("label"), message.getNBTValue.getTagList("architectures", NBT.TAG_STRING).map((tag: NBTTagString) => tag.getString()).toArray: _*)

View File

@ -82,7 +82,7 @@ class ClassTransformer extends IClassTransformer {
case (Some(interfaceName: String), Some(modid: String)) =>
Mods.All.find(_.id == modid) match {
case Some(mod) =>
if (mod.isAvailable) {
if (mod.isModAvailable) {
val interfaceDesc = interfaceName.replaceAllLiterally(".", "/")
val node = classNodeFor(interfaceDesc)
if (node == null) {
@ -103,7 +103,6 @@ class ClassTransformer extends IClassTransformer {
}
else {
log.info(s"Skipping interface $interfaceName from missing mod $modid.")
mod.disablePower()
}
case _ =>
log.warn(s"Skipping interface $interfaceName from unknown mod $modid.")

View File

@ -25,7 +25,7 @@ class DiskDrive extends SimpleBlock with traits.GUI {
override protected def tooltipTail(metadata: Int, stack: ItemStack, player: EntityPlayer, tooltip: java.util.List[String], advanced: Boolean) {
super.tooltipTail(metadata, stack, player, tooltip, advanced)
if (Mods.ComputerCraft.isAvailable) {
if (Mods.ComputerCraft.isModAvailable) {
tooltip.addAll(Tooltip.get(getClass.getSimpleName + ".CC"))
}
}

View File

@ -25,16 +25,16 @@ class PowerConverter extends SimpleBlock with traits.PowerAcceptor {
override protected def tooltipTail(metadata: Int, stack: ItemStack, player: EntityPlayer, tooltip: util.List[String], advanced: Boolean) {
super.tooltipTail(metadata, stack, player, tooltip, advanced)
if (Mods.Factorization.isAvailable) {
if (Mods.Factorization.isModAvailable) {
addRatio(tooltip, "Factorization", Settings.get.ratioFactorization)
}
if (Mods.IndustrialCraft2.isAvailable || Mods.IndustrialCraft2Classic.isAvailable) {
if (Mods.IndustrialCraft2.isModAvailable || Mods.IndustrialCraft2Classic.isModAvailable) {
addRatio(tooltip, "IndustrialCraft2", Settings.get.ratioIndustrialCraft2)
}
if (Mods.Mekanism.isAvailable) {
if (Mods.Mekanism.isModAvailable) {
addRatio(tooltip, "Mekanism", Settings.get.ratioMekanism)
}
if (Mods.CoFHEnergy.isAvailable) {
if (Mods.CoFHEnergy.isModAvailable) {
addRatio(tooltip, "ThermalExpansion", Settings.get.ratioRedstoneFlux)
}
}

View File

@ -12,13 +12,13 @@ import net.minecraft.world.World
class Redstone extends RedstoneAware {
override protected def tooltipTail(metadata: Int, stack: ItemStack, player: EntityPlayer, tooltip: util.List[String], advanced: Boolean) {
super.tooltipTail(metadata, stack, player, tooltip, advanced)
if (Mods.ProjectRedTransmission.isAvailable) {
if (Mods.ProjectRedTransmission.isModAvailable) {
tooltip.addAll(Tooltip.get("RedstoneCard.ProjectRed"))
}
if (Mods.RedLogic.isAvailable) {
if (Mods.RedLogic.isModAvailable) {
tooltip.addAll(Tooltip.get("RedstoneCard.RedLogic"))
}
if (Mods.MineFactoryReloaded.isAvailable) {
if (Mods.MineFactoryReloaded.isModAvailable) {
tooltip.addAll(Tooltip.get("RedstoneCard.RedNet"))
}
}

View File

@ -542,8 +542,8 @@ object Items extends ItemAPI {
val integration = newItem(new item.Delegator(), "integration")
// Only register recipes if the related mods are present.
Recipes.addSubItem(new item.AbstractBusCard(integration), Constants.ItemName.AbstractBusCard, Mods.StargateTech2.isAvailable, "oc:abstractBusCard")
Recipes.addSubItem(new item.WorldSensorCard(integration), Constants.ItemName.WorldSensorCard, Mods.Galacticraft.isAvailable, "oc:worldSensorCard")
Recipes.addSubItem(new item.AbstractBusCard(integration), Constants.ItemName.AbstractBusCard, Mods.StargateTech2.isModAvailable, "oc:abstractBusCard")
Recipes.addSubItem(new item.WorldSensorCard(integration), Constants.ItemName.WorldSensorCard, Mods.Galacticraft.isModAvailable, "oc:worldSensorCard")
}
private def newItem[T <: Item](item: T, name: String): T = {

View File

@ -3,5 +3,5 @@ package li.cil.oc.common.item
import li.cil.oc.integration.Mods
class AbstractBusCard(val parent: Delegator) extends traits.Delegate with traits.ItemTier {
showInItemList = Mods.StargateTech2.isAvailable
showInItemList = Mods.StargateTech2.isModAvailable
}

View File

@ -18,19 +18,19 @@ class RedstoneCard(val parent: Delegator, val tier: Int) extends traits.Delegate
override protected def tooltipExtended(stack: ItemStack, tooltip: util.List[String]) {
super.tooltipExtended(stack, tooltip)
if (tier == Tier.Two) {
if (Mods.ProjectRedTransmission.isAvailable) {
if (Mods.ProjectRedTransmission.isModAvailable) {
tooltip.addAll(Tooltip.get(super.unlocalizedName + ".ProjectRed"))
}
if (Mods.RedLogic.isAvailable) {
if (Mods.RedLogic.isModAvailable) {
tooltip.addAll(Tooltip.get(super.unlocalizedName + ".RedLogic"))
}
if (Mods.MineFactoryReloaded.isAvailable) {
if (Mods.MineFactoryReloaded.isModAvailable) {
tooltip.addAll(Tooltip.get(super.unlocalizedName + ".RedNet"))
}
if (Mods.WirelessRedstoneCBE.isAvailable) {
if (Mods.WirelessRedstoneCBE.isModAvailable) {
tooltip.addAll(Tooltip.get(super.unlocalizedName + ".WirelessCBE"))
}
if (Mods.WirelessRedstoneSVE.isAvailable) {
if (Mods.WirelessRedstoneSVE.isModAvailable) {
tooltip.addAll(Tooltip.get(super.unlocalizedName + ".WirelessSV"))
}
}

View File

@ -3,5 +3,5 @@ package li.cil.oc.common.item
import li.cil.oc.integration.Mods
class WorldSensorCard(val parent: Delegator) extends traits.Delegate with traits.ItemTier {
showInItemList = Mods.Galacticraft.isAvailable
showInItemList = Mods.Galacticraft.isModAvailable
}

View File

@ -206,7 +206,7 @@ object ExtendedRecipe {
}
}
private def weAreBeingCalledFromAppliedEnergistics2 = Mods.AppliedEnergistics2.isAvailable && new Exception().getStackTrace.exists(_.getClassName == "appeng.container.implementations.ContainerPatternTerm")
private def weAreBeingCalledFromAppliedEnergistics2 = Mods.AppliedEnergistics2.isModAvailable && new Exception().getStackTrace.exists(_.getClassName == "appeng.container.implementations.ContainerPatternTerm")
private trait ItemDataWrapper {
def components: Array[ItemStack]

View File

@ -120,7 +120,7 @@ class Relay extends traits.SwitchLike with traits.ComponentInventory with traits
}
override def tryEnqueuePacket(sourceSide: Option[EnumFacing], packet: Packet): Boolean = {
if (Mods.ComputerCraft.isAvailable) {
if (Mods.ComputerCraft.isModAvailable) {
packet.data.headOption match {
case Some(answerPort: java.lang.Double) => queueMessage(packet.source, packet.destination, packet.port, answerPort.toInt, packet.data.drop(1))
case _ => queueMessage(packet.source, packet.destination, packet.port, -1, packet.data)

View File

@ -35,7 +35,7 @@ class Switch extends traits.SwitchLike with traits.NotAnalyzable with traits.Com
// ----------------------------------------------------------------------- //
override def tryEnqueuePacket(sourceSide: Option[EnumFacing], packet: Packet): Boolean = {
if (Mods.ComputerCraft.isAvailable) {
if (Mods.ComputerCraft.isModAvailable) {
packet.data.headOption match {
case Some(answerPort: java.lang.Double) => queueMessage(packet.source, packet.destination, packet.port, answerPort.toInt, packet.data.drop(1))
case _ => queueMessage(packet.source, packet.destination, packet.port, -1, packet.data)

View File

@ -18,7 +18,7 @@ import net.minecraftforge.fml.common.eventhandler.Event
trait IndustrialCraft2Experimental extends Common with IndustrialCraft2Common with traits.Tickable {
private var conversionBuffer = 0.0
private lazy val useIndustrialCraft2Power = isServer && Mods.IndustrialCraft2.isAvailable
private lazy val useIndustrialCraft2Power = isServer && Mods.IndustrialCraft2.isModAvailable
// ----------------------------------------------------------------------- //

View File

@ -12,7 +12,7 @@ trait RedstoneFlux extends Common {
@Optional.Method(modid = Mods.IDs.CoFHEnergy)
def receiveEnergy(from: EnumFacing, maxReceive: Int, simulate: Boolean): Int =
if (!Mods.CoFHEnergy.isAvailable) 0
if (!Mods.CoFHEnergy.isModAvailable) 0
else Power.toRF(tryChangeBuffer(from, Power.fromRF(maxReceive), !simulate))
// IEnergyHandler
@ -26,5 +26,5 @@ trait RedstoneFlux extends Common {
// IEnergyConnection
@Optional.Method(modid = Mods.IDs.CoFHEnergy)
def canConnectEnergy(from: EnumFacing): Boolean = Mods.CoFHEnergy.isAvailable && canConnectPower(from)
def canConnectEnergy(from: EnumFacing): Boolean = Mods.CoFHEnergy.isModAvailable && canConnectPower(from)
}

View File

@ -4,6 +4,4 @@ public interface Mod {
String id();
boolean isModAvailable();
boolean providesPower();
}

View File

@ -13,14 +13,12 @@ object Mods {
private val knownMods = mutable.ArrayBuffer.empty[ModBase]
lazy val isPowerProvidingModPresent = knownMods.exists(mod => mod.providesPower && mod.isAvailable)
// ----------------------------------------------------------------------- //
def All = knownMods.clone()
val AgriCraft = new SimpleMod(IDs.AgriCraft, version = "@[1.4.0,)")
val AppliedEnergistics2 = new SimpleMod(IDs.AppliedEnergistics2, version = "@[rv1,)", providesPower = true)
val AppliedEnergistics2 = new SimpleMod(IDs.AppliedEnergistics2, version = "@[rv1,)")
val BattleGear2 = new SimpleMod(IDs.BattleGear2)
val BetterRecords = new SimpleMod(IDs.BetterRecords)
val BloodMagic = new SimpleMod(IDs.BloodMagic)
@ -31,30 +29,30 @@ object Mods {
val BuildCraftTiles = new SimpleMod(IDs.BuildCraftTiles)
val BuildCraftTools = new SimpleMod(IDs.BuildCraftTools)
val BuildCraftTransport = new SimpleMod(IDs.BuildCraftTransport)
val CoFHEnergy = new SimpleMod(IDs.CoFHEnergy, providesPower = true)
val CoFHEnergy = new SimpleMod(IDs.CoFHEnergy)
val CoFHItem = new SimpleMod(IDs.CoFHItem)
val CoFHTileEntity = new SimpleMod(IDs.CoFHTileEntity)
val CoFHTransport = new SimpleMod(IDs.CoFHTransport)
val ColoredLights = new SimpleMod(IDs.ColoredLights)
val ComputerCraft = new SimpleMod(IDs.ComputerCraft, version = "@[1.80,)")
val CraftingCosts = new SimpleMod(IDs.CraftingCosts)
val DeepStorageUnit = new ClassBasedMod(IDs.DeepStorageUnit, "powercrystals.minefactoryreloaded.api.IDeepStorageUnit")()
val ElectricalAge = new SimpleMod(IDs.ElectricalAge, providesPower = true)
val DeepStorageUnit = new ClassBasedMod(IDs.DeepStorageUnit, "powercrystals.minefactoryreloaded.api.IDeepStorageUnit")
val ElectricalAge = new SimpleMod(IDs.ElectricalAge)
val EnderIO = new SimpleMod(IDs.EnderIO, version = "@[1.10.2-3.0.1.132,)")
val EnderStorage = new SimpleMod(IDs.EnderStorage)
val ExtraCells = new SimpleMod(IDs.ExtraCells, version = "@[2.2.73,)")
val Factorization = new SimpleMod(IDs.Factorization, providesPower = true)
val Factorization = new SimpleMod(IDs.Factorization)
val Forestry = new SimpleMod(IDs.Forestry, version = "@[5.2,)")
val Forge = new SimpleMod(IDs.Forge, providesPower = true)
val Forge = new SimpleMod(IDs.Forge)
val ForgeMultipart = new SimpleMod(IDs.ForgeMultipart)
val Galacticraft = new SimpleMod(IDs.Galacticraft, providesPower = true)
val GregTech = new ClassBasedMod(IDs.GregTech, "gregtech.api.GregTech_API")()
val IndustrialCraft2 = new SimpleMod(IDs.IndustrialCraft2, providesPower = true)
val IndustrialCraft2Classic = new SimpleMod(IDs.IndustrialCraft2Classic, providesPower = true)
val Galacticraft = new SimpleMod(IDs.Galacticraft)
val GregTech = new ClassBasedMod(IDs.GregTech, "gregtech.api.GregTech_API")
val IndustrialCraft2 = new SimpleMod(IDs.IndustrialCraft2)
val IndustrialCraft2Classic = new SimpleMod(IDs.IndustrialCraft2Classic)
val IngameWiki = new SimpleMod(IDs.IngameWiki)
val JustEnoughItems = new SimpleMod(IDs.JustEnoughItems)
val MCMultiPart = new SimpleMod(IDs.MCMultiPart, version = "@[1.0.9,)")
val Mekanism = new SimpleMod(IDs.Mekanism, providesPower = true)
val Mekanism = new SimpleMod(IDs.Mekanism)
val MekanismGas = new SimpleMod(IDs.MekanismGas)
val Minecraft = new SimpleMod(IDs.Minecraft)
val MineFactoryReloaded = new SimpleMod(IDs.MineFactoryReloaded)
@ -63,7 +61,7 @@ object Mods {
val NotEnoughKeys = new SimpleMod(IDs.NotEnoughKeys)
val OpenComputers = new SimpleMod(IDs.OpenComputers)
val PortalGun = new SimpleMod(IDs.PortalGun)
val PowerAdvantage = new SimpleMod(IDs.PowerAdvantage, version = "@[1.2.0,)", providesPower = true)
val PowerAdvantage = new SimpleMod(IDs.PowerAdvantage, version = "@[1.2.0,)")
val ProjectRedCore = new SimpleMod(IDs.ProjectRedCore)
val ProjectRedTransmission = new SimpleMod(IDs.ProjectRedTransmission)
val Railcraft = new SimpleMod(IDs.Railcraft)
@ -79,10 +77,10 @@ object Mods {
override def isModAvailable: Boolean = isModAvailable_
}
val Tesla = new SimpleMod(IDs.Tesla, providesPower = true)
val Tesla = new SimpleMod(IDs.Tesla)
val Thaumcraft = new SimpleMod(IDs.Thaumcraft)
val ThaumicEnergistics = new SimpleMod(IDs.ThaumicEnergistics)
val ThermalExpansion = new SimpleMod(IDs.ThermalExpansion, providesPower = true)
val ThermalExpansion = new SimpleMod(IDs.ThermalExpansion)
val TinkersConstruct = new SimpleMod(IDs.TinkersConstruct)
val TIS3D = new SimpleMod(IDs.TIS3D, version = "@[0.9,)")
val TMechWorks = new SimpleMod(IDs.TMechWorks)
@ -246,28 +244,16 @@ object Mods {
trait ModBase extends Mod {
knownMods += this
private var powerDisabled = false
protected lazy val isPowerModEnabled = !providesPower || (!Settings.get.pureIgnorePower && !Settings.get.powerModBlacklist.contains(id))
def isModAvailable: Boolean
def id: String
def isAvailable = !powerDisabled && isModAvailable && isPowerModEnabled
def providesPower: Boolean = false
// This is called from the class transformer when injecting an interface of
// this power type fails, to avoid class not found / class cast exceptions.
def disablePower() = powerDisabled = true
def container = Option(Loader.instance.getIndexedModList.get(id))
def version = container.map(_.getProcessedVersion)
}
class SimpleMod(val id: String, override val providesPower: Boolean = false, version: String = "") extends ModBase {
class SimpleMod(val id: String, version: String = "") extends ModBase {
private lazy val isModAvailable_ = {
val version = VersionParser.parseVersionReference(id + this.version)
if (Loader.isModLoaded(version.getLabel))
@ -278,7 +264,7 @@ object Mods {
def isModAvailable = isModAvailable_
}
class ClassBasedMod(val id: String, val classNames: String*)(override val providesPower: Boolean = false) extends ModBase {
class ClassBasedMod(val id: String, val classNames: String*) extends ModBase {
private lazy val isModAvailable_ = classNames.forall(className => try Class.forName(className) != null catch {
case _: Throwable => false
})

View File

@ -10,7 +10,7 @@ import net.minecraft.block.Block
object ModColoredLights {
def setLightLevel(block: Block, r: Int, g: Int, b: Int): Unit = {
// Extra layer of indirection because I've learned to be paranoid when it comes to class loading...
if (Mods.ColoredLights.isAvailable)
if (Mods.ColoredLights.isModAvailable)
setColoredLightLevel(block, r, g, b)
else
setPlainLightLevel(block, r, g, b)

View File

@ -12,7 +12,7 @@ object BundledRedstone {
def addProvider(provider: RedstoneProvider): Unit = providers += provider
def isAvailable = Mods.MineFactoryReloaded.isAvailable || providers.nonEmpty
def isAvailable = Mods.MineFactoryReloaded.isModAvailable || providers.nonEmpty
def computeInput(pos: BlockPosition, side: EnumFacing): Int = {
if (pos.world.get.blockExists(pos.offset(side)))

View File

@ -13,7 +13,7 @@ object PortalGun {
def isPortalGun(stack: ItemStack) =
stack != null && stack.stackSize > 0 &&
Mods.PortalGun.isAvailable &&
Mods.PortalGun.isModAvailable &&
portalGunClass != null &&
portalGunClass.isAssignableFrom(stack.getItem.getClass)

View File

@ -6,5 +6,5 @@ object Waila {
// This is used to check if certain data actually has to be saved in
// writeToNBT calls. For some stuff we write lots of data (e.g. computer
// state), and we want to avoid that when Waila is calling us.
def isSavingForTooltip = Mods.Waila.isAvailable && new Exception().getStackTrace.exists(_.getClassName.startsWith("mcp.mobius.waila"))
def isSavingForTooltip = Mods.Waila.isModAvailable && new Exception().getStackTrace.exists(_.getClassName.startsWith("mcp.mobius.waila"))
}

View File

@ -104,7 +104,7 @@ class Player(val agent: internal.Agent) extends FakePlayer(agent.world.asInstanc
{
val inventory = new Inventory(this, agent)
if (Mods.BattleGear2.isAvailable) {
if (Mods.BattleGear2.isModAvailable) {
ObfuscationReflectionHelper.setPrivateValue(classOf[EntityPlayer], this, inventory, "inventory", "field_71071_by", "bm")
}
else this.inventory = inventory

View File

@ -59,7 +59,7 @@ object ItemCosts {
terminate(Items.SLIME_BALL)
terminate(Items.STICK)
def hasCosts(stack: ItemStack) = !Mods.CraftingCosts.isAvailable && {
def hasCosts(stack: ItemStack) = !Mods.CraftingCosts.isModAvailable && {
val ingredients = computeIngredients(stack)
ingredients.nonEmpty && (ingredients.size > 1 || !ingredients.head._1.isItemEqual(stack))
}