diff --git a/libmc-protocol/src/commonMain/kotlin/cn/rtast/libmc/protocol/protocol/game/item/slot/HashedSlot.kt b/libmc-protocol/src/commonMain/kotlin/cn/rtast/libmc/protocol/protocol/game/item/slot/HashedSlot.kt index e36751a..2e335a1 100644 --- a/libmc-protocol/src/commonMain/kotlin/cn/rtast/libmc/protocol/protocol/game/item/slot/HashedSlot.kt +++ b/libmc-protocol/src/commonMain/kotlin/cn/rtast/libmc/protocol/protocol/game/item/slot/HashedSlot.kt @@ -7,3 +7,42 @@ package cn.rtast.libmc.protocol.protocol.game.item.slot +import cn.rtast.libmc.network.BytesBuffer +import cn.rtast.libmc.primitives.readOptional +import cn.rtast.libmc.primitives.readPrefixed +import cn.rtast.libmc.primitives.readVarInt + +public data class HashedSlot( + val hasItem: Boolean, + val itemId: Int?, + val itemCount: Int?, + val componentsToAdd: List?, + val componentsToRemove: List?, +) { + public data class HashedSlotComponent( + val componentId: Int, + /** + * CRC32C + */ + val hash: Int, + ) + + public companion object { + public val EMPTY: HashedSlot = HashedSlot(false, null, null, emptyList(), emptyList()) + } +} + +internal fun BytesBuffer.readHashedSlot(): HashedSlot { + val hasItem = readBoolean() + val itemId = readOptional(hasItem) { readVarInt() } + val itemCount = readOptional(hasItem) { readVarInt() } + val componentsToAdd = readOptional(hasItem) { + readPrefixed { + val componentId = readVarInt() + val hash = readInt() + HashedSlot.HashedSlotComponent(componentId, hash) + } + } + val componentsToRemove = readOptional(hasItem) { readPrefixed { readVarInt() } } + return HashedSlot(hasItem, itemId, itemCount, componentsToAdd, componentsToRemove) +} \ No newline at end of file