diff --git a/Spigot-Server-Patches/0294-Block-Enderpearl-Travel-Exploit.patch b/Spigot-Server-Patches/0294-Block-Enderpearl-Travel-Exploit.patch new file mode 100644 index 000000000..3d89861a1 --- /dev/null +++ b/Spigot-Server-Patches/0294-Block-Enderpearl-Travel-Exploit.patch @@ -0,0 +1,43 @@ +From e867d5f0aab8446ba423b22e71aa6b35f0aaa328 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Mon, 30 Apr 2018 17:15:26 -0400 +Subject: [PATCH] Block Enderpearl Travel Exploit + +Players are able to use alt accounts and enderpearls to travel +long distances utilizing the pearls in unloaded chunks and loading +the chunk later when convenient. + +This disables that by not saving the thrower when the chunk is unloaded. + +This is mainly useful for survival servers that do not allow freeform teleporting. + +diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java +index cc1914d8c..606c0bed8 100644 +--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java ++++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java +@@ -508,4 +508,10 @@ public class PaperWorldConfig { + allowPermaChunkLoaders = getBoolean("game-mechanics.allow-permanent-chunk-loaders", allowPermaChunkLoaders); + log("Allow Perma Chunk Loaders: " + (allowPermaChunkLoaders ? "enabled" : "disabled")); + } ++ ++ public boolean disableEnderpearlExploit = true; ++ private void disableEnderpearlExploit() { ++ disableEnderpearlExploit = getBoolean("game-mechanics.disable-unloaded-chunk-enderpearl-exploit", disableEnderpearlExploit); ++ log("Disable Unloaded Chunk Enderpearl Exploit: " + (disableEnderpearlExploit ? "enabled" : "disabled")); ++ } + } +diff --git a/src/main/java/net/minecraft/server/EntityProjectile.java b/src/main/java/net/minecraft/server/EntityProjectile.java +index 01c7fcc8b..f7f9d4897 100644 +--- a/src/main/java/net/minecraft/server/EntityProjectile.java ++++ b/src/main/java/net/minecraft/server/EntityProjectile.java +@@ -250,6 +250,7 @@ public abstract class EntityProjectile extends Entity implements IProjectile { + if ((this.shooterName == null || this.shooterName.isEmpty()) && this.shooter instanceof EntityHuman) { + this.shooterName = this.shooter.getName(); + } ++ if (this instanceof EntityEnderPearl && this.world != null && this.world.paperConfig.disableEnderpearlExploit) { this.shooterName = null; } // Paper - Don't store shooter name for pearls to block enderpearl travel exploit + + nbttagcompound.setString("ownerName", this.shooterName == null ? "" : this.shooterName); + } +-- +2.17.0 +