2020-10-06 16:26:45 +02:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Ivan Pekov <ivan@mrivanplays.com>
|
|
|
|
Date: Tue, 6 Oct 2020 15:10:12 +0300
|
|
|
|
Subject: [PATCH] Optimize advancement loading
|
|
|
|
|
|
|
|
Removed some object allocations and reduced loops
|
|
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/Advancement.java b/src/main/java/net/minecraft/server/Advancement.java
|
|
|
|
index c405047c00d354bbc1449fd2f917b73f980ef1a5..8b31098032dc7a08d201e20c917f27348dd2f437 100644
|
|
|
|
--- a/src/main/java/net/minecraft/server/Advancement.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/Advancement.java
|
|
|
|
@@ -68,6 +68,7 @@ public class Advancement {
|
|
|
|
return this.display;
|
|
|
|
}
|
|
|
|
|
|
|
|
+ public final AdvancementRewards getRewards() { return d(); } // Yatopia - OBFHELPER
|
|
|
|
public AdvancementRewards d() {
|
|
|
|
return this.rewards;
|
|
|
|
}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/AdvancementDataPlayer.java b/src/main/java/net/minecraft/server/AdvancementDataPlayer.java
|
2020-11-13 09:32:37 +01:00
|
|
|
index c680319e4040be2b60795b22a5e65d6444cc67ed..18e80feae122f9b90e61b66e0f660d15585fe3bb 100644
|
2020-10-06 16:26:45 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/AdvancementDataPlayer.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/AdvancementDataPlayer.java
|
2020-11-13 09:32:37 +01:00
|
|
|
@@ -160,11 +160,16 @@ public class AdvancementDataPlayer {
|
2020-10-21 17:08:52 +02:00
|
|
|
throw new JsonParseException("Found null for advancements");
|
2020-10-06 16:26:45 +02:00
|
|
|
}
|
|
|
|
|
2020-10-21 17:08:52 +02:00
|
|
|
+ /* // Yatopia start - streams no good
|
2020-10-06 16:26:45 +02:00
|
|
|
Stream<Entry<MinecraftKey, AdvancementProgress>> stream = map.entrySet().stream().sorted(Comparator.comparing(Entry::getValue));
|
|
|
|
Iterator iterator = ((List) stream.collect(Collectors.toList())).iterator();
|
|
|
|
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
Entry<MinecraftKey, AdvancementProgress> entry = (Entry) iterator.next();
|
|
|
|
+ */
|
2020-10-21 17:08:52 +02:00
|
|
|
+ Entry<MinecraftKey, AdvancementProgress>[] entries = map.entrySet().toArray(new Entry[0]);
|
|
|
|
+ java.util.Arrays.sort(entries, Entry.comparingByValue());
|
|
|
|
+ for (Entry<MinecraftKey, AdvancementProgress> entry : entries) { // Yatopia end
|
2020-10-06 16:26:45 +02:00
|
|
|
Advancement advancement = advancementdataworld.a((MinecraftKey) entry.getKey());
|
|
|
|
|
|
|
|
if (advancement == null) {
|
2020-11-13 09:32:37 +01:00
|
|
|
@@ -201,11 +206,37 @@ public class AdvancementDataPlayer {
|
2020-10-06 16:26:45 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
+ /* // Yatopia start
|
|
|
|
this.c(advancementdataworld);
|
|
|
|
this.c();
|
|
|
|
this.b(advancementdataworld);
|
|
|
|
+ */
|
|
|
|
+ loadAdvancements(advancementdataworld);
|
|
|
|
+ // Yatopia end
|
2020-10-21 17:08:52 +02:00
|
|
|
}
|
|
|
|
|
2020-10-06 16:26:45 +02:00
|
|
|
+ // Yatopia start - reduce overload by post io load of advancements
|
|
|
|
+ // this combines c(AdvancementDataWorld), c() and b(AdvancementDataWorld) into 1 method
|
|
|
|
+ // the changes done: loops thru all the advancements only once, does not create an additional list
|
|
|
|
+ // and does not loop thru the additional list, does not create an additional set when checking for progress and
|
|
|
|
+ // does not additionally loop thru it
|
|
|
|
+ private void loadAdvancements(AdvancementDataWorld serverAdvancementManager) {
|
|
|
|
+ for (Advancement advancement : serverAdvancementManager.getAdvancements()) {
|
|
|
|
+ if (advancement.getCriteria().isEmpty()) {
|
|
|
|
+ grantCriteria(advancement, "");
|
|
|
|
+ advancement.getRewards().a(player); // todo: too lazy to import AdvancementRewards for an obfhelper
|
|
|
|
+ }
|
|
|
|
+ AdvancementProgress progress = getProgress(advancement);
|
|
|
|
+ if (progress.isDone()) {
|
|
|
|
+ this.j.add(advancement);
|
|
|
|
+ updateVisibility(advancement);
|
|
|
|
+ continue; // Do not double check isDone
|
|
|
|
+ }
|
2020-10-21 17:08:52 +02:00
|
|
|
+ beginTrackingNoIsDone(advancement, progress);
|
2020-10-06 16:26:45 +02:00
|
|
|
+ }
|
2020-10-21 17:08:52 +02:00
|
|
|
+ }
|
2020-10-06 16:26:45 +02:00
|
|
|
+ // Yatopia end
|
2020-10-21 17:08:52 +02:00
|
|
|
+
|
2020-10-06 16:26:45 +02:00
|
|
|
public void b() {
|
|
|
|
if (org.spigotmc.SpigotConfig.disableAdvancementSaving) return; // Spigot
|
2020-10-21 17:08:52 +02:00
|
|
|
Map<MinecraftKey, AdvancementProgress> map = Maps.newHashMap();
|
2020-11-13 09:32:37 +01:00
|
|
|
@@ -330,6 +361,11 @@ public class AdvancementDataPlayer {
|
2020-10-06 16:26:45 +02:00
|
|
|
AdvancementProgress advancementprogress = this.getProgress(advancement);
|
|
|
|
|
2020-10-21 17:08:52 +02:00
|
|
|
if (!advancementprogress.isDone()) {
|
|
|
|
+ // Yatopia start - beginTrackig with no isDone check
|
|
|
|
+ beginTrackingNoIsDone(advancement, advancementprogress);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ private void beginTrackingNoIsDone(Advancement advancement, AdvancementProgress advancementprogress) {
|
|
|
|
Iterator iterator = advancement.getCriteria().entrySet().iterator();
|
|
|
|
|
|
|
|
while (iterator.hasNext()) {
|
2020-11-13 09:32:37 +01:00
|
|
|
@@ -349,7 +385,7 @@ public class AdvancementDataPlayer {
|
2020-10-21 17:08:52 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- }
|
|
|
|
+ //} // Yatopia end
|
|
|
|
}
|
|
|
|
|
|
|
|
private void d(Advancement advancement) {
|
2020-11-13 09:32:37 +01:00
|
|
|
@@ -444,6 +480,7 @@ public class AdvancementDataPlayer {
|
2020-10-06 16:26:45 +02:00
|
|
|
this.data.put(advancement, advancementprogress);
|
|
|
|
}
|
|
|
|
|
|
|
|
+ private final void updateVisibility(Advancement advancement) { e(advancement); } // Yatopia
|
|
|
|
private void e(Advancement advancement) {
|
|
|
|
// Paper start
|
|
|
|
e(advancement, IterationEntryPoint.ROOT);
|