From 9ed0bbe43af67eaade5fc37fde6872b87815c86a Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Thu, 21 Jul 2016 14:22:38 -0500 Subject: [PATCH] Fix NPC's for unloaded worlds --- .../src/mineplex/core/npc/NpcManager.java | 51 ++++++++++++++----- 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/npc/NpcManager.java b/Plugins/Mineplex.Core/src/mineplex/core/npc/NpcManager.java index 87c84076d..63960ac15 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/npc/NpcManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/npc/NpcManager.java @@ -2,14 +2,7 @@ package mineplex.core.npc; import java.sql.Connection; import java.sql.SQLException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; +import java.util.*; import org.bukkit.*; import org.bukkit.configuration.InvalidConfigurationException; @@ -87,6 +80,7 @@ public class NpcManager extends MiniPlugin private final Creature _creature; private final List _npcs = new ArrayList<>(); + private final Queue _queuedNpcs = new LinkedList<>(); final Map _npcMap = new HashMap<>(); private final Set _npcDeletingPlayers = new HashSet<>(); @@ -504,11 +498,19 @@ public class NpcManager extends MiniPlugin { record.detach(); - Npc npc = new Npc(this, record); - _npcs.add(npc); + if (Bukkit.getWorld(record.getWorld()) == null) + { + // World isnt loaded yet, add to queue + _queuedNpcs.add(record); + } + else + { + Npc npc = new Npc(this, record); + _npcs.add(npc); - if (npc.getChunk().isLoaded()) - spawnNpc(npc); + if (npc.getChunk() != null && npc.getChunk().isLoaded()) + spawnNpc(npc); + } } } } @@ -561,11 +563,34 @@ public class NpcManager extends MiniPlugin for (Npc npc : _npcs) { - if (npc.getEntity() != null && !npc.getEntity().isValid() && npc.getChunk().isLoaded()) + if (npc.getEntity() != null && !npc.getEntity().isValid() && npc.getChunk() != null && npc.getChunk().isLoaded()) spawnNpc(npc); } } + @EventHandler + public void processNpcQueue(UpdateEvent event) + { + if (event.getType() != UpdateType.SEC_05) + return; + + Iterator iterator = _queuedNpcs.iterator(); + while (iterator.hasNext()) + { + NpcsRecord record = iterator.next(); + if (Bukkit.getWorld(record.getWorld()) != null) + { + Npc npc = new Npc(this, record); + _npcs.add(npc); + iterator.remove(); + + if (npc.getChunk() != null && npc.getChunk().isLoaded()) + spawnNpc(npc); + } + } + + } + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onChunkLoad(ChunkLoadEvent event) {