aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-Server-Patches/0465-Delay-unsafe-actions-until-after-entity-ticking-is-d.patch
blob: 28c02310864adc638445b4b1f2ef6a0c1b70daca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Sat, 11 Apr 2020 21:23:42 -0400
Subject: [PATCH] Delay unsafe actions until after entity ticking is done

This will help prevent many cases of unregistering entities during entity ticking

diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index a4a2882d32d0167738f8367209dbfd3ca4f5b953..9e32e2db10f5faaa3c5f4adc5cbc2c1a2e4d3073 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -60,6 +60,16 @@ public class WorldServer extends World {
     private final Queue<Entity> entitiesToAdd = Queues.newArrayDeque();
     public final List<EntityPlayer> players = Lists.newArrayList(); // Paper - private -> public
     boolean tickingEntities;
+    // Paper start
+    List<java.lang.Runnable> afterEntityTickingTasks = Lists.newArrayList();
+    public void doIfNotEntityTicking(java.lang.Runnable run) {
+        if (tickingEntities) {
+            afterEntityTickingTasks.add(run);
+        } else {
+            run.run();
+        }
+    }
+    // Paper end
     private final MinecraftServer server;
     private final WorldNBTStorage dataManager;
     public boolean savingDisabled;
@@ -531,6 +541,16 @@ public class WorldServer extends World {
             timings.entityTick.stopTiming(); // Spigot
 
             this.tickingEntities = false;
+            // Paper start
+            for (java.lang.Runnable run : this.afterEntityTickingTasks) {
+                try {
+                    run.run();
+                } catch (Exception e) {
+                    LOGGER.error("Error in After Entity Ticking Task", e);
+                }
+            }
+            this.afterEntityTickingTasks.clear();
+            // Paper end
             this.getMinecraftServer().midTickLoadChunks(); // Paper
 
             try (co.aikar.timings.Timing ignored = this.timings.newEntities.startTiming()) { // Paper - timings