diff --git a/build.gradle b/build.gradle index e90f4c7aa..99d6f1158 100644 --- a/build.gradle +++ b/build.gradle @@ -26,11 +26,14 @@ file "build.properties" withReader { version = "${config.oc.version}" group = "li.cil.oc" -archivesBaseName = "OpenComputers-MC${config.minecraft.version}" +archivesBaseName = "OpenComputers" if (System.getenv("BUILD_NUMBER") != null) version += ".${System.getenv("BUILD_NUMBER")}" +ext.simpleVersion = version +version = "MC${config.minecraft.version}-${project.version}" + apply from: 'gradle/forge.gradle' apply from: 'gradle/artifact.gradle' apply from: 'gradle/release.gradle' diff --git a/gradle/artifact.gradle b/gradle/artifact.gradle index d7f429c94..628ada98f 100644 --- a/gradle/artifact.gradle +++ b/gradle/artifact.gradle @@ -1,7 +1,8 @@ jar { classifier = 'universal' manifest { - attributes FMLCorePlugin: "li.cil.oc.common.launch.TransformerLoader", FMLCorePluginContainsFMLMod: "true" + attributes FMLCorePlugin: "li.cil.oc.common.launch.TransformerLoader" + attributes FMLCorePluginContainsFMLMod: "true" } } @@ -9,6 +10,10 @@ jar { task deobfJar(type: Jar) { from sourceSets.main.output classifier = 'deobf' + manifest { + attributes FMLCorePlugin: "li.cil.oc.common.launch.TransformerLoader" + attributes FMLCorePluginContainsFMLMod: "true" + } } task apiJar(type: Jar) { diff --git a/gradle/forge.gradle b/gradle/forge.gradle index dfc911707..155027373 100644 --- a/gradle/forge.gradle +++ b/gradle/forge.gradle @@ -20,7 +20,7 @@ minecraft { processResources { from(sourceSets.main.resources.srcDirs) { include 'mcmod/info' - expand 'version':project.version, 'mcversion':config.minecraft.version + expand 'version': project.simpleVersion, 'mcversion': config.minecraft.version } from(sourceSets.main.resources.srcDirs) { exclude 'mcmod.info' diff --git a/gradle/release.gradle b/gradle/release.gradle index 08b82d859..9c7607807 100644 --- a/gradle/release.gradle +++ b/gradle/release.gradle @@ -3,7 +3,6 @@ apply plugin: 'maven-publish' publishing { publications { mavenJava(MavenPublication) { - version "MC${minecraft.version}-${project.version}" artifact apiJar artifact deobfJar } 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 26d597b21..e97e4fbe9 100644 --- a/src/main/scala/li/cil/oc/common/asm/ClassTransformer.scala +++ b/src/main/scala/li/cil/oc/common/asm/ClassTransformer.scala @@ -134,7 +134,9 @@ class ClassTransformer extends IClassTransformer { val tileEntityName = FMLDeobfuscatingRemapper.INSTANCE.map("net.minecraft.tileentity.TileEntity").replace('.', '/') def isTileEntity(classNode: ClassNode): Boolean = { - classNode.name != "java/lang/Object" && (classNode.name == tileEntityName || isTileEntity(classNodeFor(classNode.superName))) + classNode != null && classNode.name != "java/lang/Object" && + (classNode.name == tileEntityName || classNode.superName == tileEntityName || + isTileEntity(classNodeFor(classNode.superName))) } def classNodeFor(name: String) = newClassNode(loader.getClassBytes(name.replace('/', '.'))) diff --git a/src/main/scala/li/cil/oc/server/component/machine/Machine.scala b/src/main/scala/li/cil/oc/server/component/machine/Machine.scala index ef50e89a5..8b2d58be7 100644 --- a/src/main/scala/li/cil/oc/server/component/machine/Machine.scala +++ b/src/main/scala/li/cil/oc/server/component/machine/Machine.scala @@ -1,28 +1,30 @@ package li.cil.oc.server.component.machine +import java.io import java.lang.reflect.Constructor +import java.util.concurrent.Callable import java.util.logging.Level import li.cil.oc.api.detail.MachineAPI -import li.cil.oc.api.{fs, machine, FileSystem, Network} import li.cil.oc.api.machine.{LimitReachedException, Architecture, Owner, ExecutionResult} import li.cil.oc.api.network._ +import li.cil.oc.api.{fs, machine, FileSystem, Network} import li.cil.oc.common.tileentity import li.cil.oc.server -import li.cil.oc.server.PacketSender -import li.cil.oc.server.fs.CompositeReadOnlyFileSystem import li.cil.oc.server.component.ManagedComponent +import li.cil.oc.server.fs.CompositeReadOnlyFileSystem +import li.cil.oc.server.PacketSender import li.cil.oc.util.ExtendedNBT._ import li.cil.oc.util.ThreadPoolFactory import li.cil.oc.{OpenComputers, Settings} import net.minecraft.client.Minecraft import net.minecraft.entity.player.EntityPlayer import net.minecraft.nbt._ -import net.minecraft.server.MinecraftServer import net.minecraft.server.integrated.IntegratedServer +import net.minecraft.server.MinecraftServer +import net.minecraftforge.common.DimensionManager import net.minecraftforge.common.util.Constants.NBT import scala.Array.canBuildFrom import scala.collection.mutable -import java.util.concurrent.Callable class Machine(val owner: Owner, val rom: Option[ManagedEnvironment], constructor: Constructor[_ <: Architecture]) extends ManagedComponent with machine.Machine with Runnable { val node = Network.newNode(this, Visibility.Network). @@ -806,9 +808,24 @@ object Machine extends MachineAPI { override def create(owner: Owner, architecture: Class[_ <: Architecture]) = { add(architecture) - new Machine(owner, - Option(FileSystem.asManagedEnvironment(new CompositeReadOnlyFileSystem(roms(architecture)), "rom")), + val rom = new CompositeReadOnlyFileSystem(roms(architecture)) + val instance = new Machine(owner, + Option(FileSystem.asManagedEnvironment(rom, "rom")), architecture.getConstructor(classOf[machine.Machine])) + val romPath = "rom/" + instance.architecture.name + try { + val path = new io.File(DimensionManager.getCurrentSaveRootDirectory, Settings.savePath + romPath) + if ((path.exists || path.mkdirs()) && path.isDirectory && !rom.parts.contains(romPath)) { + rom.parts += romPath -> FileSystem.fromSaveDirectory(romPath, 0, false) + } + else { + OpenComputers.log.warning(s"Failed mounting user ROM override '$romPath'. It is either not a directory or another mod registered a ROM resource with that name.") + } + } + catch { + case t: Throwable => OpenComputers.log.log(Level.WARNING, s"Failed mounting user ROM override '$romPath'.", t) + } + instance } /** Possible states of the computer, and in particular its executor. */ diff --git a/src/main/scala/li/cil/oc/server/fs/CompositeReadOnlyFileSystem.scala b/src/main/scala/li/cil/oc/server/fs/CompositeReadOnlyFileSystem.scala index ec3e11e64..8f1783f81 100644 --- a/src/main/scala/li/cil/oc/server/fs/CompositeReadOnlyFileSystem.scala +++ b/src/main/scala/li/cil/oc/server/fs/CompositeReadOnlyFileSystem.scala @@ -1,12 +1,12 @@ package li.cil.oc.server.fs +import java.io.FileNotFoundException +import java.util.concurrent.Callable import li.cil.oc.api import li.cil.oc.api.fs.Mode import li.cil.oc.util.ExtendedNBT._ import net.minecraft.nbt.NBTTagCompound import scala.collection.mutable -import java.io.FileNotFoundException -import java.util.concurrent.Callable class CompositeReadOnlyFileSystem(factories: mutable.LinkedHashMap[String, Callable[api.fs.FileSystem]]) extends api.fs.FileSystem { var parts = mutable.LinkedHashMap.empty[String, api.fs.FileSystem] @@ -35,7 +35,16 @@ class CompositeReadOnlyFileSystem(factories: mutable.LinkedHashMap[String, Calla override def lastModified(path: String) = findFileSystem(path).fold(0L)(_.lastModified(path)) - override def list(path: String) = findFileSystem(path).fold(null: Array[String])(_.list(path)) + override def list(path: String) = parts.values.foldLeft(Array.empty[String])((acc, fs) => { + if (fs.exists(path)) try { + val l = fs.list(path) + if (l != null) acc ++ l else acc + } + catch { + case _: Throwable => acc + } + else acc + }) // ----------------------------------------------------------------------- //