From 3085b961b8e60968e09df284c9677e84c51a204e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 29 Mar 2014 21:09:37 +0100 Subject: [PATCH] added version specific mod presence checks --- src/main/scala/li/cil/oc/Items.scala | 4 +-- src/main/scala/li/cil/oc/Settings.scala | 9 +++--- .../li/cil/oc/common/ConnectionHandler.scala | 4 +-- src/main/scala/li/cil/oc/common/Proxy.scala | 7 ++--- .../cil/oc/common/asm/ClassTransformer.scala | 20 +++++-------- .../scala/li/cil/oc/common/block/Cable.scala | 8 ++--- .../li/cil/oc/common/block/Delegator.scala | 8 ++--- .../li/cil/oc/common/block/DiskDrive.scala | 5 ++-- .../cil/oc/common/block/PowerConverter.scala | 12 ++++---- .../li/cil/oc/common/block/Redstone.scala | 6 ++-- .../cil/oc/common/item/AbstractBusCard.scala | 4 +-- .../li/cil/oc/common/item/IronNugget.scala | 4 +-- .../li/cil/oc/common/item/RedstoneCard.scala | 6 ++-- .../li/cil/oc/common/tileentity/Router.scala | 5 ++-- .../oc/common/tileentity/WirelessRouter.scala | 4 +-- .../tileentity/traits/AbstractBusAware.scala | 11 +++---- .../traits/BundledRedstoneAware.scala | 10 +++---- .../tileentity/traits/RedstoneAware.scala | 5 ++-- .../traits/power/IndustrialCraft2.scala | 5 ++-- .../oc/server/component/robot/Player.scala | 5 ++-- .../server/driver/item/AbstractBusCard.scala | 4 +-- .../oc/server/driver/item/FileSystem.scala | 9 +++--- .../li/cil/oc/server/network/Network.scala | 7 +++-- .../li/cil/oc/util/mods/BundledRedstone.scala | 8 ++--- .../li/cil/oc/util/mods/ComputerCraft.scala | 3 +- .../cil/oc/util/mods/IndustrialCraft2.scala | 3 +- src/main/scala/li/cil/oc/util/mods/Mods.scala | 30 +++++++++++++++++++ src/main/scala/li/cil/oc/util/mods/NEI.scala | 4 +-- .../scala/li/cil/oc/util/mods/PortalGun.scala | 3 +- .../li/cil/oc/util/mods/ProjectRed.scala | 3 -- .../li/cil/oc/util/mods/StargateTech2.scala | 14 --------- 31 files changed, 117 insertions(+), 113 deletions(-) create mode 100644 src/main/scala/li/cil/oc/util/mods/Mods.scala diff --git a/src/main/scala/li/cil/oc/Items.scala b/src/main/scala/li/cil/oc/Items.scala index a92c5acf4..d55141025 100644 --- a/src/main/scala/li/cil/oc/Items.scala +++ b/src/main/scala/li/cil/oc/Items.scala @@ -2,7 +2,7 @@ package li.cil.oc import cpw.mods.fml.common.registry.GameRegistry import li.cil.oc.common.item -import li.cil.oc.util.mods.StargateTech2 +import li.cil.oc.util.mods.Mods import net.minecraft.block.Block import net.minecraft.item.{Item, ItemStack} import net.minecraftforge.oredict.OreDictionary @@ -123,7 +123,7 @@ object Items { upgradeNavigation = Recipes.addItemDelegate(new item.UpgradeNavigation(multi), "navigationUpgrade") abstractBus = new item.AbstractBusCard(multi) - if (StargateTech2.isAvailable) { + if (Mods.StargateTech2.isAvailable) { Recipes.addItemDelegate(abstractBus, "abstractBusCard") } diff --git a/src/main/scala/li/cil/oc/Settings.scala b/src/main/scala/li/cil/oc/Settings.scala index 8289f123d..edf261185 100644 --- a/src/main/scala/li/cil/oc/Settings.scala +++ b/src/main/scala/li/cil/oc/Settings.scala @@ -8,6 +8,7 @@ import li.cil.oc.util.PackedColor import org.apache.commons.lang3.StringEscapeUtils import scala.collection.convert.WrapAsScala._ import scala.io.Source +import li.cil.oc.util.mods.Mods class Settings(config: Config) { val itemId = config.getInt("ids.item") @@ -107,10 +108,10 @@ class Settings(config: Config) { val pureIgnorePower = config.getBoolean("power.ignorePower") val ignorePower = pureIgnorePower || - (!ModAPIManager.INSTANCE.hasAPI("BuildCraftAPI|power") && - !Loader.isModLoaded("IC2") && - !Loader.isModLoaded("ThermalExpansion") && - !Loader.isModLoaded("UniversalElectricity")) + (!Mods.BuildCraftPower.isAvailable && + !Mods.IndustrialCraft2.isAvailable && + !Mods.ThermalExpansion.isAvailable && + !Mods.UniversalElectricity.isAvailable) val tickFrequency = config.getDouble("power.tickFrequency") max 1 val chargeRate = config.getDouble("power.chargerChargeRate") val generatorEfficiency = config.getDouble("power.generatorEfficiency") diff --git a/src/main/scala/li/cil/oc/common/ConnectionHandler.scala b/src/main/scala/li/cil/oc/common/ConnectionHandler.scala index ca7924544..a57def1a9 100644 --- a/src/main/scala/li/cil/oc/common/ConnectionHandler.scala +++ b/src/main/scala/li/cil/oc/common/ConnectionHandler.scala @@ -2,7 +2,7 @@ package li.cil.oc.common import cpw.mods.fml.common.network.{Player, IConnectionHandler} import li.cil.oc.util.LuaStateFactory -import li.cil.oc.util.mods.ProjectRed +import li.cil.oc.util.mods.{Mods, ProjectRed} import li.cil.oc.{OpenComputers, UpdateCheck, Settings} import net.minecraft.entity.player.EntityPlayerMP import net.minecraft.network.packet.{Packet1Login, NetHandler} @@ -17,7 +17,7 @@ object ConnectionHandler extends IConnectionHandler { if (!LuaStateFactory.isAvailable) { p.sendChatToPlayer(ChatMessageComponent.createFromText("§aOpenComputers§f: ").addKey(Settings.namespace + "gui.Chat.WarningLuaFallback")) } - if (ProjectRed.isAvailable && !ProjectRed.isAPIAvailable) { + if (Mods.ProjectRed.isAvailable && !ProjectRed.isAPIAvailable) { p.sendChatToPlayer(ChatMessageComponent.createFromText("§aOpenComputers§f: ").addKey(Settings.namespace + "gui.Chat.WarningProjectRed")) } if (!Settings.get.pureIgnorePower && Settings.get.ignorePower) { diff --git a/src/main/scala/li/cil/oc/common/Proxy.scala b/src/main/scala/li/cil/oc/common/Proxy.scala index 284b05832..fb0b0c4c8 100644 --- a/src/main/scala/li/cil/oc/common/Proxy.scala +++ b/src/main/scala/li/cil/oc/common/Proxy.scala @@ -1,7 +1,6 @@ package li.cil.oc.common import cpw.mods.fml.common.event._ -import cpw.mods.fml.common.Loader import cpw.mods.fml.common.network.NetworkRegistry import cpw.mods.fml.common.registry.{TickRegistry, GameRegistry} import cpw.mods.fml.relauncher.Side @@ -16,7 +15,7 @@ import li.cil.oc.server.component.machine.{LuaJLuaArchitecture, NativeLuaArchite import li.cil.oc.server.network.WirelessNetwork import li.cil.oc.server.{TickHandler, driver, fs, network} import li.cil.oc.util.LuaStateFactory -import li.cil.oc.util.mods.ComputerCraft +import li.cil.oc.util.mods.{Mods, ComputerCraft} import net.minecraftforge.common.MinecraftForge class Proxy { @@ -26,10 +25,10 @@ class Proxy { Blocks.init() Items.init() - if (Loader.isModLoaded("ForgeMultipart")) { + if (Mods.ForgeMultipart.isAvailable) { MultiPart.init() } - if (Loader.isModLoaded("ComputerCraft")) { + if (Mods.ComputerCraft.isAvailable) { ComputerCraft.init() } 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 36843e49d..cf8101da7 100644 --- a/src/main/scala/li/cil/oc/common/asm/ClassTransformer.scala +++ b/src/main/scala/li/cil/oc/common/asm/ClassTransformer.scala @@ -1,11 +1,10 @@ package li.cil.oc.common.asm import cpw.mods.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper -import cpw.mods.fml.common.Loader import cpw.mods.fml.relauncher.IFMLLoadingPlugin.TransformerExclusions import java.util.logging.{Level, Logger} import li.cil.oc.common.asm.template.SimpleComponentImpl -import li.cil.oc.util.mods.StargateTech2 +import li.cil.oc.util.mods.Mods import net.minecraft.launchwrapper.{LaunchClassLoader, IClassTransformer} import org.objectweb.asm.tree._ import org.objectweb.asm.{ClassWriter, ClassReader} @@ -25,11 +24,11 @@ class ClassTransformer extends IClassTransformer { transformedClass = ensureStargateTechCompatibility(transformedClass) } if (transformedClass != null - && !name.startsWith("""net.minecraft.""") - && !name.startsWith("""net.minecraftforge.""") - && !name.startsWith("""li.cil.oc.common.asm.""") - && !name.startsWith("""li.cil.oc.api.""")) { - if (name.startsWith("""li.cil.oc.""")) { + && !name.startsWith( """net.minecraft.""") + && !name.startsWith( """net.minecraftforge.""") + && !name.startsWith( """li.cil.oc.common.asm.""") + && !name.startsWith( """li.cil.oc.api.""")) { + if (name.startsWith( """li.cil.oc.""")) { // Strip foreign interfaces from scala generated classes. This is // primarily intended to clean up mix-ins / synthetic classes // generated by Scala. @@ -87,12 +86,7 @@ class ClassTransformer extends IClassTransformer { } def ensureStargateTechCompatibility(basicClass: Array[Byte]): Array[Byte] = { - if (!Loader.isModLoaded("StargateTech2")) { - return basicClass - } - - if (StargateTech2.isAvailable) { - // All green, API version is new enough. + if (!Mods.StargateTech2.isAvailable) { return basicClass } diff --git a/src/main/scala/li/cil/oc/common/block/Cable.scala b/src/main/scala/li/cil/oc/common/block/Cable.scala index cb6cc9de6..6246b2cb8 100644 --- a/src/main/scala/li/cil/oc/common/block/Cable.scala +++ b/src/main/scala/li/cil/oc/common/block/Cable.scala @@ -2,13 +2,13 @@ package li.cil.oc.common.block import codechicken.lib.vec.Cuboid6 import codechicken.multipart.{TFacePart, JNormalOcclusion, NormalOcclusionTest, TileMultipart} -import cpw.mods.fml.common.Loader import cpw.mods.fml.relauncher.{SideOnly, Side} import java.util -import li.cil.oc.Settings import li.cil.oc.api.network.{SidedEnvironment, Environment} import li.cil.oc.common.multipart.CablePart import li.cil.oc.common.tileentity +import li.cil.oc.Settings +import li.cil.oc.util.mods.Mods import li.cil.oc.util.Tooltip import net.minecraft.client.renderer.texture.IconRegister import net.minecraft.entity.player.EntityPlayer @@ -95,7 +95,7 @@ object Cable { if (!world.isAirBlock(tx, ty, tz)) { val neighborTileEntity = world.getBlockTileEntity(tx, ty, tz) val neighborHasNode = hasNetworkNode(neighborTileEntity, side.getOpposite) - val canConnect = !Loader.isModLoaded("ForgeMultipart") || + val canConnect = !Mods.ForgeMultipart.isAvailable || (canConnectFromSide(tileEntity, side) && canConnectFromSide(neighborTileEntity, side.getOpposite)) val canConnectIM = canConnectFromSideIM(tileEntity, side) && canConnectFromSideIM(neighborTileEntity, side.getOpposite) if (neighborHasNode && canConnect && canConnectIM) { @@ -115,7 +115,7 @@ object Cable { if (host.getWorldObj.isRemote) host.canConnect(side) else host.sidedNode(side) != null case host: Environment => true - case host if Loader.isModLoaded("ForgeMultipart") => hasMultiPartNode(tileEntity) + case host if Mods.ForgeMultipart.isAvailable => hasMultiPartNode(tileEntity) case _ => false } diff --git a/src/main/scala/li/cil/oc/common/block/Delegator.scala b/src/main/scala/li/cil/oc/common/block/Delegator.scala index ad4401deb..1518d4d7b 100644 --- a/src/main/scala/li/cil/oc/common/block/Delegator.scala +++ b/src/main/scala/li/cil/oc/common/block/Delegator.scala @@ -1,12 +1,13 @@ package li.cil.oc.common.block -import cpw.mods.fml.common.{Loader, Optional} +import cpw.mods.fml.common.Optional import cpw.mods.fml.relauncher.{Side, SideOnly} import java.util import java.util.Random import li.cil.oc.client.renderer.block.BlockRenderer -import li.cil.oc.common.tileentity +import li.cil.oc.common.tileentity.traits.{Rotatable, BundledRedstoneAware} import li.cil.oc.util.ItemCosts +import li.cil.oc.util.mods.Mods import li.cil.oc.{Settings, CreativeTab} import mcp.mobius.waila.api.{IWailaConfigHandler, IWailaDataAccessor, IWailaBlock} import net.minecraft.block.Block @@ -23,7 +24,6 @@ import net.minecraftforge.common.ForgeDirection import org.lwjgl.input import powercrystals.minefactoryreloaded.api.rednet.{IRedNetNetworkContainer, RedNetConnectionType, IConnectableRedNet} import scala.collection.mutable -import li.cil.oc.common.tileentity.traits.{Rotatable, BundledRedstoneAware} @Optional.Interface(iface = "mcp.mobius.waila.api.IWailaBlock", modid = "Waila") class Delegator[Child <: Delegate](id: Int) extends Block(id, Material.iron) with IWailaBlock { @@ -509,7 +509,7 @@ trait RedstoneDelegator[Child <: Delegate] extends Delegator[Child] with IConnec } abstract override def onNeighborBlockChange(world: World, x: Int, y: Int, z: Int, blockId: Int) { - if (Loader.isModLoaded("MineFactoryReloaded")) { + if (Mods.MineFactoryReloaded.isAvailable) { world.getBlockTileEntity(x, y, z) match { case t: BundledRedstoneAware => for (side <- ForgeDirection.VALID_DIRECTIONS) { Block.blocksList(world.getBlockId(x + side.offsetX, y + side.offsetY, z + side.offsetZ)) match { diff --git a/src/main/scala/li/cil/oc/common/block/DiskDrive.scala b/src/main/scala/li/cil/oc/common/block/DiskDrive.scala index fd99a171f..4def04004 100644 --- a/src/main/scala/li/cil/oc/common/block/DiskDrive.scala +++ b/src/main/scala/li/cil/oc/common/block/DiskDrive.scala @@ -1,8 +1,9 @@ package li.cil.oc.common.block -import cpw.mods.fml.common.{Optional, Loader} +import cpw.mods.fml.common.Optional import java.util import li.cil.oc.common.{GuiType, tileentity} +import li.cil.oc.util.mods.Mods import li.cil.oc.util.Tooltip import li.cil.oc.{OpenComputers, Settings} import mcp.mobius.waila.api.{IWailaConfigHandler, IWailaDataAccessor} @@ -23,7 +24,7 @@ class DiskDrive(val parent: SimpleDelegator) extends SimpleDelegate { override def tooltipLines(stack: ItemStack, player: EntityPlayer, tooltip: util.List[String], advanced: Boolean) { tooltip.addAll(Tooltip.get(unlocalizedName)) - if (Loader.isModLoaded("ComputerCraft")) { + if (Mods.ComputerCraft.isAvailable) { tooltip.addAll(Tooltip.get(unlocalizedName + ".CC")) } } diff --git a/src/main/scala/li/cil/oc/common/block/PowerConverter.scala b/src/main/scala/li/cil/oc/common/block/PowerConverter.scala index a1b4b9dbb..24d35b189 100644 --- a/src/main/scala/li/cil/oc/common/block/PowerConverter.scala +++ b/src/main/scala/li/cil/oc/common/block/PowerConverter.scala @@ -1,10 +1,10 @@ package li.cil.oc.common.block -import cpw.mods.fml.common.Loader import java.text.DecimalFormat import java.util -import li.cil.oc.Settings import li.cil.oc.common.tileentity +import li.cil.oc.Settings +import li.cil.oc.util.mods.Mods import li.cil.oc.util.Tooltip import net.minecraft.client.renderer.texture.IconRegister import net.minecraft.entity.player.EntityPlayer @@ -37,16 +37,16 @@ class PowerConverter(val parent: SimpleDelegator) extends SimpleDelegate { else (1.0 / ratio, 1.0) tooltip.addAll(Tooltip.get(unlocalizedName + "." + name, addExtension(a), addExtension(b))) } - if (Loader.isModLoaded("BuildCraft|Energy")) { + if (Mods.BuildCraftPower.isAvailable) { addRatio("BC", Settings.ratioBC) } - if (Loader.isModLoaded("IC2")) { + if (Mods.IndustrialCraft2.isAvailable) { addRatio("IC2", Settings.ratioIC2) } - if (Loader.isModLoaded("ThermalExpansion")) { + if (Mods.ThermalExpansion.isAvailable) { addRatio("TE", Settings.ratioTE) } - if (Loader.isModLoaded("UniversalElectricity")) { + if (Mods.UniversalElectricity.isAvailable) { addRatio("UE", Settings.ratioUE) } } diff --git a/src/main/scala/li/cil/oc/common/block/Redstone.scala b/src/main/scala/li/cil/oc/common/block/Redstone.scala index 7a4dce351..083e30f73 100644 --- a/src/main/scala/li/cil/oc/common/block/Redstone.scala +++ b/src/main/scala/li/cil/oc/common/block/Redstone.scala @@ -1,8 +1,8 @@ package li.cil.oc.common.block -import cpw.mods.fml.common.Loader import java.util import li.cil.oc.common.tileentity +import li.cil.oc.util.mods.Mods import li.cil.oc.util.Tooltip import li.cil.oc.{Items, Settings} import net.minecraft.client.renderer.texture.IconRegister @@ -19,10 +19,10 @@ class Redstone(val parent: SimpleDelegator) extends RedstoneAware with SimpleDel override def tooltipLines(stack: ItemStack, player: EntityPlayer, tooltip: util.List[String], advanced: Boolean) { tooltip.addAll(Tooltip.get(unlocalizedName)) - if (Loader.isModLoaded("RedLogic")) { + if (Mods.RedLogic.isAvailable) { tooltip.addAll(Tooltip.get(Items.rs.unlocalizedName + ".RedLogic")) } - if (Loader.isModLoaded("MineFactoryReloaded")) { + if (Mods.MineFactoryReloaded.isAvailable) { tooltip.addAll(Tooltip.get(Items.rs.unlocalizedName + ".RedNet")) } } diff --git a/src/main/scala/li/cil/oc/common/item/AbstractBusCard.scala b/src/main/scala/li/cil/oc/common/item/AbstractBusCard.scala index d4d1d81a2..34504a801 100644 --- a/src/main/scala/li/cil/oc/common/item/AbstractBusCard.scala +++ b/src/main/scala/li/cil/oc/common/item/AbstractBusCard.scala @@ -3,7 +3,7 @@ package li.cil.oc.common.item import java.util import li.cil.oc.Settings import li.cil.oc.util.Tooltip -import li.cil.oc.util.mods.StargateTech2 +import li.cil.oc.util.mods.Mods import net.minecraft.client.renderer.texture.IconRegister import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack @@ -11,7 +11,7 @@ import net.minecraft.item.ItemStack class AbstractBusCard(val parent: Delegator) extends Delegate { val unlocalizedName = "AbstractBusCard" - showInItemList = StargateTech2.isAvailable + showInItemList = Mods.StargateTech2.isAvailable override def tooltipLines(stack: ItemStack, player: EntityPlayer, tooltip: util.List[String], advanced: Boolean) { tooltip.addAll(Tooltip.get(unlocalizedName)) diff --git a/src/main/scala/li/cil/oc/common/item/IronNugget.scala b/src/main/scala/li/cil/oc/common/item/IronNugget.scala index 5731238af..c5d288569 100644 --- a/src/main/scala/li/cil/oc/common/item/IronNugget.scala +++ b/src/main/scala/li/cil/oc/common/item/IronNugget.scala @@ -1,8 +1,8 @@ package li.cil.oc.common.item -import cpw.mods.fml.common.Loader import java.util import li.cil.oc.Settings +import li.cil.oc.util.mods.Mods import li.cil.oc.util.Tooltip import net.minecraft.client.renderer.texture.IconRegister import net.minecraft.entity.player.EntityPlayer @@ -11,7 +11,7 @@ import net.minecraft.item.ItemStack class IronNugget(val parent: Delegator) extends Delegate { val unlocalizedName = "IronNugget" - showInItemList = !Loader.isModLoaded("gregtech_addon") + showInItemList = !Mods.GregTech.isAvailable override def tooltipLines(stack: ItemStack, player: EntityPlayer, tooltip: util.List[String], advanced: Boolean) { tooltip.addAll(Tooltip.get(unlocalizedName)) diff --git a/src/main/scala/li/cil/oc/common/item/RedstoneCard.scala b/src/main/scala/li/cil/oc/common/item/RedstoneCard.scala index 33479c568..09d821b71 100644 --- a/src/main/scala/li/cil/oc/common/item/RedstoneCard.scala +++ b/src/main/scala/li/cil/oc/common/item/RedstoneCard.scala @@ -1,8 +1,8 @@ package li.cil.oc.common.item -import cpw.mods.fml.common.Loader import java.util import li.cil.oc.Settings +import li.cil.oc.util.mods.Mods import li.cil.oc.util.Tooltip import net.minecraft.client.renderer.texture.IconRegister import net.minecraft.entity.player.EntityPlayer @@ -13,10 +13,10 @@ class RedstoneCard(val parent: Delegator) extends Delegate { override def tooltipLines(stack: ItemStack, player: EntityPlayer, tooltip: util.List[String], advanced: Boolean) { tooltip.addAll(Tooltip.get(unlocalizedName)) - if (Loader.isModLoaded("RedLogic")) { + if (Mods.RedLogic.isAvailable) { tooltip.addAll(Tooltip.get(unlocalizedName + ".RedLogic")) } - if (Loader.isModLoaded("MineFactoryReloaded")) { + if (Mods.MineFactoryReloaded.isAvailable) { tooltip.addAll(Tooltip.get(unlocalizedName + ".RedNet")) } super.tooltipLines(stack, player, tooltip, advanced) diff --git a/src/main/scala/li/cil/oc/common/tileentity/Router.scala b/src/main/scala/li/cil/oc/common/tileentity/Router.scala index a849ce09e..43e867664 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Router.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Router.scala @@ -1,11 +1,12 @@ package li.cil.oc.common.tileentity -import cpw.mods.fml.common.{Loader, Optional} +import cpw.mods.fml.common.Optional import dan200.computercraft.api.lua.ILuaContext import dan200.computercraft.api.peripheral.{IComputerAccess, IPeripheral} import li.cil.oc.api import li.cil.oc.api.network.{Packet, Message} import li.cil.oc.server.PacketSender +import li.cil.oc.util.mods.Mods import net.minecraftforge.common.ForgeDirection import scala.collection.mutable @@ -102,7 +103,7 @@ class Router extends traits.Hub with traits.NotAnalyzable with IPeripheral { override protected def onPlugMessage(plug: Plug, message: Message) { super.onPlugMessage(plug, message) - if (message.name == "network.message" && Loader.isModLoaded("ComputerCraft")) { + if (message.name == "network.message" && Mods.ComputerCraft.isAvailable) { message.data match { case Array(packet: Packet) => packet.data.headOption match { diff --git a/src/main/scala/li/cil/oc/common/tileentity/WirelessRouter.scala b/src/main/scala/li/cil/oc/common/tileentity/WirelessRouter.scala index b2ade77ce..3abfd0cfa 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/WirelessRouter.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/WirelessRouter.scala @@ -1,8 +1,8 @@ package li.cil.oc.common.tileentity -import cpw.mods.fml.common.Loader import li.cil.oc.api.network._ import li.cil.oc.util.ExtendedNBT._ +import li.cil.oc.util.mods.Mods import li.cil.oc.{api, Settings} import net.minecraft.entity.player.EntityPlayer import net.minecraft.nbt.NBTTagCompound @@ -38,7 +38,7 @@ class WirelessRouter extends Router with WirelessEndpoint { override def receivePacket(packet: Packet, distance: Double) { tryEnqueuePacket(ForgeDirection.UNKNOWN, packet) - if (Loader.isModLoaded("ComputerCraft")) { + if (Mods.ComputerCraft.isAvailable) { 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) diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/AbstractBusAware.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/AbstractBusAware.scala index 8660f2885..36df67a82 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/AbstractBusAware.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/AbstractBusAware.scala @@ -6,7 +6,7 @@ import li.cil.oc.api.network import li.cil.oc.api.network.ManagedEnvironment import li.cil.oc.server.component import li.cil.oc.server.{PacketSender => ServerPacketSender} -import li.cil.oc.util.mods.{StargateTech2API, StargateTech2} +import li.cil.oc.util.mods.{Mods, StargateTech2} import net.minecraft.nbt.NBTTagCompound import stargatetech2.api.bus.{IBusInterface, IBusDevice} import stargatetech2.api.StargateTechAPI @@ -19,7 +19,8 @@ import stargatetech2.api.StargateTechAPI // probably is something derping up in the class loader... the thing that // confuses me the most, though, is that it apparently works for redstone and // the CC interface, so... yeah. I'm out of ideas. -trait AbstractBusAware extends TileEntity with network.Environment { self: IBusDevice => +trait AbstractBusAware extends TileEntity with network.Environment { + self: IBusDevice => protected var _isAbstractBusAvailable: Boolean = _ protected lazy val fakeInterface = Array[AnyRef](StargateTechAPI.api.getFactory.getIBusInterface(this, null)) @@ -51,9 +52,9 @@ trait AbstractBusAware extends TileEntity with network.Environment { self: IBusD def isAbstractBusAvailable_=(value: Boolean) = { if (value != isAbstractBusAvailable) { _isAbstractBusAvailable = value - if (isServer && StargateTech2.isAvailable) { - if (isAbstractBusAvailable) StargateTech2API.addDevice(world, x, y, z) - else StargateTech2API.removeDevice(world, x, y, z) + if (isServer && Mods.StargateTech2.isAvailable) { + if (isAbstractBusAvailable) StargateTech2.addDevice(world, x, y, z) + else StargateTech2.removeDevice(world, x, y, z) } world.notifyBlocksOfNeighborChange(x, y, z, block.blockID) if (isServer) ServerPacketSender.sendAbstractBusState(this) diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/BundledRedstoneAware.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/BundledRedstoneAware.scala index bd4293e22..23e3be5b3 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/BundledRedstoneAware.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/BundledRedstoneAware.scala @@ -3,7 +3,7 @@ package li.cil.oc.common.tileentity.traits import cpw.mods.fml.common.{Loader, Optional} import li.cil.oc.Settings import li.cil.oc.util.ExtendedNBT._ -import li.cil.oc.util.mods.ProjectRed +import li.cil.oc.util.mods.{Mods, ProjectRed} import mods.immibis.redlogic.api.wiring.{IInsulatedRedstoneWire, IBundledUpdatable, IBundledEmitter} import mrtjp.projectred.api.{ProjectRedAPI, IBundledTile} import net.minecraft.block.Block @@ -57,7 +57,7 @@ trait BundledRedstoneAware extends RedstoneAware with IBundledEmitter with IBund def bundledOutput(side: ForgeDirection, color: Int, value: Int): Unit = if (value != bundledOutput(side, color)) { _bundledOutput(toLocal(side).ordinal())(color) = value - if (Loader.isModLoaded("MineFactoryReloaded")) { + if (Mods.MineFactoryReloaded.isAvailable) { val nx = x + side.offsetX val ny = y + side.offsetY val nz = z + side.offsetZ @@ -123,7 +123,7 @@ trait BundledRedstoneAware extends RedstoneAware with IBundledEmitter with IBund // ----------------------------------------------------------------------- // protected def computeBundledInput(side: ForgeDirection): Array[Int] = { - val redLogic = if (Loader.isModLoaded("RedLogic")) { + val redLogic = if (Mods.RedLogic.isAvailable) { world.getBlockTileEntity( x + side.offsetX, y + side.offsetY, @@ -144,7 +144,7 @@ trait BundledRedstoneAware extends RedstoneAware with IBundledEmitter with IBund case _ => null } } else null - val projectRed = if (ProjectRed.isAvailable && ProjectRed.isAPIAvailable) { + val projectRed = if (Mods.ProjectRed.isAvailable && ProjectRed.isAPIAvailable) { Option(ProjectRedAPI.transmissionAPI.getBundledInput(world, x, y, z, side.ordinal)).fold(null: Array[Int])(_.map(_ & 0xFF)) } else null (redLogic, projectRed) match { @@ -156,7 +156,7 @@ trait BundledRedstoneAware extends RedstoneAware with IBundledEmitter with IBund } override protected def onRedstoneOutputEnabledChanged() { - if (Loader.isModLoaded("MineFactoryReloaded")) { + if (Mods.MineFactoryReloaded.isAvailable) { for (side <- ForgeDirection.VALID_DIRECTIONS) { val nx = x + side.offsetX val ny = y + side.offsetY diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/RedstoneAware.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/RedstoneAware.scala index a19cfe8f0..03e34df01 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/RedstoneAware.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/RedstoneAware.scala @@ -1,9 +1,10 @@ package li.cil.oc.common.tileentity.traits -import cpw.mods.fml.common.{Loader, Optional} +import cpw.mods.fml.common.Optional import cpw.mods.fml.relauncher.{Side, SideOnly} import li.cil.oc.server.{PacketSender => ServerPacketSender} import li.cil.oc.Settings +import li.cil.oc.util.mods.Mods import mods.immibis.redlogic.api.wiring.{IWire, IRedstoneUpdatable, IRedstoneEmitter, IConnectable} import net.minecraft.block.Block import net.minecraft.nbt.NBTTagCompound @@ -121,7 +122,7 @@ trait RedstoneAware extends RotationAware with IConnectable with IRedstoneEmitte // See BlockRedstoneLogic.getInputStrength() for reference. val vanilla = math.max(world.getIndirectPowerLevelTo(sx, sy, sz, side.ordinal()), if (world.getBlockId(sx, sy, sz) == Block.redstoneWire.blockID) world.getBlockMetadata(sx, sy, sz) else 0) - val redLogic = if (Loader.isModLoaded("RedLogic")) { + val redLogic = if (Mods.RedLogic.isAvailable) { world.getBlockTileEntity(sx, sy, sz) match { case emitter: IRedstoneEmitter => var strength = 0 diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/power/IndustrialCraft2.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/power/IndustrialCraft2.scala index bdc6a9b58..7d2e8757f 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/power/IndustrialCraft2.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/power/IndustrialCraft2.scala @@ -1,16 +1,17 @@ package li.cil.oc.common.tileentity.traits.power -import cpw.mods.fml.common.{Loader, Optional} +import cpw.mods.fml.common.Optional import ic2.api.energy.tile.IEnergySink import li.cil.oc.server.TickHandler import li.cil.oc.Settings +import li.cil.oc.util.mods.Mods import net.minecraftforge.common.ForgeDirection @Optional.Interface(iface = "ic2.api.energy.tile.IEnergySink", modid = "IC2") trait IndustrialCraft2 extends Common with IEnergySink { var addedToPowerGrid = false - private lazy val useIndustrialCraft2Power = isServer && !Settings.get.ignorePower && Loader.isModLoaded("IC2") + private lazy val useIndustrialCraft2Power = isServer && !Settings.get.ignorePower && Mods.IndustrialCraft2.isAvailable // ----------------------------------------------------------------------- // diff --git a/src/main/scala/li/cil/oc/server/component/robot/Player.scala b/src/main/scala/li/cil/oc/server/component/robot/Player.scala index a06aaab15..b9d49ef0f 100644 --- a/src/main/scala/li/cil/oc/server/component/robot/Player.scala +++ b/src/main/scala/li/cil/oc/server/component/robot/Player.scala @@ -1,9 +1,8 @@ package li.cil.oc.server.component.robot -import cpw.mods.fml.common.Loader import li.cil.oc.common.tileentity import li.cil.oc.Settings -import li.cil.oc.util.mods.{UniversalElectricity, TinkersConstruct, PortalGun} +import li.cil.oc.util.mods.{Mods, UniversalElectricity, TinkersConstruct, PortalGun} import net.minecraft.block.{BlockPistonBase, BlockFluid, Block} import net.minecraft.entity.item.EntityItem import net.minecraft.entity.player.{EnumStatus, EntityPlayer} @@ -327,7 +326,7 @@ class Player(val robot: tileentity.Robot) extends EntityPlayer(robot.world, Sett } else 0 } - if (Loader.isModLoaded("UniversalElectricity") && UniversalElectricity.isEnergyItem(stack)) { + if (Mods.UniversalElectricity.isAvailable && UniversalElectricity.isEnergyItem(stack)) { UniversalElectricity.chargeItem(stack, repair(UniversalElectricity.getEnergyInItem(oldStack), UniversalElectricity.getEnergyInItem(stack))) } else if (stack.isItemStackDamageable) { diff --git a/src/main/scala/li/cil/oc/server/driver/item/AbstractBusCard.scala b/src/main/scala/li/cil/oc/server/driver/item/AbstractBusCard.scala index 227ca485c..a7bf25d28 100644 --- a/src/main/scala/li/cil/oc/server/driver/item/AbstractBusCard.scala +++ b/src/main/scala/li/cil/oc/server/driver/item/AbstractBusCard.scala @@ -3,7 +3,7 @@ package li.cil.oc.server.driver.item import li.cil.oc.Items import li.cil.oc.api.driver.Slot import li.cil.oc.server.component -import li.cil.oc.util.mods.StargateTech2 +import li.cil.oc.util.mods.Mods import net.minecraft.item.ItemStack import net.minecraft.tileentity.{TileEntity => MCTileEntity} import stargatetech2.api.bus.IBusDevice @@ -11,7 +11,7 @@ import stargatetech2.api.bus.IBusDevice object AbstractBusCard extends Item { override def worksWith(stack: ItemStack) = isOneOf(stack, Items.abstractBus) - override def createEnvironment(stack: ItemStack, container: MCTileEntity) = if (StargateTech2.isAvailable) container match { + override def createEnvironment(stack: ItemStack, container: MCTileEntity) = if (Mods.StargateTech2.isAvailable) container match { case device: IBusDevice => new component.AbstractBus(device) case _ => null } diff --git a/src/main/scala/li/cil/oc/server/driver/item/FileSystem.scala b/src/main/scala/li/cil/oc/server/driver/item/FileSystem.scala index 570dbce48..f350ab3c5 100644 --- a/src/main/scala/li/cil/oc/server/driver/item/FileSystem.scala +++ b/src/main/scala/li/cil/oc/server/driver/item/FileSystem.scala @@ -1,12 +1,11 @@ package li.cil.oc.server.driver.item -import cpw.mods.fml.common.Loader import dan200.computercraft.api.media.IMedia import li.cil.oc import li.cil.oc.api.driver.Slot import li.cil.oc.api.fs.Label import li.cil.oc.common.item.{FloppyDisk, HardDiskDrive} -import li.cil.oc.util.mods.ComputerCraft +import li.cil.oc.util.mods.{Mods, ComputerCraft} import li.cil.oc.{Settings, Items} import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound @@ -15,10 +14,10 @@ import net.minecraft.tileentity.TileEntity object FileSystem extends Item { override def worksWith(stack: ItemStack) = isOneOf(stack, Items.hdd1, Items.hdd2, Items.hdd3, Items.floppyDisk) || - (Loader.isModLoaded("ComputerCraft") && ComputerCraft.isDisk(stack)) + (Mods.ComputerCraft.isAvailable && ComputerCraft.isDisk(stack)) override def createEnvironment(stack: ItemStack, container: TileEntity) = - if (Loader.isModLoaded("ComputerCraft") && ComputerCraft.isDisk(stack) && container != null) { + if (Mods.ComputerCraft.isAvailable && ComputerCraft.isDisk(stack) && container != null) { val address = addressFromTag(dataTag(stack)) val mount = ComputerCraft.createDiskMount(stack, container.getWorldObj) Option(oc.api.FileSystem.asManagedEnvironment(mount, new ComputerCraftLabel(stack), container)) match { @@ -35,7 +34,7 @@ object FileSystem extends Item { } override def slot(stack: ItemStack) = - if (Loader.isModLoaded("ComputerCraft") && ComputerCraft.isDisk(stack)) Slot.Disk + if (Mods.ComputerCraft.isAvailable && ComputerCraft.isDisk(stack)) Slot.Disk else Items.multi.subItem(stack) match { case Some(hdd: HardDiskDrive) => Slot.HardDiskDrive case Some(disk: FloppyDisk) => Slot.Disk diff --git a/src/main/scala/li/cil/oc/server/network/Network.scala b/src/main/scala/li/cil/oc/server/network/Network.scala index 732523ed7..0519afef4 100644 --- a/src/main/scala/li/cil/oc/server/network/Network.scala +++ b/src/main/scala/li/cil/oc/server/network/Network.scala @@ -2,7 +2,7 @@ package li.cil.oc.server.network import codechicken.lib.vec.Cuboid6 import codechicken.multipart.{TFacePart, JNormalOcclusion, NormalOcclusionTest, TileMultipart} -import cpw.mods.fml.common.{Loader, FMLCommonHandler} +import cpw.mods.fml.common.FMLCommonHandler import cpw.mods.fml.relauncher.Side import li.cil.oc.api.network import li.cil.oc.api.network.{Node => ImmutableNode, WirelessEndpoint, SidedEnvironment, Environment, Visibility} @@ -10,6 +10,7 @@ import li.cil.oc.common.block.Cable import li.cil.oc.common.multipart.CablePart import li.cil.oc.common.tileentity import li.cil.oc.server.network.{Node => MutableNode} +import li.cil.oc.util.mods.Mods import li.cil.oc.{Settings, api} import net.minecraft.nbt._ import net.minecraft.tileentity.TileEntity @@ -374,7 +375,7 @@ object Network extends api.detail.NetworkAPI { case Some(node: MutableNode) => neighborNode match { case Some(neighbor: MutableNode) if neighbor != node && neighbor.network != null => - val canConnect = !Loader.isModLoaded("ForgeMultipart") || + val canConnect = !Mods.ForgeMultipart.isAvailable || (canConnectFromSide(tileEntity, side) && canConnectFromSide(neighborTileEntity, side.getOpposite)) val canConnectIM = canConnectFromSideIM(tileEntity, side) && canConnectFromSideIM(neighborTileEntity, side.getOpposite) if (canConnect && canConnectIM) neighbor.connect(node) @@ -399,7 +400,7 @@ object Network extends api.detail.NetworkAPI { tileEntity match { case host: SidedEnvironment => Option(host.sidedNode(side)) case host: Environment => Some(host.node) - case host if Loader.isModLoaded("ForgeMultipart") => getMultiPartNode(host) + case host if Mods.ForgeMultipart.isAvailable => getMultiPartNode(host) case _ => None } diff --git a/src/main/scala/li/cil/oc/util/mods/BundledRedstone.scala b/src/main/scala/li/cil/oc/util/mods/BundledRedstone.scala index dbf4458f1..cbccdc2b6 100644 --- a/src/main/scala/li/cil/oc/util/mods/BundledRedstone.scala +++ b/src/main/scala/li/cil/oc/util/mods/BundledRedstone.scala @@ -1,9 +1,7 @@ package li.cil.oc.util.mods -import cpw.mods.fml.common.Loader - object BundledRedstone { - def isAvailable = Loader.isModLoaded("RedLogic") || - Loader.isModLoaded("MineFactoryReloaded") || - (ProjectRed.isAvailable && ProjectRed.isAPIAvailable) + def isAvailable = Mods.RedLogic.isAvailable || + Mods.MineFactoryReloaded.isAvailable || + (Mods.ProjectRed.isAvailable && ProjectRed.isAPIAvailable) } diff --git a/src/main/scala/li/cil/oc/util/mods/ComputerCraft.scala b/src/main/scala/li/cil/oc/util/mods/ComputerCraft.scala index 2961bd77e..27bae897f 100644 --- a/src/main/scala/li/cil/oc/util/mods/ComputerCraft.scala +++ b/src/main/scala/li/cil/oc/util/mods/ComputerCraft.scala @@ -1,6 +1,5 @@ package li.cil.oc.util.mods -import cpw.mods.fml.common.Loader import dan200.computercraft.api.ComputerCraftAPI import dan200.computercraft.api.filesystem.{IMount, IWritableMount} import dan200.computercraft.api.media.IMedia @@ -20,7 +19,7 @@ object ComputerCraft { }) } - def isDisk(stack: ItemStack) = Loader.isModLoaded("ComputerCraft") && stack.getItem.isInstanceOf[IMedia] + def isDisk(stack: ItemStack) = stack.getItem.isInstanceOf[IMedia] def createDiskMount(stack: ItemStack, world: World) = if (isDisk(stack)) { stack.getItem.asInstanceOf[IMedia].createDataMount(stack, world) match { diff --git a/src/main/scala/li/cil/oc/util/mods/IndustrialCraft2.scala b/src/main/scala/li/cil/oc/util/mods/IndustrialCraft2.scala index e8e02237b..38ec3565c 100644 --- a/src/main/scala/li/cil/oc/util/mods/IndustrialCraft2.scala +++ b/src/main/scala/li/cil/oc/util/mods/IndustrialCraft2.scala @@ -1,6 +1,5 @@ package li.cil.oc.util.mods -import cpw.mods.fml.common.Loader import net.minecraft.item.ItemStack object IndustrialCraft2 { @@ -13,7 +12,7 @@ object IndustrialCraft2 { case _: Throwable => None } - def isMiningLaser(stack: ItemStack) = stack != null && Loader.isModLoaded("IC2") && (miningLaser match { + def isMiningLaser(stack: ItemStack) = stack != null && Mods.IndustrialCraft2.isAvailable && (miningLaser match { case Some(laser) => laser.itemID == stack.itemID case _ => false }) diff --git a/src/main/scala/li/cil/oc/util/mods/Mods.scala b/src/main/scala/li/cil/oc/util/mods/Mods.scala new file mode 100644 index 000000000..912d3c098 --- /dev/null +++ b/src/main/scala/li/cil/oc/util/mods/Mods.scala @@ -0,0 +1,30 @@ +package li.cil.oc.util.mods + +import cpw.mods.fml.common.versioning.VersionParser +import cpw.mods.fml.common.{ModAPIManager, Loader} + +object Mods { + val BuildCraftPower = new Mod("BuildCraftAPI|power") + val ComputerCraft = new Mod("ComputerCraft@[1.6,1.50)") + val ForgeMultipart = new Mod("ForgeMultipart") + val GregTech = new Mod("gregtech_addon") + val IndustrialCraft2 = new Mod("IC2") + val MineFactoryReloaded = new Mod("MineFactoryReloaded") + val NotEnoughItems = new Mod("NotEnoughItems") + val PortalGun = new Mod("PortalGun") + val ProjectRed = new Mod("ProjRed|Transmission") + val RedLogic = new Mod("RedLogic") + val StargateTech2 = new Mod("StargateTech2@[0.6.0,)") + val ThermalExpansion = new Mod("ThermalExpansion") + val UniversalElectricity = new Mod("UniversalElectricity@[3.1,)") + + class Mod(val id: String) { + val isAvailable = { + val version = VersionParser.parseVersionReference(id) + if (Loader.isModLoaded(version.getLabel)) + version.containsVersion(Loader.instance.getIndexedModList.get(version.getLabel).getProcessedVersion) + else ModAPIManager.INSTANCE.hasAPI(version.getLabel) + } + } + +} diff --git a/src/main/scala/li/cil/oc/util/mods/NEI.scala b/src/main/scala/li/cil/oc/util/mods/NEI.scala index 1b0894e65..0a0ade2d5 100644 --- a/src/main/scala/li/cil/oc/util/mods/NEI.scala +++ b/src/main/scala/li/cil/oc/util/mods/NEI.scala @@ -1,7 +1,5 @@ package li.cil.oc.util.mods -import cpw.mods.fml.common.Loader - object NEI { private lazy val layoutManagerClass = try { Class.forName("codechicken.nei.LayoutManager") @@ -11,7 +9,7 @@ object NEI { } def isInputFocused = - Loader.isModLoaded("NotEnoughItems") && layoutManagerClass != null && (try { + Mods.NotEnoughItems.isAvailable && layoutManagerClass != null && (try { layoutManagerClass.getDeclaredMethods.find(m => m.getName == "getInputFocused").fold(false)(m => m.invoke(null) != null) } catch { diff --git a/src/main/scala/li/cil/oc/util/mods/PortalGun.scala b/src/main/scala/li/cil/oc/util/mods/PortalGun.scala index 8875a12d2..742d1de6f 100644 --- a/src/main/scala/li/cil/oc/util/mods/PortalGun.scala +++ b/src/main/scala/li/cil/oc/util/mods/PortalGun.scala @@ -1,6 +1,5 @@ package li.cil.oc.util.mods -import cpw.mods.fml.common.Loader import net.minecraft.item.ItemStack object PortalGun { @@ -13,7 +12,7 @@ object PortalGun { def isPortalGun(stack: ItemStack) = stack != null && stack.stackSize > 0 && - Loader.isModLoaded("PortalGun") && + Mods.PortalGun.isAvailable && portalGunClass != null && portalGunClass.isAssignableFrom(stack.getItem.getClass) diff --git a/src/main/scala/li/cil/oc/util/mods/ProjectRed.scala b/src/main/scala/li/cil/oc/util/mods/ProjectRed.scala index 459b24ac6..5edffb8a3 100644 --- a/src/main/scala/li/cil/oc/util/mods/ProjectRed.scala +++ b/src/main/scala/li/cil/oc/util/mods/ProjectRed.scala @@ -1,10 +1,7 @@ package li.cil.oc.util.mods -import cpw.mods.fml.common.Loader import mrtjp.projectred.api.ProjectRedAPI object ProjectRed { - def isAvailable = Loader.isModLoaded("ProjRed|Transmission") - def isAPIAvailable = classOf[ProjectRedAPI].getFields.exists(_.getName == "transmissionAPI") } diff --git a/src/main/scala/li/cil/oc/util/mods/StargateTech2.scala b/src/main/scala/li/cil/oc/util/mods/StargateTech2.scala index 50d31185d..91ee0dca6 100644 --- a/src/main/scala/li/cil/oc/util/mods/StargateTech2.scala +++ b/src/main/scala/li/cil/oc/util/mods/StargateTech2.scala @@ -1,24 +1,10 @@ package li.cil.oc.util.mods -import cpw.mods.fml.common.Loader -import cpw.mods.fml.common.versioning.{VersionParser, DefaultArtifactVersion} import net.minecraft.world.World import net.minecraftforge.common.MinecraftForge import stargatetech2.api.bus.BusEvent.{RemoveFromNetwork, AddToNetwork} object StargateTech2 { - def isAvailable = Loader.isModLoaded("StargateTech2") && (try { - val mod = Loader.instance.getIndexedModList.get("StargateTech2") - val have = new DefaultArtifactVersion(mod.getVersion) - val want = VersionParser.parseRange("[0.6.0,)") - - want.containsVersion(have) - } catch { - case _: Throwable => false - }) -} - -object StargateTech2API { def addDevice(world: World, x: Int, y: Int, z: Int) = MinecraftForge.EVENT_BUS.post(new AddToNetwork(world, x, y, z)) def removeDevice(world: World, x: Int, y: Int, z: Int) = MinecraftForge.EVENT_BUS.post(new RemoveFromNetwork(world, x, y, z))