f
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
# MountTeleportFix
|
# MountTeleportFix
|
||||||
1.21.4 Fabric mod for fixing MC-277807 bug.
|
1.21.4 Fabric mod for fixing MC-277807 bug.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
Simply drop the jar to `mods` folder (This mod is server side only). As well as the **Fabric API**.
|
Simply drop the jar to `mods` folder (This mod is server side only). As well as the **Fabric API**.
|
||||||
@@ -1,154 +1,154 @@
|
|||||||
package org.walruslab.mountteleportfix.mixin;
|
package org.walruslab.mountteleportfix.mixin;
|
||||||
|
|
||||||
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
|
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
|
||||||
import net.minecraft.entity.MovementType;
|
import net.minecraft.entity.MovementType;
|
||||||
import net.minecraft.entity.effect.StatusEffects;
|
import net.minecraft.entity.effect.StatusEffects;
|
||||||
import net.minecraft.network.NetworkThreadUtils;
|
import net.minecraft.network.NetworkThreadUtils;
|
||||||
import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket;
|
import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket;
|
||||||
import net.minecraft.server.network.ServerPlayNetworkHandler;
|
import net.minecraft.server.network.ServerPlayNetworkHandler;
|
||||||
import net.minecraft.server.world.ServerWorld;
|
import net.minecraft.server.world.ServerWorld;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
import net.minecraft.util.math.Box;
|
import net.minecraft.util.math.Box;
|
||||||
import net.minecraft.util.math.MathHelper;
|
import net.minecraft.util.math.MathHelper;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Overwrite;
|
import org.spongepowered.asm.mixin.Overwrite;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
|
||||||
@Mixin(ServerPlayNetworkHandler.class)
|
@Mixin(ServerPlayNetworkHandler.class)
|
||||||
public class ServerPlayerNetworkHandlerMixin {
|
public class ServerPlayerNetworkHandlerMixin {
|
||||||
/**
|
/**
|
||||||
* @author MincoMK
|
* @author MincoMK
|
||||||
* @reason Fix MC-277807
|
* @reason Fix MC-277807
|
||||||
*/
|
*/
|
||||||
@Overwrite
|
@Overwrite
|
||||||
public void onPlayerMove(PlayerMoveC2SPacket packet) {
|
public void onPlayerMove(PlayerMoveC2SPacket packet) {
|
||||||
ServerPlayNetworkHandler self = (ServerPlayNetworkHandler) (Object) this;
|
ServerPlayNetworkHandler self = (ServerPlayNetworkHandler) (Object) this;
|
||||||
|
|
||||||
NetworkThreadUtils.forceMainThread(packet, self, self.player.getServerWorld());
|
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))) {
|
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"));
|
self.disconnect(Text.translatable("multiplayer.disconnect.invalid_player_movement"));
|
||||||
} else {
|
} else {
|
||||||
ServerWorld serverWorld = self.player.getServerWorld();
|
ServerWorld serverWorld = self.player.getServerWorld();
|
||||||
if (!self.player.notInAnyWorld) {
|
if (!self.player.notInAnyWorld) {
|
||||||
if (self.ticks == 0) {
|
if (self.ticks == 0) {
|
||||||
self.syncWithPlayerPosition();
|
self.syncWithPlayerPosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self.player.isLoaded()) {
|
if (self.player.isLoaded()) {
|
||||||
float f = MathHelper.wrapDegrees(packet.getYaw(self.player.getYaw()));
|
float f = MathHelper.wrapDegrees(packet.getYaw(self.player.getYaw()));
|
||||||
float g = MathHelper.wrapDegrees(packet.getPitch(self.player.getPitch()));
|
float g = MathHelper.wrapDegrees(packet.getPitch(self.player.getPitch()));
|
||||||
if (self.handlePendingTeleport()) {
|
if (self.handlePendingTeleport()) {
|
||||||
self.player.setAngles(f, g);
|
self.player.setAngles(f, g);
|
||||||
} else {
|
} else {
|
||||||
double d = ServerPlayNetworkHandler.clampHorizontal(packet.getX(self.player.getX()));
|
double d = ServerPlayNetworkHandler.clampHorizontal(packet.getX(self.player.getX()));
|
||||||
double e = ServerPlayNetworkHandler.clampVertical(packet.getY(self.player.getY()));
|
double e = ServerPlayNetworkHandler.clampVertical(packet.getY(self.player.getY()));
|
||||||
double h = ServerPlayNetworkHandler.clampHorizontal(packet.getZ(self.player.getZ()));
|
double h = ServerPlayNetworkHandler.clampHorizontal(packet.getZ(self.player.getZ()));
|
||||||
if (self.player.hasVehicle()) {
|
if (self.player.hasVehicle()) {
|
||||||
self.player.updatePositionAndAngles(self.player.getX(), self.player.getY(), self.player.getZ(), f, g);
|
self.player.updatePositionAndAngles(self.player.getX(), self.player.getY(), self.player.getZ(), f, g);
|
||||||
self.player.getServerWorld().getChunkManager().updatePosition(self.player);
|
self.player.getServerWorld().getChunkManager().updatePosition(self.player);
|
||||||
} else {
|
} else {
|
||||||
double i = self.player.getX();
|
double i = self.player.getX();
|
||||||
double j = self.player.getY();
|
double j = self.player.getY();
|
||||||
double k = self.player.getZ();
|
double k = self.player.getZ();
|
||||||
double l = d - self.lastTickX;
|
double l = d - self.lastTickX;
|
||||||
double m = e - self.lastTickY;
|
double m = e - self.lastTickY;
|
||||||
double n = h - self.lastTickZ;
|
double n = h - self.lastTickZ;
|
||||||
double o = self.player.getVelocity().lengthSquared();
|
double o = self.player.getVelocity().lengthSquared();
|
||||||
double p = l * l + m * m + n * n;
|
double p = l * l + m * m + n * n;
|
||||||
if (self.player.isSleeping()) {
|
if (self.player.isSleeping()) {
|
||||||
if (p > 1.0) {
|
if (p > 1.0) {
|
||||||
self.requestTeleport(self.player.getX(), self.player.getY(), self.player.getZ(), f, g);
|
self.requestTeleport(self.player.getX(), self.player.getY(), self.player.getZ(), f, g);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
boolean bl = self.player.isGliding();
|
boolean bl = self.player.isGliding();
|
||||||
if (serverWorld.getTickManager().shouldTick()) {
|
if (serverWorld.getTickManager().shouldTick()) {
|
||||||
self.movePacketsCount++;
|
self.movePacketsCount++;
|
||||||
int q = self.movePacketsCount - self.lastTickMovePacketsCount;
|
int q = self.movePacketsCount - self.lastTickMovePacketsCount;
|
||||||
if (q > 5) {
|
if (q > 5) {
|
||||||
ServerPlayNetworkHandler.LOGGER.debug("{} is sending move packets too frequently ({} packets since last tick)", self.player.getName().getString(), q);
|
ServerPlayNetworkHandler.LOGGER.debug("{} is sending move packets too frequently ({} packets since last tick)", self.player.getName().getString(), q);
|
||||||
q = 1;
|
q = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self.shouldCheckMovement(bl)) {
|
if (self.shouldCheckMovement(bl)) {
|
||||||
float r = bl ? 300.0F : 100.0F;
|
float r = bl ? 300.0F : 100.0F;
|
||||||
if (p - o > r * q) {
|
if (p - o > r * q) {
|
||||||
ServerPlayNetworkHandler.LOGGER.warn("{} moved too quickly! {},{},{}", self.player.getName().getString(), l, m, n);
|
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());
|
self.requestTeleport(self.player.getX(), self.player.getY(), self.player.getZ(), self.player.getYaw(), self.player.getPitch());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Box box = self.player.getBoundingBox();
|
Box box = self.player.getBoundingBox();
|
||||||
l = d - self.updatedX;
|
l = d - self.updatedX;
|
||||||
m = e - self.updatedY;
|
m = e - self.updatedY;
|
||||||
n = h - self.updatedZ;
|
n = h - self.updatedZ;
|
||||||
boolean bl2 = m > 0.0;
|
boolean bl2 = m > 0.0;
|
||||||
if (self.player.isOnGround() && !packet.isOnGround() && bl2) {
|
if (self.player.isOnGround() && !packet.isOnGround() && bl2) {
|
||||||
self.player.jump();
|
self.player.jump();
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean bl3 = self.player.groundCollision;
|
boolean bl3 = self.player.groundCollision;
|
||||||
self.player.move(MovementType.PLAYER, new Vec3d(l, m, n));
|
self.player.move(MovementType.PLAYER, new Vec3d(l, m, n));
|
||||||
l = d - self.player.getX();
|
l = d - self.player.getX();
|
||||||
m = e - self.player.getY();
|
m = e - self.player.getY();
|
||||||
if (m > -0.5 || m < 0.5) {
|
if (m > -0.5 || m < 0.5) {
|
||||||
m = 0.0;
|
m = 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
n = h - self.player.getZ();
|
n = h - self.player.getZ();
|
||||||
p = l * l + m * m + n * n;
|
p = l * l + m * m + n * n;
|
||||||
boolean bl4 = false;
|
boolean bl4 = false;
|
||||||
if (!self.player.isInTeleportationState() && p > 0.0625 && !self.player.isSleeping() && !self.player.isCreative() && !self.player.isSpectator()) {
|
if (!self.player.isInTeleportationState() && p > 0.0625 && !self.player.isSleeping() && !self.player.isCreative() && !self.player.isSpectator()) {
|
||||||
bl4 = true;
|
bl4 = true;
|
||||||
ServerPlayNetworkHandler.LOGGER.warn("{} moved wrongly!", self.player.getName().getString());
|
ServerPlayNetworkHandler.LOGGER.warn("{} moved wrongly!", self.player.getName().getString());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self.player.noClip
|
if (self.player.noClip
|
||||||
|| self.player.isSleeping()
|
|| self.player.isSleeping()
|
||||||
|| (!bl4 || !serverWorld.isSpaceEmpty(self.player, box)) && !self.isPlayerNotCollidingWithBlocks(serverWorld, box, d, e, h)) {
|
|| (!bl4 || !serverWorld.isSpaceEmpty(self.player, box)) && !self.isPlayerNotCollidingWithBlocks(serverWorld, box, d, e, h)) {
|
||||||
self.player.updatePositionAndAngles(d, e, h, f, g);
|
self.player.updatePositionAndAngles(d, e, h, f, g);
|
||||||
boolean bl5 = self.player.isUsingRiptide();
|
boolean bl5 = self.player.isUsingRiptide();
|
||||||
self.floating = m >= -0.03125
|
self.floating = m >= -0.03125
|
||||||
&& !bl3
|
&& !bl3
|
||||||
&& !self.player.isSpectator()
|
&& !self.player.isSpectator()
|
||||||
&& !self.server.isFlightEnabled()
|
&& !self.server.isFlightEnabled()
|
||||||
&& !self.player.getAbilities().allowFlying
|
&& !self.player.getAbilities().allowFlying
|
||||||
&& !self.player.hasStatusEffect(StatusEffects.LEVITATION)
|
&& !self.player.hasStatusEffect(StatusEffects.LEVITATION)
|
||||||
&& !bl
|
&& !bl
|
||||||
&& !bl5
|
&& !bl5
|
||||||
&& self.isEntityOnAir(self.player);
|
&& self.isEntityOnAir(self.player);
|
||||||
self.player.getServerWorld().getChunkManager().updatePosition(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);
|
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.setMovement(packet.isOnGround(), packet.horizontalCollision(), vec3d);
|
||||||
self.player.handleFall(vec3d.x, vec3d.y, vec3d.z, packet.isOnGround());
|
self.player.handleFall(vec3d.x, vec3d.y, vec3d.z, packet.isOnGround());
|
||||||
self.handleMovement(vec3d);
|
self.handleMovement(vec3d);
|
||||||
if (bl2) {
|
if (bl2) {
|
||||||
self.player.onLanding();
|
self.player.onLanding();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packet.isOnGround() || self.player.hasLandedInFluid() || self.player.isClimbing() || self.player.isSpectator() || bl || bl5) {
|
if (packet.isOnGround() || self.player.hasLandedInFluid() || self.player.isClimbing() || self.player.isSpectator() || bl || bl5) {
|
||||||
self.player.tryClearCurrentExplosion();
|
self.player.tryClearCurrentExplosion();
|
||||||
}
|
}
|
||||||
|
|
||||||
self.player.increaseTravelMotionStats(self.player.getX() - i, self.player.getY() - j, self.player.getZ() - k);
|
self.player.increaseTravelMotionStats(self.player.getX() - i, self.player.getY() - j, self.player.getZ() - k);
|
||||||
self.updatedX = self.player.getX();
|
self.updatedX = self.player.getX();
|
||||||
self.updatedY = self.player.getY();
|
self.updatedY = self.player.getY();
|
||||||
self.updatedZ = self.player.getZ();
|
self.updatedZ = self.player.getZ();
|
||||||
} else {
|
} else {
|
||||||
self.requestTeleport(i, j, k, f, g);
|
self.requestTeleport(i, j, k, f, g);
|
||||||
self.player.handleFall(self.player.getX() - i, self.player.getY() - j, self.player.getZ() - k, packet.isOnGround());
|
self.player.handleFall(self.player.getX() - i, self.player.getY() - j, self.player.getZ() - k, packet.isOnGround());
|
||||||
|
|
||||||
if (!self.player.queuedCollisionChecks.isEmpty()) {
|
if (!self.player.queuedCollisionChecks.isEmpty()) {
|
||||||
self.player.queuedCollisionChecks.removeLast();
|
self.player.queuedCollisionChecks.removeLast();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
accessWidener v2 named
|
accessWidener v2 named
|
||||||
|
|
||||||
accessible method net/minecraft/server/network/ServerPlayNetworkHandler handlePendingTeleport ()Z
|
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 isMovementInvalid (DDDFF)Z
|
||||||
accessible method net/minecraft/server/network/ServerPlayNetworkHandler clampHorizontal (D)D
|
accessible method net/minecraft/server/network/ServerPlayNetworkHandler clampHorizontal (D)D
|
||||||
accessible method net/minecraft/server/network/ServerPlayNetworkHandler clampVertical (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 lastTickX D
|
||||||
accessible field net/minecraft/server/network/ServerPlayNetworkHandler lastTickY 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 lastTickZ D
|
||||||
accessible field net/minecraft/server/network/ServerPlayNetworkHandler movePacketsCount I
|
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 lastTickMovePacketsCount I
|
||||||
accessible field net/minecraft/server/network/ServerPlayNetworkHandler LOGGER Lorg/slf4j/Logger;
|
accessible field net/minecraft/server/network/ServerPlayNetworkHandler LOGGER Lorg/slf4j/Logger;
|
||||||
accessible method net/minecraft/server/network/ServerPlayNetworkHandler shouldCheckMovement (Z)Z
|
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 updatedX D
|
||||||
accessible field net/minecraft/server/network/ServerPlayNetworkHandler updatedY 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 updatedZ D
|
||||||
accessible field net/minecraft/server/network/ServerPlayNetworkHandler floating Z
|
accessible field net/minecraft/server/network/ServerPlayNetworkHandler floating Z
|
||||||
accessible field net/minecraft/server/network/ServerCommonNetworkHandler server Lnet/minecraft/server/MinecraftServer;
|
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 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 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 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/server/network/ServerPlayNetworkHandler ticks I
|
||||||
accessible field net/minecraft/entity/Entity queuedCollisionChecks Ljava/util/List;
|
accessible field net/minecraft/entity/Entity queuedCollisionChecks Ljava/util/List;
|
||||||
Reference in New Issue
Block a user