From f456ed3de363c234d04723f31637890f46f3ba83 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Fri, 3 Dec 2021 19:48:16 +0900 Subject: [PATCH] apparently I was just doing it wrong :/ --- .../gameitems/ItemWearableWorldRadar.kt | 7 +- assets/mods/dwarventech/ModuleComputers.jar | Bin 429539 -> 429637 bytes src/net/torvald/terrarum/App.java | 15 ++++- src/net/torvald/terrarum/ModMgr.kt | 45 +++++++------ .../terrarum/blockproperties/BlockCodex.kt | 2 +- .../terrarum/blockproperties/WireCodex.kt | 2 +- .../torvald/terrarum/console/CommandDict.kt | 60 ++++++++++-------- .../terrarum/itemproperties/Material.kt | 10 ++- .../modulebasegame/console/Inventory.kt | 11 ++-- 9 files changed, 91 insertions(+), 61 deletions(-) diff --git a/ModuleComputers/src/net/torvald/terrarum/modulecomputers/gameitems/ItemWearableWorldRadar.kt b/ModuleComputers/src/net/torvald/terrarum/modulecomputers/gameitems/ItemWearableWorldRadar.kt index b27eaa128..5218f2f91 100644 --- a/ModuleComputers/src/net/torvald/terrarum/modulecomputers/gameitems/ItemWearableWorldRadar.kt +++ b/ModuleComputers/src/net/torvald/terrarum/modulecomputers/gameitems/ItemWearableWorldRadar.kt @@ -5,7 +5,10 @@ import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.TextureRegion import com.badlogic.gdx.utils.Disposable -import net.torvald.terrarum.* +import net.torvald.terrarum.App +import net.torvald.terrarum.CommonResourcePool +import net.torvald.terrarum.ModMgr +import net.torvald.terrarum.Terrarum import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameitems.GameItem import net.torvald.terrarum.gameitems.ItemID @@ -45,6 +48,8 @@ class ItemWearableWorldRadar(originalID: String) : GameItem(originalID) { val ui = WearableWorldRadarUI(vm) init { + super.equipPosition = EquipPosition.HAND_GRIP + vm.getIO().blockTransferPorts[1].attachDevice(WorldRadar()) vm.peripheralTable[1] = PeripheralEntry( ExtDisp(vm, 160, 140), 32768, 1, 0 diff --git a/assets/mods/dwarventech/ModuleComputers.jar b/assets/mods/dwarventech/ModuleComputers.jar index dabfa6320e9c4d819b45fad8dae9dcb0914fc6c4..2ea9730d9dea7cf8bcbc35e1f75e064aa56e5a5f 100644 GIT binary patch delta 17437 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 delta 17515 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 F_#f(FdD#E} diff --git a/src/net/torvald/terrarum/App.java b/src/net/torvald/terrarum/App.java index d4919ed03..4593790b5 100644 --- a/src/net/torvald/terrarum/App.java +++ b/src/net/torvald/terrarum/App.java @@ -28,6 +28,7 @@ import net.torvald.terrarum.gamecontroller.IME; import net.torvald.terrarum.gamecontroller.InputStrober; import net.torvald.terrarum.gamecontroller.KeyToggler; import net.torvald.terrarum.gamecontroller.TerrarumKeyboardEvent; +import net.torvald.terrarum.gameitems.GameItem; import net.torvald.terrarum.gameworld.GameWorld; import net.torvald.terrarum.imagefont.TinyAlphNum; import net.torvald.terrarum.langpack.Lang; @@ -851,6 +852,15 @@ public class App implements ApplicationListener { * Init stuffs which needs GL context */ private void postInit() { + ModMgr.INSTANCE.invoke(); // invoke Module Manager + printdbg(this, "all modules loaded successfully"); + + + // test print + System.out.println("[App] Test printing every registered item"); + Terrarum.INSTANCE.getItemCodex().getItemCodex().values().stream().map(GameItem::getOriginalID).forEach(System.out::println); + + // create tile atlas printdbg(this, "Making terrain textures..."); tileMaker = new CreateTileAtlas(); @@ -878,14 +888,13 @@ public class App implements ApplicationListener { System.err.println("[AppLoader] failed to create audio device: Audio device occupied by Exclusive Mode Device? (e.g. ASIO4all)"); } + CommonResourcePool.INSTANCE.loadAll(); + // if there is a predefined screen, open that screen after my init process if (injectScreen != null) { setScreen(injectScreen); } else { - ModMgr.INSTANCE.invoke(); // invoke Module Manager - CommonResourcePool.INSTANCE.loadAll(); - printdbg(this, "all modules loaded successfully"); IngameRenderer.initialise(); } diff --git a/src/net/torvald/terrarum/ModMgr.kt b/src/net/torvald/terrarum/ModMgr.kt index 0186a2456..087ac228f 100644 --- a/src/net/torvald/terrarum/ModMgr.kt +++ b/src/net/torvald/terrarum/ModMgr.kt @@ -10,8 +10,6 @@ import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.itemproperties.ItemCodex import net.torvald.terrarum.itemproperties.MaterialCodex import net.torvald.terrarum.langpack.Lang -import net.torvald.terrarum.savegame.ByteArray64GrowableOutputStream -import net.torvald.terrarum.savegame.ByteArray64Reader import net.torvald.terrarum.utils.CSVFetcher import net.torvald.terrarum.utils.JsonFetcher import org.apache.commons.csv.CSVFormat @@ -20,7 +18,6 @@ import org.apache.commons.csv.CSVRecord import java.io.File import java.io.FileInputStream import java.io.FileNotFoundException -import java.io.PrintStream import java.net.MalformedURLException import java.net.URL import java.net.URLClassLoader @@ -132,12 +129,12 @@ object ModMgr { // for modules that has JAR defined if (jar.isNotBlank()) { -// val urls = arrayOf() + val urls = arrayOf() -// val cl = JarFileLoader(urls) -// cl.addFile("${File(modDir).absolutePath}/$moduleName/$jar") -// moduleClassloader[moduleName] = cl -// newClass = cl.loadClass(entryPoint) + val cl = JarFileLoader(urls) + cl.addFile("${File(modDir).absolutePath}/$moduleName/$jar") + moduleClassloader[moduleName] = cl + newClass = cl.loadClass(entryPoint) } // for modules that are not (meant to be used by the "basegame" kind of modules) else { @@ -147,11 +144,7 @@ object ModMgr { catch (e: Throwable) { printdbgerr(this, "$moduleName failed to load, skipping...") printdbgerr(this, "\t$e") - val ba = ByteArray64GrowableOutputStream() - val sw = PrintStream(ba, true) - e.printStackTrace(sw) - val bw = ByteArray64Reader(ba.toByteArray64(), Charsets.UTF_8) - printdbgerr(this, bw.readText()) + print(App.csiR); e.printStackTrace(System.out); print(App.csi0) moduleInfo.remove(moduleName) } @@ -183,6 +176,9 @@ object ModMgr { print(App.csiR); e.printStackTrace(System.out); print(App.csi0) moduleInfo.remove(moduleName) } + finally { + + } } } @@ -315,15 +311,24 @@ object ModMgr { object GameBlockLoader { + init { + Terrarum.blockCodex = BlockCodex() + Terrarum.wireCodex = WireCodex() + } + @JvmStatic operator fun invoke(module: String) { - Terrarum.blockCodex = BlockCodex(module, "blocks/blocks.csv") - Terrarum.wireCodex = WireCodex(module, "wires/") + Terrarum.blockCodex.fromModule(module, "blocks/blocks.csv") + Terrarum.wireCodex.fromModule(module, "wires/") } } object GameItemLoader { val itemPath = "items/" + init { + Terrarum.itemCodex = ItemCodex() + } + @JvmStatic operator fun invoke(module: String) { register(module, CSVFetcher.readFromModule(module, itemPath + "itemid.csv")) } @@ -339,8 +344,6 @@ object ModMgr { } private fun register(module: String, csv: List) { - Terrarum.itemCodex = ItemCodex() - csv.forEach { val className: String = it["classname"].toString() val internalID: Int = it["id"].toInt() @@ -353,14 +356,12 @@ object ModMgr { val loadedClass = Class.forName(className) val loadedClassConstructor = loadedClass.getConstructor(ItemID::class.java) val loadedClassInstance = loadedClassConstructor.newInstance(itemName) - ItemCodex[itemName] = loadedClassInstance as GameItem } else { val loadedClass = it.loadClass(className) val loadedClassConstructor = loadedClass.getConstructor(ItemID::class.java) val loadedClassInstance = loadedClassConstructor.newInstance(itemName) - ItemCodex[itemName] = loadedClassInstance as GameItem } } @@ -379,8 +380,12 @@ object ModMgr { object GameMaterialLoader { val matePath = "materials/" + init { + Terrarum.materialCodex = MaterialCodex() + } + @JvmStatic operator fun invoke(module: String) { - Terrarum.materialCodex = MaterialCodex(module, matePath + "materials.csv") + Terrarum.materialCodex.fromModule(module, matePath + "materials.csv") } } } diff --git a/src/net/torvald/terrarum/blockproperties/BlockCodex.kt b/src/net/torvald/terrarum/blockproperties/BlockCodex.kt index 1cdf2d42c..d480d1977 100644 --- a/src/net/torvald/terrarum/blockproperties/BlockCodex.kt +++ b/src/net/torvald/terrarum/blockproperties/BlockCodex.kt @@ -58,7 +58,7 @@ class BlockCodex { /** * Later entry (possible from other modules) will replace older ones */ - internal constructor(module: String, path: String) : this() { + fun fromModule(module: String, path: String) { App.printmsg(this, "Building block properties table") try { register(module, CSVFetcher.readFromModule(module, path)) diff --git a/src/net/torvald/terrarum/blockproperties/WireCodex.kt b/src/net/torvald/terrarum/blockproperties/WireCodex.kt index a73541794..7a96f7ff5 100644 --- a/src/net/torvald/terrarum/blockproperties/WireCodex.kt +++ b/src/net/torvald/terrarum/blockproperties/WireCodex.kt @@ -38,7 +38,7 @@ class WireCodex { * @param module name of the module * @param path to the "wires" directory, not path to the CSV; must end with a slash! */ - internal constructor(module: String, path: String) : this() { + fun fromModule(module: String, path: String) { App.printmsg(this, "Building wire properties table for module $module") try { register(module, path, CSVFetcher.readFromModule(module, path + "wires.csv")) diff --git a/src/net/torvald/terrarum/console/CommandDict.kt b/src/net/torvald/terrarum/console/CommandDict.kt index cdea5d3d3..5b034b8b5 100644 --- a/src/net/torvald/terrarum/console/CommandDict.kt +++ b/src/net/torvald/terrarum/console/CommandDict.kt @@ -17,46 +17,50 @@ object CommandDict { printdbg(this, ModMgr.loadOrder.reversed()) printdbg(this, ModMgr.loadOrder.reversed().map { ModMgr.moduleInfo[it]?.packageName }) - (listOf("net.torvald.terrarum") + ModMgr.loadOrder.reversed().mapNotNull { ModMgr.moduleInfo[it]?.packageName }).forEach{ packageRoot -> + (listOf("net.torvald.terrarum") + ModMgr.loadOrder.reversed().mapNotNull { ModMgr.moduleInfo[it]?.packageName }).forEach { packageRoot -> printdbg(this, packageRoot) val packageConsole = "$packageRoot.console" - val stream = ClassLoader.getSystemClassLoader().getResourceAsStream(packageConsole.replace('.','/')) - val reader = BufferedReader(InputStreamReader(stream)) + val stream = ClassLoader.getSystemClassLoader().getResourceAsStream(packageConsole.replace('.', '/')) - reader.lines() - .filter{ it.endsWith(".class") && !it.contains('$') } - .map { Class.forName("$packageConsole.${it.substring(0, it.lastIndexOf('.'))}") } - .forEach { + if (stream != null) { // not all modules have extra console commands - printdbg(this, "> Trying to instantiate ${it.canonicalName}") + val reader = BufferedReader(InputStreamReader(stream)) - try { - val instance = it.kotlin.objectInstance ?: it.kotlin.java.newInstance() + reader.lines() + .filter { it.endsWith(".class") && !it.contains('$') } + .map { Class.forName("$packageConsole.${it.substring(0, it.lastIndexOf('.'))}") } + .forEach { - val aliases = instance.javaClass.getAnnotation(ConsoleAlias::class.java)?.aliasesCSV?.split(',')?.map { it.trim() } - val noexport = instance.javaClass.getAnnotation(ConsoleNoExport::class.java) + printdbg(this, "> Trying to instantiate ${it.canonicalName}") - if (noexport == null) { + try { + val instance = it.kotlin.objectInstance ?: it.kotlin.java.newInstance() - dict[instance.javaClass.simpleName.lowercase()] = instance as ConsoleCommand - aliases?.forEach { - dict[it] = instance as ConsoleCommand + val aliases = instance.javaClass.getAnnotation(ConsoleAlias::class.java)?.aliasesCSV?.split(',')?.map { it.trim() } + val noexport = instance.javaClass.getAnnotation(ConsoleNoExport::class.java) + + if (noexport == null) { + + dict[instance.javaClass.simpleName.lowercase()] = instance as ConsoleCommand + aliases?.forEach { + dict[it] = instance as ConsoleCommand + } + + printdbg(this, "Class instantiated: ${instance.javaClass.simpleName}") + if (aliases != null) + printdbg(this, " Annotations: $aliases") } - - printdbg(this, "Class instantiated: ${instance.javaClass.simpleName}") - if (aliases != null) - printdbg(this, " Annotations: $aliases") + } + catch (e: ClassCastException) { + printdbgerr(this, "${it.canonicalName} is not a ConsoleCommand") + } + catch (e: InstantiationException) { + printdbgerr(this, "Could not instantiate ${it.canonicalName}") + e.printStackTrace(System.err) } } - catch (e: ClassCastException) { - printdbgerr(this, "${it.canonicalName} is not a ConsoleCommand") - } - catch (e: InstantiationException) { - printdbgerr(this, "Could not instantiate ${it.canonicalName}") - e.printStackTrace(System.err) - } - } + } } diff --git a/src/net/torvald/terrarum/itemproperties/Material.kt b/src/net/torvald/terrarum/itemproperties/Material.kt index d022cadf3..f38fb3ec4 100644 --- a/src/net/torvald/terrarum/itemproperties/Material.kt +++ b/src/net/torvald/terrarum/itemproperties/Material.kt @@ -1,11 +1,13 @@ package net.torvald.terrarum.itemproperties +import net.torvald.terrarum.App import net.torvald.terrarum.App.printmsg import net.torvald.terrarum.Codex import net.torvald.terrarum.blockproperties.floatVal import net.torvald.terrarum.blockproperties.intVal import net.torvald.terrarum.utils.CSVFetcher import org.apache.commons.csv.CSVRecord +import java.io.IOException /** * To be used with items AND TILES (electricity resistance, thermal conductivity) @@ -39,8 +41,12 @@ class MaterialCodex { internal constructor() - internal constructor(module: String, path: String) : this() { - register(CSVFetcher.readFromModule(module, path)) + fun fromModule(module: String, path: String) { + App.printmsg(this, "Building material properties table") + try { + register(CSVFetcher.readFromModule(module, path)) + } + catch (e: IOException) { e.printStackTrace() } } fun fromCSV(module: String, csvString: String) { diff --git a/src/net/torvald/terrarum/modulebasegame/console/Inventory.kt b/src/net/torvald/terrarum/modulebasegame/console/Inventory.kt index 3f0ca4813..3ea0fdd06 100644 --- a/src/net/torvald/terrarum/modulebasegame/console/Inventory.kt +++ b/src/net/torvald/terrarum/modulebasegame/console/Inventory.kt @@ -1,13 +1,12 @@ package net.torvald.terrarum.modulebasegame.console -import net.torvald.terrarum.Terrarum +import net.torvald.terrarum.* +import net.torvald.terrarum.Terrarum.PLAYER_REF_ID import net.torvald.terrarum.console.ConsoleCommand import net.torvald.terrarum.console.Echo import net.torvald.terrarum.console.EchoError -import net.torvald.terrarum.gameitems.ItemID -import net.torvald.terrarum.* -import net.torvald.terrarum.Terrarum.PLAYER_REF_ID import net.torvald.terrarum.gameactors.ActorID +import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.modulebasegame.gameactors.Pocketed /** @@ -21,6 +20,9 @@ internal object Inventory : ConsoleCommand { if (args.size == 1) { printUsage() } + else if (args[1] == "target") { + targetID = if (args[2].lowercase() == "player") PLAYER_REF_ID else args[2].toInt() + } else { val actor = getActor() if (actor != null) { @@ -28,7 +30,6 @@ internal object Inventory : ConsoleCommand { "list" -> listInventory(actor) "add" -> if (args.size > 3) addItem(actor, args[2], args[3].toInt()) else addItem(actor, args[2]) "remove" -> if (args.size > 3) removeItem(actor, args[2], args[3].toInt()) else removeItem(actor, args[2]) - "target" -> targetID = if (args[2].lowercase() == "player") PLAYER_REF_ID else args[2].toInt() "equip" -> equipItem(actor, args[2]) "unequip"-> unequipItem(actor, args[2]) else -> printUsage()