diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/assets/TestAssetsManager.kt b/src/integration-test/kotlin/de/bixilon/minosoft/assets/TestAssetsManager.kt index 14f2e77bd..405261db9 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/assets/TestAssetsManager.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/assets/TestAssetsManager.kt @@ -14,6 +14,9 @@ package de.bixilon.minosoft.assets import de.bixilon.kutil.latch.AbstractLatch +import de.bixilon.minosoft.assets.connection.ConnectionAssetsManager +import de.bixilon.minosoft.assets.properties.manager.AssetsManagerProperties +import de.bixilon.minosoft.assets.properties.manager.pack.PackProperties import de.bixilon.minosoft.data.registries.identified.ResourceLocation import java.io.FileNotFoundException import java.io.InputStream @@ -36,4 +39,12 @@ object TestAssetsManager : AssetsManager { } override fun getAssetsManager(path: ResourceLocation) = null + + + fun AssetsManager.box(packFormat: Int = 0): ConnectionAssetsManager { + val manager = ConnectionAssetsManager(AssetsManagerProperties(PackProperties(0))) + manager += this + + return manager + } } diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/ModelTestUtil.kt b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/ModelTestUtil.kt index 19a70364b..450fe570a 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/ModelTestUtil.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/ModelTestUtil.kt @@ -15,6 +15,7 @@ package de.bixilon.minosoft.gui.rendering.models import de.bixilon.kutil.reflection.ReflectionUtil.forceSet import de.bixilon.minosoft.assets.MemoryAssetsManager +import de.bixilon.minosoft.assets.TestAssetsManager.box import de.bixilon.minosoft.gui.rendering.models.block.element.ModelElement import de.bixilon.minosoft.gui.rendering.models.block.state.apply.SingleBlockStateApply import de.bixilon.minosoft.gui.rendering.models.block.state.baked.BakedModel @@ -43,7 +44,7 @@ object ModelTestUtil { for ((name, value) in files) { assets.push(name.toResourceLocation().model(), value) } - this.block::assets.forceSet(assets) + this.block::assets.forceSet(assets.box()) return assets } diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/baked/BakedModelTestUtil.kt b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/baked/BakedModelTestUtil.kt index e2070de2b..29985352a 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/baked/BakedModelTestUtil.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/baked/BakedModelTestUtil.kt @@ -17,6 +17,7 @@ import de.bixilon.kotlinglm.vec2.Vec2i import de.bixilon.kutil.reflection.ReflectionUtil.forceSet import de.bixilon.minosoft.Minosoft import de.bixilon.minosoft.assets.MemoryAssetsManager +import de.bixilon.minosoft.assets.TestAssetsManager.box import de.bixilon.minosoft.data.direction.Directions import de.bixilon.minosoft.gui.rendering.Rendering import de.bixilon.minosoft.gui.rendering.models.block.element.face.ModelFace @@ -38,7 +39,7 @@ object BakedModelTestUtil { for (name in names) { assets.push(name.toResourceLocation().texture(), texture) } - connection::assetsManager.forceSet(assets) + connection::assetsManager.forceSet(assets.box()) val rendering = Rendering(connection) rendering.context.textures::debugTexture.forceSet(MemoryTexture(Vec2i(0, 0))) diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/protocol/network/connection/play/ConnectionTestUtil.kt b/src/integration-test/kotlin/de/bixilon/minosoft/protocol/network/connection/play/ConnectionTestUtil.kt index 1666e103d..70cd86c95 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/protocol/network/connection/play/ConnectionTestUtil.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/protocol/network/connection/play/ConnectionTestUtil.kt @@ -16,7 +16,10 @@ package de.bixilon.minosoft.protocol.network.connection.play import de.bixilon.kotlinglm.pow import de.bixilon.kutil.observer.DataObserver import de.bixilon.kutil.reflection.ReflectionUtil.forceSet -import de.bixilon.minosoft.assets.TestAssetsManager +import de.bixilon.minosoft.assets.connection.ConnectionAssetsManager +import de.bixilon.minosoft.assets.minecraft.MinecraftAssetsVersion.packFormat +import de.bixilon.minosoft.assets.properties.manager.AssetsManagerProperties +import de.bixilon.minosoft.assets.properties.manager.pack.PackProperties import de.bixilon.minosoft.camera.ConnectionCamera import de.bixilon.minosoft.config.profile.ProfileTestUtil.createProfiles import de.bixilon.minosoft.data.accounts.types.test.TestAccount @@ -60,7 +63,7 @@ object ConnectionTestUtil { connection::network.forceSet(TestNetwork()) connection::events.forceSet(EventMaster()) connection::profiles.forceSet(profiles) - connection::assetsManager.forceSet(TestAssetsManager) + connection::assetsManager.forceSet(ConnectionAssetsManager(AssetsManagerProperties(PackProperties(version.packFormat)))) connection::state.forceSet(DataObserver(PlayConnectionStates.PLAYING)) connection::tags.forceSet(TagManager()) connection::legacyTags.forceSet(FALLBACK_TAGS) diff --git a/src/main/java/de/bixilon/minosoft/assets/AssetsLoader.kt b/src/main/java/de/bixilon/minosoft/assets/AssetsLoader.kt index 6a40db96a..227400d67 100644 --- a/src/main/java/de/bixilon/minosoft/assets/AssetsLoader.kt +++ b/src/main/java/de/bixilon/minosoft/assets/AssetsLoader.kt @@ -15,10 +15,12 @@ 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.MinecraftAssetsVersion.packFormat import de.bixilon.minosoft.assets.minecraft.index.IndexAssetsManager -import de.bixilon.minosoft.assets.multi.PriorityAssetsManager +import de.bixilon.minosoft.assets.properties.manager.AssetsManagerProperties +import de.bixilon.minosoft.assets.properties.manager.pack.PackProperties import de.bixilon.minosoft.assets.properties.version.AssetsVersionProperties import de.bixilon.minosoft.assets.properties.version.AssetsVersionProperty import de.bixilon.minosoft.config.profile.profiles.resources.ResourcesProfile @@ -26,16 +28,31 @@ import de.bixilon.minosoft.protocol.versions.Version object AssetsLoader { - fun create(profile: ResourcesProfile, version: Version, latch: AbstractLatch, property: AssetsVersionProperty = AssetsVersionProperties[version] ?: throw IllegalAccessException("$version has no assets!")): AssetsManager { - val assetsManager = PriorityAssetsManager() + private fun ResourcesProfile.createPackProperties(version: Version): AssetsManagerProperties { + var packFormat = assets.packFormat + if (packFormat < 0) { + packFormat = version.packFormat + } + + return AssetsManagerProperties(PackProperties(packFormat)) + } + + private fun ConnectionAssetsManager.addPacks(profile: ResourcesProfile, latch: AbstractLatch) { + for (resourcePack in profile.assets.resourcePacks.reversed()) { + val manager = resourcePack.type.creator.invoke(resourcePack) + manager.load(latch) + this += manager + } + } + + fun create(profile: ResourcesProfile, version: Version, latch: AbstractLatch, property: AssetsVersionProperty = AssetsVersionProperties[version] ?: throw IllegalAccessException("$version has no assets!")): ConnectionAssetsManager { + val properties = profile.createPackProperties(version) + + val assetsManager = ConnectionAssetsManager(properties) assetsManager += Minosoft.OVERRIDE_ASSETS_MANAGER - for (resourcePack in profile.assets.resourcePacks.reversed()) { - resourcePack.type.creator(resourcePack).let { - it.load(latch) - assetsManager += it - } - } + + assetsManager.addPacks(profile, latch) if (!profile.assets.disableIndexAssets) { assetsManager += IndexAssetsManager(profile, property.indexVersion, property.indexHash, profile.assets.indexAssetsTypes.toSet(), version.packFormat) diff --git a/src/main/java/de/bixilon/minosoft/assets/connection/ConnectionAssetsManager.kt b/src/main/java/de/bixilon/minosoft/assets/connection/ConnectionAssetsManager.kt new file mode 100644 index 000000000..10192f4c5 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/assets/connection/ConnectionAssetsManager.kt @@ -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 . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.assets.connection + +import de.bixilon.minosoft.assets.multi.PriorityAssetsManager +import de.bixilon.minosoft.assets.properties.manager.AssetsManagerProperties + +class ConnectionAssetsManager( + override val properties: AssetsManagerProperties, +) : PriorityAssetsManager() diff --git a/src/main/java/de/bixilon/minosoft/assets/minecraft/MinecraftAssetsVersion.kt b/src/main/java/de/bixilon/minosoft/assets/minecraft/MinecraftAssetsVersion.kt index 4c7117a96..5f45d2101 100644 --- a/src/main/java/de/bixilon/minosoft/assets/minecraft/MinecraftAssetsVersion.kt +++ b/src/main/java/de/bixilon/minosoft/assets/minecraft/MinecraftAssetsVersion.kt @@ -32,6 +32,7 @@ import de.bixilon.minosoft.protocol.protocol.ProtocolVersions.V_23W32A import de.bixilon.minosoft.protocol.versions.Version object MinecraftAssetsVersion { + const val LATEST_PACK_FORMAT = 18 val Version.packFormat: Int get() = when { @@ -51,7 +52,7 @@ object MinecraftAssetsVersion { versionId < V_23W31A -> 15 versionId < V_23W32A -> 16 versionId < V_1_20_2_PRE2 -> 17 - else -> 18 + else -> LATEST_PACK_FORMAT } } 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 cbfa0ac85..be014fb9a 100644 --- a/src/main/java/de/bixilon/minosoft/assets/multi/PriorityAssetsManager.kt +++ b/src/main/java/de/bixilon/minosoft/assets/multi/PriorityAssetsManager.kt @@ -22,7 +22,7 @@ import java.io.InputStream /** * A set of assets managers (sorted) */ -class PriorityAssetsManager( +open class PriorityAssetsManager( vararg managers: AssetsManager, ) : MultiAssetsManager { private val managers: MutableSet = mutableSetOf() diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/entries/AbstractServer.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/entries/AbstractServer.kt index 233356a2b..b2215e4c9 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/entries/AbstractServer.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/entries/AbstractServer.kt @@ -20,8 +20,10 @@ import de.bixilon.minosoft.protocol.versions.Version interface AbstractServer { val address: String val name: ChatComponent + val queryVersion: Boolean val profiles: MutableMap val forcedVersion: Version? + var faviconHash: String? } diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/resources/assets/AssetsC.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/resources/assets/AssetsC.kt index d6db26166..90ba8bcbd 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/resources/assets/AssetsC.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/resources/assets/AssetsC.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. * @@ -13,8 +13,10 @@ package de.bixilon.minosoft.config.profile.profiles.resources.assets +import de.bixilon.minosoft.assets.minecraft.MinecraftAssetsVersion.LATEST_PACK_FORMAT import de.bixilon.minosoft.assets.minecraft.index.IndexAssetsType import de.bixilon.minosoft.config.profile.delegate.primitive.BooleanDelegate +import de.bixilon.minosoft.config.profile.delegate.primitive.IntDelegate import de.bixilon.minosoft.config.profile.delegate.types.list.ListDelegate import de.bixilon.minosoft.config.profile.delegate.types.set.SetDelegate import de.bixilon.minosoft.config.profile.profiles.resources.ResourcesProfile @@ -26,4 +28,6 @@ class AssetsC(profile: ResourcesProfile) { val indexAssetsTypes: MutableSet by SetDelegate(profile, mutableSetOf(*IndexAssetsType.VALUES), "") val resourcePacks: List by ListDelegate(profile, mutableListOf(), "") + + val packFormat by IntDelegate(profile, -1, "", arrayOf(-1..-1, 0..LATEST_PACK_FORMAT)) } diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt index 81b72720d..4aac7b0b4 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt @@ -25,7 +25,7 @@ import de.bixilon.kutil.observer.DataObserver.Companion.observe import de.bixilon.kutil.observer.DataObserver.Companion.observed import de.bixilon.kutil.reflection.ReflectionUtil.forceSet import de.bixilon.minosoft.assets.AssetsLoader -import de.bixilon.minosoft.assets.AssetsManager +import de.bixilon.minosoft.assets.connection.ConnectionAssetsManager import de.bixilon.minosoft.camera.ConnectionCamera import de.bixilon.minosoft.commands.nodes.RootNode import de.bixilon.minosoft.config.profile.ConnectionProfiles @@ -95,7 +95,7 @@ class PlayConnection( val sequence = AtomicInteger(1) - lateinit var assetsManager: AssetsManager + lateinit var assetsManager: ConnectionAssetsManager private set lateinit var language: Translator