Last active
February 7, 2026 16:07
-
-
Save tildejustin/1b05239c1607bc9ceb2c3777231573eb to your computer and use it in GitHub Desktop.
sneak clutch fix
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| package dev.tildejustin.xrayfix.mixin; | |
| import com.llamalad7.mixinextras.sugar.*; | |
| import com.llamalad7.mixinextras.sugar.ref.LocalRef; | |
| import dev.tildejustin.xrayfix.mixin.accessor.EntityAccessor; | |
| import net.minecraft.server.network.*; | |
| import net.minecraft.util.math.*; | |
| import org.spongepowered.asm.mixin.*; | |
| import org.spongepowered.asm.mixin.injection.*; | |
| @Mixin(ServerPlayNetworkHandler.class) | |
| public abstract class ServerPlayNetworkHandlerMixin { | |
| @Shadow | |
| public ServerPlayerEntity player; | |
| @ModifyArg(method = "onPlayerMove", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayerEntity;move(Lnet/minecraft/entity/MovementType;Lnet/minecraft/util/math/Vec3d;)V")) | |
| private Vec3d captureTargetMovementVector(Vec3d original, @Share("x") LocalRef<Double> sharedX, @Share("z") LocalRef<Double> sharedZ) { | |
| sharedX.set(this.player.getX()); | |
| sharedZ.set(this.player.getZ()); | |
| // calculates the player x & z position that would be set by Player#move if the player wasn't sneaking | |
| Vec3d movement = original, movementMultiplier = ((EntityAccessor) this.player).getMovementMultiplier(); | |
| if (movementMultiplier.lengthSquared() > 1e-7) { | |
| movement = movement.multiply(movementMultiplier); | |
| } | |
| /* movement = this.adjustMovementForSneaking(movement, type); */ | |
| Vec3d vec3d = ((EntityAccessor) this.player).callAdjustMovementForCollisions(movement); | |
| if (vec3d.lengthSquared() > 1e-7) { | |
| Box box = this.player.getBoundingBox().offset(vec3d); | |
| // Entity#moveToBoundingBoxCenter | |
| sharedX.set((box.minX + box.maxX) / 2); | |
| sharedZ.set((box.minZ + box.maxZ) / 2); | |
| } | |
| return original; | |
| } | |
| @ModifyVariable( | |
| method = "onPlayerMove", | |
| at = @At(value = "LOAD"), | |
| ordinal = 11, | |
| slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayerEntity;move(Lnet/minecraft/entity/MovementType;Lnet/minecraft/util/math/Vec3d;)V")) | |
| ) | |
| private double qAfterMove( | |
| double original, | |
| @Local(ordinal = 4) double h, | |
| @Local(ordinal = 6) double j, | |
| @Local(ordinal = 8) double n, | |
| @Share("x") LocalRef<Double> sharedX, | |
| @Share("z") LocalRef<Double> sharedZ) { | |
| if (original <= 0.0625) return original; | |
| if (player.noClip) return original; | |
| if (!this.player.isSneaking() || this.player.isOnGround()) return original; | |
| double x = sharedX.get(), z = sharedZ.get(); | |
| double q = (h - x) * (h - x) * n * n * (j - z) * (j - z); | |
| System.out.println("Would have warped back when sneaking, trying movement without sneaking: " + q); | |
| return q; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment