Skip to content

Commit f8e8d6c

Browse files
authored
Strip enderpearl owners when they are no longer ticked (#7559)
1 parent 4322c05 commit f8e8d6c

5 files changed

+28
-32
lines changed

patches/server/0191-Block-Enderpearl-Travel-Exploit.patch

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,23 @@ index ef9f6712046a22a8d0dfcf95d8e2d12403345532..ea426792b751fd7591bf09f2256dd6bd
2626
+ log("Disable Unloaded Chunk Enderpearl Exploit: " + (disableEnderpearlExploit ? "enabled" : "disabled"));
2727
+ }
2828
}
29+
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
30+
index 9769977c9db77aa52b99b793ca4f5d0c7b54528f..eb6981ca27d27946c748047660ced880c4dea01a 100644
31+
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
32+
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
33+
@@ -1991,6 +1991,12 @@ public class ServerLevel extends Level implements WorldGenLevel {
34+
35+
public void onTickingEnd(Entity entity) {
36+
ServerLevel.this.entityTickList.remove(entity);
37+
+ // Paper start - Reset pearls when they stop being ticked
38+
+ if (paperConfig.disableEnderpearlExploit && entity instanceof net.minecraft.world.entity.projectile.ThrownEnderpearl pearl) {
39+
+ pearl.cachedOwner = null;
40+
+ pearl.ownerUUID = null;
41+
+ }
42+
+ // Paper end
43+
}
44+
45+
public void onTrackingStart(Entity entity) {
2946
diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
3047
index 1c3ae7c61c06f486e50e57f434b9f360c6cf55be..bdefda914a7f93b8393a06f112ea9239d9685d51 100644
3148
--- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
@@ -38,24 +55,3 @@ index 1c3ae7c61c06f486e50e57f434b9f360c6cf55be..bdefda914a7f93b8393a06f112ea9239
3855
}
3956

4057
this.leftOwner = nbt.getBoolean("LeftOwner");
41-
diff --git a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java
42-
index 23f77dfc6df93ef6a70e14a7e410263d39fae2cb..834ba402decb556a5f77809b37fa00578b67432e 100644
43-
--- a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java
44-
+++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java
45-
@@ -108,6 +108,16 @@ public class ThrownEnderpearl extends ThrowableItemProjectile {
46-
super.tick();
47-
}
48-
49-
+ // Paper start
50-
+ if (this.level.paperConfig.disableEnderpearlExploit) {
51-
+ final net.minecraft.server.level.ChunkHolder chunkHolder = ((net.minecraft.server.level.ServerChunkCache) this.level.getChunkSource()).chunkMap.getVisibleChunkIfPresent(net.minecraft.world.level.ChunkPos.asLong(this.blockPosition()));
52-
+ if (chunkHolder == null || !net.minecraft.server.level.ChunkHolder.getFullChunkStatus(chunkHolder.getTicketLevel()).isOrAfter(net.minecraft.server.level.ChunkHolder.FullChunkStatus.ENTITY_TICKING)) {
53-
+ this.cachedOwner = null;
54-
+ this.ownerUUID = null;
55-
+ }
56-
+ }
57-
+ // Paper end
58-
+
59-
}
60-
61-
@Nullable

patches/server/0214-InventoryCloseEvent-Reason-API.patch

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ Allows you to determine why an inventory was closed, enabling plugin developers
77
to "confirm" things based on if it was player triggered close or not.
88

