From e895403a10fd7414cca1d71ec3d12c27b17ca6d0 Mon Sep 17 00:00:00 2001 From: Jake Potrebic <15055071+Machine-Maker@users.noreply.github.com> Date: Mon, 28 Jun 2021 05:53:28 -0700 Subject: [PATCH] Improve horrible CraftChunk#getEntities performance (#5999) Thanks Spigot, very cool. --- build-data/paper.at | 3 ++ .../0721-Improve-CraftChunk-getEntities.patch | 29 +++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 patches/server/0721-Improve-CraftChunk-getEntities.patch diff --git a/build-data/paper.at b/build-data/paper.at index bc8ecf325f..e90ed085ab 100644 --- a/build-data/paper.at +++ b/build-data/paper.at @@ -225,3 +225,6 @@ public net.minecraft.world.entity.animal.Fox setFaceplanted(Z)V # Cook speed multipler API public net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity recipeType + +# Improve CraftChunk#getEntities +public net.minecraft.world.level.entity.PersistentEntitySectionManager sectionStorage diff --git a/patches/server/0721-Improve-CraftChunk-getEntities.patch b/patches/server/0721-Improve-CraftChunk-getEntities.patch new file mode 100644 index 0000000000..9fdd9087be --- /dev/null +++ b/patches/server/0721-Improve-CraftChunk-getEntities.patch @@ -0,0 +1,29 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jake Potrebic +Date: Fri, 25 Jun 2021 12:06:35 -0700 +Subject: [PATCH] Improve CraftChunk#getEntities + + +diff --git a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java +index 08a5fabb1d13db26014bb5751aa271c0a0bdcb7a..40d6dfe30e8f388fb2014ba81f9ea4a986354b88 100644 +--- a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java ++++ b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java +@@ -110,11 +110,13 @@ public class CraftChunk implements Chunk { + this.getWorld().getChunkAt(x, z); // Transient load for this tick + } + +- Location location = new Location(null, 0, 0, 0); +- return this.getWorld().getEntities().stream().filter((entity) -> { +- entity.getLocation(location); +- return location.getBlockX() >> 4 == this.x && location.getBlockZ() >> 4 == this.z; +- }).toArray(Entity[]::new); ++ // Paper start - improve CraftChunk#getEntities ++ return this.worldServer.entityManager.sectionStorage.getExistingSectionsInChunk(ChunkPos.asLong(this.x, this.z)) ++ .flatMap(net.minecraft.world.level.entity.EntitySection::getEntities) ++ .map(net.minecraft.world.entity.Entity::getBukkitEntity) ++ .filter(entity -> entity != null && entity.isValid()) ++ .toArray(Entity[]::new); ++ // Paper end + } + + @Override