From cb974340f842c4c71d855251b8c1c93a87c84214 Mon Sep 17 00:00:00 2001 From: mincomk Date: Sat, 31 May 2025 16:14:27 +0900 Subject: [PATCH] f --- README.md | 8 +- .../ServerPlayerNetworkHandlerMixin.java | 308 +++++++++--------- .../resources/mountteleportfix.accesswidener | 44 +-- 3 files changed, 180 insertions(+), 180 deletions(-) diff --git a/README.md b/README.md index 56cb7c9..5c95156 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -# MountTeleportFix -1.21.4 Fabric mod for fixing MC-277807 bug. - -## Installation +# MountTeleportFix +1.21.4 Fabric mod for fixing MC-277807 bug. + +## Installation Simply drop the jar to `mods` folder (This mod is server side only). As well as the **Fabric API**. \ No newline at end of file diff --git a/src/main/java/org/walruslab/mountteleportfix/mixin/ServerPlayerNetworkHandlerMixin.java b/src/main/java/org/walruslab/mountteleportfix/mixin/ServerPlayerNetworkHandlerMixin.java index 9c7de62..f84f29f 100644 --- a/src/main/java/org/walruslab/mountteleportfix/mixin/ServerPlayerNetworkHandlerMixin.java +++ b/src/main/java/org/walruslab/mountteleportfix/mixin/ServerPlayerNetworkHandlerMixin.java @@ -1,154 +1,154 @@ -package org.walruslab.mountteleportfix.mixin; - -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import net.minecraft.entity.MovementType; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.network.NetworkThreadUtils; -import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; -import net.minecraft.server.network.ServerPlayNetworkHandler; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.text.Text; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(ServerPlayNetworkHandler.class) -public class ServerPlayerNetworkHandlerMixin { - /** - * @author MincoMK - * @reason Fix MC-277807 - */ - @Overwrite - public void onPlayerMove(PlayerMoveC2SPacket packet) { - ServerPlayNetworkHandler self = (ServerPlayNetworkHandler) (Object) this; - - NetworkThreadUtils.forceMainThread(packet, self, self.player.getServerWorld()); - if (ServerPlayNetworkHandler.isMovementInvalid(packet.getX(0.0), packet.getY(0.0), packet.getZ(0.0), packet.getYaw(0.0F), packet.getPitch(0.0F))) { - self.disconnect(Text.translatable("multiplayer.disconnect.invalid_player_movement")); - } else { - ServerWorld serverWorld = self.player.getServerWorld(); - if (!self.player.notInAnyWorld) { - if (self.ticks == 0) { - self.syncWithPlayerPosition(); - } - - if (self.player.isLoaded()) { - float f = MathHelper.wrapDegrees(packet.getYaw(self.player.getYaw())); - float g = MathHelper.wrapDegrees(packet.getPitch(self.player.getPitch())); - if (self.handlePendingTeleport()) { - self.player.setAngles(f, g); - } else { - double d = ServerPlayNetworkHandler.clampHorizontal(packet.getX(self.player.getX())); - double e = ServerPlayNetworkHandler.clampVertical(packet.getY(self.player.getY())); - double h = ServerPlayNetworkHandler.clampHorizontal(packet.getZ(self.player.getZ())); - if (self.player.hasVehicle()) { - self.player.updatePositionAndAngles(self.player.getX(), self.player.getY(), self.player.getZ(), f, g); - self.player.getServerWorld().getChunkManager().updatePosition(self.player); - } else { - double i = self.player.getX(); - double j = self.player.getY(); - double k = self.player.getZ(); - double l = d - self.lastTickX; - double m = e - self.lastTickY; - double n = h - self.lastTickZ; - double o = self.player.getVelocity().lengthSquared(); - double p = l * l + m * m + n * n; - if (self.player.isSleeping()) { - if (p > 1.0) { - self.requestTeleport(self.player.getX(), self.player.getY(), self.player.getZ(), f, g); - } - } else { - boolean bl = self.player.isGliding(); - if (serverWorld.getTickManager().shouldTick()) { - self.movePacketsCount++; - int q = self.movePacketsCount - self.lastTickMovePacketsCount; - if (q > 5) { - ServerPlayNetworkHandler.LOGGER.debug("{} is sending move packets too frequently ({} packets since last tick)", self.player.getName().getString(), q); - q = 1; - } - - if (self.shouldCheckMovement(bl)) { - float r = bl ? 300.0F : 100.0F; - if (p - o > r * q) { - ServerPlayNetworkHandler.LOGGER.warn("{} moved too quickly! {},{},{}", self.player.getName().getString(), l, m, n); - self.requestTeleport(self.player.getX(), self.player.getY(), self.player.getZ(), self.player.getYaw(), self.player.getPitch()); - return; - } - } - } - - Box box = self.player.getBoundingBox(); - l = d - self.updatedX; - m = e - self.updatedY; - n = h - self.updatedZ; - boolean bl2 = m > 0.0; - if (self.player.isOnGround() && !packet.isOnGround() && bl2) { - self.player.jump(); - } - - boolean bl3 = self.player.groundCollision; - self.player.move(MovementType.PLAYER, new Vec3d(l, m, n)); - l = d - self.player.getX(); - m = e - self.player.getY(); - if (m > -0.5 || m < 0.5) { - m = 0.0; - } - - n = h - self.player.getZ(); - p = l * l + m * m + n * n; - boolean bl4 = false; - if (!self.player.isInTeleportationState() && p > 0.0625 && !self.player.isSleeping() && !self.player.isCreative() && !self.player.isSpectator()) { - bl4 = true; - ServerPlayNetworkHandler.LOGGER.warn("{} moved wrongly!", self.player.getName().getString()); - } - - if (self.player.noClip - || self.player.isSleeping() - || (!bl4 || !serverWorld.isSpaceEmpty(self.player, box)) && !self.isPlayerNotCollidingWithBlocks(serverWorld, box, d, e, h)) { - self.player.updatePositionAndAngles(d, e, h, f, g); - boolean bl5 = self.player.isUsingRiptide(); - self.floating = m >= -0.03125 - && !bl3 - && !self.player.isSpectator() - && !self.server.isFlightEnabled() - && !self.player.getAbilities().allowFlying - && !self.player.hasStatusEffect(StatusEffects.LEVITATION) - && !bl - && !bl5 - && self.isEntityOnAir(self.player); - self.player.getServerWorld().getChunkManager().updatePosition(self.player); - Vec3d vec3d = new Vec3d(self.player.getX() - i, self.player.getY() - j, self.player.getZ() - k); - self.player.setMovement(packet.isOnGround(), packet.horizontalCollision(), vec3d); - self.player.handleFall(vec3d.x, vec3d.y, vec3d.z, packet.isOnGround()); - self.handleMovement(vec3d); - if (bl2) { - self.player.onLanding(); - } - - if (packet.isOnGround() || self.player.hasLandedInFluid() || self.player.isClimbing() || self.player.isSpectator() || bl || bl5) { - self.player.tryClearCurrentExplosion(); - } - - self.player.increaseTravelMotionStats(self.player.getX() - i, self.player.getY() - j, self.player.getZ() - k); - self.updatedX = self.player.getX(); - self.updatedY = self.player.getY(); - self.updatedZ = self.player.getZ(); - } else { - self.requestTeleport(i, j, k, f, g); - self.player.handleFall(self.player.getX() - i, self.player.getY() - j, self.player.getZ() - k, packet.isOnGround()); - - if (!self.player.queuedCollisionChecks.isEmpty()) { - self.player.queuedCollisionChecks.removeLast(); - } - } - } - } - } - } - } - } - } -} +package org.walruslab.mountteleportfix.mixin; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import net.minecraft.entity.MovementType; +import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.network.NetworkThreadUtils; +import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; +import net.minecraft.server.network.ServerPlayNetworkHandler; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.text.Text; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(ServerPlayNetworkHandler.class) +public class ServerPlayerNetworkHandlerMixin { + /** + * @author MincoMK + * @reason Fix MC-277807 + */ + @Overwrite + public void onPlayerMove(PlayerMoveC2SPacket packet) { + ServerPlayNetworkHandler self = (ServerPlayNetworkHandler) (Object) this; + + NetworkThreadUtils.forceMainThread(packet, self, self.player.getServerWorld()); + if (ServerPlayNetworkHandler.isMovementInvalid(packet.getX(0.0), packet.getY(0.0), packet.getZ(0.0), packet.getYaw(0.0F), packet.getPitch(0.0F))) { + self.disconnect(Text.translatable("multiplayer.disconnect.invalid_player_movement")); + } else { + ServerWorld serverWorld = self.player.getServerWorld(); + if (!self.player.notInAnyWorld) { + if (self.ticks == 0) { + self.syncWithPlayerPosition(); + } + + if (self.player.isLoaded()) { + float f = MathHelper.wrapDegrees(packet.getYaw(self.player.getYaw())); + float g = MathHelper.wrapDegrees(packet.getPitch(self.player.getPitch())); + if (self.handlePendingTeleport()) { + self.player.setAngles(f, g); + } else { + double d = ServerPlayNetworkHandler.clampHorizontal(packet.getX(self.player.getX())); + double e = ServerPlayNetworkHandler.clampVertical(packet.getY(self.player.getY())); + double h = ServerPlayNetworkHandler.clampHorizontal(packet.getZ(self.player.getZ())); + if (self.player.hasVehicle()) { + self.player.updatePositionAndAngles(self.player.getX(), self.player.getY(), self.player.getZ(), f, g); + self.player.getServerWorld().getChunkManager().updatePosition(self.player); + } else { + double i = self.player.getX(); + double j = self.player.getY(); + double k = self.player.getZ(); + double l = d - self.lastTickX; + double m = e - self.lastTickY; + double n = h - self.lastTickZ; + double o = self.player.getVelocity().lengthSquared(); + double p = l * l + m * m + n * n; + if (self.player.isSleeping()) { + if (p > 1.0) { + self.requestTeleport(self.player.getX(), self.player.getY(), self.player.getZ(), f, g); + } + } else { + boolean bl = self.player.isGliding(); + if (serverWorld.getTickManager().shouldTick()) { + self.movePacketsCount++; + int q = self.movePacketsCount - self.lastTickMovePacketsCount; + if (q > 5) { + ServerPlayNetworkHandler.LOGGER.debug("{} is sending move packets too frequently ({} packets since last tick)", self.player.getName().getString(), q); + q = 1; + } + + if (self.shouldCheckMovement(bl)) { + float r = bl ? 300.0F : 100.0F; + if (p - o > r * q) { + ServerPlayNetworkHandler.LOGGER.warn("{} moved too quickly! {},{},{}", self.player.getName().getString(), l, m, n); + self.requestTeleport(self.player.getX(), self.player.getY(), self.player.getZ(), self.player.getYaw(), self.player.getPitch()); + return; + } + } + } + + Box box = self.player.getBoundingBox(); + l = d - self.updatedX; + m = e - self.updatedY; + n = h - self.updatedZ; + boolean bl2 = m > 0.0; + if (self.player.isOnGround() && !packet.isOnGround() && bl2) { + self.player.jump(); + } + + boolean bl3 = self.player.groundCollision; + self.player.move(MovementType.PLAYER, new Vec3d(l, m, n)); + l = d - self.player.getX(); + m = e - self.player.getY(); + if (m > -0.5 || m < 0.5) { + m = 0.0; + } + + n = h - self.player.getZ(); + p = l * l + m * m + n * n; + boolean bl4 = false; + if (!self.player.isInTeleportationState() && p > 0.0625 && !self.player.isSleeping() && !self.player.isCreative() && !self.player.isSpectator()) { + bl4 = true; + ServerPlayNetworkHandler.LOGGER.warn("{} moved wrongly!", self.player.getName().getString()); + } + + if (self.player.noClip + || self.player.isSleeping() + || (!bl4 || !serverWorld.isSpaceEmpty(self.player, box)) && !self.isPlayerNotCollidingWithBlocks(serverWorld, box, d, e, h)) { + self.player.updatePositionAndAngles(d, e, h, f, g); + boolean bl5 = self.player.isUsingRiptide(); + self.floating = m >= -0.03125 + && !bl3 + && !self.player.isSpectator() + && !self.server.isFlightEnabled() + && !self.player.getAbilities().allowFlying + && !self.player.hasStatusEffect(StatusEffects.LEVITATION) + && !bl + && !bl5 + && self.isEntityOnAir(self.player); + self.player.getServerWorld().getChunkManager().updatePosition(self.player); + Vec3d vec3d = new Vec3d(self.player.getX() - i, self.player.getY() - j, self.player.getZ() - k); + self.player.setMovement(packet.isOnGround(), packet.horizontalCollision(), vec3d); + self.player.handleFall(vec3d.x, vec3d.y, vec3d.z, packet.isOnGround()); + self.handleMovement(vec3d); + if (bl2) { + self.player.onLanding(); + } + + if (packet.isOnGround() || self.player.hasLandedInFluid() || self.player.isClimbing() || self.player.isSpectator() || bl || bl5) { + self.player.tryClearCurrentExplosion(); + } + + self.player.increaseTravelMotionStats(self.player.getX() - i, self.player.getY() - j, self.player.getZ() - k); + self.updatedX = self.player.getX(); + self.updatedY = self.player.getY(); + self.updatedZ = self.player.getZ(); + } else { + self.requestTeleport(i, j, k, f, g); + self.player.handleFall(self.player.getX() - i, self.player.getY() - j, self.player.getZ() - k, packet.isOnGround()); + + if (!self.player.queuedCollisionChecks.isEmpty()) { + self.player.queuedCollisionChecks.removeLast(); + } + } + } + } + } + } + } + } + } +} diff --git a/src/main/resources/mountteleportfix.accesswidener b/src/main/resources/mountteleportfix.accesswidener index f7d080a..1c49a68 100644 --- a/src/main/resources/mountteleportfix.accesswidener +++ b/src/main/resources/mountteleportfix.accesswidener @@ -1,23 +1,23 @@ -accessWidener v2 named - -accessible method net/minecraft/server/network/ServerPlayNetworkHandler handlePendingTeleport ()Z -accessible method net/minecraft/server/network/ServerPlayNetworkHandler isMovementInvalid (DDDFF)Z -accessible method net/minecraft/server/network/ServerPlayNetworkHandler clampHorizontal (D)D -accessible method net/minecraft/server/network/ServerPlayNetworkHandler clampVertical (D)D -accessible field net/minecraft/server/network/ServerPlayNetworkHandler lastTickX D -accessible field net/minecraft/server/network/ServerPlayNetworkHandler lastTickY D -accessible field net/minecraft/server/network/ServerPlayNetworkHandler lastTickZ D -accessible field net/minecraft/server/network/ServerPlayNetworkHandler movePacketsCount I -accessible field net/minecraft/server/network/ServerPlayNetworkHandler lastTickMovePacketsCount I -accessible field net/minecraft/server/network/ServerPlayNetworkHandler LOGGER Lorg/slf4j/Logger; -accessible method net/minecraft/server/network/ServerPlayNetworkHandler shouldCheckMovement (Z)Z -accessible field net/minecraft/server/network/ServerPlayNetworkHandler updatedX D -accessible field net/minecraft/server/network/ServerPlayNetworkHandler updatedY D -accessible field net/minecraft/server/network/ServerPlayNetworkHandler updatedZ D -accessible field net/minecraft/server/network/ServerPlayNetworkHandler floating Z -accessible field net/minecraft/server/network/ServerCommonNetworkHandler server Lnet/minecraft/server/MinecraftServer; -accessible method net/minecraft/server/network/ServerPlayNetworkHandler handleMovement (Lnet/minecraft/util/math/Vec3d;)V -accessible method net/minecraft/server/network/ServerPlayNetworkHandler isEntityOnAir (Lnet/minecraft/entity/Entity;)Z -accessible method net/minecraft/server/network/ServerPlayNetworkHandler isPlayerNotCollidingWithBlocks (Lnet/minecraft/world/WorldView;Lnet/minecraft/util/math/Box;DDD)Z -accessible field net/minecraft/server/network/ServerPlayNetworkHandler ticks I +accessWidener v2 named + +accessible method net/minecraft/server/network/ServerPlayNetworkHandler handlePendingTeleport ()Z +accessible method net/minecraft/server/network/ServerPlayNetworkHandler isMovementInvalid (DDDFF)Z +accessible method net/minecraft/server/network/ServerPlayNetworkHandler clampHorizontal (D)D +accessible method net/minecraft/server/network/ServerPlayNetworkHandler clampVertical (D)D +accessible field net/minecraft/server/network/ServerPlayNetworkHandler lastTickX D +accessible field net/minecraft/server/network/ServerPlayNetworkHandler lastTickY D +accessible field net/minecraft/server/network/ServerPlayNetworkHandler lastTickZ D +accessible field net/minecraft/server/network/ServerPlayNetworkHandler movePacketsCount I +accessible field net/minecraft/server/network/ServerPlayNetworkHandler lastTickMovePacketsCount I +accessible field net/minecraft/server/network/ServerPlayNetworkHandler LOGGER Lorg/slf4j/Logger; +accessible method net/minecraft/server/network/ServerPlayNetworkHandler shouldCheckMovement (Z)Z +accessible field net/minecraft/server/network/ServerPlayNetworkHandler updatedX D +accessible field net/minecraft/server/network/ServerPlayNetworkHandler updatedY D +accessible field net/minecraft/server/network/ServerPlayNetworkHandler updatedZ D +accessible field net/minecraft/server/network/ServerPlayNetworkHandler floating Z +accessible field net/minecraft/server/network/ServerCommonNetworkHandler server Lnet/minecraft/server/MinecraftServer; +accessible method net/minecraft/server/network/ServerPlayNetworkHandler handleMovement (Lnet/minecraft/util/math/Vec3d;)V +accessible method net/minecraft/server/network/ServerPlayNetworkHandler isEntityOnAir (Lnet/minecraft/entity/Entity;)Z +accessible method net/minecraft/server/network/ServerPlayNetworkHandler isPlayerNotCollidingWithBlocks (Lnet/minecraft/world/WorldView;Lnet/minecraft/util/math/Box;DDD)Z +accessible field net/minecraft/server/network/ServerPlayNetworkHandler ticks I accessible field net/minecraft/entity/Entity queuedCollisionChecks Ljava/util/List; \ No newline at end of file