diff --git a/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandMembers.java b/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandMembers.java index 2e90572..605cd24 100644 --- a/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandMembers.java +++ b/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandMembers.java @@ -2,7 +2,9 @@ package com.alttd.cometskyblock.commands.island; import com.alttd.cometskyblock.CometSkyBlockPlugin; import com.alttd.cometskyblock.commands.PlayerSubCommand; +import com.alttd.cometskyblock.island.Island; import com.alttd.cometskyblock.island.IslandPlayer; +import com.alttd.cometskyblock.island.gui.MembersGUI; import org.bukkit.entity.Player; public class IslandMembers extends PlayerSubCommand { @@ -13,6 +15,18 @@ public class IslandMembers extends PlayerSubCommand { @Override public boolean execute(Player player, IslandPlayer islandPlayer, String[] args) { + if (islandPlayer.islandId() == 0) { + // You need an island to be able to do this + return true; + } + + Island island = Island.getIsland(islandPlayer.islandUUID()); + if (island == null) { + // "Could not load your island. Contact an administrator" + return true; + } + + new MembersGUI().open(player); return true; } } diff --git a/plugin/src/main/java/com/alttd/cometskyblock/gui/GUIInventory.java b/plugin/src/main/java/com/alttd/cometskyblock/gui/GUIInventory.java index f126df8..0ca239d 100644 --- a/plugin/src/main/java/com/alttd/cometskyblock/gui/GUIInventory.java +++ b/plugin/src/main/java/com/alttd/cometskyblock/gui/GUIInventory.java @@ -19,13 +19,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Consumer; - +// TODO - load the gui from a dependency and share basic info public abstract class GUIInventory implements GUI, InventoryHolder { private final Inventory inventory; private final Map buttons = new HashMap<>(); - int currentSlot = 0; - int pageIndex = 0; + protected int currentSlot = 0; + protected int pageIndex = 0; public GUIInventory() { this.inventory = this.createInventory(); @@ -62,7 +62,7 @@ public abstract class GUIInventory implements GUI, InventoryHolder { this.buttons.put(slot, button); } - public void decorate(Player player) { + protected void decorate(Player player) { this.buttons.forEach((slot, button) -> { ItemStack icon = button.iconCreator().apply(player); this.inventory.setItem(slot, icon); @@ -91,7 +91,7 @@ public abstract class GUIInventory implements GUI, InventoryHolder { return item; } - void makeMenuBar() { + protected void makeMenuBar() { for (int i = inventory.getSize() - 9; i < inventory.getSize(); ++i) { addButton(i, createMenuButton(Material.BLACK_STAINED_GLASS_PANE, "", new ArrayList<>(), event -> {})); } @@ -112,4 +112,22 @@ public abstract class GUIInventory implements GUI, InventoryHolder { return true; } + protected void createPrevPageButton(Player player) { + addButton(48, createMenuButton(Material.PAPER, "<< Previous Page", new ArrayList<>(), event -> { + --pageIndex; + decorate(player); + })); + } + + protected void createNextPageButton(Player player) { + addButton(50, createMenuButton(Material.PAPER, "Next Page >>", new ArrayList<>(), event -> { + ++pageIndex; + decorate(player); + })); + } + + protected void createExitButton(Player player, int slot) { + addButton(slot, createMenuButton(Material.BARRIER, "Exit Menu", new ArrayList<>(), event -> player.closeInventory())); + } + } diff --git a/plugin/src/main/java/com/alttd/cometskyblock/island/gui/MembersGUI.java b/plugin/src/main/java/com/alttd/cometskyblock/island/gui/MembersGUI.java index c4bf38a..e5c592a 100644 --- a/plugin/src/main/java/com/alttd/cometskyblock/island/gui/MembersGUI.java +++ b/plugin/src/main/java/com/alttd/cometskyblock/island/gui/MembersGUI.java @@ -1,17 +1,86 @@ package com.alttd.cometskyblock.island.gui; +import com.alttd.cometskyblock.gui.GUIButton; import com.alttd.cometskyblock.gui.GUIInventory; +import com.alttd.cometskyblock.island.Island; +import com.alttd.cometskyblock.island.IslandPlayer; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.SkullMeta; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.function.Consumer; public class MembersGUI extends GUIInventory { public MembersGUI() { super(); } + @Override protected Inventory createInventory() { // TODO - config - return Bukkit.createInventory(this, 54, MiniMessage.miniMessage().deserialize("GUI")); + return Bukkit.createInventory(this, 54, MiniMessage.miniMessage().deserialize("Island Members")); + } + + @Override + public void decorate(Player player) { + currentSlot = 9; + makeMenuBar(); + + IslandPlayer islandPlayer = IslandPlayer.getIslandPlayer(player.getUniqueId()); + if (islandPlayer.islandId() == 0) { + // You need an island to be able to do this + return; + } + + Island island = Island.getIsland(islandPlayer.islandUUID()); + if (island == null) { + // "Could not load your island. Contact an administrator" + return; + } + + addButton(5, createPlayerHeadMenuButton(island.owner(), event -> {})); + + int startIndex = pageIndex * 45; + for (int i = startIndex; i < island.members().size(); i++) { + GUIButton guiButton = createPlayerHeadMenuButton(island.members().get(i), event -> {}); + if (!addItem(guiButton)) { + createNextPageButton(player); + break; + } + } + + if (pageIndex > 0) { + createPrevPageButton(player); + } + super.decorate(player); + } + + public GUIButton createPlayerHeadMenuButton(UUID uuid, Consumer eventConsumer) { + return new GUIButton() + .creator(player -> createPlayerHead(uuid)) + .consumer(eventConsumer); + } + + public static ItemStack createPlayerHead(UUID uuid) { + ItemStack skull = new ItemStack(Material.PLAYER_HEAD); + + OfflinePlayer player = Bukkit.getOfflinePlayer(uuid); + if (!player.hasPlayedBefore()) + return skull; + + SkullMeta meta = (SkullMeta) skull.getItemMeta(); + meta.setPlayerProfile(player.getPlayerProfile()); + skull.setItemMeta(meta); + + return skull; } }