diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index 7a4a8ff6f0c..b95b5af8d23 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -602,6 +602,13 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { @Setter private @Nullable ItemData currentBook = null; + /** + * Stores if we've sent AvailibleCommandsPacket to the client due to it crashing if sent twice on 1.20.70/71 + * Hopefully bedrock will have a hotfix so we can remove this + */ + @Setter + private boolean sentAvailibleCommands = false; + private final GeyserCameraData cameraData; private final GeyserEntityData entityData; diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCommandsTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCommandsTranslator.java index 0d7f45c7dd9..7ded656dd33 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCommandsTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCommandsTranslator.java @@ -46,6 +46,7 @@ import org.geysermc.geyser.api.event.java.ServerDefineCommandsEvent; import org.geysermc.geyser.command.GeyserCommandManager; import org.geysermc.geyser.inventory.item.Enchantment; +import org.geysermc.geyser.network.GameProtocol; import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.session.GeyserSession; @@ -115,6 +116,12 @@ public void translate(GeyserSession session, ClientboundCommandsPacket packet) { return; } + // Don't send command suggestions if they are already sent and the client is 1.20.70 or higher due to crash bug + // TODO: Remove this check when the crash bug is fixed + if (session.isSentAvailibleCommands() && !GameProtocol.isPre1_20_70(session)) { + return; + } + GeyserCommandManager manager = session.getGeyser().commandManager(); CommandNode[] nodes = packet.getNodes(); List commandData = new ArrayList<>(); @@ -191,6 +198,7 @@ public void translate(GeyserSession session, ClientboundCommandsPacket packet) { // Finally, send the commands to the client session.sendUpstreamPacket(availableCommandsPacket); + session.setSentAvailibleCommands(true); } /**