2023-08-26 22:23:31 +02:00
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Martijn Muijsers <martijnmuijsers@live.nl>
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
2024-05-26 23:30:45 +02:00
index 1339459dcbd85897f32362019f79a68393c91674..26c77cead77db560dd5836f5b56e09775cf5172d 100644
2023-08-26 22:23:31 +02:00
--- a/src/main/java/net/minecraft/world/item/EndCrystalItem.java
+++ b/src/main/java/net/minecraft/world/item/EndCrystalItem.java
2024-04-25 00:36:49 +02:00
@@ -30,7 +30,7 @@ public class EndCrystalItem extends Item {
2023-08-26 22:23:31 +02:00
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;
2024-05-26 23:30:45 +02:00
@@ -58,7 +58,7 @@ public class EndCrystalItem extends Item {
2023-08-26 22:23:31 +02:00
EndDragonFight enderdragonbattle = ((ServerLevel) world).getDragonFight();
if (enderdragonbattle != null) {
- enderdragonbattle.tryRespawn();
2024-01-14 16:31:39 +01:00
+ enderdragonbattle.tryRespawn(aboveBlockPosition); // Paper - Perf: Do crystal-portal proximity check before entity lookup
2023-08-26 22:23:31 +02:00
}
}
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
2024-04-25 00:36:49 +02:00
index 6b59c4b5906c0fb4fdbc674452c6ff3df42b099b..18a1b4325cac81b040596071dab99ef9bf6f3142 100644
2023-08-26 22:23:31 +02:00
--- a/src/main/java/net/minecraft/world/level/dimension/end/EndDragonFight.java
+++ b/src/main/java/net/minecraft/world/level/dimension/end/EndDragonFight.java
2023-09-22 18:59:52 +02:00
@@ -558,6 +558,12 @@ public class EndDragonFight {
2023-08-26 22:23:31 +02:00
}
public boolean tryRespawn() { // CraftBukkit - return boolean
2024-01-14 16:31:39 +01:00
+ // Paper start - Perf: Do crystal-portal proximity check before entity lookup
2023-08-26 22:23:31 +02:00
+ 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
2024-01-14 16:31:39 +01:00
+ // Paper end - Perf: Do crystal-portal proximity check before entity lookup
2023-08-26 22:23:31 +02:00
if (this.dragonKilled && this.respawnStage == null) {
BlockPos blockposition = this.portalLocation;
2023-09-22 18:59:52 +02:00
@@ -575,6 +581,22 @@ public class EndDragonFight {
2023-08-26 22:23:31 +02:00
blockposition = this.portalLocation;
}
2024-01-14 16:31:39 +01:00
+ // Paper start - Perf: Do crystal-portal proximity check before entity lookup
2023-08-26 22:23:31 +02:00
+ 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;
+ }
+ }
2024-01-14 16:31:39 +01:00
+ // Paper end - Perf: Do crystal-portal proximity check before entity lookup
2023-08-26 22:23:31 +02:00
+
List<EndCrystal> list = Lists.newArrayList();
BlockPos blockposition1 = blockposition.above(1);
Iterator iterator = Direction.Plane.HORIZONTAL.iterator();