mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-17 16:37:43 +01:00
Drop async advancements patch for now
Dropped per the advice of Proximyst. Has possible issues if players log in while they are still logging out from another location, with increased risk during lag spikes. A fix/workaround is possible in the future, but for the time being we will just drop this patch to avoid any potential problems.
This commit is contained in:
@@ -1,156 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Mariell Hoversholm <proximyst@proximyst.com>
|
||||
Date: Thu, 20 Aug 2020 17:57:02 +0200
|
||||
Subject: [PATCH] PaperPR - Apply advancements async
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/AdvancementDataPlayer.java b/src/main/java/net/minecraft/server/AdvancementDataPlayer.java
|
||||
index eaa1063ff2bc5621e93043c4de41ca62f1323fde..a3b89a4f2a291b9a9bf847e059c6b926ea9db9b2 100644
|
||||
--- a/src/main/java/net/minecraft/server/AdvancementDataPlayer.java
|
||||
+++ b/src/main/java/net/minecraft/server/AdvancementDataPlayer.java
|
||||
@@ -63,6 +63,7 @@ public class AdvancementDataPlayer {
|
||||
this.d(advancementdataworld);
|
||||
}
|
||||
|
||||
+ public final void setPlayer(EntityPlayer entityPlayer) { this.a(entityPlayer); } // Paper - OBFHELPER
|
||||
public void a(EntityPlayer entityplayer) {
|
||||
this.player = entityplayer;
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/server/CriterionProgress.java b/src/main/java/net/minecraft/server/CriterionProgress.java
|
||||
index 98c3884f478aed1eba82c15f258ebfa1c7203b14..244b58a7c41d2b0ba3117550282e68a168439708 100644
|
||||
--- a/src/main/java/net/minecraft/server/CriterionProgress.java
|
||||
+++ b/src/main/java/net/minecraft/server/CriterionProgress.java
|
||||
@@ -10,8 +10,9 @@ import java.util.Date;
|
||||
|
||||
public class CriterionProgress {
|
||||
|
||||
- private static final SimpleDateFormat a = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
|
||||
- private Date b;
|
||||
+ private static final SimpleDateFormat a = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); // Paper - diff on change
|
||||
+ private static final ThreadLocal<SimpleDateFormat> THREAD_LOCAL_FORMATTER = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z")); // Paper - async advancements - SimpleDateFormat is not thread safe
|
||||
+ private Date b; private void setDate(Date date) { this.b = date; } // Paper - OBFHELPER
|
||||
|
||||
public CriterionProgress() {}
|
||||
|
||||
@@ -44,7 +45,7 @@ public class CriterionProgress {
|
||||
}
|
||||
|
||||
public JsonElement e() {
|
||||
- return (JsonElement) (this.b != null ? new JsonPrimitive(CriterionProgress.a.format(this.b)) : JsonNull.INSTANCE);
|
||||
+ return this.getDate() != null ? new JsonPrimitive(THREAD_LOCAL_FORMATTER.get().format(this.getDate())) : JsonNull.INSTANCE; // Paper
|
||||
}
|
||||
|
||||
public static CriterionProgress b(PacketDataSerializer packetdataserializer) {
|
||||
@@ -61,7 +62,7 @@ public class CriterionProgress {
|
||||
CriterionProgress criterionprogress = new CriterionProgress();
|
||||
|
||||
try {
|
||||
- criterionprogress.b = CriterionProgress.a.parse(s);
|
||||
+ criterionprogress.setDate(THREAD_LOCAL_FORMATTER.get().parse(s)); // Paper
|
||||
return criterionprogress;
|
||||
} catch (ParseException parseexception) {
|
||||
throw new JsonSyntaxException("Invalid datetime: " + s, parseexception);
|
||||
diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java
|
||||
index 50cd947d0e47e7897a071fdf8ff6e5834e137d58..5e4cc5e8f71c1c657041159305ce3e4a9aa9f46b 100644
|
||||
--- a/src/main/java/net/minecraft/server/EntityPlayer.java
|
||||
+++ b/src/main/java/net/minecraft/server/EntityPlayer.java
|
||||
@@ -51,7 +51,8 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
|
||||
public final MinecraftServer server;
|
||||
public final PlayerInteractManager playerInteractManager;
|
||||
public final Deque<Integer> removeQueue = new ArrayDeque<>(); // Paper
|
||||
- private final AdvancementDataPlayer advancementDataPlayer;
|
||||
+ private AdvancementDataPlayer advancementDataPlayer; // Paper - remove final
|
||||
+ private final java.util.concurrent.CompletableFuture<AdvancementDataPlayer> advancementDataPlayerCompletableFuture; // Paper - async advancements
|
||||
private final ServerStatisticManager serverStatisticManager;
|
||||
private float lastHealthScored = Float.MIN_VALUE;
|
||||
private int lastFoodScored = Integer.MIN_VALUE;
|
||||
@@ -138,7 +139,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
|
||||
this.playerInteractManager = playerinteractmanager;
|
||||
this.server = minecraftserver;
|
||||
this.serverStatisticManager = minecraftserver.getPlayerList().getStatisticManager(this);
|
||||
- this.advancementDataPlayer = minecraftserver.getPlayerList().f(this);
|
||||
+ this.advancementDataPlayerCompletableFuture = minecraftserver.getPlayerList().loadAdvancementDataPlayerAsync(this); // Paper - async advancements
|
||||
this.G = 1.0F;
|
||||
//this.c(worldserver); // Paper - don't move to spawn on login, only first join
|
||||
this.co = minecraftserver.a(this);
|
||||
@@ -507,7 +508,8 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
|
||||
CriterionTriggers.u.a(this, this.cf, this.ticksLived - this.cg);
|
||||
}
|
||||
|
||||
- this.advancementDataPlayer.b(this);
|
||||
+ if (areAdvancementsLoaded()) // Paper - async advancements: don't tick advancements until they're loaded
|
||||
+ this.advancementDataPlayer.sendUpdateIfNeeded(this); // Paper - conflict on change
|
||||
|
||||
// Purpur start
|
||||
if (this.world.purpurConfig.useNightVisionWhenRiding && this.getVehicle() != null && this.getVehicle().getRider() == this && world.getTime() % 100 == 0) { // 5 seconds
|
||||
@@ -2134,7 +2136,26 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
|
||||
this.worldChangeInvuln = false;
|
||||
}
|
||||
|
||||
+ // Paper start - async advancements
|
||||
+ public boolean areAdvancementsLoaded() {
|
||||
+ return this.advancementDataPlayer != null
|
||||
+ || this.advancementDataPlayerCompletableFuture.isDone();
|
||||
+ }
|
||||
+
|
||||
+ public AdvancementDataPlayer getAdvancementDataIfLoadedImmediately() {
|
||||
+ // We need a null check here because this method is called before the future is assigned.
|
||||
+ // Once assigned, it will essentially be a no-op as the field is final.
|
||||
+ if (this.advancementDataPlayer == null && this.advancementDataPlayerCompletableFuture != null && this.advancementDataPlayerCompletableFuture.isDone())
|
||||
+ this.advancementDataPlayer = this.advancementDataPlayerCompletableFuture.join();
|
||||
+ return this.advancementDataPlayer;
|
||||
+ }
|
||||
+
|
||||
public AdvancementDataPlayer getAdvancementData() {
|
||||
+ if (this.advancementDataPlayer == null)
|
||||
+ synchronized (this.advancementDataPlayerCompletableFuture) {
|
||||
+ if (this.advancementDataPlayer == null) this.advancementDataPlayer = this.advancementDataPlayerCompletableFuture.join();
|
||||
+ }
|
||||
+ // Paper end
|
||||
return this.advancementDataPlayer;
|
||||
}
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
index 2374a7ee018493795389b21848289395168db422..6c9a8d92e70106635699e55367eed60ac95c3290 100644
|
||||
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
@@ -2315,6 +2315,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
|
||||
return methodprofilerresults;
|
||||
}
|
||||
|
||||
+ public final java.nio.file.Path getSavedFilePath(SavedFile savedFile) { return this.a(savedFile); } // Paper - OBFHELPER
|
||||
public java.nio.file.Path a(SavedFile savedfile) {
|
||||
return this.convertable.getWorldFolder(savedfile);
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java
|
||||
index 7b385eb43e4cf565d500d0250f3c5e4dbebae986..eae19141e3cc890d3b4bdc0d0297061e79857160 100644
|
||||
--- a/src/main/java/net/minecraft/server/PlayerList.java
|
||||
+++ b/src/main/java/net/minecraft/server/PlayerList.java
|
||||
@@ -1339,9 +1339,26 @@ public abstract class PlayerList {
|
||||
return serverstatisticmanager;
|
||||
}
|
||||
|
||||
+ // Paper start - async advancements
|
||||
+ public java.util.concurrent.CompletableFuture<AdvancementDataPlayer> loadAdvancementDataPlayerAsync(EntityPlayer entityPlayer) {
|
||||
+ if (entityPlayer.getAdvancementDataIfLoadedImmediately() != null) {
|
||||
+ entityPlayer.getAdvancementData().setPlayer(entityPlayer);
|
||||
+ return java.util.concurrent.CompletableFuture.completedFuture(entityPlayer.getAdvancementData());
|
||||
+ }
|
||||
+
|
||||
+ UUID uuid = entityPlayer.getUniqueID();
|
||||
+ File file = this.server.getSavedFilePath(SavedFile.ADVANCEMENTS).toFile();
|
||||
+ final File file1 = new File(file, uuid + ".json");
|
||||
+ return java.util.concurrent.CompletableFuture.supplyAsync(
|
||||
+ () -> new AdvancementDataPlayer(this.server.getDataFixer(), this, this.server.getAdvancementData(), file1, entityPlayer),
|
||||
+ this.server.executorService
|
||||
+ );
|
||||
+ }
|
||||
+ // Paper end
|
||||
+
|
||||
public AdvancementDataPlayer f(EntityPlayer entityplayer) {
|
||||
UUID uuid = entityplayer.getUniqueID();
|
||||
- AdvancementDataPlayer advancementdataplayer = (AdvancementDataPlayer) entityplayer.getAdvancementData(); // CraftBukkit
|
||||
+ AdvancementDataPlayer advancementdataplayer = (AdvancementDataPlayer) entityplayer.getAdvancementDataIfLoadedImmediately(); // CraftBukkit // Paper
|
||||
|
||||
if (advancementdataplayer == null) {
|
||||
File file = this.server.a(SavedFile.ADVANCEMENTS).toFile();
|
||||
@@ -5,7 +5,7 @@ Subject: [PATCH] Spread out and optimise player list ticks
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java
|
||||
index eae19141e3cc890d3b4bdc0d0297061e79857160..881db63d6f2776956429b969e59db2534f8d96af 100644
|
||||
index 7b385eb43e4cf565d500d0250f3c5e4dbebae986..f055fd0aff86d04677d0bd256c9e7c12f94bfbcc 100644
|
||||
--- a/src/main/java/net/minecraft/server/PlayerList.java
|
||||
+++ b/src/main/java/net/minecraft/server/PlayerList.java
|
||||
@@ -71,7 +71,7 @@ public abstract class PlayerList {
|
||||
@@ -17,7 +17,7 @@ index ccd0be059f4d7b95d4ec58c0d4fc744a94fec3fd..e31f13b80aef9b410c508030c0d965ec
|
||||
|
||||
if (commanddispatcher_servertype.d) {
|
||||
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
index 6c9a8d92e70106635699e55367eed60ac95c3290..d39b04e2a3d87be04625d85f42f3ab8263e91747 100644
|
||||
index 2374a7ee018493795389b21848289395168db422..d33047a57f232ea2260289d86836264f91a52d86 100644
|
||||
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
@@ -473,6 +473,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
|
||||
@@ -37,7 +37,7 @@ index 6c9a8d92e70106635699e55367eed60ac95c3290..d39b04e2a3d87be04625d85f42f3ab82
|
||||
this.isRestarting = isRestarting;
|
||||
if (flag) {
|
||||
diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java
|
||||
index 881db63d6f2776956429b969e59db2534f8d96af..628771e6b450f8053eaca6499f1bbecac7337071 100644
|
||||
index f055fd0aff86d04677d0bd256c9e7c12f94bfbcc..d2a7fa1595ed4bc9fea0238af42f70889e07b262 100644
|
||||
--- a/src/main/java/net/minecraft/server/PlayerList.java
|
||||
+++ b/src/main/java/net/minecraft/server/PlayerList.java
|
||||
@@ -513,6 +513,8 @@ public abstract class PlayerList {
|
||||
Reference in New Issue
Block a user