From 0cbd90b598972df5471ad236e6d83ab7c92ccadf Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Fri, 22 Dec 2023 23:24:09 +0100 Subject: [PATCH] directory assets manager: use java path instead of string with slashes --- .../assets/directory/DirectoryAssetsManager.kt | 17 +++++++++-------- .../minosoft/assets/file/ResourcesAssetsUtil.kt | 5 ++--- .../resources/assets/packs/ResourcePackType.kt | 5 +++-- .../loader/mod/source/DirectorySource.kt | 2 +- .../loader/mod/source/SplitDirectorySource.kt | 2 +- 5 files changed, 16 insertions(+), 15 deletions(-) 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 e4f4010d1..e2892adf2 100644 --- a/src/main/java/de/bixilon/minosoft/assets/directory/DirectoryAssetsManager.kt +++ b/src/main/java/de/bixilon/minosoft/assets/directory/DirectoryAssetsManager.kt @@ -13,7 +13,6 @@ package de.bixilon.minosoft.assets.directory -import de.bixilon.kutil.file.FileUtil.slashPath import de.bixilon.kutil.latch.AbstractLatch import de.bixilon.minosoft.assets.AssetsManager import de.bixilon.minosoft.assets.properties.manager.AssetsManagerProperties @@ -27,6 +26,7 @@ import java.io.FileInputStream import java.io.FileNotFoundException import java.io.InputStream import java.nio.file.Path +import kotlin.io.path.relativeTo /** @@ -34,11 +34,11 @@ import java.nio.file.Path */ class DirectoryAssetsManager( - private val rootPath: String, + private val rootPath: Path, private val canUnload: Boolean = true, val prefix: String = AssetsManager.DEFAULT_ASSETS_PREFIX, ) : AssetsManager { - private val basePath = File(rootPath).slashPath + "/" + prefix + private val basePath = rootPath.resolve(prefix) private var assets: MutableSet = ObjectOpenHashSet() override var loaded: Boolean = false private set @@ -48,22 +48,23 @@ class DirectoryAssetsManager( private set private val ResourceLocation.filePath: Path - get() = Path.of(basePath, namespace, path) + get() = basePath.resolve(namespace).resolve(path) - private fun scanDirectory(directory: File) { + private fun scanDirectory(root: Boolean, directory: File) { for (file in directory.listFiles() ?: return) { if (file.isDirectory) { - scanDirectory(file) + scanDirectory(false, file) continue } - val path = file.slashPath.removePrefix(basePath).removePrefix(File.separator).toAssetName(false, prefix) ?: continue + if (root) continue // root path just allows folders + val path = file.toPath().relativeTo(basePath).toString().removePrefix(File.separator).toAssetName(false, prefix) ?: continue assets += path } } override fun load(latch: AbstractLatch?) { check(!loaded) { "Already loaded!" } - scanDirectory(File(basePath)) + scanDirectory(true, basePath.toFile()) File("$rootPath/pack.png").let { if (it.exists() && it.isFile) image = FileInputStream(it).readAllBytes() } File("$rootPath/pack.mcmeta").let { if (it.exists() && it.isFile) properties = FileInputStream(it).readJson() } loaded = true 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 3f6095edd..c01f973c5 100644 --- a/src/main/java/de/bixilon/minosoft/assets/file/ResourcesAssetsUtil.kt +++ b/src/main/java/de/bixilon/minosoft/assets/file/ResourcesAssetsUtil.kt @@ -19,10 +19,9 @@ import de.bixilon.minosoft.assets.resource.ResourceAssetsManager import de.bixilon.minosoft.util.logging.Log import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogMessageType -import java.io.File import java.net.URLDecoder import java.nio.charset.StandardCharsets - +import java.nio.file.Path object ResourcesAssetsUtil { @@ -34,7 +33,7 @@ object ResourcesAssetsUtil { } return when (rootResources.protocol) { - "file" -> DirectoryAssetsManager(rootResources.path.removeSuffix(File.separator).removeSuffix(prefix), canUnload, prefix) // Read them directly from the folder + "file" -> DirectoryAssetsManager(Path.of(rootResources.path).parent, canUnload, prefix) // Read them directly from the folder "jar" -> { val path: String = rootResources.path val jarPath = path.substring(5, path.indexOf("!")) diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/resources/assets/packs/ResourcePackType.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/resources/assets/packs/ResourcePackType.kt index becf31935..be2b78305 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/resources/assets/packs/ResourcePackType.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/resources/assets/packs/ResourcePackType.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2022 Moritz Zwerger + * Copyright (C) 2020-2023 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. * @@ -16,9 +16,10 @@ package de.bixilon.minosoft.config.profile.profiles.resources.assets.packs import de.bixilon.minosoft.assets.AssetsManager import de.bixilon.minosoft.assets.directory.DirectoryAssetsManager import de.bixilon.minosoft.assets.file.ZipAssetsManager +import java.nio.file.Path enum class ResourcePackType(val creator: (ResourcePack) -> AssetsManager) { ZIP({ ZipAssetsManager(it.path) }), - DIRECTORY({ DirectoryAssetsManager(it.path) }), + DIRECTORY({ DirectoryAssetsManager(Path.of(it.path)) }), ; } diff --git a/src/main/java/de/bixilon/minosoft/modding/loader/mod/source/DirectorySource.kt b/src/main/java/de/bixilon/minosoft/modding/loader/mod/source/DirectorySource.kt index 062dc6953..acb4c4203 100644 --- a/src/main/java/de/bixilon/minosoft/modding/loader/mod/source/DirectorySource.kt +++ b/src/main/java/de/bixilon/minosoft/modding/loader/mod/source/DirectorySource.kt @@ -35,7 +35,7 @@ class DirectorySource( override fun process(mod: MinosoftMod) { val files = directory.listFiles()!! - val assets = DirectoryAssetsManager(directory.path) + val assets = DirectoryAssetsManager(directory.toPath()) assets.load() for (sub in files) { diff --git a/src/main/java/de/bixilon/minosoft/modding/loader/mod/source/SplitDirectorySource.kt b/src/main/java/de/bixilon/minosoft/modding/loader/mod/source/SplitDirectorySource.kt index 6e57e0943..a37ed2f27 100644 --- a/src/main/java/de/bixilon/minosoft/modding/loader/mod/source/SplitDirectorySource.kt +++ b/src/main/java/de/bixilon/minosoft/modding/loader/mod/source/SplitDirectorySource.kt @@ -49,7 +49,7 @@ class SplitDirectorySource( } private fun processResources(mod: MinosoftMod) { - val assets = DirectoryAssetsManager(resources.path) + val assets = DirectoryAssetsManager(resources.toPath()) assets.load(ParentLatch(0, mod.latch)) mod.assetsManager = assets