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 1/2] 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); + } +} From 6593b6a5cf432dcdc953f44ea85049a56a4b2eb3 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 7 Oct 2023 17:42:04 -0400 Subject: [PATCH 2/2] Preserve rotation --- .../ServerGamePacketListenerImplMixin.java | 8 ++++++++ 1 file changed, 8 insertions(+) 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 index 8a716de8..3e842208 100644 --- 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 @@ -18,7 +18,15 @@ public class ServerGamePacketListenerImplMixin { if(player == this.player) { // use positionRider Vec3 oldPos = this.player.position(); + yRot = this.player.yRot; + xRot = this.player.xRot; + float yHeadRot = this.player.getYHeadRot(); this.player.getRootVehicle().positionRider(this.player); + // keep old rotation + this.player.yRot = yRot; + this.player.xRot = xRot; + this.player.setYHeadRot(yHeadRot); + // save old position this.player.xo = oldPos.x; this.player.yo = oldPos.y; this.player.zo = oldPos.z;