move integrated assets managers to own holder

This commit is contained in:
Moritz Zwerger 2023-11-23 16:04:02 +01:00
parent bd6a072dcb
commit a2cb6b6258
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
18 changed files with 67 additions and 42 deletions

View File

@ -15,6 +15,7 @@ package de.bixilon.minosoft
import de.bixilon.kutil.latch.SimpleLatch
import de.bixilon.kutil.reflection.ReflectionUtil.forceSet
import de.bixilon.minosoft.assets.IntegratedAssets
import de.bixilon.minosoft.assets.meta.MinosoftMeta
import de.bixilon.minosoft.assets.properties.version.AssetsVersionProperties
import de.bixilon.minosoft.data.registries.fallback.FallbackRegistries
@ -78,7 +79,8 @@ internal object MinosoftSIT {
}
fun initAssetsManager() {
Minosoft.MINOSOFT_ASSETS_MANAGER.load()
IntegratedAssets.DEFAULT.load()
IntegratedAssets.OVERRIDE.load()
}
fun loadVersionsJson() {

View File

@ -30,7 +30,7 @@ import de.bixilon.kutil.shutdown.AbstractShutdownReason
import de.bixilon.kutil.shutdown.ShutdownManager
import de.bixilon.kutil.time.TimeUtil.nanos
import de.bixilon.kutil.unit.UnitFormatter.formatNanos
import de.bixilon.minosoft.assets.file.ResourcesAssetsUtil
import de.bixilon.minosoft.assets.IntegratedAssets
import de.bixilon.minosoft.assets.meta.MinosoftMeta
import de.bixilon.minosoft.assets.properties.version.AssetsVersionProperties
import de.bixilon.minosoft.config.StaticConfiguration
@ -73,21 +73,22 @@ import de.bixilon.minosoft.util.yggdrasil.YggdrasilUtil
object Minosoft {
val MINOSOFT_ASSETS_MANAGER = ResourcesAssetsUtil.create(Minosoft::class.java, canUnload = false)
val OVERRIDE_ASSETS_MANAGER = ResourcesAssetsUtil.create(Minosoft::class.java, canUnload = false, prefix = "assets_override")
val LANGUAGE_MANAGER = MultiLanguageManager()
val BOOT_LATCH = CallbackLatch(1)
private fun preBoot(args: Array<String>) {
val assets = SimpleLatch(1)
DefaultThreadPool += ForcePooledRunnable { IntegratedAssets.DEFAULT.load(); assets.dec() }
DefaultThreadPool += ForcePooledRunnable { Jackson.init(); MinosoftPropertiesLoader.init() }
DefaultThreadPool += ForcePooledRunnable { KUtil.initBootClasses() }
CommandLineArguments.parse(args)
Log.log(LogMessageType.OTHER, LogLevels.INFO) { "Starting minosoft..." }
val latch = SimpleLatch(2)
DefaultThreadPool += ForcePooledRunnable { MINOSOFT_ASSETS_MANAGER.load(); MinosoftPropertiesLoader.load(); latch.dec() }
DefaultThreadPool += ForcePooledRunnable { ModLoader.initModLoading(); latch.dec() }
assets.await()
DefaultThreadPool += ForcePooledRunnable { MinosoftPropertiesLoader.load(); latch.dec() }
KUtil.init()
@ -122,7 +123,7 @@ object Minosoft {
}
taskWorker += WorkerTask(identifier = BootTasks.YGGDRASIL, executor = { YggdrasilUtil.load() })
taskWorker += WorkerTask(identifier = BootTasks.ASSETS_OVERRIDE, executor = { OVERRIDE_ASSETS_MANAGER.load(it) })
taskWorker += WorkerTask(identifier = BootTasks.ASSETS_OVERRIDE, executor = { IntegratedAssets.OVERRIDE.load(it) })
taskWorker += WorkerTask(identifier = BootTasks.MODS, executor = { ModLoader.load(LoadingPhases.BOOT, it) })
taskWorker += WorkerTask(identifier = BootTasks.DATA_FIXER, executor = { DataFixer.load() })
taskWorker += WorkerTask(identifier = BootTasks.CLI, priority = ThreadPool.LOW, executor = CLI::startThread)
@ -187,7 +188,7 @@ object Minosoft {
val language = ErosProfileManager.selected.general.language
ErosProfileManager.selected.general::language.observe(this, true) {
Log.log(LogMessageType.OTHER, LogLevels.VERBOSE) { "Loading language files (${language})" }
LANGUAGE_MANAGER.translators[Namespaces.MINOSOFT] = LanguageUtil.load(it, null, MINOSOFT_ASSETS_MANAGER, minosoft("language/"))
LANGUAGE_MANAGER.translators[Namespaces.MINOSOFT] = LanguageUtil.load(it, null, IntegratedAssets.DEFAULT, minosoft("language/"))
Log.log(LogMessageType.OTHER, LogLevels.VERBOSE) { "Language files loaded!" }
}
}

View File

@ -14,7 +14,6 @@
package de.bixilon.minosoft.assets
import de.bixilon.kutil.latch.AbstractLatch
import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.assets.connection.ConnectionAssetsManager
import de.bixilon.minosoft.assets.minecraft.JarAssetsManager
import de.bixilon.minosoft.assets.minecraft.MinecraftPackFormat.packFormat
@ -50,7 +49,7 @@ object AssetsLoader {
val assetsManager = ConnectionAssetsManager(properties)
assetsManager += Minosoft.OVERRIDE_ASSETS_MANAGER
assetsManager += IntegratedAssets.OVERRIDE
assetsManager.addPacks(profile, latch)
@ -60,7 +59,7 @@ object AssetsLoader {
if (!profile.assets.disableJarAssets) {
assetsManager += JarAssetsManager(property.jarAssetsHash, property.clientJarHash, profile, version, property.jarAssetsTarBytes ?: JarAssetsManager.DEFAULT_TAR_BYTES)
}
assetsManager += Minosoft.MINOSOFT_ASSETS_MANAGER
assetsManager += IntegratedAssets.DEFAULT
return assetsManager
}

View File

@ -0,0 +1,21 @@
/*
* Minosoft
* 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.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.assets
import de.bixilon.minosoft.assets.file.ResourcesAssetsUtil
object IntegratedAssets {
val DEFAULT = ResourcesAssetsUtil.create(IntegratedAssets::class.java, canUnload = false)
val OVERRIDE = ResourcesAssetsUtil.create(IntegratedAssets::class.java, canUnload = false, prefix = "assets_override")
}

View File

@ -19,7 +19,7 @@ import de.bixilon.kutil.json.JsonObject
import de.bixilon.kutil.string.StringUtil.formatPlaceholder
import de.bixilon.kutil.url.URLUtil.toURL
import de.bixilon.mbf.MBFBinaryReader
import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.assets.IntegratedAssets
import de.bixilon.minosoft.assets.util.FileAssetsTypes
import de.bixilon.minosoft.assets.util.FileAssetsUtil
import de.bixilon.minosoft.assets.util.HashTypes
@ -37,7 +37,7 @@ object MinosoftMeta {
fun load() {
this.root = Minosoft.MINOSOFT_ASSETS_MANAGER[INDEX].readJson<MetaRoot>()
this.root = IntegratedAssets.DEFAULT[INDEX].readJson<MetaRoot>()
}
private fun ByteArray.load(): JsonObject {

View File

@ -14,7 +14,7 @@
package de.bixilon.minosoft.assets.properties.version
import de.bixilon.kutil.latch.AbstractLatch
import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.assets.IntegratedAssets
import de.bixilon.minosoft.assets.util.InputStreamUtil.readJson
import de.bixilon.minosoft.protocol.versions.Version
import de.bixilon.minosoft.protocol.versions.Versions
@ -32,7 +32,7 @@ object AssetsVersionProperties {
throw IllegalStateException("Already loaded!")
}
Log.log(LogMessageType.OTHER, LogLevels.VERBOSE) { "Loading assets properties..." }
val assetsProperties: Map<String, AssetsVersionProperty> = Minosoft.MINOSOFT_ASSETS_MANAGER[ASSETS_PROPERTIES_FILE].readJson()
val assetsProperties: Map<String, AssetsVersionProperty> = IntegratedAssets.DEFAULT[ASSETS_PROPERTIES_FILE].readJson()
for ((versionName, property) in assetsProperties) {
PROPERTIES[Versions[versionName] ?: continue] = property
}

View File

@ -16,7 +16,7 @@ package de.bixilon.minosoft.data.entities.event
import de.bixilon.kutil.cast.CollectionCast.asAnyMap
import de.bixilon.kutil.json.JsonUtil.asJsonObject
import de.bixilon.kutil.primitive.IntUtil.toInt
import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.assets.IntegratedAssets
import de.bixilon.minosoft.assets.util.InputStreamUtil.readJson
import de.bixilon.minosoft.data.entities.entities.Entity
import de.bixilon.minosoft.data.entities.event.events.damage.*
@ -58,7 +58,7 @@ object EntityEvents : DefaultFactory<EntityEvent<*>>(
}
fun load() {
val json: Map<ResourceLocation, Any> = Minosoft.MINOSOFT_ASSETS_MANAGER[FILE].readJson()
val json: Map<ResourceLocation, Any> = IntegratedAssets.DEFAULT[FILE].readJson()
for ((name, data) in json) {
val clazz = DefaultEntityFactories.ABSTRACT_ENTITY_DATA_CLASSES[name]?.java ?: DefaultEntityFactories[name]?.javaClass // TODO: This is the companion class
if (clazz == null) {

View File

@ -14,7 +14,7 @@
package de.bixilon.minosoft.data.registries.fallback
import de.bixilon.kutil.json.JsonUtil.asJsonObject
import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.assets.IntegratedAssets
import de.bixilon.minosoft.assets.util.InputStreamUtil.readJson
import de.bixilon.minosoft.data.container.equipment.EquipmentSlots
import de.bixilon.minosoft.data.entities.EntityAnimations
@ -76,7 +76,7 @@ object FallbackRegistries {
check(!initialized) { "Already initialized!" }
Log.log(LogMessageType.OTHER, LogLevels.VERBOSE) { "Loading default registries..." }
val enumJson: Map<ResourceLocation, Any> = Minosoft.MINOSOFT_ASSETS_MANAGER[ENUM_RESOURCE_LOCATION].readJson()
val enumJson: Map<ResourceLocation, Any> = IntegratedAssets.DEFAULT[ENUM_RESOURCE_LOCATION].readJson()
EQUIPMENT_SLOTS_REGISTRY.initialize(enumJson[ResourceLocation.of("equipment_slots")].asJsonObject())
HAND_EQUIPMENT_SLOTS_REGISTRY.initialize(enumJson[ResourceLocation.of("hand_equipment_slots")].asJsonObject())
@ -91,7 +91,7 @@ object FallbackRegistries {
ENTITY_ACTIONS_REGISTRY.initialize(enumJson[ResourceLocation.of("entity_actions")].asJsonObject())
val registriesJson: Map<ResourceLocation, Any> = Minosoft.MINOSOFT_ASSETS_MANAGER[REGISTRIES_RESOURCE_LOCATION].readJson()
val registriesJson: Map<ResourceLocation, Any> = IntegratedAssets.DEFAULT[REGISTRIES_RESOURCE_LOCATION].readJson()
DEFAULT_PLUGIN_CHANNELS_REGISTRY.initialize(registriesJson[ResourceLocation.of("default_channels")].asJsonObject(), PluginChannel)

View File

@ -15,7 +15,7 @@ package de.bixilon.minosoft.data.registries.fallback.tags
import de.bixilon.kutil.cast.CastUtil.unsafeCast
import de.bixilon.kutil.cast.CollectionCast.asAnyCollection
import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.assets.IntegratedAssets
import de.bixilon.minosoft.assets.util.InputStreamUtil.readJsonObject
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
import de.bixilon.minosoft.data.registries.item.items.tool.ToolLevels
@ -40,7 +40,7 @@ object FallbackTags {
private val tags: MutableMap<ResourceLocation, MutableMap<ResourceLocation, Set<ResourceLocation>>> = mutableMapOf()
private fun read(type: ResourceLocation, name: ResourceLocation): Set<ResourceLocation> {
val content = Minosoft.MINOSOFT_ASSETS_MANAGER[ResourceLocation(name.namespace, "tags/${type.path}/${name.path}.json")].readJsonObject()["values"].asAnyCollection()
val content = IntegratedAssets.DEFAULT[ResourceLocation(name.namespace, "tags/${type.path}/${name.path}.json")].readJsonObject()["values"].asAnyCollection()
val set: MutableSet<ResourceLocation> = ObjectOpenHashSet()
for (entry in content) {

View File

@ -15,7 +15,7 @@ package de.bixilon.minosoft.datafixer.rls
import de.bixilon.kutil.cast.CastUtil.unsafeNull
import de.bixilon.kutil.reflection.ReflectionUtil.forceSet
import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.assets.IntegratedAssets
import de.bixilon.minosoft.assets.util.InputStreamUtil.readJson
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
import de.bixilon.minosoft.datafixer.Fixer
@ -25,7 +25,7 @@ abstract class ResourceLocationFixer(private val path: ResourceLocation) : Fixer
override fun load() {
this::renames.forceSet(Minosoft.MINOSOFT_ASSETS_MANAGER[this.path.fixer()].readJson())
this::renames.forceSet(IntegratedAssets.DEFAULT[this.path.fixer()].readJson())
}
open fun fix(resourceLocation: ResourceLocation): ResourceLocation {

View File

@ -13,7 +13,7 @@
package de.bixilon.minosoft.gui.eros.card
import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.assets.IntegratedAssets
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
import de.bixilon.minosoft.gui.eros.util.JavaFXUtil
import javafx.scene.control.ListCell
@ -24,7 +24,7 @@ interface CardFactory<T : ListCell<*>> {
fun build(): T {
val loader = JavaFXUtil.createLoader()
loader.load<Any>(Minosoft.MINOSOFT_ASSETS_MANAGER[LAYOUT])
loader.load<Any>(IntegratedAssets.DEFAULT[LAYOUT])
return loader.getController()
}

View File

@ -19,7 +19,7 @@ import de.bixilon.kutil.concurrent.worker.unconditional.UnconditionalWorker
import de.bixilon.kutil.exception.ExceptionUtil.catchAll
import de.bixilon.kutil.latch.SimpleLatch
import de.bixilon.kutil.shutdown.ShutdownManager
import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.assets.IntegratedAssets
import de.bixilon.minosoft.gui.eros.crash.ErosCrashReport.Companion.crash
import de.bixilon.minosoft.util.DesktopUtil
import de.bixilon.minosoft.util.logging.Log
@ -41,7 +41,7 @@ class JavaFXInitializer internal constructor() : Application() {
DesktopUtil.initialize()
val worker = UnconditionalWorker(autoWork = true)
worker += { JavaFXUtil.MINOSOFT_LOGO = Image(Minosoft.MINOSOFT_ASSETS_MANAGER[DesktopUtil.ICON]) }
worker += { JavaFXUtil.MINOSOFT_LOGO = Image(IntegratedAssets.DEFAULT[DesktopUtil.ICON]) }
worker.work(LATCH)
Log.log(LogMessageType.JAVAFX, LogLevels.VERBOSE) { "Initialized JavaFX Toolkit!" }

View File

@ -21,7 +21,9 @@ import de.bixilon.kutil.reflection.ReflectionUtil.forceSet
import de.bixilon.kutil.reflection.ReflectionUtil.jvmField
import de.bixilon.kutil.url.URLUtil.toURL
import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.assets.IntegratedAssets
import de.bixilon.minosoft.config.profile.profiles.eros.ErosProfileManager
import de.bixilon.minosoft.data.registries.identified.Namespaces.minosoft
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
import de.bixilon.minosoft.gui.eros.controller.EmbeddedJavaFXController
import de.bixilon.minosoft.gui.eros.controller.JavaFXController
@ -59,10 +61,10 @@ object JavaFXUtil {
lateinit var JAVA_FX_THREAD: Thread
lateinit var MINOSOFT_LOGO: Image
lateinit var HOST_SERVICES: HostServices
val BIXILON_LOGO: Group? by lazy { catchAll { SvgLoader().loadSvg(Minosoft.MINOSOFT_ASSETS_MANAGER["minosoft:textures/icons/bixilon_logo.svg".toResourceLocation()]) } }
val BIXILON_LOGO: Group? by lazy { catchAll { SvgLoader().loadSvg(IntegratedAssets.DEFAULT[minosoft("textures/icons/bixilon_logo.svg")]) } }
private var watchingTheme = false
val THEME_ASSETS_MANAGER = Minosoft.MINOSOFT_ASSETS_MANAGER
val THEME_ASSETS_MANAGER = IntegratedAssets.DEFAULT
private fun startThemeWatcher() {
if (watchingTheme) {
@ -109,7 +111,7 @@ object JavaFXUtil {
startThemeWatcher()
val fxmlLoader = createLoader()
controller?.let { fxmlLoader.setController(it) }
val parent: Parent = fxmlLoader.load(Minosoft.MINOSOFT_ASSETS_MANAGER[layout])
val parent: Parent = fxmlLoader.load(IntegratedAssets.DEFAULT[layout])
parent.registerFreezeDumpKey()
return loadController(title, fxmlLoader, parent, modality)
}
@ -119,7 +121,7 @@ object JavaFXUtil {
startThemeWatcher()
val fxmlLoader = createLoader()
controller?.let { fxmlLoader.setController(it) }
val parent: Parent = fxmlLoader.load(Minosoft.MINOSOFT_ASSETS_MANAGER[layout])
val parent: Parent = fxmlLoader.load(IntegratedAssets.DEFAULT[layout])
parent.registerFreezeDumpKey()
if (callback == null) {
@ -133,7 +135,7 @@ object JavaFXUtil {
fun <T : EmbeddedJavaFXController<out Pane>> loadEmbeddedController(layout: ResourceLocation, controller: T? = null): T {
val fxmlLoader = createLoader()
controller?.let { fxmlLoader.setController(it) }
val pane = fxmlLoader.load<Pane>(Minosoft.MINOSOFT_ASSETS_MANAGER[layout])
val pane = fxmlLoader.load<Pane>(IntegratedAssets.DEFAULT[layout])
val controller = fxmlLoader.getController<T>()

View File

@ -13,7 +13,7 @@
package de.bixilon.minosoft.properties
import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.assets.IntegratedAssets
import de.bixilon.minosoft.assets.util.InputStreamUtil.readJson
import de.bixilon.minosoft.data.registries.identified.Namespaces.minosoft
import de.bixilon.minosoft.properties.general.GeneralP
@ -29,7 +29,7 @@ object MinosoftPropertiesLoader {
val reader = Jackson.MAPPER.readerFor(type)
fun load() {
val properties = Minosoft.MINOSOFT_ASSETS_MANAGER.getOrNull(minosoft("version.json"))?.readJson<MinosoftP>(reader = reader)
val properties = IntegratedAssets.DEFAULT.getOrNull(minosoft("version.json"))?.readJson<MinosoftP>(reader = reader)
MinosoftProperties = if (properties == null) {
Log.log(LogMessageType.OTHER, LogLevels.FATAL) { "Can not load version.json! Did you compile with gradle?" }
MinosoftP(GeneralP("unknown", false), null)

View File

@ -17,7 +17,7 @@ import de.bixilon.kutil.cast.CastUtil.unsafeCast
import de.bixilon.kutil.json.JsonObject
import de.bixilon.kutil.latch.AbstractLatch
import de.bixilon.kutil.primitive.IntUtil.toInt
import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.assets.IntegratedAssets
import de.bixilon.minosoft.assets.util.InputStreamUtil.readJson
import de.bixilon.minosoft.data.registries.identified.Namespaces.minosoft
import de.bixilon.minosoft.protocol.packets.registry.DefaultPackets
@ -86,7 +86,7 @@ object VersionLoader {
fun load(latch: AbstractLatch?) {
Log.log(LogMessageType.LOADING, LogLevels.VERBOSE) { "Loading versions..." }
val index: VersionIndex = Minosoft.MINOSOFT_ASSETS_MANAGER[INDEX].readJson()
val index: VersionIndex = IntegratedAssets.DEFAULT[INDEX].readJson()
for ((versionId, data) in index) {
load(versionId, index, data)

View File

@ -13,7 +13,7 @@
package de.bixilon.minosoft.util
import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.assets.IntegratedAssets
import de.bixilon.minosoft.data.registries.identified.Namespaces.minosoft
import de.bixilon.minosoft.gui.eros.util.JavaFXUtil
import de.bixilon.minosoft.gui.rendering.textures.TextureUtil.texture
@ -66,7 +66,7 @@ object DesktopUtil {
}
private fun Taskbar.setDockIcon() {
iconImage = Toolkit.getDefaultToolkit().createImage(Minosoft.MINOSOFT_ASSETS_MANAGER[ICON].readAllBytes())
iconImage = Toolkit.getDefaultToolkit().createImage(IntegratedAssets.DEFAULT[ICON].readAllBytes())
}
private fun Taskbar.initialize() {

View File

@ -13,7 +13,7 @@
package de.bixilon.minosoft.util.url
import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.assets.IntegratedAssets
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
import java.io.InputStream
import java.net.URL
@ -33,7 +33,7 @@ object ResourceURLHandler : URLStreamHandler() {
}
override fun getInputStream(): InputStream {
return Minosoft.MINOSOFT_ASSETS_MANAGER[ResourceLocation.of(url.path)]
return IntegratedAssets.DEFAULT[ResourceLocation.of(url.path)]
}
}
}

View File

@ -13,7 +13,7 @@
package de.bixilon.minosoft.util.yggdrasil
import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.assets.IntegratedAssets
import de.bixilon.minosoft.data.registries.identified.Namespaces.mojang
import de.bixilon.minosoft.terminal.RunConfiguration
import de.bixilon.minosoft.util.logging.Log
@ -36,7 +36,7 @@ object YggdrasilUtil {
return
}
check(!this::PUBLIC_KEY.isInitialized) { "Already loaded!" }
val spec = X509EncodedKeySpec(Minosoft.MINOSOFT_ASSETS_MANAGER[mojang("yggdrasil/pubkey.der")].readAllBytes())
val spec = X509EncodedKeySpec(IntegratedAssets.DEFAULT[mojang("yggdrasil/pubkey.der")].readAllBytes())
val keyFactory: KeyFactory = KeyFactory.getInstance("RSA")
PUBLIC_KEY = keyFactory.generatePublic(spec)
}