2018-10-03 21:19:35 +02:00
|
|
|
From 4aa958cd75e6b558fc25887fb204d69eb97fd2a8 Mon Sep 17 00:00:00 2001
|
2016-02-28 19:34:19 +01:00
|
|
|
From: Sudzzy <originmc@outlook.com>
|
2016-03-01 00:09:49 +01:00
|
|
|
Date: Thu, 3 Mar 2016 02:50:31 -0600
|
2018-06-18 23:27:33 +02:00
|
|
|
Subject: [PATCH] Configurable inter-world teleportation safety
|
2016-02-28 19:34:19 +01:00
|
|
|
|
2018-06-18 23:27:33 +02:00
|
|
|
People are able to abuse the way Bukkit handles teleportation across worlds since it provides a built in teleportation
|
|
|
|
safety check.
|
2016-02-28 19:34:19 +01:00
|
|
|
|
2018-06-18 23:27:33 +02:00
|
|
|
To abuse the safety check, players are required to get into a location deemed unsafe by Bukkit e.g. be within a chest
|
|
|
|
or door block. While they are in this block, they accept a teleport request from a player within a different world. Once
|
|
|
|
the player teleports, Minecraft will recursively search upwards for a safe location, this could eventually land within a
|
|
|
|
player's skybase.
|
2016-02-28 19:34:19 +01:00
|
|
|
|
|
|
|
Example setup to perform the glitch: http://puu.sh/ng3PC/cf072dcbdb.png
|
2018-06-18 23:27:33 +02:00
|
|
|
The wanted destination was on top of the emerald block however the player ended on top of the diamond block.
|
|
|
|
This only is the case if the player is teleporting between worlds.
|
2016-02-28 19:34:19 +01:00
|
|
|
|
2016-03-01 00:09:49 +01:00
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
2018-10-03 21:19:35 +02:00
|
|
|
index 9db394d4..50837d76 100644
|
2016-03-01 00:09:49 +01:00
|
|
|
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
2018-09-26 06:57:59 +02:00
|
|
|
@@ -190,4 +190,9 @@ public class PaperWorldConfig {
|
2016-03-01 00:09:49 +01:00
|
|
|
private void portalSearchRadius() {
|
|
|
|
portalSearchRadius = getInt("portal-search-radius", 128);
|
|
|
|
}
|
|
|
|
+
|
|
|
|
+ public boolean disableTeleportationSuffocationCheck;
|
|
|
|
+ private void disableTeleportationSuffocationCheck() {
|
|
|
|
+ disableTeleportationSuffocationCheck = getBoolean("disable-teleportation-suffocation-check", false);
|
|
|
|
+ }
|
|
|
|
}
|
2018-06-18 23:27:33 +02:00
|
|
|
diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java
|
2018-10-03 21:19:35 +02:00
|
|
|
index 4a843d52..7dfb2bee 100644
|
2018-06-18 23:27:33 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/PlayerList.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/PlayerList.java
|
2018-10-03 21:19:35 +02:00
|
|
|
@@ -793,7 +793,7 @@ public abstract class PlayerList {
|
2018-06-18 23:27:33 +02:00
|
|
|
exitWorld.getTravelAgent().adjustExit(entityplayer, exit, velocity);
|
|
|
|
|
|
|
|
entityplayer.worldChangeInvuln = true; // CraftBukkit - Set teleport invulnerability only if player changing worlds
|
|
|
|
- this.moveToWorld(entityplayer, exitWorld.dimension, true, exit, true); // SPIGOT-3864
|
|
|
|
+ this.moveToWorld(entityplayer, exitWorld.dimension, true, exit, !exitWorld.paperConfig.disableTeleportationSuffocationCheck); // SPIGOT-3864 // Paper GH-1149 - Tie suffocation check to config option
|
|
|
|
if (entityplayer.motX != velocity.getX() || entityplayer.motY != velocity.getY() || entityplayer.motZ != velocity.getZ()) {
|
|
|
|
entityplayer.getBukkitEntity().setVelocity(velocity);
|
|
|
|
}
|
2016-02-28 19:34:19 +01:00
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
2018-10-03 21:19:35 +02:00
|
|
|
index 9e51645c..15a99220 100644
|
2016-02-28 19:34:19 +01:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
2018-09-01 12:09:13 +02:00
|
|
|
@@ -714,7 +714,8 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
2016-02-28 19:34:19 +01:00
|
|
|
if (fromWorld == toWorld) {
|
|
|
|
entity.playerConnection.teleport(to);
|
|
|
|
} else {
|
|
|
|
- server.getHandle().moveToWorld(entity, toWorld.dimension, true, to, true);
|
2016-03-01 00:09:49 +01:00
|
|
|
+ // Paper - Configurable suffocation check
|
|
|
|
+ server.getHandle().moveToWorld(entity, toWorld.dimension, true, to, !toWorld.paperConfig.disableTeleportationSuffocationCheck);
|
2016-02-28 19:34:19 +01:00
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
--
|
2018-09-26 06:57:59 +02:00
|
|
|
2.19.0
|
2016-02-28 19:34:19 +01:00
|
|
|
|