From b3ce6141203b67ca05e1ab7782eef230fb43818d Mon Sep 17 00:00:00 2001 From: Bixilon Date: Thu, 30 Jun 2022 18:45:43 +0200 Subject: [PATCH] crash if can not find theme --- doc/Assets.md | 2 +- .../de/bixilon/minosoft/assets/AssetsManager.kt | 3 +++ .../assets/directory/DirectoryAssetsManager.kt | 4 ++++ .../minosoft/assets/file/ZipAssetsManager.kt | 9 +++++++-- .../assets/minecraft/JarAssetsManager.kt | 7 +++++++ .../minecraft/index/IndexAssetsManager.kt | 4 ++++ .../assets/multi/PriorityAssetsManager.kt | 14 ++++++++++++++ .../minosoft/gui/eros/util/JavaFXUtil.kt | 17 ++++++++++++++--- 8 files changed, 54 insertions(+), 6 deletions(-) diff --git a/doc/Assets.md b/doc/Assets.md index a644a3c4e..f4245202d 100644 --- a/doc/Assets.md +++ b/doc/Assets.md @@ -9,7 +9,7 @@ Assets are [Game Files](https://wiki.vg/Game_files). For example: - Language Files - Block/Item models - (Icons) -- Maybe more, but not relevant at this time“``` +- Maybe more, but not relevant at this time ## Index assets diff --git a/src/main/java/de/bixilon/minosoft/assets/AssetsManager.kt b/src/main/java/de/bixilon/minosoft/assets/AssetsManager.kt index 010628d48..9527119e5 100644 --- a/src/main/java/de/bixilon/minosoft/assets/AssetsManager.kt +++ b/src/main/java/de/bixilon/minosoft/assets/AssetsManager.kt @@ -61,6 +61,9 @@ interface AssetsManager { */ fun unload() + operator fun contains(path: ResourceLocation): Boolean + + companion object { const val DEFAULT_ASSETS_PREFIX = "assets" } diff --git a/src/main/java/de/bixilon/minosoft/assets/directory/DirectoryAssetsManager.kt b/src/main/java/de/bixilon/minosoft/assets/directory/DirectoryAssetsManager.kt index 1d7e2b426..33fc2fb51 100644 --- a/src/main/java/de/bixilon/minosoft/assets/directory/DirectoryAssetsManager.kt +++ b/src/main/java/de/bixilon/minosoft/assets/directory/DirectoryAssetsManager.kt @@ -81,4 +81,8 @@ class DirectoryAssetsManager( } return FileUtil.safeReadFile(path.filePath, false) } + + override fun contains(path: ResourceLocation): Boolean { + return path in assets + } } diff --git a/src/main/java/de/bixilon/minosoft/assets/file/ZipAssetsManager.kt b/src/main/java/de/bixilon/minosoft/assets/file/ZipAssetsManager.kt index 1036f9089..be564970f 100644 --- a/src/main/java/de/bixilon/minosoft/assets/file/ZipAssetsManager.kt +++ b/src/main/java/de/bixilon/minosoft/assets/file/ZipAssetsManager.kt @@ -17,6 +17,7 @@ import de.bixilon.kutil.latch.CountUpAndDownLatch import de.bixilon.minosoft.assets.AssetsManager import de.bixilon.minosoft.assets.util.FileAssetsUtil.toAssetName import de.bixilon.minosoft.assets.util.FileUtil.readJson +import de.bixilon.minosoft.data.registries.ResourceLocation import java.io.File import java.io.FileInputStream import java.util.zip.ZipInputStream @@ -31,6 +32,9 @@ class ZipAssetsManager( val prefix: String = AssetsManager.DEFAULT_ASSETS_PREFIX, ) : FileAssetsManager(canUnload) { + constructor(file: File, canUnload: Boolean = true, prefix: String = AssetsManager.DEFAULT_ASSETS_PREFIX) : this(ZipInputStream(FileInputStream(file)), canUnload, prefix) + constructor(path: String, canUnload: Boolean = true, prefix: String = AssetsManager.DEFAULT_ASSETS_PREFIX) : this(File(path), canUnload, prefix) + override fun load(latch: CountUpAndDownLatch) { check(!loaded) { "Already loaded!" } @@ -56,6 +60,7 @@ class ZipAssetsManager( loaded = true } - constructor(file: File, canUnload: Boolean = true, prefix: String = AssetsManager.DEFAULT_ASSETS_PREFIX) : this(ZipInputStream(FileInputStream(file)), canUnload, prefix) - constructor(path: String, canUnload: Boolean = true, prefix: String = AssetsManager.DEFAULT_ASSETS_PREFIX) : this(File(path), canUnload, prefix) + override fun contains(path: ResourceLocation): Boolean { + return path in assets + } } diff --git a/src/main/java/de/bixilon/minosoft/assets/minecraft/JarAssetsManager.kt b/src/main/java/de/bixilon/minosoft/assets/minecraft/JarAssetsManager.kt index e7c2d8d76..4e50b27e3 100644 --- a/src/main/java/de/bixilon/minosoft/assets/minecraft/JarAssetsManager.kt +++ b/src/main/java/de/bixilon/minosoft/assets/minecraft/JarAssetsManager.kt @@ -139,6 +139,13 @@ class JarAssetsManager( loaded = false } + override fun contains(path: ResourceLocation): Boolean { + if (path.namespace != ProtocolDefinition.DEFAULT_NAMESPACE) { + return false + } + return path.path in jarAssets + } + companion object { private val REQUIRED_FILE_PREFIXES = arrayOf( "blockstates/", diff --git a/src/main/java/de/bixilon/minosoft/assets/minecraft/index/IndexAssetsManager.kt b/src/main/java/de/bixilon/minosoft/assets/minecraft/index/IndexAssetsManager.kt index 4142f24e8..f7c340648 100644 --- a/src/main/java/de/bixilon/minosoft/assets/minecraft/index/IndexAssetsManager.kt +++ b/src/main/java/de/bixilon/minosoft/assets/minecraft/index/IndexAssetsManager.kt @@ -150,4 +150,8 @@ class IndexAssetsManager( override fun getOrNull(path: ResourceLocation): InputStream? { return FileAssetsUtil.readVerified(assets[path]?.hash ?: return null, verify, hashType = FileAssetsUtil.HashTypes.SHA1) ?: throw AssetCorruptedError(path) } + + override fun contains(path: ResourceLocation): Boolean { + return path in assets + } } diff --git a/src/main/java/de/bixilon/minosoft/assets/multi/PriorityAssetsManager.kt b/src/main/java/de/bixilon/minosoft/assets/multi/PriorityAssetsManager.kt index 7688faba0..f8433bf41 100644 --- a/src/main/java/de/bixilon/minosoft/assets/multi/PriorityAssetsManager.kt +++ b/src/main/java/de/bixilon/minosoft/assets/multi/PriorityAssetsManager.kt @@ -85,4 +85,18 @@ class PriorityAssetsManager( } } } + + override fun contains(path: ResourceLocation): Boolean { + for ((namespace, managers) in managers) { + if (path.namespace != namespace) { + continue + } + for (manager in managers) { + if (path in manager) { + return true + } + } + } + return false + } } diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/util/JavaFXUtil.kt b/src/main/java/de/bixilon/minosoft/gui/eros/util/JavaFXUtil.kt index 29aea89ad..8948053f1 100644 --- a/src/main/java/de/bixilon/minosoft/gui/eros/util/JavaFXUtil.kt +++ b/src/main/java/de/bixilon/minosoft/gui/eros/util/JavaFXUtil.kt @@ -24,6 +24,7 @@ import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.gui.eros.controller.EmbeddedJavaFXController import de.bixilon.minosoft.gui.eros.controller.JavaFXController import de.bixilon.minosoft.gui.eros.controller.JavaFXWindowController +import de.bixilon.minosoft.util.KUtil.toResourceLocation import javafx.application.HostServices import javafx.application.Platform import javafx.css.StyleableProperty @@ -51,6 +52,8 @@ object JavaFXUtil { lateinit var BIXILON_LOGO: Group private var watchingTheme = false + val THEME_ASSETS_MANAGER = Minosoft.MINOSOFT_ASSETS_MANAGER + private fun startThemeWatcher() { if (watchingTheme) { return @@ -62,8 +65,7 @@ object JavaFXUtil { stage ?: continue stage.scene.stylesheets.clear() stage.scene.stylesheets.add(DEFAULT_STYLE) - val theme = ErosProfileManager.selected.theme.theme - stage.scene.stylesheets.add("resource:minosoft:eros/themes/$theme.css") + stage.scene.stylesheets.add(getThemeURL(it)) } } watchingTheme = true @@ -78,7 +80,7 @@ object JavaFXUtil { stage.scene.stylesheets.add(DEFAULT_STYLE) val theme = ErosProfileManager.selected.theme.theme - stage.scene.stylesheets.add("resource:minosoft:eros/themes/$theme.css") + stage.scene.stylesheets.add(getThemeURL(theme)) stages.cleanup() stages.add(stage) @@ -200,4 +202,13 @@ object JavaFXUtil { this.requestFocus() this.toFront() } + + private fun getThemeURL(name: String): String { + val path = "minosoft:eros/themes/$name.css" + if (path.toResourceLocation() !in THEME_ASSETS_MANAGER) { + throw Exception("Can not load theme: $name") + } + + return "resource:$path" + } }