From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: violetc <58360096+s-yh-china@users.noreply.github.com> Date: Wed, 17 Aug 2022 11:19:33 +0800 Subject: [PATCH] Remove streams and iterators from range check This patch is Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java index 7179137194040ee29f05227aa67bd5f1ec5b4045..39d0cc12f39c4ec77f32ee123e6b557948f0e303 100644 --- a/src/main/java/net/minecraft/server/level/ChunkMap.java +++ b/src/main/java/net/minecraft/server/level/ChunkMap.java @@ -1619,19 +1619,45 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider return ChunkMap.this.level.getServer().getScaledTrackingDistance(initialDistance); } - private int getEffectiveRange() { - int i = this.range; - Iterator iterator = this.entity.getIndirectPassengers().iterator(); + // Leaves start + private static int getHighestRange(Entity parent, int highest) { + List passengers = parent.getPassengers(); - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - int j = entity.getType().clientTrackingRange() * 16; - j = org.spigotmc.TrackingRange.getEntityTrackingRange(entity, j); // Paper + for (int i = 0, size = passengers.size(); i < size; i++) { + Entity entity = passengers.get(i); + int range = entity.getType().clientTrackingRange() * 16; + range = org.spigotmc.TrackingRange.getEntityTrackingRange(entity, range); // Paper + + if (range > highest) { // Paper - we need the lowest range thanks to the fact that our tracker doesn't account for passenger logic // Tuinity - not anymore! + highest = range; + } + + highest = getHighestRange(entity, highest); + } + + return highest; + } + // Leaves end - if (j > i) { - i = j; + private int getEffectiveRange() { + int i = this.range; + // Leaves start - remove iterators and streams + if (top.leavesmc.leaves.LeavesConfig.removeRangeCheckStreams) { + i = getHighestRange(this.entity, i); + } else { + Iterator iterator = this.entity.getIndirectPassengers().iterator(); + + while (iterator.hasNext()) { + Entity entity = (Entity) iterator.next(); + int j = entity.getType().clientTrackingRange() * 16; + j = org.spigotmc.TrackingRange.getEntityTrackingRange(entity, j); // Paper + + if (j > i) { + i = j; + } } } + // Leaves end - remove iterators and streams return this.scaledRange(i); } diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java index c83b3b5fb99a9730632e03f0f7d2d4e4ac510049..6924ca89da0decc8f861842b770d0cfae7fc0ba1 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java @@ -335,6 +335,11 @@ public final class LeavesConfig { removeGetNearPlayerStreams = getBoolean("settings.performance.remove.get-nearby-players-streams", removeGetNearPlayerStreams); } + public static boolean removeRangeCheckStreams = true; + private static void removeRangeCheckStreams() { + removeRangeCheckStreams = getBoolean("settings.performance.remove.range-check-streams-and-iterators", removeRangeCheckStreams); + } + public static final class WorldConfig { public final String worldName;