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:13:30 +0800 Subject: [PATCH] Remove streams from getting nearby players This patch is Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java index 66cecf64fac0b72590e1a4ea7147ea2ac78dd30a..2a55e56b80e2835ca8b3975f3b34e0087d385717 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -439,25 +439,50 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.isLegacyTrackingEntity = isLegacyTrackingEntity; } + // Leaves start - better metond + private org.spigotmc.TrackingRange.TrackingRangeType getFurthestEntity(Entity entity, net.minecraft.server.level.ChunkMap chunkMap, org.spigotmc.TrackingRange.TrackingRangeType type, int range) { + List passengers = entity.getPassengers(); + for (int i = 0, size = passengers.size(); i < size; i++) { + Entity passenger = passengers.get(i); + org.spigotmc.TrackingRange.TrackingRangeType passengerType = passenger.trackingRangeType; + int passengerRange = chunkMap.getEntityTrackerRange(passengerType.ordinal()); + if (passengerRange > range) { + type = passengerType; + range = passengerRange; + } + + type = this.getFurthestEntity(passenger, chunkMap, type, range); + } + + return type; + } + // Leaves end - better metond + public final com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet getPlayersInTrackRange() { // determine highest range of passengers if (this.passengers.isEmpty()) { return ((ServerLevel)this.level).getChunkSource().chunkMap.playerEntityTrackerTrackMaps[this.trackingRangeType.ordinal()] .getObjectsInRange(MCUtil.getCoordinateKey(this)); } - Iterable passengers = this.getIndirectPassengers(); + // Leaves start - use getFurthestEntity to skip getIndirectPassengers net.minecraft.server.level.ChunkMap chunkMap = ((ServerLevel)this.level).getChunkSource().chunkMap; org.spigotmc.TrackingRange.TrackingRangeType type = this.trackingRangeType; int range = chunkMap.getEntityTrackerRange(type.ordinal()); - for (Entity passenger : passengers) { - org.spigotmc.TrackingRange.TrackingRangeType passengerType = passenger.trackingRangeType; - int passengerRange = chunkMap.getEntityTrackerRange(passengerType.ordinal()); - if (passengerRange > range) { - type = passengerType; - range = passengerRange; + if (top.leavesmc.leaves.LeavesConfig.removeGetNearPlayerStreams) { + type = this.getFurthestEntity(this, chunkMap, type, range); + } else { + Iterable passengers = this.getIndirectPassengers(); + for (Entity passenger : passengers) { + org.spigotmc.TrackingRange.TrackingRangeType passengerType = passenger.trackingRangeType; + int passengerRange = chunkMap.getEntityTrackerRange(passengerType.ordinal()); + if (passengerRange > range) { + type = passengerType; + range = passengerRange; + } } } + // Leaves end - use getFurthestEntity to skip getIndirectPassengers return chunkMap.playerEntityTrackerTrackMaps[type.ordinal()].getObjectsInRange(MCUtil.getCoordinateKey(this)); } diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java index 8b4095c0e8797482bca3800ad9dfc4f894e63f85..d797792d4c26ba70c08e0b96f0a611c379b07105 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java @@ -313,6 +313,11 @@ public final class LeavesConfig { removeInventoryContainsIterators = getBoolean("settings.performance.remove.inventory-contains-iterators", removeInventoryContainsIterators); } + public static boolean removeGetNearPlayerStreams = true; + private static void removeGetNearPlayerStreams() { + removeGetNearPlayerStreams = getBoolean("settings.performance.remove.get-nearby-players-streams", removeGetNearPlayerStreams); + } + public static final class WorldConfig { public final String worldName;