diff --git a/patches/server/0012-Lazily-create-LootContext-for-criterions.patch b/patches/server/0012-Lazily-create-LootContext-for-criterions.patch new file mode 100644 index 0000000..bdb522f --- /dev/null +++ b/patches/server/0012-Lazily-create-LootContext-for-criterions.patch @@ -0,0 +1,33 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: MrPowerGamerBR +Date: Tue, 21 Nov 2023 12:16:39 -0300 +Subject: [PATCH] Lazily create LootContext for criterions + +For each player on each tick, enter block triggers are invoked, and these create loot contexts that are promptly thrown away since the trigger doesn't pass the predicate + +To avoid this, we now lazily create the LootContext if the criterion passes the predicate AND if any of the listener triggers require a loot context instance + +diff --git a/src/main/java/net/minecraft/advancements/critereon/SimpleCriterionTrigger.java b/src/main/java/net/minecraft/advancements/critereon/SimpleCriterionTrigger.java +index f0367a9cce13ef576fbb7023c0aba6eb48963606..bace327cd6409025463ef2caa2c478ebdb196665 100644 +--- a/src/main/java/net/minecraft/advancements/critereon/SimpleCriterionTrigger.java ++++ b/src/main/java/net/minecraft/advancements/critereon/SimpleCriterionTrigger.java +@@ -54,13 +54,18 @@ public abstract class SimpleCriterionTrigger> set = (Set) playerAdvancements.criterionData.get(this); // Paper - fix AdvancementDataPlayer leak + if (set != null && !set.isEmpty()) { +- LootContext lootContext = EntityPredicate.createContext(player, player); ++ LootContext lootContext = null; // EntityPredicate.createContext(player, player); // SparklyPaper - lazily create LootContext for criterions + List> list = null; + + for(CriterionTrigger.Listener listener : set) { + T simpleInstance = listener.trigger(); + if (predicate.test(simpleInstance)) { + Optional optional = simpleInstance.playerPredicate(); ++ // SparklyPaper start - lazily create LootContext for criterions ++ if (lootContext == null && optional.isPresent()) { ++ lootContext = EntityPredicate.createContext(player, player); ++ } ++ // SparklyPaper end + if (optional.isEmpty() || optional.get().matches(lootContext)) { + if (list == null) { + list = Lists.newArrayList(); diff --git a/patches/server/0012-Track-how-much-MSPT-each-world-used.patch b/patches/server/0013-Track-how-much-MSPT-each-world-used.patch similarity index 100% rename from patches/server/0012-Track-how-much-MSPT-each-world-used.patch rename to patches/server/0013-Track-how-much-MSPT-each-world-used.patch diff --git a/patches/server/0013-Parallel-world-ticking.patch b/patches/server/0014-Parallel-world-ticking.patch similarity index 100% rename from patches/server/0013-Parallel-world-ticking.patch rename to patches/server/0014-Parallel-world-ticking.patch