From f5063bf955ab587ece60a066974c40ac1d693156 Mon Sep 17 00:00:00 2001 From: zimzaza4 <3625282098@qq.com> Date: Wed, 24 Jul 2024 14:06:15 +0800 Subject: [PATCH] huh --- .../geyserutils/geyser/GeyserUtils.java | 1 + .../zimzaza4/geyserutils/geyser/MountFix.java | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 geyser/src/main/java/me/zimzaza4/geyserutils/geyser/MountFix.java diff --git a/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/GeyserUtils.java b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/GeyserUtils.java index 49236d4..551e62d 100644 --- a/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/GeyserUtils.java +++ b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/GeyserUtils.java @@ -112,6 +112,7 @@ public class GeyserUtils implements Extension { replaceTranslator(); logger().info("Defined " + LOADED_ENTITY_DEFINITIONS.size() + " entities"); particlesMappings.read(dataFolder().resolve("item_particles_mappings.json")); + MountFix.start(); } // the static here is crazy ;( diff --git a/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/MountFix.java b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/MountFix.java new file mode 100644 index 0000000..896972d --- /dev/null +++ b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/MountFix.java @@ -0,0 +1,39 @@ +package me.zimzaza4.geyserutils.geyser; + +import org.cloudburstmc.protocol.bedrock.data.entity.EntityLinkData; +import org.cloudburstmc.protocol.bedrock.packet.SetEntityLinkPacket; +import org.geysermc.geyser.GeyserImpl; +import org.geysermc.geyser.entity.EntityDefinition; +import org.geysermc.geyser.entity.EntityDefinitions; +import org.geysermc.geyser.entity.type.Entity; +import org.geysermc.geyser.session.GeyserSession; + +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +public class MountFix { + + public static void start() { + // just keep send SetEntityLinkPacket to fix the mount bug + // https://github.com/GeyserMC/Geyser/issues/3302 + // if the vehicle is too fast, the problem appear + Executors.newSingleThreadScheduledExecutor() + .scheduleAtFixedRate(() -> { + for (GeyserSession session : GeyserImpl.getInstance().onlineConnections()) { + Entity v = session.getPlayerEntity().getVehicle(); + if (v != null && v.getDefinition() == EntityDefinitions.ARMOR_STAND) { + long vehicleBedrockId = v.getGeyserId(); + if (session.getPlayerEntity().getVehicle().getGeyserId() == vehicleBedrockId) { + // The Bedrock client, as of 1.19.51, dismounts on its end. The server may not agree with this. + // If the server doesn't agree with our dismount (sends a packet saying we dismounted), + // then remount the player. + SetEntityLinkPacket linkPacket = new SetEntityLinkPacket(); + linkPacket.setEntityLink(new EntityLinkData(vehicleBedrockId, session.getPlayerEntity().getGeyserId(), EntityLinkData.Type.RIDER, true, false)); + session.sendUpstreamPacket(linkPacket); + } + } + } + }, 2000, 80, TimeUnit.MILLISECONDS); + } + +}