aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0868-Do-crystal-portal-proximity-check-before-entity-look.patch
diff options
context:
space:
mode:
authorNassim Jahnke <[email protected]>2024-10-27 18:11:15 +0100
committerNassim Jahnke <[email protected]>2024-10-27 18:39:30 +0100
commit02bca1e6558bf4ac0cbf928d48e90f497b10b0a3 (patch)
tree1144072e447f4c0b7e80b278fd769106227f016a /patches/server/0868-Do-crystal-portal-proximity-check-before-entity-look.patch
parent12ed02105177f54906a7d4422b235929426bc264 (diff)
downloadPaper-02bca1e6558bf4ac0cbf928d48e90f497b10b0a3.tar.gz
Paper-02bca1e6558bf4ac0cbf928d48e90f497b10b0a3.zip
Remove timings impl
Diffstat (limited to 'patches/server/0868-Do-crystal-portal-proximity-check-before-entity-look.patch')
-rw-r--r--patches/server/0868-Do-crystal-portal-proximity-check-before-entity-look.patch75
1 files changed, 75 insertions, 0 deletions
diff --git a/patches/server/0868-Do-crystal-portal-proximity-check-before-entity-look.patch b/patches/server/0868-Do-crystal-portal-proximity-check-before-entity-look.patch
new file mode 100644
index 0000000000..0ba2ce3d55
--- /dev/null
+++ b/patches/server/0868-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 48317c7436445a7acff9103bac1de558c42f31cc..b62db8c7c8c57e43869ee239ebf4b02f112355d9 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 8ec6b33126096fb9e1de5f41290097e004d7a455..b331c93c82c27f9456fec208a0c008c5bedfa8c4 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
+@@ -563,6 +563,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;
+
+@@ -580,6 +586,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();