From 9f304bda4f0740cb0f7631a805a14dd17a88637b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Fri, 8 Aug 2014 22:51:38 +0200 Subject: [PATCH] Made power support more stable (checking if methods are implemented before injecting the interfaces, to prevent crashes if APIs change, e.g.) --- .../li/cil/oc/common/asm/ClassTransformer.scala | 14 +++++++++++++- src/main/scala/li/cil/oc/util/mods/Mods.scala | 6 ++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/common/asm/ClassTransformer.scala b/src/main/scala/li/cil/oc/common/asm/ClassTransformer.scala index 2de8f0dbb..5e3cdb21c 100644 --- a/src/main/scala/li/cil/oc/common/asm/ClassTransformer.scala +++ b/src/main/scala/li/cil/oc/common/asm/ClassTransformer.scala @@ -64,8 +64,20 @@ class ClassTransformer extends IClassTransformer { // Inject available power interfaces into power acceptors. if (classNode.interfaces.contains("li/cil/oc/common/tileentity/traits/PowerAcceptor")) { + def missingImplementations(interfaceName: String) = { + val node = classNodeFor(interfaceName) + if (node == null) Seq(s"Interface ${interfaceName.replaceAll("/", ".")} not found.") + else node.methods.filterNot(im => classNode.methods.exists(cm => im.name == cm.name && im.desc == cm.desc)).map(method => s"Missing implementation of ${method.name + method.desc}") + } for ((mod, interfaces) <- powerTypes if mod.isAvailable) { - interfaces.foreach(classNode.interfaces.add) + val missing = interfaces.flatMap(missingImplementations) + if (missing.isEmpty) { + interfaces.foreach(classNode.interfaces.add) + } + else { + log.warning(s"Skipping power support for mod ${mod.id}.") + missing.foreach(log.warning) + } } } 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 5c3a8132f..b99c5efb0 100644 --- a/src/main/scala/li/cil/oc/util/mods/Mods.scala +++ b/src/main/scala/li/cil/oc/util/mods/Mods.scala @@ -49,6 +49,8 @@ object Mods { }) } val ComputerCraft = new Mod { + def id = IDs.ComputerCraft + override def isAvailable = ComputerCraft15.isAvailable || ComputerCraft16.isAvailable } val Factorization = new SimpleMod(IDs.Factorization, providesPower = true) @@ -63,6 +65,8 @@ object Mods { val ProjectRedTransmission = new SimpleMod(IDs.ProjectRedTransmission) val RedLogic = new SimpleMod(IDs.RedLogic) val StargateTech2 = new Mod { + def id = IDs.StargateTech2 + val isAvailable = Loader.isModLoaded(IDs.StargateTech2) && { val mod = Loader.instance.getIndexedModList.get(IDs.StargateTech2) mod.getVersion.startsWith("0.7.") @@ -78,6 +82,8 @@ object Mods { trait Mod { knownMods += this + def id: String + def isAvailable: Boolean def providesPower: Boolean = false