resource profile: provide pack format

This commit is contained in:
Moritz Zwerger 2023-10-04 00:00:05 +02:00
parent 73b9d4c541
commit f1f18e2c92
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
11 changed files with 79 additions and 18 deletions

View File

@ -14,6 +14,9 @@
package de.bixilon.minosoft.assets package de.bixilon.minosoft.assets
import de.bixilon.kutil.latch.AbstractLatch 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 de.bixilon.minosoft.data.registries.identified.ResourceLocation
import java.io.FileNotFoundException import java.io.FileNotFoundException
import java.io.InputStream import java.io.InputStream
@ -36,4 +39,12 @@ object TestAssetsManager : AssetsManager {
} }
override fun getAssetsManager(path: ResourceLocation) = null override fun getAssetsManager(path: ResourceLocation) = null
fun AssetsManager.box(packFormat: Int = 0): ConnectionAssetsManager {
val manager = ConnectionAssetsManager(AssetsManagerProperties(PackProperties(0)))
manager += this
return manager
}
} }

View File

@ -15,6 +15,7 @@ package de.bixilon.minosoft.gui.rendering.models
import de.bixilon.kutil.reflection.ReflectionUtil.forceSet import de.bixilon.kutil.reflection.ReflectionUtil.forceSet
import de.bixilon.minosoft.assets.MemoryAssetsManager 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.element.ModelElement
import de.bixilon.minosoft.gui.rendering.models.block.state.apply.SingleBlockStateApply import de.bixilon.minosoft.gui.rendering.models.block.state.apply.SingleBlockStateApply
import de.bixilon.minosoft.gui.rendering.models.block.state.baked.BakedModel import de.bixilon.minosoft.gui.rendering.models.block.state.baked.BakedModel
@ -43,7 +44,7 @@ object ModelTestUtil {
for ((name, value) in files) { for ((name, value) in files) {
assets.push(name.toResourceLocation().model(), value) assets.push(name.toResourceLocation().model(), value)
} }
this.block::assets.forceSet(assets) this.block::assets.forceSet(assets.box())
return assets return assets
} }

View File

