mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-27 02:49:19 +00:00
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.
111 lines
5.7 KiB
Diff
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
|
|
}
|
|
};
|
|
}
|