From 204c8b78c44c68fd4bca1814864566a4094c2164 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 7 Oct 2023 17:27:23 -0400 Subject: [PATCH] Fix lag caused by Forge vehicle resync patch This patch previously set the player to the entity's position, which is not always correct for entities that position the player at an offset (e.g. boats with two entities). Move the player using positionRider() instead Original PR: https://github.com/MinecraftForge/MinecraftForge/pull/5160 --- .../ServerGamePacketListenerImplMixin.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/forge_vehicle_packets/ServerGamePacketListenerImplMixin.java diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/forge_vehicle_packets/ServerGamePacketListenerImplMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/forge_vehicle_packets/ServerGamePacketListenerImplMixin.java new file mode 100644 index 00000000..8a716de8 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/forge_vehicle_packets/ServerGamePacketListenerImplMixin.java @@ -0,0 +1,28 @@ +package org.embeddedt.modernfix.forge.mixin.bugfix.forge_vehicle_packets; + +import net.minecraft.network.protocol.game.ServerboundMoveVehiclePacket; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.ServerGamePacketListenerImpl; +import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(ServerGamePacketListenerImpl.class) +public class ServerGamePacketListenerImplMixin { + @Shadow public ServerPlayer player; + + @Redirect(method = "handleMoveVehicle", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;absMoveTo(DDDFF)V")) + private void movePlayerUsingPositionRider(ServerPlayer player, double x, double y, double z, float yRot, float xRot, ServerboundMoveVehiclePacket packet) { + if(player == this.player) { + // use positionRider + Vec3 oldPos = this.player.position(); + this.player.getRootVehicle().positionRider(this.player); + this.player.xo = oldPos.x; + this.player.yo = oldPos.y; + this.player.zo = oldPos.z; + } else + player.absMoveTo(x, y, z, yRot, xRot); + } +}