9
0
mirror of https://github.com/Winds-Studio/Leaf.git synced 2026-01-06 15:51:31 +00:00
Files
Leaf/leaf-server/minecraft-patches/features/0279-fix-temptation-lookups.patch
hayanesuru 23b7b02eee optimize chunk map (#438)
* rebase

* optimize LivingEntity#travel

* cleanup

* Replace fluid height map

* reuse array list in Entity#collide

* cleanup

* fix fire and liquid collision shape

* fix checkInside

* inline betweenClosed

* cleanup

* optimize getOnPos

* optimize equals in getOnPos

* update mainSupportingBlockPos on dirty

* cleanup

* rename

* merge same patch

* rebase and remove properly

* [ci skip] cleanup

* rebase and rebuild

* fix async locator

* remove async locator

* cleanup

* rebase

---------

Co-authored-by: Taiyou06 <kaandindar21@gmail.com>
2025-08-19 20:48:26 +02:00

169 lines
11 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: hayanesuru <hayanesuru@outlook.jp>
Date: Fri, 15 Aug 2025 16:16:08 +0900
Subject: [PATCH] fix temptation lookups
diff --git a/io/papermc/paper/entity/temptation/GlobalTemptationLookup.java b/io/papermc/paper/entity/temptation/GlobalTemptationLookup.java
index 5f5cdfc538ba9aa6666c019df6706015234d7bae..2dfec8f6d0fe833e5f06cf2165ae14bf54cc7b84 100644
--- a/io/papermc/paper/entity/temptation/GlobalTemptationLookup.java
+++ b/io/papermc/paper/entity/temptation/GlobalTemptationLookup.java
@@ -24,6 +24,7 @@ public class GlobalTemptationLookup {
public static final TemptationPredicate BEE_FOOD = register(stack -> stack.is(ItemTags.BEE_FOOD));
public static final TemptationPredicate CHICKEN_FOOD = register(stack -> stack.is(ItemTags.CHICKEN_FOOD));
public static final TemptationPredicate COW_FOOD = register(stack -> stack.is(ItemTags.COW_FOOD));
+ public static final TemptationPredicate COW_FOOD_MUSHROOM = register(stack -> stack.is(Items.RED_MUSHROOM) || stack.is(Items.BROWN_MUSHROOM) || stack.is(ItemTags.COW_FOOD));
public static final TemptationPredicate PANDA_FOOD = register(stack -> stack.is(ItemTags.PANDA_FOOD));
public static final TemptationPredicate PIG_CARROT_ON_A_STICK = register(stack -> stack.is(Items.CARROT_ON_A_STICK));
public static final TemptationPredicate PIG = register(stack -> stack.is(ItemTags.PIG_FOOD));
@@ -61,20 +62,34 @@ public class GlobalTemptationLookup {
return val;
}
- private final List<BitSet> precalculatedTemptItems = new ArrayList<>();
+ private final BitSet[] precalculatedTemptItems;
private final BitSet calculatedThisTick = new BitSet();
+ private static final net.minecraft.server.level.ServerPlayer[] EMPTY_PLAYERS = {};
+ private net.minecraft.server.level.ServerPlayer[] players = EMPTY_PLAYERS;
{
- for (int i = 0; i < registeredPredicateCounter; i++) {
- this.precalculatedTemptItems.add(new BitSet());
+ precalculatedTemptItems = new BitSet[registeredPredicateCounter];
+ for (int i = 0; i < precalculatedTemptItems.length; i++) {
+ this.precalculatedTemptItems[i] = new BitSet();
}
}
- public void reset() {
+ public void tick(final net.minecraft.server.level.ServerLevel world) {
for (int i = 0; i < registeredPredicateCounter; i++) {
- this.precalculatedTemptItems.get(i).clear();
+ this.precalculatedTemptItems[i].clear();
+ this.calculatedThisTick.clear();
+ }
+
+ int j = 0;
+ final net.minecraft.server.level.ServerPlayer[] array = world.players().toArray(EMPTY_PLAYERS);
+ for (int i = 0; i < array.length; i++) {
+ final net.minecraft.server.level.ServerPlayer p = array[i];
+ if (!p.isSpectator() && p.isAlive()) {
+ array[j] = p;
+ j++;
+ }
}
- this.calculatedThisTick.clear();
+ this.players = it.unimi.dsi.fastutil.objects.ObjectArrays.setLength(array, j);
}
public boolean isCalculated(final int index) {
@@ -86,6 +101,10 @@ public class GlobalTemptationLookup {
}
public BitSet getBitSet(final int index) {
- return this.precalculatedTemptItems.get(index);
+ return this.precalculatedTemptItems[index];
+ }
+
+ public net.minecraft.server.level.ServerPlayer[] players() {
+ return this.players;
}
}
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
index 8496069c8605bd0233efc9b76492b22be6fefcd9..ba9efafd8e58e1dee7d871892906f85b4cbdf89a 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
@@ -936,7 +936,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
}
io.papermc.paper.entity.activation.ActivationRange.activateEntities(this); // Paper - EAR
- this.globalTemptationLookup.reset(); // Paper - optimise temptation lookups - reset global cache prior to next entity tick
+ this.globalTemptationLookup.tick(this); // Paper - optimise temptation lookups - reset global cache prior to next entity tick
if (org.dreeam.leaf.config.modules.opt.OptimizeDespawn.enabled && tickRateManager.runsNormally()) { despawnMap.tick(this, this.entityTickList); } // Leaf - optimize despawn
this.entityTickList
diff --git a/net/minecraft/world/entity/ai/goal/TemptGoal.java b/net/minecraft/world/entity/ai/goal/TemptGoal.java
index 0c9a355344463ea85a3b724d22d53638b1e42394..7cb94eb75a1de0cef02d4953ee5896bd5e3c7abd 100644
--- a/net/minecraft/world/entity/ai/goal/TemptGoal.java
+++ b/net/minecraft/world/entity/ai/goal/TemptGoal.java
@@ -64,21 +64,25 @@ public class TemptGoal extends Goal {
final net.minecraft.server.level.ServerLevel level = getServerLevel(this.mob);
final io.papermc.paper.entity.temptation.GlobalTemptationLookup lookup = level.getTemptGoalLookup();
final java.util.BitSet lookupBitSet = lookup.getBitSet(this.globalTemptationLookupIndex);
- final java.util.List<net.minecraft.server.level.ServerPlayer> players = level.players();
+ final net.minecraft.server.level.ServerPlayer[] players = lookup.players();
// Check if the lookup needs to be computed this tick. Do so for all players if needed.
if (!lookup.isCalculated(this.globalTemptationLookupIndex)) {
- for (int i = 0; i < players.size(); i++) {
- lookupBitSet.set(i, shouldFollow(players.get(i)));
+ for (int i = 0; i < players.length; i++) {
+ lookupBitSet.set(i, shouldFollow(players[i]));
}
lookup.setCalculated(this.globalTemptationLookupIndex);
}
double d = -1.0;
net.minecraft.server.level.ServerPlayer nearestPlayer = null;
// Only iterate over players that passed #shouldFollow either in the prior computation or another goals canUse check.
+ final Mob mob = this.mob;
+ final double mobX = mob.getX();
+ final double mobY = mob.getY();
+ final double mobZ = mob.getZ();
for (int i = lookupBitSet.nextSetBit(0); i >= 0; i = lookupBitSet.nextSetBit(i + 1)) {
- final net.minecraft.server.level.ServerPlayer player = players.get(i);
- if (rangeTargetingConditions.test(level, this.mob, player)) {
- final double d1 = player.distanceToSqr(this.mob.getX(), this.mob.getY(), this.mob.getZ());
+ final net.minecraft.server.level.ServerPlayer player = players[i];
+ if (rangeTargetingConditions.test(level, mob, player)) {
+ final double d1 = player.distanceToSqr(mobX, mobY, mobZ);
if (d == -1.0 || d1 < d) {
d = d1;
nearestPlayer = player;
diff --git a/net/minecraft/world/entity/ai/sensing/TemptingSensor.java b/net/minecraft/world/entity/ai/sensing/TemptingSensor.java
index a88b644c7480bfa66526c697455771eb7f86ad67..58c22828b62323ed99b7b1a9e3c1196aaf619786 100644
--- a/net/minecraft/world/entity/ai/sensing/TemptingSensor.java
+++ b/net/minecraft/world/entity/ai/sensing/TemptingSensor.java
@@ -35,11 +35,11 @@ public class TemptingSensor extends Sensor<PathfinderMob> {
if (this.globalTemptationLookupIndex != -1) {
final io.papermc.paper.entity.temptation.GlobalTemptationLookup lookup = level.getTemptGoalLookup();
final java.util.BitSet lookupBitSet = lookup.getBitSet(this.globalTemptationLookupIndex);
- final java.util.List<net.minecraft.server.level.ServerPlayer> players = level.players();
+ final net.minecraft.server.level.ServerPlayer[] players = lookup.players();
// Check if the lookup needs to be computed this tick. Do so for all players if needed.
if (!lookup.isCalculated(this.globalTemptationLookupIndex)) {
- for (int i = 0; i < players.size(); i++) {
- final net.minecraft.server.level.ServerPlayer serverPlayer = players.get(i);
+ for (int i = 0; i < players.length; i++) {
+ final net.minecraft.server.level.ServerPlayer serverPlayer = players[i];
lookupBitSet.set(i, net.minecraft.world.entity.EntitySelector.NO_SPECTATORS.test(serverPlayer) && this.playerHoldingTemptation(serverPlayer)); // check on update
}
lookup.setCalculated(this.globalTemptationLookupIndex);
@@ -47,10 +47,13 @@ public class TemptingSensor extends Sensor<PathfinderMob> {
double d = -1.0;
net.minecraft.server.level.ServerPlayer nearestPlayer = null;
// Only iterate over players that passed #shouldFollow either in the prior computation or another goals canUse check.
+ final double entityX = entity.getX();
+ final double entityY = entity.getY();
+ final double entityZ = entity.getZ();
for (int i = lookupBitSet.nextSetBit(0); i >= 0; i = lookupBitSet.nextSetBit(i + 1)) {
- final net.minecraft.server.level.ServerPlayer player = players.get(i);
+ final net.minecraft.server.level.ServerPlayer player = players[i];
if (targetingConditions.test(level, entity, player) && !entity.hasPassenger(player)) { // check on update - consider non passengers
- final double d1 = player.distanceToSqr(entity.getX(), entity.getY(), entity.getZ());
+ final double d1 = player.distanceToSqr(entityX, entityY, entityZ);
if (d == -1.0 || d1 < d) {
d = d1;
nearestPlayer = player;
diff --git a/net/minecraft/world/entity/animal/AbstractCow.java b/net/minecraft/world/entity/animal/AbstractCow.java
index 832a9a56fbf870e4242d4a59ab58ed43881fdccd..48441154ff7cbfea714ba88ac31910d0419644a8 100644
--- a/net/minecraft/world/entity/animal/AbstractCow.java
+++ b/net/minecraft/world/entity/animal/AbstractCow.java
@@ -40,7 +40,7 @@ public abstract class AbstractCow extends Animal {
this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables
this.goalSelector.addGoal(1, new PanicGoal(this, 2.0));
this.goalSelector.addGoal(2, new BreedGoal(this, 1.0));
- this.goalSelector.addGoal(3, new TemptGoal(this, 1.25, io.papermc.paper.entity.temptation.GlobalTemptationLookup.COW_FOOD, false)); // Paper - optimise temptation lookups
+ this.goalSelector.addGoal(3, new TemptGoal(this, 1.25, level().purpurConfig.cowFeedMushrooms > 0 ? io.papermc.paper.entity.temptation.GlobalTemptationLookup.COW_FOOD_MUSHROOM : io.papermc.paper.entity.temptation.GlobalTemptationLookup.COW_FOOD, false)); // Purpur - Cows eat mushrooms // Paper - optimise temptation lookups
this.goalSelector.addGoal(4, new FollowParentGoal(this, 1.25));
this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0));
this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F));