network: rewrite advancement reading

This commit is contained in:
Bixilon 2023-06-05 14:00:48 +02:00
parent 0449c17f7c
commit 7ddd0e6f68
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
4 changed files with 62 additions and 39 deletions

View File

@ -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<String>,
val requirements: Set<Set<String>>,

View File

@ -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,
)

View File

@ -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<String, Advancement?>
val progress: Map<String, Set<AdvancementProgress>>
val advancements: Map<ResourceLocation, Advancement>
val remove: Set<ResourceLocation>
val progress: Map<ResourceLocation, Set<AdvancementProgress>>
init {
val advancements: MutableMap<String, Advancement?> = 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<String, Set<AdvancementProgress>> = mutableMapOf()
for (i in 0 until buffer.readVarInt()) {
val name = buffer.readString()
val criteria: MutableSet<AdvancementProgress> = 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(

View File

@ -191,4 +191,25 @@ open class InByteBuffer : de.bixilon.kutil.buffer.bytes.`in`.InByteBuffer {
}
return readNBTTag(type)
}
@Deprecated("Kutil 1.23")
inline fun <reified T> readSet(length: Int = readVarInt(), reader: () -> T): Set<T> {
check(length <= size) { "Trying to allocate too much memory!" }
val set: MutableSet<T> = LinkedHashSet(length)
for (i in 0 until length) {
set += reader()
}
return set
}
@Deprecated("Kutil 1.23")
inline fun <reified K, reified V> readMap(length: Int = readVarInt(), key: () -> K, value: () -> V): Map<K, V> {
check(length <= size) { "Trying to allocate too much memory!" }
val map: MutableMap<K, V> = LinkedHashMap(length)
for (i in 0 until length) {
map[key()] = value()
}
return map
}
}