diff --git a/ChallengeUtils/src/main/java/de/fanta/challengeutils/FileUtils.java b/ChallengeUtils/src/main/java/de/fanta/challengeutils/FileUtils.java index 68c7f34..bf374ed 100644 --- a/ChallengeUtils/src/main/java/de/fanta/challengeutils/FileUtils.java +++ b/ChallengeUtils/src/main/java/de/fanta/challengeutils/FileUtils.java @@ -30,6 +30,7 @@ return null; } + System.out.println(challengeFolder.getAbsolutePath()); return challengeFolder; } diff --git a/Lobby/src/main/java/de/fanta/lobby/Config.java b/Lobby/src/main/java/de/fanta/lobby/Config.java index 23827e8..b25d85a 100644 --- a/Lobby/src/main/java/de/fanta/lobby/Config.java +++ b/Lobby/src/main/java/de/fanta/lobby/Config.java @@ -54,6 +54,7 @@ plugin.setAventureMapsPath(new File(filaPathSection.getString("adventureMaps")).toPath()); plugin.setServerJarsPath(new File(filaPathSection.getString("serverJars")).toPath()); plugin.setServerFolderPath(new File(filaPathSection.getString("serverFolder")).toPath()); + plugin.setSaveAccessFile(new File(filaPathSection.getString("saveAccessFile"))); } ConfigurationSection challengeServerSection = config.getConfigurationSection("challenge"); diff --git a/Lobby/src/main/java/de/fanta/lobby/Lobby.java b/Lobby/src/main/java/de/fanta/lobby/Lobby.java index 2346992..5384d22 100644 --- a/Lobby/src/main/java/de/fanta/lobby/Lobby.java +++ b/Lobby/src/main/java/de/fanta/lobby/Lobby.java @@ -1,9 +1,11 @@ package de.fanta.lobby; import de.cubeside.nmsutils.NMSUtils; +import de.fanta.challenge.Challenge; import de.fanta.challengeutils.Color; import de.fanta.lobby.adventure.AdventureMapsConfig; import de.fanta.lobby.adventure.CategoriesConfig; +import de.fanta.lobby.adventure.ui.AnvilAddUserGui; import de.fanta.lobby.commands.AdventureCommand.AdventureAddCategoryCommand; import de.fanta.lobby.commands.AdventureCommand.AdventureAddMapCommand; import de.fanta.lobby.commands.AdventureCommand.AdventureClearSavesCommand; @@ -27,6 +29,7 @@ import de.fanta.lobby.commands.PiglinCommand.RemoveEntityCommand; import de.fanta.lobby.commands.PiglinCommand.SetEntitySpawnLocationCommand; import de.fanta.lobby.commands.PiglinCommand.ToggleArenaCommand; +import de.fanta.lobby.listeners.AnvilGuiListener; import de.fanta.lobby.listeners.ChallengesEventListener; import de.fanta.lobby.listeners.EntityListener; import de.fanta.lobby.listeners.PlayerListener; @@ -40,6 +43,7 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Piglin; @@ -49,6 +53,7 @@ import org.jetbrains.annotations.Nullable; import java.io.File; +import java.io.IOException; import java.nio.file.Path; import java.util.ArrayList; import java.util.HashMap; @@ -87,7 +92,11 @@ private Path serverJarsPath; private Path serverFolderPath; + private File saveAccessFile; + private YamlConfiguration saveAccessConfig; + private ComponentUtil componentUtil; + private final HashMap anvilInputGuis = new HashMap<>(); public Lobby() { @@ -130,6 +139,15 @@ this.globalDataHelper = new ChallengesGlobalDataHelper(this); this.config = new Config(this); + if (!saveAccessFile.exists()) { + try { + saveAccessFile.createNewFile(); + } catch (IOException e) { + getLogger().log(Level.SEVERE, "SaveAccessFile konnte nicht erstellt werden!", e); + } + } + saveAccessConfig = YamlConfiguration.loadConfiguration(saveAccessFile); + loadCategoriesAndMaps(); if (Bukkit.getPluginManager().getPlugin("Challenge") != null) { // Challenge server -> listen on Challenge events @@ -167,6 +185,7 @@ Bukkit.getPluginManager().registerEvents(new EntityListener(this), this); Bukkit.getPluginManager().registerEvents(new PlayerListener(this), this); + Bukkit.getPluginManager().registerEvents(new AnvilGuiListener(this), this); } Bukkit.getPluginManager().registerEvents(globalDataHelper, this); @@ -480,6 +499,30 @@ this.serverFolderPath = serverFolderPath; } + public void setSaveAccessFile(File saveAccessFile) { + this.saveAccessFile = saveAccessFile; + } + + public File getSaveAccessFile() { + return saveAccessFile; + } + + public YamlConfiguration getSaveAccessConfig() { + return saveAccessConfig; + } + + public void saveSaveAccessConfig() { + try { + saveAccessConfig.save(saveAccessFile); + } catch (IOException e) { + Challenge.getPlugin().getLogger().log(Level.SEVERE, "Could not save SaveAccess config", e); + } + } + + public HashMap getAnvilInputGuis() { + return anvilInputGuis; + } + public TextComponent getPrefixComponent() { return prefixComponent; } diff --git a/Lobby/src/main/java/de/fanta/lobby/adventure/ui/AnvilAddUserGui.java b/Lobby/src/main/java/de/fanta/lobby/adventure/ui/AnvilAddUserGui.java new file mode 100644 index 0000000..f55f0cb --- /dev/null +++ b/Lobby/src/main/java/de/fanta/lobby/adventure/ui/AnvilAddUserGui.java @@ -0,0 +1,83 @@ +package de.fanta.lobby.adventure.ui; + +import com.destroystokyo.paper.event.inventory.PrepareResultEvent; +import de.fanta.lobby.Lobby; +import de.fanta.lobby.SaveSlot; +import de.iani.cubesideutils.bukkit.items.CustomHeads; +import de.iani.playerUUIDCache.CachedPlayer; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.inventory.AnvilInventory; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import java.util.List; + +public class AnvilAddUserGui { + private final Lobby plugin; + private final SaveSlot saveSlot; + private Inventory inventory; + private String inputString; + + public AnvilAddUserGui(Player player, ItemStack displayItem, Lobby plugin, SaveSlot saveSlot) { + this.plugin = plugin; + this.saveSlot = saveSlot; + openInventory(player, displayItem); + } + + private void openInventory(Player player, ItemStack displayItem) { + inventory = player.openAnvil(null, true).getTopInventory(); + plugin.getAnvilInputGuis().put(player.getUniqueId(), this); + AnvilInventory inv = (AnvilInventory) inventory; + inv.setFirstItem(displayItem); + inv.setRepairCost(0); + } + + public void onUpdateAnvil(PrepareResultEvent event) { + if (!(event.getInventory() instanceof AnvilInventory inv)) { + return; + } + inputString = null; + if (inv.getResult() != null && inv.getResult().hasItemMeta()) { + inputString = inv.getResult().getItemMeta().getDisplayName(); + } + if (inputString != null) { + inputString = inputString.trim(); + if (inputString.isEmpty()) { + inputString = null; + } + } + if (inputString == null) { + event.setResult(CustomHeads.RAINBOW_X.getHead(ChatColor.RED + "Keine Eingabe.")); + } else { + event.setResult(CustomHeads.RAINBOW_ARROW_FORWARD_II.getHead(ChatColor.GREEN + "Eingabe bestätigen.")); + } + inv.setRepairCost(0); + } + + public void onClick(Player player, int slot) { + if (slot == 2) { + if (inputString != null) { + CachedPlayer cp = plugin.getPlayerUUIDCache().getPlayer(inputString, false); + if (cp == null) { + plugin.getComponentUtil().sendErrorMessage(player, "Den Spieler " + inputString + " gibt es nicht!"); + player.closeInventory(); + return; + } + + List accessList = plugin.getSaveAccessConfig().getStringList(player.getUniqueId() + "." + saveSlot); + accessList.add(cp.getUUID().toString()); + + plugin.getSaveAccessConfig().set(player.getUniqueId() + "." + saveSlot, accessList); + plugin.saveSaveAccessConfig(); + + player.closeInventory(); + plugin.getComponentUtil().sendNormalMessage(player, "Spieler " + cp.getName() + " hat jetzt zugriff auf Slot: " + saveSlot.getSlot()); + } + } + } + + public Inventory getInventory() { + return inventory; + } +} diff --git a/Lobby/src/main/java/de/fanta/lobby/listeners/AnvilGuiListener.java b/Lobby/src/main/java/de/fanta/lobby/listeners/AnvilGuiListener.java new file mode 100644 index 0000000..a175b5c --- /dev/null +++ b/Lobby/src/main/java/de/fanta/lobby/listeners/AnvilGuiListener.java @@ -0,0 +1,64 @@ +package de.fanta.lobby.listeners; + +import com.destroystokyo.paper.event.inventory.PrepareResultEvent; +import de.fanta.lobby.Lobby; +import de.fanta.lobby.adventure.ui.AnvilAddUserGui; +import org.bukkit.Material; +import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.inventory.AnvilInventory; +import org.bukkit.inventory.ItemStack; + +public class AnvilGuiListener implements Listener { + + private final Lobby plugin; + + public AnvilGuiListener(Lobby plugin) { + this.plugin = plugin; + } + + @EventHandler() + public void onPlayerInventoryClick(InventoryClickEvent e) { + AnvilAddUserGui openMenu = plugin.getAnvilInputGuis().get(e.getWhoClicked().getUniqueId()); + if (openMenu != null) { + e.setCancelled(true); + if (e.getClickedInventory() instanceof AnvilInventory) { + ((AnvilInventory) e.getClickedInventory()).setRepairCost(0); + + ItemStack clicked = e.getCurrentItem(); + if (clicked != null && clicked.getType() != Material.AIR && (e.getSlotType() == InventoryType.SlotType.CONTAINER || e.getSlotType() == InventoryType.SlotType.RESULT) && e.getClickedInventory().equals(openMenu.getInventory())) { + openMenu.onClick((Player) e.getWhoClicked(), e.getSlot()); + } + } + } + } + + @EventHandler() + public void onPlayerPrepareResult(PrepareResultEvent e) { + for (HumanEntity viewer : e.getViewers()) { + AnvilAddUserGui openMenu = plugin.getAnvilInputGuis().get(viewer.getUniqueId()); + if (openMenu != null) { + openMenu.onUpdateAnvil(e); + } + } + } + + @EventHandler() + public void onPlayerCloseInventory(InventoryCloseEvent e) { + AnvilAddUserGui openMenu = plugin.getAnvilInputGuis().remove(e.getPlayer().getUniqueId()); + if (openMenu != null && openMenu.getInventory() instanceof AnvilInventory anvilInventory) { + anvilInventory.clear(); + } + } + + @EventHandler() + public void onPlayerQuit(PlayerQuitEvent e) { + plugin.getAnvilInputGuis().remove(e.getPlayer().getUniqueId()); + } +} diff --git a/Lobby/src/main/java/de/fanta/lobby/loadgui/ChallengeAccessListGUI.java b/Lobby/src/main/java/de/fanta/lobby/loadgui/ChallengeAccessListGUI.java new file mode 100644 index 0000000..973508a --- /dev/null +++ b/Lobby/src/main/java/de/fanta/lobby/loadgui/ChallengeAccessListGUI.java @@ -0,0 +1,191 @@ +package de.fanta.lobby.loadgui; + +import com.destroystokyo.paper.profile.PlayerProfile; +import de.fanta.challengeutils.Color; +import de.fanta.lobby.Lobby; +import de.fanta.lobby.SaveSlot; +import de.fanta.lobby.adventure.ui.AnvilAddUserGui; +import de.iani.cubesideutils.bukkit.inventory.AbstractWindow; +import de.iani.cubesideutils.bukkit.items.CustomHeads; +import de.iani.playerUUIDCache.CachedPlayer; +import de.iani.playerUUIDCache.CachedPlayerProfile; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextDecoration; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.SkullMeta; + +import java.io.File; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.UUID; + +public class ChallengeAccessListGUI extends AbstractWindow { + private static final int NUM_OF_COLUMNS = 9; + private static final int NUM_OF_ITEM_COLUMNS = NUM_OF_COLUMNS - 1; + private static final int NUM_OF_ROWS = 6; + private static final int WINDOW_SIZE = NUM_OF_COLUMNS * NUM_OF_ROWS; + private static final int END_OF_FIRST_ROW_INDEX = NUM_OF_COLUMNS - 1; + private static final int END_OF_LAST_ROW_INDEX = WINDOW_SIZE - 1; + + private static final int BACK_INDEX = 0; + private static final int ADDUSER_INDEX = 1; + + private final List playerList = new ArrayList<>(); + private final HashMap slotInfos = new HashMap<>(); + private final SaveSlot saveSlot; + private int numOfItemRows = 0; + private int scrollAmount; + private final Lobby plugin; + + public ChallengeAccessListGUI(Player player, SaveSlot saveSlot, Lobby plugin) { + super(player, Bukkit.createInventory(player, WINDOW_SIZE, Lobby.getPlugin().getCHALLENGEGUIPREFIX().append(Component.text(" >> Zugriffsliste")))); + this.plugin = plugin; + this.saveSlot = saveSlot; + List playerInfoList = new ArrayList<>(); + + File saveFolder = plugin.getChallengeSavePath().toFile(); + File[] saves = null; + if (saveFolder.isDirectory()) { + saves = saveFolder.listFiles(); + } + if (saves == null || saves.length == 0) { + plugin.getComponentUtil().sendErrorMessage(player, "Keine Spieler Saves gefunden!"); + return; + } + + List accessPlayers = plugin.getSaveAccessConfig().getStringList(player.getUniqueId() + "." + saveSlot); + + for (String accessPlayer : accessPlayers) { + CachedPlayer cachedPlayer = plugin.getPlayerUUIDCache().getPlayer(UUID.fromString(accessPlayer)); + if (cachedPlayer != null) { + ItemStack playerHead = new ItemStack(Material.PLAYER_HEAD); + SkullMeta meta = (SkullMeta) playerHead.getItemMeta(); + + CachedPlayerProfile cachedPlayerProfile = plugin.getPlayerUUIDCache().getPlayerProfile(cachedPlayer.getUUID(), true); + PlayerProfile playerProfile = plugin.getServer().createProfile(cachedPlayer.getUUID()); + playerProfile.setProperties(cachedPlayerProfile.getProperties()); + meta.setPlayerProfile(playerProfile); + + meta.displayName(Component.text(cachedPlayer.getName()).color(Color.GREEN).decorationIfAbsent(TextDecoration.ITALIC, TextDecoration.State.FALSE)); + meta.lore(List.of(Component.text("Anklicken um rechte zu entfernen!", Color.YELLOW))); + playerHead.setItemMeta(meta); + PlayerInfoEntry playerInfoEntry = new PlayerInfoEntry(cachedPlayer, playerHead); + playerInfoList.add(playerInfoEntry); + } + } + + playerInfoList.sort(Comparator.comparing(p -> p.getCachedPlayer().getName().toLowerCase())); + + playerList.addAll(playerInfoList); + this.numOfItemRows = (int) (Math.ceil(playerInfoList.size() / (double) NUM_OF_ITEM_COLUMNS)); + this.scrollAmount = 0; + } + + protected void rebuildInventory() { + ItemStack[] content = new ItemStack[WINDOW_SIZE]; + + // build scroll buttons + ItemStack scrollUpHead = this.scrollAmount <= 0 ? CustomHeads.RAINBOW_BLANK.getHead() : CustomHeads.RAINBOW_ARROW_UP.getHead(); + ItemMeta scrollUpMeta = scrollUpHead.getItemMeta(); + scrollUpMeta.displayName(Component.text("Hoch", this.scrollAmount <= 0 ? Color.GRAY : Color.WHITE)); + scrollUpHead.setItemMeta(scrollUpMeta); + content[NUM_OF_COLUMNS - 1] = scrollUpHead; + + ItemStack scrollDownHead = this.scrollAmount - 1 >= this.numOfItemRows - NUM_OF_ROWS ? CustomHeads.RAINBOW_BLANK.getHead() : CustomHeads.RAINBOW_ARROW_DOWN.getHead(); + ItemMeta scrollDownMeta = scrollDownHead.getItemMeta(); + scrollDownMeta.displayName(Component.text("Runter", this.scrollAmount - 1 >= this.numOfItemRows - NUM_OF_ROWS ? Color.GRAY : Color.WHITE)); + scrollDownHead.setItemMeta(scrollDownMeta); + content[WINDOW_SIZE - 1] = scrollDownHead; + + // build scrollbar + for (int i = 1; i < NUM_OF_ROWS - 1; i++) { + content[(i + 1) * NUM_OF_COLUMNS - 1] = new ItemStack(Material.GRAY_STAINED_GLASS_PANE); + } + int numOfScrollbarRows = NUM_OF_ROWS - 2; + int currentScrollbarRow = + (int) Math.round(this.scrollAmount * numOfScrollbarRows / (double) this.numOfItemRows); + content[(currentScrollbarRow + 2) * NUM_OF_COLUMNS - 1] = new ItemStack(Material.BLACK_STAINED_GLASS_PANE); + + // fill in items + slotInfos.clear(); + int index = this.scrollAmount * NUM_OF_ITEM_COLUMNS; + for (int row = 1; row < NUM_OF_ROWS && index < playerList.size(); row++) { + for (int column = 0; column < NUM_OF_ITEM_COLUMNS && index < playerList.size(); column++) { + PlayerInfoEntry secretEntry = new ArrayList<>(playerList).get(index++); + ItemStack stack = secretEntry.getPlayerHead().clone(); + int slot = row * NUM_OF_COLUMNS + column; + slotInfos.put(slot, secretEntry); + content[slot] = stack; + } + } + + content[BACK_INDEX] = CustomHeads.RAINBOW_ARROW_BACKWARD_II.getHead(Component.text("Zurück", Color.GREEN).decorationIfAbsent(TextDecoration.ITALIC, TextDecoration.State.FALSE)); + content[ADDUSER_INDEX] = CustomHeads.RAINBOW_ARROW_UP.getHead(Component.text("Spieler hinzufügen", Color.GREEN).decorationIfAbsent(TextDecoration.ITALIC, TextDecoration.State.FALSE)); + getInventory().setContents(content); + } + + public void onItemClicked(InventoryClickEvent event) { + if (!mayAffectThisInventory(event)) { + return; + } + + event.setCancelled(true); + + if (!getInventory().equals(event.getClickedInventory())) { + return; + } + + int slot = event.getSlot(); + Player p = getPlayer(); + + if (slot == BACK_INDEX) { + new ChallengeLoadGUI(p, plugin.getPlayerUUIDCache().getPlayer(p.getUniqueId())).open(); + return; + } + + if (slot == ADDUSER_INDEX) { + new AnvilAddUserGui(p, CustomHeads.RAINBOW_S.getHead(Component.empty(), Component.text("Wer soll berechtigung bekommen?")), plugin, saveSlot); + return; + } + + if (slot == END_OF_FIRST_ROW_INDEX) { + attempScrollUp(); + } else if (slot == END_OF_LAST_ROW_INDEX) { + attempScrollDown(); + } + + + PlayerInfoEntry playerInfo = slotInfos.get(slot); + if (playerInfo != null) { + List acceessList = plugin.getSaveAccessConfig().getStringList(p.getUniqueId() + "." + saveSlot); + acceessList.remove(playerInfo.getCachedPlayer().getUniqueId().toString()); + plugin.getSaveAccessConfig().set(p.getUniqueId() + "." + saveSlot, acceessList); + plugin.saveSaveAccessConfig(); + plugin.getComponentUtil().sendNormalMessage(p, "Du hast den Zugriff auf Slot " + saveSlot.getSlot() + " für " + playerInfo.getCachedPlayer().getName() + " entfernt!"); + p.closeInventory(); + } + } + + private void attempScrollUp() { + if (this.scrollAmount <= 0) { + return; + } + this.scrollAmount--; + rebuildInventory(); + } + + private void attempScrollDown() { + if (this.scrollAmount - 1 >= this.numOfItemRows - NUM_OF_ROWS) { + return; + } + this.scrollAmount++; + rebuildInventory(); + } +} diff --git a/Lobby/src/main/java/de/fanta/lobby/loadgui/ChallengeLoadGUI.java b/Lobby/src/main/java/de/fanta/lobby/loadgui/ChallengeLoadGUI.java index 4df7c99..5b4c2a4 100644 --- a/Lobby/src/main/java/de/fanta/lobby/loadgui/ChallengeLoadGUI.java +++ b/Lobby/src/main/java/de/fanta/lobby/loadgui/ChallengeLoadGUI.java @@ -4,9 +4,12 @@ import de.fanta.challengeutils.FileUtils; import de.fanta.challengeutils.ItemUtils; import de.fanta.lobby.Lobby; +import de.fanta.lobby.SaveSlot; import de.fanta.lobby.Server; +import de.iani.cubesideutils.ChatUtil; import de.iani.cubesideutils.StringUtil; import de.iani.cubesideutils.bukkit.inventory.AbstractWindow; +import de.iani.cubesideutils.bukkit.items.CustomHeads; import de.iani.playerUUIDCache.CachedPlayer; import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; @@ -16,9 +19,11 @@ import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemStack; +import javax.annotation.Nullable; import java.io.File; import java.io.IOException; import java.util.HashMap; +import java.util.List; import java.util.UUID; import java.util.logging.Level; @@ -26,19 +31,35 @@ private static final Lobby plugin = Lobby.getPlugin(); - private static final int SAVE_1_INDEX = 1; - private static final int SAVE_2_INDEX = 3; - private static final int SAVE_3_INDEX = 5; - private static final int SAVE_AUTO_INDEX = 7; + private static final int SAVE_1_INDEX = 0; + private static final int SAVE_2_INDEX = 2; + private static final int SAVE_3_INDEX = 4; + private static final int SAVE_AUTO_INDEX = 6; + private static final int OTHER_SAVE_INDEX = 8; private static final int WINDOW_SIZE = 9; + private final boolean isOwnGUI; + private static final HashMap savePlayerList = new HashMap<>(); + @Nullable + private PlayerInfoEntry playerInfoEntry; + public ChallengeLoadGUI(Player player, CachedPlayer savePlayer) { - super(player, Bukkit.createInventory(player, WINDOW_SIZE, Lobby.getPlugin().getCHALLENGEGUIPREFIX().append(Component.text(" >> Map laden")))); + super(player, Bukkit.createInventory(player, WINDOW_SIZE, Lobby.getPlugin().getCHALLENGEGUIPREFIX().append(Component.text(" >> Map laden").append(Component.text(player.getUniqueId().equals(savePlayer.getUniqueId()) ? "" : " " + savePlayer.getName()))))); + isOwnGUI = player.getUniqueId().equals(savePlayer.getUniqueId()); savePlayerList.put(player.getUniqueId(), savePlayer.getUniqueId()); } + public ChallengeLoadGUI(Player player, PlayerInfoEntry infoEntry) { + super(player, Bukkit.createInventory(player, WINDOW_SIZE, Lobby.getPlugin().getCHALLENGEGUIPREFIX().append(Component.text(" >> Map laden").append(Component.text(player.getUniqueId().equals(infoEntry.getCachedPlayer().getUniqueId()) ? "" : " " + infoEntry.getCachedPlayer().getName()))))); + CachedPlayer savePlayer = infoEntry.getCachedPlayer(); + System.out.println(infoEntry.getCachedPlayer().getName()); + isOwnGUI = player.getUniqueId().equals(savePlayer.getUniqueId()); + savePlayerList.put(player.getUniqueId(), savePlayer.getUniqueId()); + this.playerInfoEntry = infoEntry; + } + @Override protected void rebuildInventory() { Player p = getPlayer(); @@ -48,15 +69,32 @@ File challengeSave3 = new File(plugin.getChallengeSavePath().toFile(), savePlayerID + "/3"); File challengeSaveAuto = new File(plugin.getChallengeSavePath().toFile(), savePlayerID + "/autosave"); + List allowSlots = null; + if (playerInfoEntry != null) { + allowSlots = playerInfoEntry.getAccessList().get(p.getUniqueId()); + } + for (int i = 0; i < WINDOW_SIZE; i++) { - ItemStack item; + ItemStack item = null; switch (i) { case SAVE_1_INDEX -> { if (p.hasPermission("challenge.save.slot1")) { - if (challengeSave1.isDirectory()) { - item = ItemUtils.createGuiItem(Material.MAP, Component.text("Save 1", Color.GREEN), Component.text("Klicken zum laden.", Color.GREEN), Component.text("Gespeichert am " + FileUtils.getFileDate(new File(FileUtils.getPluginFolder(challengeSave1), "/serverconfig.yml")), Color.GREEN)); + if (allowSlots != null) { + if (!allowSlots.contains(SaveSlot.SLOT_1)) { + item = ItemUtils.createGuiItem(Material.TNT, Component.text("Save 1", Color.GREEN), Component.text("Kein Zugriff!", Color.RED)); + } else { + if (challengeSave1.isDirectory()) { + item = ItemUtils.createGuiItem(Material.MAP, Component.text("Save 1", Color.GREEN), Component.text("Links-Kick zum laden.", Color.GREEN), Component.text("Gespeichert am " + FileUtils.getFileDate(new File(FileUtils.getPluginFolder(challengeSave1), "/serverconfig.yml")), Color.GREEN)); + } else { + item = ItemUtils.createGuiItem(Material.LIME_STAINED_GLASS_PANE, Component.text("Frei", Color.GREEN)); + } + } } else { - item = ItemUtils.createGuiItem(Material.LIME_STAINED_GLASS_PANE, Component.text("Frei", Color.GREEN)); + if (challengeSave1.isDirectory()) { + item = ItemUtils.createGuiItem(Material.MAP, Component.text("Save 1", Color.GREEN), Component.text("Links-Kick zum laden.", Color.GREEN), Component.text("Rechts-Kick um Rechte zu bearbeiten.", Color.GREEN), Component.text("Gespeichert am " + FileUtils.getFileDate(new File(FileUtils.getPluginFolder(challengeSave1), "/serverconfig.yml")), Color.GREEN)); + } else { + item = ItemUtils.createGuiItem(Material.LIME_STAINED_GLASS_PANE, Component.text("Frei", Color.GREEN)); + } } } else { item = ItemUtils.createGuiItem(Material.BARRIER, Component.text("Für diesen Slot brauchst du VIP", Color.RED)); @@ -65,10 +103,22 @@ case SAVE_2_INDEX -> { if (p.hasPermission("challenge.save.slot2")) { - if (challengeSave2.isDirectory()) { - item = ItemUtils.createGuiItem(Material.MAP, Component.text("Save 2", Color.GREEN), Component.text("Klicken zum laden.", Color.GREEN), Component.text("Gespeichert am " + FileUtils.getFileDate(new File(FileUtils.getPluginFolder(challengeSave2), "/serverconfig.yml")), Color.GREEN)); + if (allowSlots != null) { + if (!allowSlots.contains(SaveSlot.SLOT_2)) { + item = ItemUtils.createGuiItem(Material.TNT, Component.text("Save 2", Color.GREEN), Component.text("Kein Zugriff!", Color.RED)); + } else { + if (challengeSave2.isDirectory()) { + item = ItemUtils.createGuiItem(Material.MAP, Component.text("Save 2", Color.GREEN), Component.text("Links-Kick zum laden.", Color.GREEN), Component.text("Gespeichert am " + FileUtils.getFileDate(new File(FileUtils.getPluginFolder(challengeSave2), "/serverconfig.yml")), Color.GREEN)); + } else { + item = ItemUtils.createGuiItem(Material.LIME_STAINED_GLASS_PANE, Component.text("Frei", Color.GREEN)); + } + } } else { - item = ItemUtils.createGuiItem(Material.LIME_STAINED_GLASS_PANE, Component.text("Frei", Color.GREEN)); + if (challengeSave2.isDirectory()) { + item = ItemUtils.createGuiItem(Material.MAP, Component.text("Save 2", Color.GREEN), Component.text("Links-Kick zum laden.", Color.GREEN), Component.text("Rechts-Kick um Rechte zu bearbeiten.", Color.GREEN), Component.text("Gespeichert am " + FileUtils.getFileDate(new File(FileUtils.getPluginFolder(challengeSave2), "/serverconfig.yml")), Color.GREEN)); + } else { + item = ItemUtils.createGuiItem(Material.LIME_STAINED_GLASS_PANE, Component.text("Frei", Color.GREEN)); + } } } else { item = ItemUtils.createGuiItem(Material.BARRIER, Component.text("Für diesen Slot brauchst du VIP", Color.RED)); @@ -77,11 +127,22 @@ case SAVE_3_INDEX -> { if (p.hasPermission("challenge.save.slot3")) { - if (challengeSave3.isDirectory()) { - item = ItemUtils.createGuiItem(Material.MAP, Component.text("Save 3", Color.GREEN), Component.text("Klicken zum laden.", Color.GREEN), Component.text("Gespeichert am " + FileUtils.getFileDate(new File(FileUtils.getPluginFolder(challengeSave3), "/serverconfig.yml")), Color.GREEN)); + if (allowSlots != null) { + if (!allowSlots.contains(SaveSlot.SLOT_3)) { + item = ItemUtils.createGuiItem(Material.TNT, Component.text("Save 3", Color.GREEN), Component.text("Kein Zugriff!", Color.RED)); + } else { + if (challengeSave3.isDirectory()) { + item = ItemUtils.createGuiItem(Material.MAP, Component.text("Save 3", Color.GREEN), Component.text("Links-Kick zum laden.", Color.GREEN), Component.text("Gespeichert am " + FileUtils.getFileDate(new File(FileUtils.getPluginFolder(challengeSave3), "/serverconfig.yml")), Color.GREEN)); + } else { + item = ItemUtils.createGuiItem(Material.LIME_STAINED_GLASS_PANE, Component.text("Frei", Color.GREEN)); + } + } } else { - item = ItemUtils.createGuiItem(Material.LIME_STAINED_GLASS_PANE, Component.text("Frei", Color.GREEN)); - ; + if (challengeSave3.isDirectory()) { + item = ItemUtils.createGuiItem(Material.MAP, Component.text("Save 3", Color.GREEN), Component.text("Links-Kick zum laden.", Color.GREEN), Component.text("Rechts-Kick um Rechte zu bearbeiten.", Color.GREEN), Component.text("Gespeichert am " + FileUtils.getFileDate(new File(FileUtils.getPluginFolder(challengeSave3), "/serverconfig.yml")), Color.GREEN)); + } else { + item = ItemUtils.createGuiItem(Material.LIME_STAINED_GLASS_PANE, Component.text("Frei", Color.GREEN)); + } } } else { item = ItemUtils.createGuiItem(Material.BARRIER, Component.text("Für diesen Slot brauchst du VIP", Color.RED)); @@ -90,17 +151,41 @@ case SAVE_AUTO_INDEX -> { if (p.hasPermission("challenge.save.slotauto")) { - if (challengeSaveAuto.isDirectory()) { - item = ItemUtils.createGuiItem(Material.MAP, Component.text("Auto Save", Color.GREEN), Component.text("Klicken zum laden.", Color.GREEN), Component.text("Gespeichert am " + FileUtils.getFileDate(new File(FileUtils.getPluginFolder(challengeSaveAuto), "/serverconfig.yml")), Color.GREEN)); + if (allowSlots != null) { + if (!allowSlots.contains(SaveSlot.SLOT_AUTO)) { + item = ItemUtils.createGuiItem(Material.TNT, Component.text("AutoSave", Color.GREEN), Component.text("Kein Zugriff!", Color.RED)); + } else { + if (challengeSaveAuto.isDirectory()) { + item = ItemUtils.createGuiItem(Material.MAP, Component.text("AutoSave", Color.GREEN), Component.text("Links-Kick zum laden.", Color.GREEN), Component.text("Gespeichert am " + FileUtils.getFileDate(new File(FileUtils.getPluginFolder(challengeSaveAuto), "/serverconfig.yml")), Color.GREEN)); + } else { + item = ItemUtils.createGuiItem(Material.LIME_STAINED_GLASS_PANE, Component.text("Frei", Color.GREEN)); + } + } } else { - item = ItemUtils.createGuiItem(Material.LIME_STAINED_GLASS_PANE, Component.text("AutoSave", Color.GREEN)); + if (challengeSaveAuto.isDirectory()) { + item = ItemUtils.createGuiItem(Material.MAP, Component.text("AutoSave", Color.GREEN), Component.text("Links-Kick zum laden.", Color.GREEN), Component.text("Rechts-Kick um Rechte zu bearbeiten.", Color.GREEN), Component.text("Gespeichert am " + FileUtils.getFileDate(new File(FileUtils.getPluginFolder(challengeSaveAuto), "/serverconfig.yml")), Color.GREEN)); + } else { + item = ItemUtils.createGuiItem(Material.LIME_STAINED_GLASS_PANE, Component.text("Frei", Color.GREEN)); + } } } else { - item = ItemUtils.createGuiItem(Material.BARRIER, Component.text("Für diesen Slot hast du keine Rechte", Color.RED)); + item = ItemUtils.createGuiItem(Material.BARRIER, Component.text("Für diesen Slot brauchst du VIP", Color.RED)); + } + } + case OTHER_SAVE_INDEX -> { + if (p.hasPermission("lobby.load.other") || p.hasPermission("challenges.load.admin")) { + if (isOwnGUI) { + item = ItemUtils.createGuiItem(Material.GRAY_SHULKER_BOX, Component.text("Maps von anderen Spielern", Color.GREEN), Component.text("Liste alle Maps auf, auf die du Zugriff hast!", Color.GREEN)); + } else { + item = CustomHeads.RAINBOW_ARROW_BACKWARD_II.getHead(Component.text("Zurück", Color.GREEN)); + } } } default -> item = ItemUtils.EMPTY_ICON; } + if (item == null) { + item = ItemUtils.EMPTY_ICON; + } this.getInventory().setItem(i, item); } } @@ -132,15 +217,21 @@ plugin.getComponentUtil().sendErrorMessage(p, "Für diesen Slot hast du keine Rechte!"); return; } - if (!challengeSave1.isDirectory()) { - return; - } - if (!Server.serverPlayers.containsValue(p.getUniqueId())) { - p.closeInventory(); - plugin.getPluginConfig().getOnlineChanllengeServer().ifPresentOrElse(server -> server.loadSaved(p, savePlayerID, "1"), () -> plugin.getComponentUtil().sendErrorMessage(p, "Aktuell ist kein Server Frei!")); - } else { - p.closeInventory(); - plugin.getComponentUtil().sendErrorMessage(p, "Du kannst nur einen Server starten!"); + if (event.isLeftClick()) { + if (!challengeSave1.isDirectory()) { + return; + } + if (!Server.serverPlayers.containsValue(p.getUniqueId())) { + p.closeInventory(); + plugin.getPluginConfig().getOnlineChanllengeServer().ifPresentOrElse(server -> server.loadSaved(p, savePlayerID, "1"), () -> plugin.getComponentUtil().sendErrorMessage(p, "Aktuell ist kein Server Frei!")); + } else { + p.closeInventory(); + plugin.getComponentUtil().sendErrorMessage(p, "Du kannst nur einen Server starten!"); + } + } else if (event.isRightClick()) { + if (isOwnGUI) { + new ChallengeAccessListGUI(p, SaveSlot.SLOT_1, plugin).open(); + } } } case SAVE_2_INDEX -> { @@ -148,15 +239,21 @@ plugin.getComponentUtil().sendErrorMessage(p, "Für diesen Slot brauchst du VIP!"); return; } - if (!challengeSave2.isDirectory()) { - return; - } - if (!Server.serverPlayers.containsValue(p.getUniqueId())) { - p.closeInventory(); - plugin.getPluginConfig().getOnlineChanllengeServer().ifPresentOrElse(server -> server.loadSaved(p, savePlayerID, "2"), () -> plugin.getComponentUtil().sendErrorMessage(p, "Aktuell ist kein Server Frei!")); - } else { - p.closeInventory(); - plugin.getComponentUtil().sendErrorMessage(p, "Du kannst nur einen Server starten!"); + if (event.isLeftClick()) { + if (!challengeSave2.isDirectory()) { + return; + } + if (!Server.serverPlayers.containsValue(p.getUniqueId())) { + p.closeInventory(); + plugin.getPluginConfig().getOnlineChanllengeServer().ifPresentOrElse(server -> server.loadSaved(p, savePlayerID, "2"), () -> plugin.getComponentUtil().sendErrorMessage(p, "Aktuell ist kein Server Frei!")); + } else { + p.closeInventory(); + plugin.getComponentUtil().sendErrorMessage(p, "Du kannst nur einen Server starten!"); + } + } else if (event.isRightClick()) { + if (isOwnGUI) { + new ChallengeAccessListGUI(p, SaveSlot.SLOT_2, plugin).open(); + } } } case SAVE_3_INDEX -> { @@ -164,15 +261,21 @@ plugin.getComponentUtil().sendErrorMessage(p, "Für diesen Slot brauchst du VIP!"); return; } - if (!challengeSave3.isDirectory()) { - return; - } - if (!Server.serverPlayers.containsValue(p.getUniqueId())) { - p.closeInventory(); - plugin.getPluginConfig().getOnlineChanllengeServer().ifPresentOrElse(server -> server.loadSaved(p, savePlayerID, "3"), () -> plugin.getComponentUtil().sendErrorMessage(p, "Aktuell ist kein Server Frei!")); - } else { - p.closeInventory(); - plugin.getComponentUtil().sendErrorMessage(p, "Du kannst nur einen Server starten!"); + if (event.isLeftClick()) { + if (!challengeSave3.isDirectory()) { + return; + } + if (!Server.serverPlayers.containsValue(p.getUniqueId())) { + p.closeInventory(); + plugin.getPluginConfig().getOnlineChanllengeServer().ifPresentOrElse(server -> server.loadSaved(p, savePlayerID, "3"), () -> plugin.getComponentUtil().sendErrorMessage(p, "Aktuell ist kein Server Frei!")); + } else { + p.closeInventory(); + plugin.getComponentUtil().sendErrorMessage(p, "Du kannst nur einen Server starten!"); + } + } else if (event.isRightClick()) { + if (isOwnGUI) { + new ChallengeAccessListGUI(p, SaveSlot.SLOT_3, plugin).open(); + } } } case SAVE_AUTO_INDEX -> { @@ -180,15 +283,27 @@ plugin.getComponentUtil().sendErrorMessage(p, "Für diesen Slot hast du keine Rechte!"); return; } - if (!challengeSaveAuto.isDirectory()) { - return; + if (event.isLeftClick()) { + if (!challengeSaveAuto.isDirectory()) { + return; + } + if (!Server.serverPlayers.containsValue(p.getUniqueId())) { + p.closeInventory(); + plugin.getPluginConfig().getOnlineChanllengeServer().ifPresentOrElse(server -> server.loadSaved(p, savePlayerID, "autosave"), () -> plugin.getComponentUtil().sendErrorMessage(p, "Aktuell ist kein Server Frei!")); + } else { + p.closeInventory(); + plugin.getComponentUtil().sendErrorMessage(p, "Du kannst nur einen Server starten!"); + } + } else if (event.isRightClick()) { + if (isOwnGUI) { + new ChallengeAccessListGUI(p, SaveSlot.SLOT_AUTO, plugin).open(); + } } - if (!Server.serverPlayers.containsValue(p.getUniqueId())) { + } + case OTHER_SAVE_INDEX -> { + if (p.hasPermission("lobby.load.other") || p.hasPermission("challenges.load.admin")) { p.closeInventory(); - plugin.getPluginConfig().getOnlineChanllengeServer().ifPresentOrElse(server -> server.loadSaved(p, savePlayerID, "autosave"), () -> plugin.getComponentUtil().sendErrorMessage(p, "Aktuell ist kein Server Frei!")); - } else { - p.closeInventory(); - plugin.getComponentUtil().sendErrorMessage(p, "Du kannst nur einen Server starten!"); + new ChallengePlayerListGUI(p, plugin).open(); } } default -> { diff --git a/Lobby/src/main/java/de/fanta/lobby/loadgui/ChallengePlayerListGUI.java b/Lobby/src/main/java/de/fanta/lobby/loadgui/ChallengePlayerListGUI.java new file mode 100644 index 0000000..75c2f47 --- /dev/null +++ b/Lobby/src/main/java/de/fanta/lobby/loadgui/ChallengePlayerListGUI.java @@ -0,0 +1,225 @@ +package de.fanta.lobby.loadgui; + +import com.destroystokyo.paper.profile.PlayerProfile; +import de.fanta.challengeutils.Color; +import de.fanta.lobby.Lobby; +import de.fanta.lobby.SaveSlot; +import de.iani.cubesideutils.bukkit.inventory.AbstractWindow; +import de.iani.cubesideutils.bukkit.items.CustomHeads; +import de.iani.playerUUIDCache.CachedPlayer; +import de.iani.playerUUIDCache.CachedPlayerProfile; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextDecoration; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.SkullMeta; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Set; +import java.util.UUID; + +public class ChallengePlayerListGUI extends AbstractWindow { + private static final int NUM_OF_COLUMNS = 9; + private static final int NUM_OF_ITEM_COLUMNS = NUM_OF_COLUMNS - 1; + private static final int NUM_OF_ROWS = 6; + private static final int WINDOW_SIZE = NUM_OF_COLUMNS * NUM_OF_ROWS; + private static final int END_OF_FIRST_ROW_INDEX = NUM_OF_COLUMNS - 1; + private static final int END_OF_LAST_ROW_INDEX = WINDOW_SIZE - 1; + + private static final int CLOSE_INDEX = 0; + + private final List playerList = new ArrayList<>(); + private final HashMap playerMap = new HashMap<>(); + private final HashMap slotInfos = new HashMap<>(); + private int numOfItemRows = 0; + private int scrollAmount; + private final Lobby plugin; + + public ChallengePlayerListGUI(Player player, Lobby plugin) { + super(player, Bukkit.createInventory(player, WINDOW_SIZE, Lobby.getPlugin().getCHALLENGEGUIPREFIX().append(Component.text(" >> Spieler")))); + this.plugin = plugin; + HashMap playerInfoList = new HashMap<>(); + + File saveFolder = plugin.getChallengeSavePath().toFile(); + File[] saves = null; + if (saveFolder.isDirectory()) { + saves = saveFolder.listFiles(); + } + if (saves == null || saves.length == 0) { + plugin.getComponentUtil().sendErrorMessage(player, "Keine Spieler Saves gefunden!"); + return; + } + + if (player.hasPermission("challenges.load.admin")) { + for (File save : saves) { + if (save.isDirectory()) { + String fileName = save.getName(); + CachedPlayer cachedPlayer = plugin.getPlayerUUIDCache().getPlayer(UUID.fromString(fileName)); + if (cachedPlayer != null && !cachedPlayer.getUniqueId().equals(player.getUniqueId())) { + ItemStack playerHead = new ItemStack(Material.PLAYER_HEAD); + SkullMeta meta = (SkullMeta) playerHead.getItemMeta(); + + CachedPlayerProfile cachedPlayerProfile = plugin.getPlayerUUIDCache().getPlayerProfile(cachedPlayer.getUUID(), true); + PlayerProfile playerProfile = plugin.getServer().createProfile(cachedPlayer.getUUID()); + playerProfile.setProperties(cachedPlayerProfile.getProperties()); + meta.setPlayerProfile(playerProfile); + + meta.displayName(Component.text(cachedPlayer.getName()).color(Color.GREEN).decorationIfAbsent(TextDecoration.ITALIC, TextDecoration.State.FALSE)); + playerHead.setItemMeta(meta); + PlayerInfoEntry playerInfoEntry = new PlayerInfoEntry(cachedPlayer, playerHead); + playerInfoList.put(cachedPlayer.getUUID(), playerInfoEntry); + } + } + } + } else if (player.hasPermission("lobby.load.other")) { + Set playerList = plugin.getSaveAccessConfig().getKeys(false); + for (String name : playerList) { + plugin.getLogger().info("Name: " + name); + ConfigurationSection playerSection = plugin.getSaveAccessConfig().getConfigurationSection(name); + if (playerSection != null) { + Set slots = playerSection.getKeys(false); + for (String slot : slots) { + plugin.getLogger().info("Slot: " + slot); + List acceessList = playerSection.getStringList(slot); + for (String accessPlayer : acceessList) { + plugin.getLogger().info("accessPlayer: " + accessPlayer); + UUID uuid = UUID.fromString(accessPlayer); + if (player.getUniqueId().equals(uuid)) { + CachedPlayer cachedPlayer = plugin.getPlayerUUIDCache().getPlayer(UUID.fromString(name)); + if (cachedPlayer != null) { + PlayerInfoEntry playerInfoEntry = playerInfoList.get(cachedPlayer.getUUID()); + if (playerInfoEntry == null) { + ItemStack playerHead = new ItemStack(Material.PLAYER_HEAD); + SkullMeta meta = (SkullMeta) playerHead.getItemMeta(); + + CachedPlayerProfile cachedPlayerProfile = plugin.getPlayerUUIDCache().getPlayerProfile(cachedPlayer.getUUID(), true); + PlayerProfile playerProfile = plugin.getServer().createProfile(cachedPlayer.getUUID()); + playerProfile.setProperties(cachedPlayerProfile.getProperties()); + meta.setPlayerProfile(playerProfile); + + meta.displayName(Component.text(cachedPlayer.getName()).color(Color.GREEN).decorationIfAbsent(TextDecoration.ITALIC, TextDecoration.State.FALSE)); + playerHead.setItemMeta(meta); + playerInfoEntry = new PlayerInfoEntry(cachedPlayer, playerHead); + } + + List saveSlots = playerInfoEntry.getAccessList().getOrDefault(player.getUniqueId(), new ArrayList<>()); + saveSlots.add(SaveSlot.valueOf(slot)); + playerInfoEntry.getAccessList().put(player.getUniqueId(), saveSlots); + playerInfoList.put(cachedPlayer.getUUID(), playerInfoEntry); + } + } + } + } + } + } + } + + List infos = new ArrayList<>(playerInfoList.values().stream().toList()); + infos.sort(Comparator.comparing(p -> p.getCachedPlayer().getName().toLowerCase())); + + playerList.addAll(infos); + playerMap.putAll(playerInfoList); + this.numOfItemRows = (int) (Math.ceil(playerInfoList.size() / (double) NUM_OF_ITEM_COLUMNS)); + this.scrollAmount = 0; + } + + protected void rebuildInventory() { + ItemStack[] content = new ItemStack[WINDOW_SIZE]; + + // build scroll buttons + ItemStack scrollUpHead = this.scrollAmount <= 0 ? CustomHeads.RAINBOW_BLANK.getHead() : CustomHeads.RAINBOW_ARROW_UP.getHead(); + ItemMeta scrollUpMeta = scrollUpHead.getItemMeta(); + scrollUpMeta.displayName(Component.text("Hoch", this.scrollAmount <= 0 ? Color.GRAY : Color.WHITE)); + scrollUpHead.setItemMeta(scrollUpMeta); + content[NUM_OF_COLUMNS - 1] = scrollUpHead; + + ItemStack scrollDownHead = this.scrollAmount - 1 >= this.numOfItemRows - NUM_OF_ROWS ? CustomHeads.RAINBOW_BLANK.getHead() : CustomHeads.RAINBOW_ARROW_DOWN.getHead(); + ItemMeta scrollDownMeta = scrollDownHead.getItemMeta(); + scrollDownMeta.displayName(Component.text("Runter", this.scrollAmount - 1 >= this.numOfItemRows - NUM_OF_ROWS ? Color.GRAY : Color.WHITE)); + scrollDownHead.setItemMeta(scrollDownMeta); + content[WINDOW_SIZE - 1] = scrollDownHead; + + // build scrollbar + for (int i = 1; i < NUM_OF_ROWS - 1; i++) { + content[(i + 1) * NUM_OF_COLUMNS - 1] = new ItemStack(Material.GRAY_STAINED_GLASS_PANE); + } + int numOfScrollbarRows = NUM_OF_ROWS - 2; + int currentScrollbarRow = + (int) Math.round(this.scrollAmount * numOfScrollbarRows / (double) this.numOfItemRows); + content[(currentScrollbarRow + 2) * NUM_OF_COLUMNS - 1] = new ItemStack(Material.BLACK_STAINED_GLASS_PANE); + + // fill in items + slotInfos.clear(); + int index = this.scrollAmount * NUM_OF_ITEM_COLUMNS; + for (int row = 1; row < NUM_OF_ROWS && index < playerList.size(); row++) { + for (int column = 0; column < NUM_OF_ITEM_COLUMNS && index < playerList.size(); column++) { + PlayerInfoEntry secretEntry = new ArrayList<>(playerList).get(index++); + ItemStack stack = secretEntry.getPlayerHead().clone(); + int slot = row * NUM_OF_COLUMNS + column; + slotInfos.put(slot, secretEntry); + content[slot] = stack; + } + } + + content[CLOSE_INDEX] = CustomHeads.RAINBOW_X.getHead(Component.text("Menü verlassen", Color.RED)); + getInventory().setContents(content); + } + + public void onItemClicked(InventoryClickEvent event) { + if (!mayAffectThisInventory(event)) { + return; + } + + event.setCancelled(true); + + if (!getInventory().equals(event.getClickedInventory())) { + return; + } + + int slot = event.getSlot(); + + if (slot == CLOSE_INDEX) { + getPlayer().closeInventory(); + return; + } + + if (slot == END_OF_FIRST_ROW_INDEX) { + attempScrollUp(); + } else if (slot == END_OF_LAST_ROW_INDEX) { + attempScrollDown(); + } + + Player p = getPlayer(); + PlayerInfoEntry playerInfo = slotInfos.get(slot); + if (playerInfo != null) { + plugin.getComponentUtil().sendDebugMessage(p, playerInfo.getCachedPlayer().getName()); + new ChallengeLoadGUI(p, playerInfo).open(); + } + } + + private void attempScrollUp() { + if (this.scrollAmount <= 0) { + return; + } + this.scrollAmount--; + rebuildInventory(); + } + + private void attempScrollDown() { + if (this.scrollAmount - 1 >= this.numOfItemRows - NUM_OF_ROWS) { + return; + } + this.scrollAmount++; + rebuildInventory(); + } +} diff --git a/Lobby/src/main/java/de/fanta/lobby/loadgui/PlayerInfoEntry.java b/Lobby/src/main/java/de/fanta/lobby/loadgui/PlayerInfoEntry.java new file mode 100644 index 0000000..24c804a --- /dev/null +++ b/Lobby/src/main/java/de/fanta/lobby/loadgui/PlayerInfoEntry.java @@ -0,0 +1,33 @@ +package de.fanta.lobby.loadgui; + +import de.fanta.lobby.SaveSlot; +import de.iani.playerUUIDCache.CachedPlayer; +import org.bukkit.inventory.ItemStack; + +import java.util.HashMap; +import java.util.List; +import java.util.UUID; + +public class PlayerInfoEntry { + private final CachedPlayer cachedPlayer; + private ItemStack playerHead; + private final HashMap> accessList; + + public PlayerInfoEntry(CachedPlayer cachedPlayer, ItemStack playerHead) { + this.cachedPlayer = cachedPlayer; + this.playerHead = playerHead; + this.accessList = new HashMap<>(); + } + + public CachedPlayer getCachedPlayer() { + return cachedPlayer; + } + + public ItemStack getPlayerHead() { + return playerHead; + } + + public HashMap> getAccessList() { + return accessList; + } +} diff --git a/Lobby/src/main/resources/config.yml b/Lobby/src/main/resources/config.yml index ee33ad0..dee0295 100644 --- a/Lobby/src/main/resources/config.yml +++ b/Lobby/src/main/resources/config.yml @@ -5,5 +5,6 @@ challengeSaves: "/home/storagebox/Challenge-saves" serverJars: "/home/minecraft/ServerJars/" serverFolder: "/home/minecraft/Server/" + saveAccessFile: "/home/storagebox/saveAccess.yml" teleportworlds: - lobbynew