From 859ebd5ad46ee9c80def36f6b44ee04417c0900d Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Wed, 11 Nov 2020 08:18:36 -0800 Subject: [PATCH] Fix client lag on advancement loading (#4710) When new advancements are added via the UnsafeValues#loadAdvancement API, it triggers a full datapack reload when this is not necessary. The advancement is already loaded directly into the advancement registry, and the point of saving the advancement to the Bukkit datapack seems to be for persistence. By removing the call to reload datapacks when an advancement is loaded, the client no longer completely freezes up when adding a new advancement. To ensure the client still receives the updated advancement data, we manually reload the advancement data for all players, which normally takes place as a part of the datapack reloading. --- ...ix-client-lag-on-advancement-loading.patch | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 Spigot-Server-Patches/Fix-client-lag-on-advancement-loading.patch diff --git a/Spigot-Server-Patches/Fix-client-lag-on-advancement-loading.patch b/Spigot-Server-Patches/Fix-client-lag-on-advancement-loading.patch new file mode 100644 index 0000000000..acd39431de --- /dev/null +++ b/Spigot-Server-Patches/Fix-client-lag-on-advancement-loading.patch @@ -0,0 +1,55 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> +Date: Sat, 31 Oct 2020 11:49:01 -0700 +Subject: [PATCH] Fix client lag on advancement loading + +When new advancements are added via the UnsafeValues#loadAdvancement +API, it triggers a full datapack reload when this is not necessary. The +advancement is already loaded directly into the advancement registry, +and the point of saving the advancement to the Bukkit datapack seems to +be for persistence. By removing the call to reload datapacks when an +advancement is loaded, the client no longer completely freezes up when +adding a new advancement. +To ensure the client still receives the updated advancement data, we +manually reload the advancement data for all players, which +normally takes place as a part of the datapack reloading. + +diff --git a/src/main/java/net/minecraft/server/AdvancementDataPlayer.java b/src/main/java/net/minecraft/server/AdvancementDataPlayer.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/net/minecraft/server/AdvancementDataPlayer.java ++++ b/src/main/java/net/minecraft/server/AdvancementDataPlayer.java +@@ -0,0 +0,0 @@ public class AdvancementDataPlayer { + + } + ++ public final void reload(AdvancementDataWorld advancementDataWorld) { this.a(advancementDataWorld); } // Paper - OBFHELPER + public void a(AdvancementDataWorld advancementdataworld) { + this.a(); + this.data.clear(); +@@ -0,0 +0,0 @@ public class AdvancementDataPlayer { + + } + ++ public final void sendUpdateIfNeeded(EntityPlayer entityPlayer) { this.b(entityPlayer); } // Paper - OBFHELPER + public void b(EntityPlayer entityplayer) { + if (this.m || !this.i.isEmpty() || !this.j.isEmpty()) { + Map map = Maps.newHashMap(); +diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java ++++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +@@ -0,0 +0,0 @@ public final class CraftMagicNumbers implements UnsafeValues { + Bukkit.getLogger().log(Level.SEVERE, "Error saving advancement " + key, ex); + } + +- MinecraftServer.getServer().getPlayerList().reload(); ++ // Paper start ++ //MinecraftServer.getServer().getPlayerList().reload(); ++ MinecraftServer.getServer().getPlayerList().getPlayers().forEach(player -> { ++ player.getAdvancementData().reload(MinecraftServer.getServer().getAdvancementData()); ++ player.getAdvancementData().sendUpdateIfNeeded(player); ++ }); ++ // Paper end + + return bukkit; + }