diff --git a/src/main/java/xyz/ineanto/nicko/event/PlayerJoinListener.java b/src/main/java/xyz/ineanto/nicko/event/PlayerJoinListener.java index d905a9b..a0baed4 100644 --- a/src/main/java/xyz/ineanto/nicko/event/PlayerJoinListener.java +++ b/src/main/java/xyz/ineanto/nicko/event/PlayerJoinListener.java @@ -9,13 +9,19 @@ import org.bukkit.event.player.PlayerJoinEvent; import xyz.ineanto.nicko.NickoBukkit; import xyz.ineanto.nicko.appearance.ActionResult; import xyz.ineanto.nicko.appearance.AppearanceManager; +import xyz.ineanto.nicko.gui.PlayerCheckGUI; +import xyz.ineanto.nicko.gui.PlayerCheckGUIData; import xyz.ineanto.nicko.i18n.I18N; import xyz.ineanto.nicko.i18n.I18NDict; import xyz.ineanto.nicko.profile.NickoProfile; import xyz.ineanto.nicko.storage.PlayerDataStore; import xyz.ineanto.nicko.storage.name.PlayerNameStore; +import xyz.xenondevs.invui.window.Window; +import xyz.xenondevs.invui.window.WindowManager; +import java.util.ArrayList; import java.util.Optional; +import java.util.UUID; import java.util.logging.Logger; import java.util.stream.Collectors; @@ -61,5 +67,16 @@ public class PlayerJoinListener implements Listener { }); } }, 20L); + + @SuppressWarnings("unchecked") final ArrayList viewers = (ArrayList) PlayerCheckGUIData.VIEWERS.clone(); + viewers.forEach(uuid -> { + final Player windowWatcher = Bukkit.getPlayer(uuid); + final Window openWindow = WindowManager.getInstance().getOpenWindow(windowWatcher); + if (openWindow != null) { + final PlayerCheckGUI gui = new PlayerCheckGUI(windowWatcher, Bukkit.getOnlinePlayers()); + openWindow.close(); + gui.open(); + } + }); } } diff --git a/src/main/java/xyz/ineanto/nicko/event/PlayerQuitListener.java b/src/main/java/xyz/ineanto/nicko/event/PlayerQuitListener.java index c0c232f..25ccb49 100644 --- a/src/main/java/xyz/ineanto/nicko/event/PlayerQuitListener.java +++ b/src/main/java/xyz/ineanto/nicko/event/PlayerQuitListener.java @@ -1,11 +1,21 @@ package xyz.ineanto.nicko.event; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; import xyz.ineanto.nicko.NickoBukkit; import xyz.ineanto.nicko.appearance.ActionResult; +import xyz.ineanto.nicko.gui.PlayerCheckGUI; +import xyz.ineanto.nicko.gui.PlayerCheckGUIData; +import xyz.xenondevs.invui.window.Window; +import xyz.xenondevs.invui.window.WindowManager; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; public class PlayerQuitListener implements Listener { @EventHandler @@ -15,5 +25,20 @@ public class PlayerQuitListener implements Listener { if (result.isError()) { NickoBukkit.getInstance().getLogger().warning("Failed to save data for " + player.getName()); } + + // This is a dirty way to do it but could be worse tbh + @SuppressWarnings("unchecked") final ArrayList viewers = (ArrayList) PlayerCheckGUIData.VIEWERS.clone(); + viewers.forEach(uuid -> { + final Player windowWatcher = Bukkit.getPlayer(uuid); + final Window openWindow = WindowManager.getInstance().getOpenWindow(windowWatcher); + if (openWindow != null) { + final List playersWithoutOffline = Bukkit.getOnlinePlayers() + .stream() + .filter(online -> online.getUniqueId() != player.getUniqueId()).collect(Collectors.toList()); + final PlayerCheckGUI gui = new PlayerCheckGUI(windowWatcher, playersWithoutOffline); + openWindow.close(); + gui.open(); + } + }); } } diff --git a/src/main/java/xyz/ineanto/nicko/gui/PlayerCheckGUI.java b/src/main/java/xyz/ineanto/nicko/gui/PlayerCheckGUI.java index f59616d..c6dbe1d 100644 --- a/src/main/java/xyz/ineanto/nicko/gui/PlayerCheckGUI.java +++ b/src/main/java/xyz/ineanto/nicko/gui/PlayerCheckGUI.java @@ -15,7 +15,9 @@ import xyz.xenondevs.invui.gui.structure.Markers; import xyz.xenondevs.invui.item.Item; import xyz.xenondevs.invui.window.Window; +import java.util.Collection; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; public class PlayerCheckGUI { @@ -23,13 +25,15 @@ public class PlayerCheckGUI { private final Gui gui; private final String title; - public PlayerCheckGUI(Player player) { + public PlayerCheckGUI(Player player, Collection players) { final I18N i18n = new I18N(player); this.title = i18n.translatePrefixless(I18NDict.GUI.Titles.CHECK); - final List items = Bukkit.getOnlinePlayers().stream() + final List items = players.stream() .map(Entity::getUniqueId) - .map(uuid -> new PlayerInformationItem(i18n, Bukkit.getPlayer(uuid))) + .map(Bukkit::getPlayer) + .filter(Objects::nonNull) + .map(mappedPlayer -> new PlayerInformationItem(i18n, mappedPlayer)) .collect(Collectors.toList()); final AdminGUI parent = new AdminGUI(player); @@ -56,6 +60,9 @@ public class PlayerCheckGUI { } public void open() { - Window.single().setGui(gui).setTitle(title).open(player); + final Window.Builder.Normal.Single window = Window.single().setGui(gui).setTitle(title); + window.addOpenHandler(() -> PlayerCheckGUIData.VIEWERS.add(player.getUniqueId())); + window.addCloseHandler(() -> PlayerCheckGUIData.VIEWERS.remove(player.getUniqueId())); + window.open(player); } } diff --git a/src/main/java/xyz/ineanto/nicko/gui/PlayerCheckGUIData.java b/src/main/java/xyz/ineanto/nicko/gui/PlayerCheckGUIData.java new file mode 100644 index 0000000..e238a93 --- /dev/null +++ b/src/main/java/xyz/ineanto/nicko/gui/PlayerCheckGUIData.java @@ -0,0 +1,8 @@ +package xyz.ineanto.nicko.gui; + +import java.util.ArrayList; +import java.util.UUID; + +public class PlayerCheckGUIData { + public static final ArrayList VIEWERS = new ArrayList<>(); +} diff --git a/src/main/java/xyz/ineanto/nicko/gui/items/admin/ManagePlayerItem.java b/src/main/java/xyz/ineanto/nicko/gui/items/admin/ManagePlayerItem.java index ffe3732..adde45b 100644 --- a/src/main/java/xyz/ineanto/nicko/gui/items/admin/ManagePlayerItem.java +++ b/src/main/java/xyz/ineanto/nicko/gui/items/admin/ManagePlayerItem.java @@ -1,5 +1,6 @@ package xyz.ineanto.nicko.gui.items.admin; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; import xyz.ineanto.nicko.gui.PlayerCheckGUI; @@ -22,7 +23,7 @@ public class ManagePlayerItem { final ItemBuilder builder = new ItemBuilder(Material.WRITABLE_BOOK); return i18n.translateItem(builder, I18NDict.GUI.Admin.MANAGE_PLAYER); }, click -> { - new PlayerCheckGUI(player).open(); + new PlayerCheckGUI(player, Bukkit.getOnlinePlayers()).open(); return true; }); } diff --git a/src/main/java/xyz/ineanto/nicko/gui/items/admin/check/PlayerInformationItem.java b/src/main/java/xyz/ineanto/nicko/gui/items/admin/check/PlayerInformationItem.java index b0bcba0..8055016 100644 --- a/src/main/java/xyz/ineanto/nicko/gui/items/admin/check/PlayerInformationItem.java +++ b/src/main/java/xyz/ineanto/nicko/gui/items/admin/check/PlayerInformationItem.java @@ -1,5 +1,6 @@ package xyz.ineanto.nicko.gui.items.admin.check; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; @@ -72,7 +73,7 @@ public class PlayerInformationItem extends AsyncItem { @Override public void onCancel() { - new PlayerCheckGUI(player).open(); + new PlayerCheckGUI(player, Bukkit.getOnlinePlayers()).open(); } }).open(); }