From dd77d31f76ae35b92b714de1ef903ebf4e9f26a5 Mon Sep 17 00:00:00 2001 From: MrPowerGamerBR Date: Tue, 21 Nov 2023 12:18:19 -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 --- ...ly-create-LootContext-for-criterions.patch | 33 +++++++++++++++++++ ...Track-how-much-MSPT-each-world-used.patch} | 0 ...atch => 0014-Parallel-world-ticking.patch} | 0 3 files changed, 33 insertions(+) create mode 100644 patches/server/0012-Lazily-create-LootContext-for-criterions.patch rename patches/server/{0012-Track-how-much-MSPT-each-world-used.patch => 0013-Track-how-much-MSPT-each-world-used.patch} (100%) rename patches/server/{0013-Parallel-world-ticking.patch => 0014-Parallel-world-ticking.patch} (100%) 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