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 2d8af400a75324b57bae87ceaee79e74da180cbd..5e85ecd3fc64f92e3ca65d127930ff195cd0949c 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -489,25 +489,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 914744995ff7637f063afe1a45d577f41d2c30d9..c83b3b5fb99a9730632e03f0f7d2d4e4ac510049 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java @@ -330,6 +330,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;