@ -17,6 +17,7 @@ import de.bixilon.kotlinglm.vec2.Vec2i
import de.bixilon.kutil.reflection.ReflectionUtil.forceSet import de.bixilon.kutil.reflection.ReflectionUtil.forceSet
import de.bixilon.minosoft.Minosoft import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.assets.MemoryAssetsManager import de.bixilon.minosoft.assets.MemoryAssetsManager
import de.bixilon.minosoft.assets.TestAssetsManager.box
import de.bixilon.minosoft.data.direction.Directions import de.bixilon.minosoft.data.direction.Directions
import de.bixilon.minosoft.gui.rendering.Rendering import de.bixilon.minosoft.gui.rendering.Rendering
import de.bixilon.minosoft.gui.rendering.models.block.element.face.ModelFace import de.bixilon.minosoft.gui.rendering.models.block.element.face.ModelFace
@ -38,7 +39,7 @@ object BakedModelTestUtil {
for (name in names) { for (name in names) {
assets.push(name.toResourceLocation().texture(), texture) assets.push(name.toResourceLocation().texture(), texture)
} }
connection::assetsManager.forceSet(assets) connection::assetsManager.forceSet(assets.box())
val rendering = Rendering(connection) val rendering = Rendering(connection)
rendering.context.textures::debugTexture.forceSet(MemoryTexture(Vec2i(0, 0))) rendering.context.textures::debugTexture.forceSet(MemoryTexture(Vec2i(0, 0)))

View File

@ -16,7 +16,10 @@ package de.bixilon.minosoft.protocol.network.connection.play
import de.bixilon.kotlinglm.pow import de.bixilon.kotlinglm.pow
import de.bixilon.kutil.observer.DataObserver import de.bixilon.kutil.observer.DataObserver
import de.bixilon.kutil.reflection.ReflectionUtil.forceSet 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.camera.ConnectionCamera
import de.bixilon.minosoft.config.profile.ProfileTestUtil.createProfiles import de.bixilon.minosoft.config.profile.ProfileTestUtil.createProfiles
import de.bixilon.minosoft.data.accounts.types.test.TestAccount import de.bixilon.minosoft.data.accounts.types.test.TestAccount
@ -60,7 +63,7 @@ object ConnectionTestUtil {
connection::network.forceSet(TestNetwork()) connection::network.forceSet(TestNetwork())
connection::events.forceSet(EventMaster()) connection::events.forceSet(EventMaster())
connection::profiles.forceSet(profiles) connection::profiles.forceSet(profiles)
connection::assetsManager.forceSet(TestAssetsManager) connection::assetsManager.forceSet(ConnectionAssetsManager(AssetsManagerProperties(PackProperties(version.packFormat))))
connection::state.forceSet(DataObserver(PlayConnectionStates.PLAYING)) connection::state.forceSet(DataObserver(PlayConnectionStates.PLAYING))
connection::tags.forceSet(TagManager()) connection::tags.forceSet(TagManager())
connection::legacyTags.forceSet(FALLBACK_TAGS) connection::legacyTags.forceSet(FALLBACK_TAGS)

View File

@ -15,10 +15,12 @@ package de.bixilon.minosoft.assets
import de.bixilon.kutil.latch.AbstractLatch import de.bixilon.kutil.latch.AbstractLatch
import de.bixilon.minosoft.Minosoft 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.JarAssetsManager
import de.bixilon.minosoft.assets.minecraft.MinecraftAssetsVersion.packFormat import de.bixilon.minosoft.assets.minecraft.MinecraftAssetsVersion.packFormat
import de.bixilon.minosoft.assets.minecraft.index.IndexAssetsManager 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.AssetsVersionProperties
import de.bixilon.minosoft.assets.properties.version.AssetsVersionProperty import de.bixilon.minosoft.assets.properties.version.AssetsVersionProperty
import de.bixilon.minosoft.config.profile.profiles.resources.ResourcesProfile import de.bixilon.minosoft.config.profile.profiles.resources.ResourcesProfile
@ -26,16 +28,31 @@ import de.bixilon.minosoft.protocol.versions.Version
object AssetsLoader { object AssetsLoader {
fun create(profile: ResourcesProfile, version: Version, latch: AbstractLatch, property: AssetsVersionProperty = AssetsVersionProperties[version] ?: throw IllegalAccessException("$version has no assets!")): AssetsManager { private fun ResourcesProfile.createPackProperties(version: Version): AssetsManagerProperties {
val assetsManager = PriorityAssetsManager() 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 assetsManager += Minosoft.OVERRIDE_ASSETS_MANAGER
for (resourcePack in profile.assets.resourcePacks.reversed()) {
resourcePack.type.creator(resourcePack).let { assetsManager.addPacks(profile, latch)
it.load(latch)
assetsManager += it
}
}
if (!profile.assets.disableIndexAssets) { if (!profile.assets.disableIndexAssets) {
assetsManager += IndexAssetsManager(profile, property.indexVersion, property.indexHash, profile.assets.indexAssetsTypes.toSet(), version.packFormat) assetsManager += IndexAssetsManager(profile, property.indexVersion, property.indexHash, profile.assets.indexAssetsTypes.toSet(), version.packFormat)

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.connection
import de.bixilon.minosoft.assets.multi.PriorityAssetsManager
import de.bixilon.minosoft.assets.properties.manager.AssetsManagerProperties
class ConnectionAssetsManager(
override val properties: AssetsManagerProperties,
) : PriorityAssetsManager()

View File

@ -32,6 +32,7 @@ import de.bixilon.minosoft.protocol.protocol.ProtocolVersions.V_23W32A
import de.bixilon.minosoft.protocol.versions.Version import de.bixilon.minosoft.protocol.versions.Version
object MinecraftAssetsVersion { object MinecraftAssetsVersion {
const val LATEST_PACK_FORMAT = 18
val Version.packFormat: Int val Version.packFormat: Int
get() = when { get() = when {
@ -51,7 +52,7 @@ object MinecraftAssetsVersion {
versionId < V_23W31A -> 15 versionId < V_23W31A -> 15
versionId < V_23W32A -> 16 versionId < V_23W32A -> 16
versionId < V_1_20_2_PRE2 -> 17 versionId < V_1_20_2_PRE2 -> 17
else -> 18 else -> LATEST_PACK_FORMAT
} }
} }

View File

@ -22,7 +22,7 @@ import java.io.InputStream
/** /**
* A set of assets managers (sorted) * A set of assets managers (sorted)
*/ */
class PriorityAssetsManager( open class PriorityAssetsManager(
vararg managers: AssetsManager, vararg managers: AssetsManager,
) : MultiAssetsManager { ) : MultiAssetsManager {
private val managers: MutableSet<AssetsManager> = mutableSetOf() private val managers: MutableSet<AssetsManager> = mutableSetOf()

View File

@ -20,8 +20,10 @@ import de.bixilon.minosoft.protocol.versions.Version
interface AbstractServer { interface AbstractServer {
val address: String val address: String
val name: ChatComponent val name: ChatComponent
val queryVersion: Boolean val queryVersion: Boolean
val profiles: MutableMap<ResourceLocation, String> val profiles: MutableMap<ResourceLocation, String>
val forcedVersion: Version? val forcedVersion: Version?
var faviconHash: String? var faviconHash: String?
} }

View File

@ -1,6 +1,6 @@
/* /*
* Minosoft * 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. * 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 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.assets.minecraft.index.IndexAssetsType
import de.bixilon.minosoft.config.profile.delegate.primitive.BooleanDelegate 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.list.ListDelegate
import de.bixilon.minosoft.config.profile.delegate.types.set.SetDelegate import de.bixilon.minosoft.config.profile.delegate.types.set.SetDelegate
import de.bixilon.minosoft.config.profile.profiles.resources.ResourcesProfile import de.bixilon.minosoft.config.profile.profiles.resources.ResourcesProfile
@ -26,4 +28,6 @@ class AssetsC(profile: ResourcesProfile) {
val indexAssetsTypes: MutableSet<IndexAssetsType> by SetDelegate(profile, mutableSetOf(*IndexAssetsType.VALUES), "") val indexAssetsTypes: MutableSet<IndexAssetsType> by SetDelegate(profile, mutableSetOf(*IndexAssetsType.VALUES), "")
val resourcePacks: List<ResourcePack> by ListDelegate(profile, mutableListOf(), "") val resourcePacks: List<ResourcePack> by ListDelegate(profile, mutableListOf(), "")
val packFormat by IntDelegate(profile, -1, "", arrayOf(-1..-1, 0..LATEST_PACK_FORMAT))
} }

View File

@ -25,7 +25,7 @@ import de.bixilon.kutil.observer.DataObserver.Companion.observe
import de.bixilon.kutil.observer.DataObserver.Companion.observed import de.bixilon.kutil.observer.DataObserver.Companion.observed
import de.bixilon.kutil.reflection.ReflectionUtil.forceSet import de.bixilon.kutil.reflection.ReflectionUtil.forceSet
import de.bixilon.minosoft.assets.AssetsLoader 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.camera.ConnectionCamera
import de.bixilon.minosoft.commands.nodes.RootNode import de.bixilon.minosoft.commands.nodes.RootNode
import de.bixilon.minosoft.config.profile.ConnectionProfiles import de.bixilon.minosoft.config.profile.ConnectionProfiles
@ -95,7 +95,7 @@ class PlayConnection(
val sequence = AtomicInteger(1) val sequence = AtomicInteger(1)
lateinit var assetsManager: AssetsManager lateinit var assetsManager: ConnectionAssetsManager
private set private set
lateinit var language: Translator lateinit var language: Translator