From 04c0108257c69b156bdbcef90cef292e5406847e Mon Sep 17 00:00:00 2001 From: Bixilon Date: Mon, 21 Feb 2022 11:01:53 +0100 Subject: [PATCH] network: fix item writing, gui: stack dropping --- .../minosoft/data/player/LocalPlayerEntity.kt | 4 +++- .../data/registries/other/containers/Container.kt | 5 +++++ .../rendering/gui/elements/items/ItemElement.kt | 15 +++++++++++++-- .../protocol/protocol/PlayOutByteBuffer.kt | 6 ++++-- 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/data/player/LocalPlayerEntity.kt b/src/main/java/de/bixilon/minosoft/data/player/LocalPlayerEntity.kt index 48e257196..346e51603 100644 --- a/src/main/java/de/bixilon/minosoft/data/player/LocalPlayerEntity.kt +++ b/src/main/java/de/bixilon/minosoft/data/player/LocalPlayerEntity.kt @@ -13,8 +13,10 @@ package de.bixilon.minosoft.data.player import de.bixilon.kutil.cast.CastUtil.nullCast +import de.bixilon.kutil.collections.CollectionUtil.synchronizedBiMapOf import de.bixilon.kutil.collections.CollectionUtil.synchronizedMapOf import de.bixilon.kutil.collections.map.LockMap +import de.bixilon.kutil.collections.map.bi.SynchronizedBiMap import de.bixilon.kutil.math.MMath.clamp import de.bixilon.kutil.math.MMath.floor import de.bixilon.kutil.primitive.BooleanUtil.decide @@ -83,7 +85,7 @@ class LocalPlayerEntity( val baseAbilities = Abilities() val inventory = PlayerInventory(connection) - val containers: MutableMap = synchronizedMapOf( + val containers: SynchronizedBiMap = synchronizedBiMapOf( ProtocolDefinition.PLAYER_CONTAINER_ID to inventory, ) var selectedHotbarSlot: Int = 0 diff --git a/src/main/java/de/bixilon/minosoft/data/registries/other/containers/Container.kt b/src/main/java/de/bixilon/minosoft/data/registries/other/containers/Container.kt index 12c44fd3f..31436f025 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/other/containers/Container.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/other/containers/Container.kt @@ -147,6 +147,11 @@ open class Container( revision++ } + + fun createAction(): Int { + return 0 // ToDo + } + override fun iterator(): Iterator> { return slots.toSynchronizedMap().iterator() } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/items/ItemElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/items/ItemElement.kt index 6f4a2d84c..b3979a31d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/items/ItemElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/items/ItemElement.kt @@ -31,6 +31,7 @@ import de.bixilon.minosoft.gui.rendering.gui.elements.VerticalAlignments.Compani import de.bixilon.minosoft.gui.rendering.gui.elements.primitive.ColorElement import de.bixilon.minosoft.gui.rendering.gui.elements.primitive.ImageElement import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement +import de.bixilon.minosoft.gui.rendering.gui.input.ModifierKeys import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions import de.bixilon.minosoft.gui.rendering.gui.popper.text.TextPopper @@ -145,11 +146,21 @@ class ItemElement( return true } val container = container ?: return false + val containerId = renderWindow.connection.player.containers.getKey(container) ?: return false + val controlDown = guiRenderer.isKeyDown(ModifierKeys.CONTROL) + val shiftDown = guiRenderer.isKeyDown(ModifierKeys.SHIFT) // ToDo when (key) { KeyCodes.KEY_Q -> { - stack?.item?.decreaseCount() - renderWindow.connection.sendPacket(ContainerClickC2SP(0, container.serverRevision, slotId, InventoryActions.DROP_ITEM, 0, mapOf(), stack)) + val action: InventoryActions + if (controlDown) { + stack?.item?.count = 0 + action = InventoryActions.DROP_STACK + } else { + stack?.item?.decreaseCount() + action = InventoryActions.DROP_ITEM + } + renderWindow.connection.sendPacket(ContainerClickC2SP(containerId, container.serverRevision, slotId, action, container.createAction(), mapOf(slotId to stack), stack)) } } return true diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/PlayOutByteBuffer.kt b/src/main/java/de/bixilon/minosoft/protocol/protocol/PlayOutByteBuffer.kt index 0086c4314..d04cbc6e2 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/PlayOutByteBuffer.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/PlayOutByteBuffer.kt @@ -50,10 +50,12 @@ class PlayOutByteBuffer(val connection: PlayConnection) : OutByteBuffer() { writeNBT(itemStack.getNBT()) return } - writeBoolean(itemStack != null) - if (itemStack == null || !itemStack._valid) { + val valid = itemStack?._valid == true + writeBoolean(valid) + if (!valid) { return } + itemStack!! writeVarInt(connection.registries.itemRegistry.getId(itemStack.item.item)) writeByte(itemStack.item.count) writeNBT(itemStack.getNBT())