From c8150e5fb521ad9a37fa789e6d17fdb16cd38a45 Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Fri, 12 Jan 2024 21:40:56 +0100 Subject: [PATCH] network: improve pre flattening item meta writing --- build.gradle.kts | 4 +-- .../data/registries/item/items/DurableItem.kt | 5 ++++ .../item/items/legacy/ItemWithMeta.kt | 6 +++- .../registries/registry/MetaTypes.kt | 6 ++-- .../buffers/play/PlayOutByteBuffer.kt | 28 ++++++++++++------- 5 files changed, 33 insertions(+), 16 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 250acf06d..1d068bd45 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2024 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. * @@ -134,7 +134,7 @@ when (os) { Architectures.ARM -> { lwjglNatives += "-arm64" zstdNatives += "-amd64" - // TODO: javafx for Windows on arm is not yet supported: https://github.com/luben/zstd-jni/issues/277 + // TODO: javafx for Windows on arm is not yet supported } */ diff --git a/src/main/java/de/bixilon/minosoft/data/registries/item/items/DurableItem.kt b/src/main/java/de/bixilon/minosoft/data/registries/item/items/DurableItem.kt index f06cea85b..aee454bdb 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/item/items/DurableItem.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/item/items/DurableItem.kt @@ -22,4 +22,9 @@ interface DurableItem : ItemWithMeta { override fun setMeta(stack: ItemStack, meta: Int) { stack.durability.durability = maxDurability - meta // in <1.13 its damage not durability } + + override fun getMeta(id: Int, stack: ItemStack): Int { + val durability = stack._durability ?: return 0 + return maxDurability - durability.durability + } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/item/items/legacy/ItemWithMeta.kt b/src/main/java/de/bixilon/minosoft/data/registries/item/items/legacy/ItemWithMeta.kt index 722edf939..cc46eb154 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/item/items/legacy/ItemWithMeta.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/item/items/legacy/ItemWithMeta.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2024 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. * @@ -14,8 +14,12 @@ package de.bixilon.minosoft.data.registries.item.items.legacy import de.bixilon.minosoft.data.container.stack.ItemStack +import de.bixilon.minosoft.data.registries.registries.registry.MetaTypes interface ItemWithMeta { fun setMeta(stack: ItemStack, meta: Int) + fun getMeta(id: Int, stack: ItemStack): Int { + return id and MetaTypes.ITEM.mask + } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/MetaTypes.kt b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/MetaTypes.kt index 3b217724b..156d07d03 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/MetaTypes.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/MetaTypes.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2024 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. * @@ -19,9 +19,9 @@ enum class MetaTypes(val bits: Int) { ITEM(16), ; - private val metaMask = (1 shl bits) - 1 + val mask = (1 shl bits) - 1 fun modify(id: Int, meta: Int): Int { - return (id shl bits) or (meta and metaMask) + return (id shl bits) or (meta and mask) } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/buffers/play/PlayOutByteBuffer.kt b/src/main/java/de/bixilon/minosoft/protocol/protocol/buffers/play/PlayOutByteBuffer.kt index eb52e67ef..e98ccd85d 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/buffers/play/PlayOutByteBuffer.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/buffers/play/PlayOutByteBuffer.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2024 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. * @@ -18,6 +18,8 @@ import de.bixilon.minosoft.data.chat.signature.ChatSignatureProperties import de.bixilon.minosoft.data.chat.signature.LastSeenMessageList import de.bixilon.minosoft.data.chat.signature.lastSeen.MessageSignatureData import de.bixilon.minosoft.data.container.stack.ItemStack +import de.bixilon.minosoft.data.registries.item.items.legacy.ItemWithMeta +import de.bixilon.minosoft.data.registries.registries.registry.MetaTypes import de.bixilon.minosoft.protocol.PlayerPublicKey import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.protocol.ProtocolVersions @@ -48,17 +50,22 @@ class PlayOutByteBuffer(val connection: PlayConnection) : OutByteBuffer() { } } + fun writeLegacyItemStack(stack: ItemStack?) { + if (stack == null || !stack._valid) { + writeShort(-1) + return + } + val item = stack.item.item + val id = connection.registries.item.getId(item) + writeShort(id shr MetaTypes.ITEM.bits) + writeByte(stack.item.count) + writeShort(if (item is ItemWithMeta) item.getMeta(id, stack) else 0) + writeNBT(stack.getNBT()) + } + fun writeItemStack(stack: ItemStack?) { if (versionId < ProtocolVersions.V_1_13_2_PRE1) { - if (stack == null || !stack._valid) { - writeShort(-1) - return - } - writeShort(connection.registries.item.getId(stack.item.item)) - writeByte(stack.item.count) - writeShort(stack._durability?.durability ?: 0) // ToDo: This is meta in general and not just durability - writeNBT(stack.getNBT()) - return + return writeLegacyItemStack(stack) } val valid = stack != null && stack._valid writeBoolean(valid) @@ -80,6 +87,7 @@ class PlayOutByteBuffer(val connection: PlayConnection) : OutByteBuffer() { } fun writeNBT(nbt: Any?) { + if (nbt is Map<*, *> && nbt.isEmpty()) return writeNBT(null) return writeNBT(nbt, versionId < ProtocolVersions.V_14W28B, versionId < V_23W31A) }