mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-13 10:21:13 +01:00
89d51d5f29
Because this exploit has been widely known for years and has not been fixed by Mojang, we decided that it was worth allowing people to toggle it on/off due to how easy it is to make it configurable. It should be noted that this decision does not promise all future exploits will be configurable.
109 lines
9.2 KiB
Diff
109 lines
9.2 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Moulberry <james.jenour@protonmail.com>
|
|
Date: Wed, 26 Jul 2023 20:13:31 +0800
|
|
Subject: [PATCH] Implement PlayerFailMoveEvent
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
index 69118af2a873f23f6543676db39263bfeb81b4f1..93f5ec2c48bf4bdd4afc1e07ffcf1a34387ce6ac 100644
|
|
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
@@ -1279,8 +1279,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
double d0 = ServerGamePacketListenerImpl.clampHorizontal(packet.getX(this.player.getX())); final double toX = d0; // Paper - OBFHELPER
|
|
double d1 = ServerGamePacketListenerImpl.clampVertical(packet.getY(this.player.getY())); final double toY = d1; // Paper - OBFHELPER
|
|
double d2 = ServerGamePacketListenerImpl.clampHorizontal(packet.getZ(this.player.getZ())); final double toZ = d2; // Paper - OBFHELPER
|
|
- float f = Mth.wrapDegrees(packet.getYRot(this.player.getYRot()));
|
|
- float f1 = Mth.wrapDegrees(packet.getXRot(this.player.getXRot()));
|
|
+ float f = Mth.wrapDegrees(packet.getYRot(this.player.getYRot())); final float toYaw = f; // Paper - OBFHELPER
|
|
+ float f1 = Mth.wrapDegrees(packet.getXRot(this.player.getXRot())); final float toPitch = f1; // Paper - OBFHELPER
|
|
|
|
if (this.player.isPassenger()) {
|
|
this.player.absMoveTo(this.player.getX(), this.player.getY(), this.player.getZ(), f, f1);
|
|
@@ -1345,8 +1345,14 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
}
|
|
// Paper start - Prevent moving into unloaded chunks
|
|
if (this.player.level().paperConfig().chunks.preventMovingIntoUnloadedChunks && (this.player.getX() != toX || this.player.getZ() != toZ) && !worldserver.areChunksLoadedForMove(this.player.getBoundingBox().expandTowards(new Vec3(toX, toY, toZ).subtract(this.player.position())))) {
|
|
- this.internalTeleport(this.player.getX(), this.player.getY(), this.player.getZ(), this.player.getYRot(), this.player.getXRot(), Collections.emptySet());
|
|
- return;
|
|
+ // Paper start - Add fail move event
|
|
+ io.papermc.paper.event.player.PlayerFailMoveEvent event = fireFailMove(io.papermc.paper.event.player.PlayerFailMoveEvent.FailReason.MOVED_INTO_UNLOADED_CHUNK,
|
|
+ toX, toY, toZ, toYaw, toPitch, false);
|
|
+ if (!event.isAllowed()) {
|
|
+ this.internalTeleport(this.player.getX(), this.player.getY(), this.player.getZ(), this.player.getYRot(), this.player.getXRot(), Collections.emptySet());
|
|
+ return;
|
|
+ }
|
|
+ // Paper end - Add fail move event
|
|
}
|
|
// Paper end - Prevent moving into unloaded chunks
|
|
|
|
@@ -1355,9 +1361,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
if (d10 - d9 > Math.max(f2, Math.pow((double) (org.spigotmc.SpigotConfig.movedTooQuicklyMultiplier * (float) i * speed), 2)) && !this.isSingleplayerOwner()) {
|
|
// CraftBukkit end
|
|
- ServerGamePacketListenerImpl.LOGGER.warn("{} moved too quickly! {},{},{}", new Object[]{this.player.getName().getString(), d6, d7, d8});
|
|
- this.teleport(this.player.getX(), this.player.getY(), this.player.getZ(), this.player.getYRot(), this.player.getXRot());
|
|
- return;
|
|
+ // Paper start - Add fail move event
|
|
+ io.papermc.paper.event.player.PlayerFailMoveEvent event = fireFailMove(io.papermc.paper.event.player.PlayerFailMoveEvent.FailReason.MOVED_TOO_QUICKLY,
|
|
+ toX, toY, toZ, toYaw, toPitch, true);
|
|
+ if (!event.isAllowed()) {
|
|
+ if (event.getLogWarning())
|
|
+ ServerGamePacketListenerImpl.LOGGER.warn("{} moved too quickly! {},{},{}", new Object[]{this.player.getName().getString(), d6, d7, d8});
|
|
+ this.teleport(this.player.getX(), this.player.getY(), this.player.getZ(), this.player.getYRot(), this.player.getXRot());
|
|
+ return;
|
|
+ }
|
|
+ // Paper end - Add fail move event
|
|
}
|
|
}
|
|
}
|
|
@@ -1419,14 +1432,29 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
d8 = d2 - this.player.getZ();
|
|
d10 = d6 * d6 + d7 * d7 + d8 * d8;
|
|
- boolean flag2 = false;
|
|
+ boolean movedWrongly = false; // Paper - Add fail move event; rename
|
|
|
|
if (!this.player.isChangingDimension() && d10 > org.spigotmc.SpigotConfig.movedWronglyThreshold && !this.player.isSleeping() && !this.player.gameMode.isCreative() && this.player.gameMode.getGameModeForPlayer() != GameType.SPECTATOR) { // Spigot
|
|
- flag2 = true;
|
|
+ // Paper start - Add fail move event
|
|
+ io.papermc.paper.event.player.PlayerFailMoveEvent event = fireFailMove(io.papermc.paper.event.player.PlayerFailMoveEvent.FailReason.MOVED_WRONGLY,
|
|
+ toX, toY, toZ, toYaw, toPitch, true);
|
|
+ if (!event.isAllowed()) {
|
|
+ movedWrongly = true;
|
|
+ if (event.getLogWarning())
|
|
ServerGamePacketListenerImpl.LOGGER.warn("{} moved wrongly!", this.player.getName().getString());
|
|
+ }
|
|
}
|
|
|
|
- if (!this.player.noPhysics && !this.player.isSleeping() && (flag2 && worldserver.noCollision(this.player, axisalignedbb) || this.isPlayerCollidingWithAnythingNew(worldserver, axisalignedbb, d0, d1, d2))) {
|
|
+ boolean teleportBack = !this.player.noPhysics && !this.player.isSleeping() && (movedWrongly && worldserver.noCollision(this.player, axisalignedbb) || this.isPlayerCollidingWithAnythingNew(worldserver, axisalignedbb, d0, d1, d2));
|
|
+ if (teleportBack) {
|
|
+ io.papermc.paper.event.player.PlayerFailMoveEvent event = fireFailMove(io.papermc.paper.event.player.PlayerFailMoveEvent.FailReason.CLIPPED_INTO_BLOCK,
|
|
+ toX, toY, toZ, toYaw, toPitch, false);
|
|
+ if (event.isAllowed()) {
|
|
+ teleportBack = false;
|
|
+ }
|
|
+ }
|
|
+ if (teleportBack) {
|
|
+ // Paper end - Add fail move event
|
|
this.internalTeleport(d3, d4, d5, f, f1, Collections.emptySet()); // CraftBukkit - SPIGOT-1807: Don't call teleport event, when the client thinks the player is falling, because the chunks are not loaded on the client yet.
|
|
this.player.doCheckFallDamage(this.player.getX() - d3, this.player.getY() - d4, this.player.getZ() - d5, packet.isOnGround());
|
|
} else {
|
|
@@ -3363,4 +3391,17 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
InteractionResult run(ServerPlayer player, Entity entity, InteractionHand hand);
|
|
}
|
|
+
|
|
+ // Paper start - Add fail move event
|
|
+ private io.papermc.paper.event.player.PlayerFailMoveEvent fireFailMove(io.papermc.paper.event.player.PlayerFailMoveEvent.FailReason failReason,
|
|
+ double toX, double toY, double toZ, float toYaw, float toPitch, boolean logWarning) {
|
|
+ Player player = this.getCraftPlayer();
|
|
+ Location from = new Location(player.getWorld(), this.lastPosX, this.lastPosY, this.lastPosZ, this.lastYaw, this.lastPitch);
|
|
+ Location to = new Location(player.getWorld(), toX, toY, toZ, toYaw, toPitch);
|
|
+ io.papermc.paper.event.player.PlayerFailMoveEvent event = new io.papermc.paper.event.player.PlayerFailMoveEvent(player, failReason,
|
|
+ false, logWarning, from, to);
|
|
+ event.callEvent();
|
|
+ return event;
|
|
+ }
|
|
+ // Paper end - Add fail move event
|
|
}
|