From 9da741c6187e60f631cd8500aab3898b84c3dbd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 9 Mar 2014 10:43:14 +0100 Subject: [PATCH 1/4] adding saves/[world]/opencomputers/rom/[arch] folder to composite fs for machines, allows easy overriding/adding of stuff in/to the rom without editing the jar; fixed list() in composite fs --- .../oc/server/component/machine/Machine.scala | 31 ++++++++++++++----- .../fs/CompositeReadOnlyFileSystem.scala | 15 +++++++-- 2 files changed, 36 insertions(+), 10 deletions(-) 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 9bda95974..6dec14ad2 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,26 +1,28 @@ 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.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 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). @@ -800,9 +802,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 + }) // ----------------------------------------------------------------------- // From dfa24ac35c9a93b4f9005c84a002c424fb592836 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 9 Mar 2014 11:25:54 +0100 Subject: [PATCH 2/4] trying to stabilize the class transformer a little --- src/main/scala/li/cil/oc/common/asm/ClassTransformer.scala | 4 +++- 1 file changed, 3 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 098253729..5efc56a4d 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('/', '.'))) From ed43b7fe31bd7ceba0659c456c223f23e0da6f51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 9 Mar 2014 11:49:48 +0100 Subject: [PATCH 3/4] cleaned up gradle scripts a little more (pulled version out of base name) --- build.gradle | 5 ++++- gradle/artifact.gradle | 3 ++- gradle/forge.gradle | 2 +- gradle/release.gradle | 1 - 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index fc2e9916f..d285c510f 100644 --- a/build.gradle +++ b/build.gradle @@ -22,11 +22,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..54e67fbeb 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" } } diff --git a/gradle/forge.gradle b/gradle/forge.gradle index 5dfc3cc5a..b51972ec1 100644 --- a/gradle/forge.gradle +++ b/gradle/forge.gradle @@ -18,7 +18,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 } From f759a06ee37487e32644c51fcbc71e79670872af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 9 Mar 2014 12:32:00 +0100 Subject: [PATCH 4/4] fixed class transformer in deobf jar --- gradle/artifact.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gradle/artifact.gradle b/gradle/artifact.gradle index 54e67fbeb..628ada98f 100644 --- a/gradle/artifact.gradle +++ b/gradle/artifact.gradle @@ -10,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) {