9
0
mirror of https://github.com/Winds-Studio/Leaf.git synced 2025-12-27 02:49:19 +00:00
Files
Leaf/leaf-server/minecraft-patches/features/0222-Remove-streams-on-PlayerDetector.patch
Dreeam 9a4efaa230 Drop patch that causes performance regression
Originally vanilla logic is to use stream, and Mojang switched it to Guava's Collections2
since 1.21.4. It is much faster than using stream or manually adding to a new ArrayList.
Manually adding to a new ArrayList requires allocating a new object array. However, the Collections2
lazy handles filter condition on iteration, so much better.
2025-08-04 19:25:56 +08:00

111 lines
5.7 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Taiyou06 <kaandindar21@gmail.com>
Date: Sat, 22 Mar 2025 12:51:28 +0100
Subject: [PATCH] Remove streams on PlayerDetector
Dreeam TODO: Merge to single loop
diff --git a/net/minecraft/world/level/block/entity/trialspawner/PlayerDetector.java b/net/minecraft/world/level/block/entity/trialspawner/PlayerDetector.java
index 438b269e53915f7f00ff894697096157f68cdff8..6e27472deabe86e899d0227d2963d30926a3b114 100644
--- a/net/minecraft/world/level/block/entity/trialspawner/PlayerDetector.java
+++ b/net/minecraft/world/level/block/entity/trialspawner/PlayerDetector.java
@@ -21,28 +21,45 @@ import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.CollisionContext;
public interface PlayerDetector {
- PlayerDetector NO_CREATIVE_PLAYERS = (level, entitySelector, pos, maxDistance, requireLineOfSight) -> entitySelector.getPlayers(
- level, player -> player.blockPosition().closerThan(pos, maxDistance) && !player.isCreative() && !player.isSpectator()
- )
- .stream()
- .filter(player -> !requireLineOfSight || inLineOfSight(level, pos.getCenter(), player.getEyePosition()))
- .map(Entity::getUUID)
- .toList();
- PlayerDetector INCLUDING_CREATIVE_PLAYERS = (level, entitySelector, pos, maxDistance, requireLineOfSight) -> entitySelector.getPlayers(
- level, player -> player.blockPosition().closerThan(pos, maxDistance) && !player.isSpectator()
- )
- .stream()
- .filter(player -> !requireLineOfSight || inLineOfSight(level, pos.getCenter(), player.getEyePosition()))
- .map(Entity::getUUID)
- .toList();
+ // Leaf start - Remove streams on PlayerDetector
+ PlayerDetector NO_CREATIVE_PLAYERS = (level, entitySelector, pos, maxDistance, requireLineOfSight) -> {
+ List<? extends Player> players = entitySelector.getPlayers(
+ level, player -> player.blockPosition().closerThan(pos, maxDistance) && !player.isCreative() && !player.isSpectator()
+ );
+ List<UUID> result = new java.util.ArrayList<>();
+ for (Player player : players) {
+ if (!requireLineOfSight || inLineOfSight(level, pos.getCenter(), player.getEyePosition())) {
+ result.add(player.getUUID());
+ }
+ }
+ return result;
+ };
+
+ PlayerDetector INCLUDING_CREATIVE_PLAYERS = (level, entitySelector, pos, maxDistance, requireLineOfSight) -> {
+ List<? extends Player> players = entitySelector.getPlayers(
+ level, player -> player.blockPosition().closerThan(pos, maxDistance) && !player.isSpectator()
+ );
+ List<UUID> result = new java.util.ArrayList<>();
+ for (Player player : players) {
+ if (!requireLineOfSight || inLineOfSight(level, pos.getCenter(), player.getEyePosition())) {
+ result.add(player.getUUID());
+ }
+ }
+ return result;
+ };
+
PlayerDetector SHEEP = (level, entitySelector, pos, maxDistance, requireLineOfSight) -> {
AABB aabb = new AABB(pos).inflate(maxDistance);
- return entitySelector.getEntities(level, EntityType.SHEEP, aabb, LivingEntity::isAlive)
- .stream()
- .filter(sheep -> !requireLineOfSight || inLineOfSight(level, pos.getCenter(), sheep.getEyePosition()))
- .map(Entity::getUUID)
- .toList();
+ List<? extends Entity> sheep = entitySelector.getEntities(level, EntityType.SHEEP, aabb, LivingEntity::isAlive);
+ List<UUID> result = new java.util.ArrayList<>();
+ for (Entity entity : sheep) {
+ if (!requireLineOfSight || inLineOfSight(level, pos.getCenter(), entity.getEyePosition())) {
+ result.add(entity.getUUID());
+ }
+ }
+ return result;
};
+ // Leaf end - Remove streams on PlayerDetector
List<UUID> detect(ServerLevel level, PlayerDetector.EntitySelector entitySelector, BlockPos pos, double maxDistance, boolean requireLineOfSight);
@@ -78,14 +95,31 @@ public interface PlayerDetector {
return new PlayerDetector.EntitySelector() {
@Override
public List<Player> getPlayers(ServerLevel level, Predicate<? super Player> predicate) {
- return players.stream().filter(predicate).toList();
+ // Leaf start - Remove streams on PlayerDetector
+ List<Player> result = new java.util.ArrayList<>();
+ for (Player player : players) {
+ if (predicate.test(player)) {
+ result.add(player);
+ }
+ }
+ return result;
+ // Leaf end - Remove streams on PlayerDetector
}
@Override
public <T extends Entity> List<T> getEntities(
ServerLevel level, EntityTypeTest<Entity, T> typeTest, AABB boundingBox, Predicate<? super T> predicate
) {
- return players.stream().map(typeTest::tryCast).filter(Objects::nonNull).filter(predicate).toList();
+ // Leaf start - Remove streams on PlayerDetector
+ List<T> result = new java.util.ArrayList<>();
+ for (Player player : players) {
+ T entity = typeTest.tryCast(player);
+ if (entity != null && predicate.test(entity)) {
+ result.add(entity);
+ }
+ }
+ return result;
+ // Leaf end - Remove streams on PlayerDetector
}
};
}