mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2026-01-06 15:51:31 +00:00
* 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>
169 lines
11 KiB
Diff
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));
|