From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Aikar 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/level/WorldServer.java b/src/main/java/net/minecraft/server/level/WorldServer.java index 3825e05025b42a38d6e473b75a90475f0c62585f..2d01ae0fa137ad414a9a9b6c0864a713fed93e17 100644 --- a/src/main/java/net/minecraft/server/level/WorldServer.java +++ b/src/main/java/net/minecraft/server/level/WorldServer.java @@ -175,6 +175,16 @@ public class WorldServer extends World implements GeneratorAccessSeed { public final List players = Lists.newArrayList(); // Paper - private -> public public final ChunkProviderServer chunkProvider; // Paper - public boolean tickingEntities; + // Paper start + List afterEntityTickingTasks = Lists.newArrayList(); + public void doIfNotEntityTicking(java.lang.Runnable run) { + if (tickingEntities) { + afterEntityTickingTasks.add(run); + } else { + run.run(); + } + } + // Paper end private final MinecraftServer server; public final WorldDataServer worldDataServer; // CraftBukkit - type public boolean savingDisabled; @@ -642,6 +652,16 @@ public class WorldServer extends World implements GeneratorAccessSeed { 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 Entity entity2;