diff --git a/src/main/java/de/bixilon/minosoft/advancements/Advancement.kt b/src/main/java/de/bixilon/minosoft/advancements/Advancement.kt index 6e7c57b11..c13a3d021 100644 --- a/src/main/java/de/bixilon/minosoft/advancements/Advancement.kt +++ b/src/main/java/de/bixilon/minosoft/advancements/Advancement.kt @@ -13,8 +13,10 @@ package de.bixilon.minosoft.advancements +import de.bixilon.minosoft.data.registries.identified.ResourceLocation + data class Advancement( - val parent: String?, + val parent: ResourceLocation?, val display: AdvancementDisplay?, val criteria: Set, val requirements: Set>, diff --git a/src/main/java/de/bixilon/minosoft/advancements/AdvancementDisplay.kt b/src/main/java/de/bixilon/minosoft/advancements/AdvancementDisplay.kt index 618cd7841..e7e0a780a 100644 --- a/src/main/java/de/bixilon/minosoft/advancements/AdvancementDisplay.kt +++ b/src/main/java/de/bixilon/minosoft/advancements/AdvancementDisplay.kt @@ -15,6 +15,7 @@ package de.bixilon.minosoft.advancements import de.bixilon.kotlinglm.vec2.Vec2 import de.bixilon.minosoft.data.container.stack.ItemStack +import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.data.text.ChatComponent data class AdvancementDisplay( @@ -22,6 +23,6 @@ data class AdvancementDisplay( val description: ChatComponent, val icon: ItemStack?, val frame: AdvancementFrames, - val background: String?, + val background: ResourceLocation?, val position: Vec2, ) diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/advancement/AdvancementsS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/advancement/AdvancementsS2CP.kt index d299cd42c..de5b013ce 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/advancement/AdvancementsS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/advancement/AdvancementsS2CP.kt @@ -18,8 +18,10 @@ import de.bixilon.minosoft.advancements.Advancement import de.bixilon.minosoft.advancements.AdvancementDisplay import de.bixilon.minosoft.advancements.AdvancementFrames import de.bixilon.minosoft.advancements.AdvancementProgress +import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.protocol.packets.factory.LoadPacket import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket +import de.bixilon.minosoft.protocol.protocol.ProtocolVersions.V_23W18A import de.bixilon.minosoft.protocol.protocol.buffers.play.PlayInByteBuffer import de.bixilon.minosoft.util.logging.Log import de.bixilon.minosoft.util.logging.LogLevels @@ -28,45 +30,15 @@ import de.bixilon.minosoft.util.logging.LogMessageType @LoadPacket class AdvancementsS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { val reset = buffer.readBoolean() - val advancements: Map - val progress: Map> + val advancements: Map + val remove: Set + val progress: Map> init { - val advancements: MutableMap = mutableMapOf() - for (i in 0 until buffer.readVarInt()) { - val key = buffer.readString() - val parent = buffer.readOptional { readString() } - val display = buffer.readOptional { buffer.readDisplay() } - val criteria = buffer.readArray { buffer.readString() }.toSet() - val requirements = buffer.readArray { buffer.readArray { buffer.readString() }.toSet() }.toSet() + this.advancements = buffer.readMap(key = { buffer.readResourceLocation() }, value = { buffer.readAdvancement() }) + this.remove = buffer.readSet { buffer.readResourceLocation() } - advancements[key] = Advancement( - parent = parent, - display = display, - criteria = criteria, - requirements = requirements, - ) - } - for (remove in buffer.readArray { buffer.readString() }) { - advancements[remove] = null - } - this.advancements = advancements - - val progress: MutableMap> = mutableMapOf() - for (i in 0 until buffer.readVarInt()) { - val name = buffer.readString() - val criteria: MutableSet = mutableSetOf() - for (ii in 0 until buffer.readVarInt()) { - val criterion = buffer.readString() - val archiveTime = buffer.readOptional { readLong() } - criteria += AdvancementProgress( - criterion = criterion, - archiveTime = archiveTime, - ) - } - progress[name] = criteria - } - this.progress = progress + this.progress = buffer.readMap(key = { buffer.readResourceLocation() }, value = { buffer.readSet { buffer.readProgress() } }) } override fun log(reducedLog: Boolean) { @@ -77,13 +49,40 @@ class AdvancementsS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { } } + fun PlayInByteBuffer.readProgress(): AdvancementProgress { + val criterion = readString() + val archiveTime = readOptional { readLong() } + + return AdvancementProgress( + criterion = criterion, + archiveTime = archiveTime, + ) + } + + fun PlayInByteBuffer.readAdvancement(): Advancement { + val parent = readOptional { readResourceLocation() } + val display = readOptional { readDisplay() } + val criteria = readSet { readString() } + val requirements = readSet { readSet { readString() } } + if (versionId >= V_23W18A) { // TODO: not 100% sure + val sendTelemetry = readBoolean() + } + + return Advancement( + parent = parent, + display = display, + criteria = criteria, + requirements = requirements, + ) + } + fun PlayInByteBuffer.readDisplay(): AdvancementDisplay { val title = readChatComponent() val description = readChatComponent() val icon = readItemStack() val frame = AdvancementFrames[readVarInt()] val flags = readInt() - val background = if (flags.isBit(0)) readString() else null + val background = if (flags.isBit(0)) readResourceLocation() else null val position = readVec2f() return AdvancementDisplay( diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/buffers/InByteBuffer.kt b/src/main/java/de/bixilon/minosoft/protocol/protocol/buffers/InByteBuffer.kt index de31354b8..301bb044e 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/buffers/InByteBuffer.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/buffers/InByteBuffer.kt @@ -191,4 +191,25 @@ open class InByteBuffer : de.bixilon.kutil.buffer.bytes.`in`.InByteBuffer { } return readNBTTag(type) } + + + @Deprecated("Kutil 1.23") + inline fun readSet(length: Int = readVarInt(), reader: () -> T): Set { + check(length <= size) { "Trying to allocate too much memory!" } + val set: MutableSet = LinkedHashSet(length) + for (i in 0 until length) { + set += reader() + } + return set + } + + @Deprecated("Kutil 1.23") + inline fun readMap(length: Int = readVarInt(), key: () -> K, value: () -> V): Map { + check(length <= size) { "Trying to allocate too much memory!" } + val map: MutableMap = LinkedHashMap(length) + for (i in 0 until length) { + map[key()] = value() + } + return map + } }