From d6f7da4e74423d6577e5bf7e686cfee1b837d2d2 Mon Sep 17 00:00:00 2001 From: filoghost Date: Mon, 6 Feb 2017 11:34:01 +0100 Subject: [PATCH] Protection against async chunk loads caused by other plugins --- .../listener/MainListener.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/listener/MainListener.java b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/listener/MainListener.java index d22f0ead..db090bbc 100644 --- a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/listener/MainListener.java +++ b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/listener/MainListener.java @@ -3,6 +3,7 @@ package com.gmail.filoghost.holographicdisplays.listener; import java.util.Map; import java.util.logging.Level; +import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; @@ -59,7 +60,27 @@ public class MainListener implements Listener { @EventHandler (priority = EventPriority.MONITOR) public void onChunkLoad(ChunkLoadEvent event) { - Chunk chunk = event.getChunk(); + final Chunk chunk = event.getChunk(); + + // Other plugins could call this event wrongly, check if the chunk is actually loaded. + if (chunk.isLoaded()) { + + // In case another plugin loads the chunk asynchronously always make sure to load the holograms on the main thread. + if (Bukkit.isPrimaryThread()) { + processChunkLoad(chunk); + } else { + Bukkit.getScheduler().runTask(HolographicDisplays.getInstance(), new Runnable() { + @Override + public void run() { + processChunkLoad(chunk); + } + }); + } + } + } + + // This method should be always called synchronously. + public void processChunkLoad(Chunk chunk) { NamedHologramManager.onChunkLoad(chunk); PluginHologramManager.onChunkLoad(chunk); }