From d3a0ff5745e02fcb6ef8e8b850281a67ca6bf42a Mon Sep 17 00:00:00 2001 From: Bixilon Date: Tue, 19 Apr 2022 17:18:37 +0200 Subject: [PATCH] assets: allow different assets prefix, overwrite assets manager --- src/main/java/de/bixilon/minosoft/Minosoft.kt | 2 ++ .../java/de/bixilon/minosoft/assets/AssetsLoader.kt | 3 ++- .../java/de/bixilon/minosoft/assets/AssetsManager.kt | 6 +++++- .../assets/directory/DirectoryAssetsManager.kt | 5 +++-- .../minosoft/assets/file/ResourcesAssetsUtil.kt | 6 +++--- .../bixilon/minosoft/assets/file/ZipAssetsManager.kt | 10 ++++++---- .../de/bixilon/minosoft/assets/util/FileAssetsUtil.kt | 9 +++++---- .../entities/renderer/sign/SignBlockEntityRenderer.kt | 3 ++- 8 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/Minosoft.kt b/src/main/java/de/bixilon/minosoft/Minosoft.kt index 51c93cafd..2d34bd66a 100644 --- a/src/main/java/de/bixilon/minosoft/Minosoft.kt +++ b/src/main/java/de/bixilon/minosoft/Minosoft.kt @@ -58,6 +58,7 @@ import de.bixilon.minosoft.util.task.worker.StartupTasks object Minosoft { val MAIN_THREAD: Thread = Thread.currentThread() val MINOSOFT_ASSETS_MANAGER = ResourcesAssetsUtil.create(Minosoft::class.java, canUnload = false) + val OVERWRITE_ASSETS_MANAGER = ResourcesAssetsUtil.create(Minosoft::class.java, canUnload = false, prefix = "assets_overwrite") val LANGUAGE_MANAGER = MultiLanguageManager() val START_UP_LATCH = CountUpAndDownLatch(1) @@ -66,6 +67,7 @@ object Minosoft { CommandLineArguments.parse(args) KUtil.initUtilClasses() MINOSOFT_ASSETS_MANAGER.load(CountUpAndDownLatch(0)) + OVERWRITE_ASSETS_MANAGER.load(CountUpAndDownLatch(0)) // ToDo: async Log.log(LogMessageType.OTHER, LogLevels.INFO) { "Starting minosoft..." } if (OSUtil.OS == OSUtil.OSs.MAC && !RunConfiguration.X_START_ON_FIRST_THREAD_SET && !RunConfiguration.DISABLE_RENDERING) { diff --git a/src/main/java/de/bixilon/minosoft/assets/AssetsLoader.kt b/src/main/java/de/bixilon/minosoft/assets/AssetsLoader.kt index 9bdd5e217..8f4d70ec1 100644 --- a/src/main/java/de/bixilon/minosoft/assets/AssetsLoader.kt +++ b/src/main/java/de/bixilon/minosoft/assets/AssetsLoader.kt @@ -28,7 +28,8 @@ object AssetsLoader { fun create(profile: ResourcesProfile, version: Version, latch: CountUpAndDownLatch, property: AssetsVersionProperty = AssetsVersionProperties[version] ?: throw IllegalAccessException("$version has no assets!")): AssetsManager { val assetsManager = PriorityAssetsManager() - for (resourcePack in profile.assets.resourcePacks) { + assetsManager += Minosoft.OVERWRITE_ASSETS_MANAGER + for (resourcePack in profile.assets.resourcePacks.reversed()) { resourcePack.type.creator(resourcePack).let { it.load(latch) assetsManager += it diff --git a/src/main/java/de/bixilon/minosoft/assets/AssetsManager.kt b/src/main/java/de/bixilon/minosoft/assets/AssetsManager.kt index 311b970a1..41f239df7 100644 --- a/src/main/java/de/bixilon/minosoft/assets/AssetsManager.kt +++ b/src/main/java/de/bixilon/minosoft/assets/AssetsManager.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * Copyright (C) 2020-2022 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -60,4 +60,8 @@ interface AssetsManager { * Deletes all assets from memory */ fun unload() + + 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 1b84b7a5d..d4bcf04a9 100644 --- a/src/main/java/de/bixilon/minosoft/assets/directory/DirectoryAssetsManager.kt +++ b/src/main/java/de/bixilon/minosoft/assets/directory/DirectoryAssetsManager.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * Copyright (C) 2020-2022 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -31,6 +31,7 @@ import java.io.InputStream class DirectoryAssetsManager( basePath: String, private val canUnload: Boolean = true, + val prefix: String = AssetsManager.DEFAULT_ASSETS_PREFIX, ) : AssetsManager { private val basePath = File(basePath).slashPath override val namespaces: MutableSet = mutableSetOf() @@ -47,7 +48,7 @@ class DirectoryAssetsManager( scanDirectory(file) continue } - val path = file.slashPath.removePrefix(basePath).removePrefix("/").toAssetName(false) ?: continue + val path = file.slashPath.removePrefix(basePath).removePrefix("/").toAssetName(false, prefix) ?: continue assets += path namespaces += path.namespace } diff --git a/src/main/java/de/bixilon/minosoft/assets/file/ResourcesAssetsUtil.kt b/src/main/java/de/bixilon/minosoft/assets/file/ResourcesAssetsUtil.kt index 226fe28ff..4507dc510 100644 --- a/src/main/java/de/bixilon/minosoft/assets/file/ResourcesAssetsUtil.kt +++ b/src/main/java/de/bixilon/minosoft/assets/file/ResourcesAssetsUtil.kt @@ -22,16 +22,16 @@ import java.nio.charset.StandardCharsets object ResourcesAssetsUtil { - fun create(clazz: Class<*>, canUnload: Boolean = true): AssetsManager { + fun create(clazz: Class<*>, canUnload: Boolean = true, prefix: String = AssetsManager.DEFAULT_ASSETS_PREFIX): AssetsManager { val rootResources = clazz.classLoader.getResource("assets") ?: throw FileNotFoundException("Can not find assets folder in $clazz") return when (rootResources.protocol) { - "file" -> DirectoryAssetsManager(rootResources.path, canUnload) // Read them directly from the folder + "file" -> DirectoryAssetsManager(rootResources.path, canUnload, prefix) // Read them directly from the folder "jar" -> { val path: String = rootResources.path val jarPath = path.substring(5, path.indexOf("!")) val zip = URLDecoder.decode(jarPath, StandardCharsets.UTF_8) - ZipAssetsManager(zip, canUnload = canUnload) + ZipAssetsManager(zip, canUnload = canUnload, prefix = prefix) } else -> throw IllegalStateException("Can not read resources: $rootResources") } 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 504addce1..1036f9089 100644 --- a/src/main/java/de/bixilon/minosoft/assets/file/ZipAssetsManager.kt +++ b/src/main/java/de/bixilon/minosoft/assets/file/ZipAssetsManager.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * Copyright (C) 2020-2022 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -14,6 +14,7 @@ package de.bixilon.minosoft.assets.file 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 java.io.File @@ -27,6 +28,7 @@ import java.util.zip.ZipInputStream class ZipAssetsManager( private val inputStream: ZipInputStream, canUnload: Boolean = true, + val prefix: String = AssetsManager.DEFAULT_ASSETS_PREFIX, ) : FileAssetsManager(canUnload) { override fun load(latch: CountUpAndDownLatch) { @@ -42,7 +44,7 @@ class ZipAssetsManager( "pack.png" -> image = inputStream.readAllBytes() "pack.mcmeta" -> properties = inputStream.readJson(false) else -> { - val resourceLocation = name.toAssetName() ?: continue + val resourceLocation = name.toAssetName(prefix = prefix) ?: continue namespaces += resourceLocation.namespace assets[resourceLocation] = inputStream.readAllBytes() } @@ -54,6 +56,6 @@ class ZipAssetsManager( loaded = true } - constructor(file: File, canUnload: Boolean = true) : this(ZipInputStream(FileInputStream(file)), canUnload) - constructor(path: String, canUnload: Boolean = true) : this(File(path), 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) } diff --git a/src/main/java/de/bixilon/minosoft/assets/util/FileAssetsUtil.kt b/src/main/java/de/bixilon/minosoft/assets/util/FileAssetsUtil.kt index 7b9f541c4..6b793c95d 100644 --- a/src/main/java/de/bixilon/minosoft/assets/util/FileAssetsUtil.kt +++ b/src/main/java/de/bixilon/minosoft/assets/util/FileAssetsUtil.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * Copyright (C) 2020-2022 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -18,6 +18,7 @@ import com.github.luben.zstd.ZstdOutputStream import de.bixilon.kutil.array.ByteArrayUtil.toHex import de.bixilon.kutil.hex.HexUtil.isHexString import de.bixilon.kutil.random.RandomStringUtil.randomString +import de.bixilon.minosoft.assets.AssetsManager import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.terminal.RunConfiguration @@ -115,11 +116,11 @@ object FileAssetsUtil { return saveAndGet(ByteArrayInputStream(data), compress, false, hashType) } - fun String.toAssetName(verifyPrefix: Boolean = true): ResourceLocation? { - if (verifyPrefix && !startsWith("assets/")) { + fun String.toAssetName(verifyPrefix: Boolean = true, prefix: String = AssetsManager.DEFAULT_ASSETS_PREFIX): ResourceLocation? { + if (verifyPrefix && !startsWith("$prefix/")) { return null } - val split = removePrefix("assets/").split("/", limit = 2) + val split = removePrefix("$prefix/").split("/", limit = 2) if (split.size != 2) { return null } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/renderer/sign/SignBlockEntityRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/renderer/sign/SignBlockEntityRenderer.kt index 4711e38ef..b5edfbfd8 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/renderer/sign/SignBlockEntityRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/renderer/sign/SignBlockEntityRenderer.kt @@ -28,9 +28,10 @@ class SignBlockEntityRenderer( ) : MeshedBlockEntityRenderer { override fun singleRender(position: Vec3i, mesh: WorldMesh, random: Random, blockState: BlockState, neighbours: Array, light: ByteArray, ambientLight: FloatArray, tints: IntArray?): Boolean { - val model = this.blockState.block.nullCast() ?: return false + val model = this.blockState.block.nullCast()?.model ?: return false println("Rendering sign at $position") + // ToDo return true