99
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
10-
index d8b0f6ae1604a158ef1be02701c8c605192e7fe1..4d69b6b35f04c904ee9ca9c896baaa9892f8ef9c 100644
10+
index 3cb4a84a08cbf76e39da5f25fea490c26c77a289..1d29f6c12d2c9de7918669ec03da7307a899e9ab 100644
1111
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
1212
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
1313
@@ -1137,7 +1137,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
@@ -19,7 +19,7 @@ index d8b0f6ae1604a158ef1be02701c8c605192e7fe1..4d69b6b35f04c904ee9ca9c896baaa98
1919
}
2020
}
2121
}
22-
@@ -2074,7 +2074,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
22+
@@ -2080,7 +2080,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
2323
// Spigot Start
2424
if (entity.getBukkitEntity() instanceof org.bukkit.inventory.InventoryHolder && (!(entity instanceof ServerPlayer) || entity.getRemovalReason() != Entity.RemovalReason.KILLED)) { // SPIGOT-6876: closeInventory clears death message
2525
for (org.bukkit.entity.HumanEntity h : Lists.newArrayList(((org.bukkit.inventory.InventoryHolder) entity.getBukkitEntity()).getInventory().getViewers())) {

patches/server/0381-Prevent-Double-PlayerChunkMap-adds-crashing-server.patch

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ index a0ffdeaad5c375539857d6a5a94832216d09f024..5346109670bedf88f13b4eff47c52921
2626
EntityType<?> entitytypes = entity.getType();
2727
int i = entitytypes.clientTrackingRange() * 16;
2828
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
29-
index e0e6915320264da3fefb3f449f27efb8477e1e63..5c5f9cf3539aeba4911d27111b0580d99a61f577 100644
29+
index 0a7dbafd938141b34dc66d0b4af26dba92a21c06..5009ad1a758e192eaf6ca59baab26d2ba58a6c66 100644
3030
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
3131
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
32-
@@ -2204,7 +2204,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
32+
@@ -2210,7 +2210,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
3333

3434
public void onTrackingStart(Entity entity) {
3535
org.spigotmc.AsyncCatcher.catchOp("entity register"); // Spigot
@@ -38,7 +38,7 @@ index e0e6915320264da3fefb3f449f27efb8477e1e63..5c5f9cf3539aeba4911d27111b0580d9
3838
if (entity instanceof ServerPlayer) {
3939
ServerPlayer entityplayer = (ServerPlayer) entity;
4040

41-
@@ -2237,6 +2237,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
41+
@@ -2243,6 +2243,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
4242
}
4343

4444
entity.valid = true; // CraftBukkit

patches/server/0766-Optimise-WorldServer-notify.patch

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ index bc6a4bfe7df804ee22791fb767f059a541a3900f..a578ff8a88ef944516150303e96f8b49
110110
}
111111

112112
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
113-
index c780af51c50c019e7fa0e5aee3d05e3374f79948..524a4bb83afacf02c331f719be2e2c4320626afe 100644
113+
index 6053b7797cc4f6ed1ffbfc35048bab1a96586254..7922ecc1bfeb2d00a7a1bce0431efec4f8c57eec 100644
114114
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
115115
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
116116
@@ -1096,6 +1096,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
@@ -179,9 +179,9 @@ index c780af51c50c019e7fa0e5aee3d05e3374f79948..524a4bb83afacf02c331f719be2e2c43
179179
public void onTickingEnd(Entity entity) {
180180
ServerLevel.this.entityTickList.remove(entity);
181181
+ ServerLevel.this.entityManager.removeNavigatorsFromData(entity); // Paper - optimise notify
182-
}
183-
184-
public void onTrackingStart(Entity entity) {
182+
// Paper start - Reset pearls when they stop being ticked
183+
if (paperConfig.disableEnderpearlExploit && entity instanceof net.minecraft.world.entity.projectile.ThrownEnderpearl pearl) {
184+
pearl.cachedOwner = null;
185185
diff --git a/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java b/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java
186186
index b47cd6d8ed02875bd9af54d27b7c1cda340e7f9f..d35032a8d2612d555c3dad1fe496d7ae1c5a285b 100644
187187
--- a/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java

patches/server/0774-Fix-merchant-inventory-not-closing-on-entity-removal.patch

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ Subject: [PATCH] Fix merchant inventory not closing on entity removal
55

66

77
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
8-
index 524a4bb83afacf02c331f719be2e2c4320626afe..46db8458478de3dee83fc03478245ba914c79999 100644
8+
index 7922ecc1bfeb2d00a7a1bce0431efec4f8c57eec..4c9832ccede082a468e97870b5f6b07bbed652f3 100644
99
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
1010
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
11-
@@ -2485,6 +2485,11 @@ public class ServerLevel extends Level implements WorldGenLevel {
11+
@@ -2491,6 +2491,11 @@ public class ServerLevel extends Level implements WorldGenLevel {
1212
// Spigot end
1313
// Spigot Start
1414
if (entity.getBukkitEntity() instanceof org.bukkit.inventory.InventoryHolder && (!(entity instanceof ServerPlayer) || entity.getRemovalReason() != Entity.RemovalReason.KILLED)) { // SPIGOT-6876: closeInventory clears death message

0 commit comments

Comments
 (0)