aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0877-Do-crystal-portal-proximity-check-before-entity-look.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0877-Do-crystal-portal-proximity-check-before-entity-look.patch')
-rw-r--r--patches/server/0877-Do-crystal-portal-proximity-check-before-entity-look.patch75
1 files changed, 75 insertions, 0 deletions
diff --git a/patches/server/0877-Do-crystal-portal-proximity-check-before-entity-look.patch b/patches/server/0877-Do-crystal-portal-proximity-check-before-entity-look.patch
new file mode 100644
index 0000000000..ee3855f2b8
--- /dev/null
+++ b/patches/server/0877-Do-crystal-portal-proximity-check-before-entity-look.patch
@@ -0,0 +1,75 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Martijn Muijsers <[email protected]>
+Date: Tue, 15 Aug 2023 21:04:55 +0200
+Subject: [PATCH] Do crystal-portal proximity check before entity lookup
+
+This adds a very cheap distance check when an end crystal is placed.
+
+Attempting to respawn the dragon, which involves looking up the end crystal
+entities near the portal, every time an end crystal is placed, can be slow on
+some servers that have players placing end crystals as a style of combat.
+
+The very cheap distance check prevents running the entity lookup every time.
+
+diff --git a/src/main/java/net/minecraft/world/item/EndCrystalItem.java b/src/main/java/net/minecraft/world/item/EndCrystalItem.java
+index 273bb38f14b8af08d123e02742d365fb5d91cdf5..5f51e64cb0611a4ba6bdcdcacbcba1063a7f3a5c 100644
+--- a/src/main/java/net/minecraft/world/item/EndCrystalItem.java
++++ b/src/main/java/net/minecraft/world/item/EndCrystalItem.java
+@@ -30,7 +30,7 @@ public class EndCrystalItem extends Item {
+ if (!iblockdata.is(Blocks.OBSIDIAN) && !iblockdata.is(Blocks.BEDROCK)) {
+ return InteractionResult.FAIL;
+ } else {
+- BlockPos blockposition1 = blockposition.above();
++ BlockPos blockposition1 = blockposition.above(); final BlockPos aboveBlockPosition = blockposition1; // Paper - OBFHELPER
+
+ if (!world.isEmptyBlock(blockposition1)) {
+ return InteractionResult.FAIL;
+@@ -58,7 +58,7 @@ public class EndCrystalItem extends Item {
+ EndDragonFight enderdragonbattle = ((ServerLevel) world).getDragonFight();
+
+ if (enderdragonbattle != null) {
+- enderdragonbattle.tryRespawn();
++ enderdragonbattle.tryRespawn(aboveBlockPosition); // Paper - Perf: Do crystal-portal proximity check before entity lookup
+ }
+ }
+
+diff --git a/src/main/java/net/minecraft/world/level/dimension/end/EndDragonFight.java b/src/main/java/net/minecraft/world/level/dimension/end/EndDragonFight.java
+index 4a0479fcff94bf6a1f239c1f694202345cdea1d4..84300f2f7b7be4f5281edd8e263646dbcbb3ba07 100644
+--- a/src/main/java/net/minecraft/world/level/dimension/end/EndDragonFight.java
++++ b/src/main/java/net/minecraft/world/level/dimension/end/EndDragonFight.java
+@@ -560,6 +560,12 @@ public class EndDragonFight {
+ }
+
+ public boolean tryRespawn() { // CraftBukkit - return boolean
++ // Paper start - Perf: Do crystal-portal proximity check before entity lookup
++ return this.tryRespawn(null);
++ }
++
++ public boolean tryRespawn(@Nullable BlockPos placedEndCrystalPos) { // placedEndCrystalPos is null if the tryRespawn() call was not caused by a placed end crystal
++ // Paper end - Perf: Do crystal-portal proximity check before entity lookup
+ if (this.dragonKilled && this.respawnStage == null) {
+ BlockPos blockposition = this.portalLocation;
+
+@@ -577,6 +583,22 @@ public class EndDragonFight {
+ blockposition = this.portalLocation;
+ }
+
++ // Paper start - Perf: Do crystal-portal proximity check before entity lookup
++ if (placedEndCrystalPos != null) {
++ // The end crystal must be 0 or 1 higher than the portal origin
++ int dy = placedEndCrystalPos.getY() - blockposition.getY();
++ if (dy != 0 && dy != 1) {
++ return false;
++ }
++ // The end crystal must be within a distance of 1 in one planar direction, and 3 in the other
++ int dx = placedEndCrystalPos.getX() - blockposition.getX();
++ int dz = placedEndCrystalPos.getZ() - blockposition.getZ();
++ if (!((dx >= -1 && dx <= 1 && dz >= -3 && dz <= 3) || (dx >= -3 && dx <= 3 && dz >= -1 && dz <= 1))) {
++ return false;
++ }
++ }
++ // Paper end - Perf: Do crystal-portal proximity check before entity lookup
++
+ List<EndCrystal> list = Lists.newArrayList();
+ BlockPos blockposition1 = blockposition.above(1);
+ Iterator iterator = Direction.Plane.HORIZONTAL.iterator();