diff --git a/src/main/java/de/epiceric/shopchest/listeners/ShopUpdateListener.java b/src/main/java/de/epiceric/shopchest/listeners/ShopUpdateListener.java index ddce5c0..33feeba 100644 --- a/src/main/java/de/epiceric/shopchest/listeners/ShopUpdateListener.java +++ b/src/main/java/de/epiceric/shopchest/listeners/ShopUpdateListener.java @@ -9,7 +9,10 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.scheduler.BukkitRunnable; public class ShopUpdateListener implements Listener { @@ -28,14 +31,43 @@ public class ShopUpdateListener implements Listener { @EventHandler(priority = EventPriority.MONITOR) public void onPlayerJoin(PlayerJoinEvent e) { + restartShopUpdater(e.getPlayer()); + } + + // The Bukkit::getOnlinePlayers() list does not include players that + // are currently respawning or chaning worlds, so when only one player is + // online and is currently respawning, the updater will think that no player + // is online, so it will stop. To prevent that, a delay of 1 tick is needed. + + @EventHandler + public void onPlayerChangedWorld(final PlayerChangedWorldEvent e) { + new BukkitRunnable() { + @Override + public void run() { + restartShopUpdater(e.getPlayer()); + } + }.runTaskLater(plugin, 1L); + } + + @EventHandler + public void onPlayerRespawn(final PlayerRespawnEvent e) { + new BukkitRunnable() { + @Override + public void run() { + restartShopUpdater(e.getPlayer()); + } + }.runTaskLater(plugin, 1L); + } + + private void restartShopUpdater(Player p) { if (!plugin.getUpdater().isRunning()) { plugin.setUpdater(new ShopUpdater(plugin)); plugin.getUpdater().start(); } for (Shop shop : plugin.getShopUtils().getShops()) { - if (shop.getHologram() != null) shop.getHologram().hidePlayer(e.getPlayer()); - if (shop.getItem() != null) shop.getItem().setVisible(e.getPlayer(), false); + if (shop.getHologram() != null) shop.getHologram().hidePlayer(p); + if (shop.getItem() != null) shop.getItem().setVisible(p, false); } }