diff --git a/Challenge/src/main/java/de/fanta/challenge/Challenge.java b/Challenge/src/main/java/de/fanta/challenge/Challenge.java index e558509..7cf0bc7 100644 --- a/Challenge/src/main/java/de/fanta/challenge/Challenge.java +++ b/Challenge/src/main/java/de/fanta/challenge/Challenge.java @@ -714,4 +714,14 @@ public ComponentUtil getComponentUtil() { return componentUtil; } + + public YamlConfiguration getSaveAccessConfig() { + File saveAccessFile = new File("/home/storagebox/saveAccess.yml"); + + if (!saveAccessFile.exists()) { + return null; + } + + return YamlConfiguration.loadConfiguration(saveAccessFile); + } } diff --git a/Challenge/src/main/java/de/fanta/challenge/guis/savegui/ChallengePlayerListGUI.java b/Challenge/src/main/java/de/fanta/challenge/guis/savegui/ChallengePlayerListGUI.java new file mode 100644 index 0000000..5bfc2e1 --- /dev/null +++ b/Challenge/src/main/java/de/fanta/challenge/guis/savegui/ChallengePlayerListGUI.java @@ -0,0 +1,221 @@ +package de.fanta.challenge.guis.savegui; + +import com.destroystokyo.paper.profile.PlayerProfile; +import de.fanta.challenge.Challenge; +import de.fanta.challenge.SaveSlot; +import de.fanta.challengeutils.Color; +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.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 Challenge plugin; + + public ChallengePlayerListGUI(Player player, Challenge plugin) { + super(player, Bukkit.createInventory(player, WINDOW_SIZE, Challenge.getPlugin().getGuiPrefix().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) { + ConfigurationSection playerSection = plugin.getSaveAccessConfig().getConfigurationSection(name); + if (playerSection != null) { + Set slots = playerSection.getKeys(false); + for (String slot : slots) { + List acceessList = playerSection.getStringList(slot); + for (String accessPlayer : acceessList) { + 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 ChallengeSaveGui(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/Challenge/src/main/java/de/fanta/challenge/guis/savegui/ChallengeSaveGui.java b/Challenge/src/main/java/de/fanta/challenge/guis/savegui/ChallengeSaveGui.java index 61606bc..8974d97 100644 --- a/Challenge/src/main/java/de/fanta/challenge/guis/savegui/ChallengeSaveGui.java +++ b/Challenge/src/main/java/de/fanta/challenge/guis/savegui/ChallengeSaveGui.java @@ -4,10 +4,12 @@ import de.fanta.challenge.SaveSlot; import de.fanta.challenge.ServerType; import de.fanta.challenge.utils.SaveWorldUtils; +import de.fanta.challengeutils.FileUtils; import de.fanta.challengeutils.ItemUtils; import de.fanta.challengeutils.Color; 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; @@ -19,6 +21,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import javax.annotation.Nullable; import java.io.File; import java.io.IOException; import java.util.HashMap; @@ -28,16 +31,30 @@ public class ChallengeSaveGui extends AbstractWindow { private static final Challenge plugin = Challenge.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 static final HashMap savePlayerList = new HashMap<>(); + private final boolean isOwnGUI; + + @Nullable + private PlayerInfoEntry playerInfoEntry; public ChallengeSaveGui(Player player, CachedPlayer savePlayer) { super(player, Bukkit.createInventory(null, WINDOW_SIZE, plugin.getGuiPrefix().append(Component.text(" >> Map speichern")))); savePlayerList.put(player.getUniqueId(), savePlayer.getUniqueId()); + isOwnGUI = player.getUniqueId().equals(savePlayer.getUniqueId()); + } + + public ChallengeSaveGui(Player player, PlayerInfoEntry infoEntry) { + super(player, Bukkit.createInventory(null, WINDOW_SIZE, plugin.getGuiPrefix().append(Component.text(" >> Map speichern")))); + CachedPlayer savePlayer = infoEntry.getCachedPlayer(); + savePlayerList.put(player.getUniqueId(), savePlayer.getUniqueId()); + isOwnGUI = player.getUniqueId().equals(savePlayer.getUniqueId()); + this.playerInfoEntry = infoEntry; } @Override @@ -48,6 +65,12 @@ File save2; File save3; File saveAuto; + + List allowSlots = null; + if (playerInfoEntry != null) { + allowSlots = playerInfoEntry.getAccessList().get(player.getUniqueId()); + } + if (plugin.getServerType() != ServerType.ADVENTURE) { save1 = new File(plugin.getChallengeSavePath().toFile(), savePlayerID + "/1"); save2 = new File(plugin.getChallengeSavePath().toFile(), savePlayerID + "/2"); @@ -61,14 +84,26 @@ } for (int i = 0; i < WINDOW_SIZE; i++) { - ItemStack item; + ItemStack item = null; switch (i) { - case SAVE_1_INDEX -> item = getDisplayItem(player, SaveSlot.SLOT_1, save1); - case SAVE_2_INDEX -> item = getDisplayItem(player, SaveSlot.SLOT_2, save2); - case SAVE_3_INDEX -> item = getDisplayItem(player, SaveSlot.SLOT_3, save3); - case SAVE_AUTO_INDEX -> item = getDisplayItem(player, SaveSlot.SLOT_AUTO, saveAuto); + case SAVE_1_INDEX -> item = getDisplayItem(player, SaveSlot.SLOT_1, save1, allowSlots); + case SAVE_2_INDEX -> item = getDisplayItem(player, SaveSlot.SLOT_2, save2, allowSlots); + case SAVE_3_INDEX -> item = getDisplayItem(player, SaveSlot.SLOT_3, save3, allowSlots); + case SAVE_AUTO_INDEX -> item = getDisplayItem(player, SaveSlot.SLOT_AUTO, saveAuto, allowSlots); + case OTHER_SAVE_INDEX -> { + if (player.hasPermission("lobby.load.other") || player.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); } } @@ -100,6 +135,11 @@ save3 = new File(plugin.getAdventureSavePath().toFile(), savePlayerID + "/3"); } + List allowSlots = null; + if (playerInfoEntry != null) { + allowSlots = playerInfoEntry.getAccessList().get(player.getUniqueId()); + } + int slot = event.getSlot(); switch (slot) { case SAVE_1_INDEX -> { @@ -107,36 +147,79 @@ plugin.getComponentUtil().sendErrorMessage(p, "Für diesen Slot hast du keine Rechte!"); return; } - if (!save1.isDirectory()) { - player.closeInventory(); - SaveWorldUtils.saveWorld(player, savePlayerID.toString(), SaveSlot.SLOT_1); - return; + if (allowSlots == null) { + if (!save1.isDirectory()) { + player.closeInventory(); + SaveWorldUtils.saveWorld(player, savePlayerID.toString(), SaveSlot.SLOT_1); + return; + } + new ChallengeSaveConfirmGui(player, savePlayerID, SaveSlot.SLOT_1, event.getCurrentItem()).open(); + } else if (allowSlots.contains(SaveSlot.SLOT_1)) { + if (!save1.isDirectory()) { + player.closeInventory(); + SaveWorldUtils.saveWorld(player, savePlayerID.toString(), SaveSlot.SLOT_1); + return; + } + new ChallengeSaveConfirmGui(player, savePlayerID, SaveSlot.SLOT_1, event.getCurrentItem()).open(); + } else { + p.closeInventory(); + plugin.getComponentUtil().sendErrorMessage(p, "Auf diesen Slot hat du kein Zugriff!"); } - new ChallengeSaveConfirmGui(player, savePlayerID, SaveSlot.SLOT_1, event.getCurrentItem()).open(); } case SAVE_2_INDEX -> { if (!p.hasPermission("challenge.save.slot2")) { plugin.getComponentUtil().sendErrorMessage(p, "Für diesen Slot brauchst du VIP!"); return; } - if (!save2.isDirectory()) { - player.closeInventory(); - SaveWorldUtils.saveWorld(player, savePlayerID.toString(), SaveSlot.SLOT_2); - return; + if (allowSlots == null) { + if (!save2.isDirectory()) { + player.closeInventory(); + SaveWorldUtils.saveWorld(player, savePlayerID.toString(), SaveSlot.SLOT_2); + return; + } + new ChallengeSaveConfirmGui(player, savePlayerID, SaveSlot.SLOT_2, event.getCurrentItem()).open(); + } else if (allowSlots.contains(SaveSlot.SLOT_2)) { + if (!save2.isDirectory()) { + player.closeInventory(); + SaveWorldUtils.saveWorld(player, savePlayerID.toString(), SaveSlot.SLOT_2); + return; + } + new ChallengeSaveConfirmGui(player, savePlayerID, SaveSlot.SLOT_2, event.getCurrentItem()).open(); + } else { + p.closeInventory(); + plugin.getComponentUtil().sendErrorMessage(p, "Auf diesen Slot hat du kein Zugriff!"); } - new ChallengeSaveConfirmGui(player, savePlayerID, SaveSlot.SLOT_2, event.getCurrentItem()).open(); + } case SAVE_3_INDEX -> { if (!p.hasPermission("challenge.save.slot3")) { plugin.getComponentUtil().sendErrorMessage(p, "Für diesen Slot brauchst du VIP!"); return; } - if (!save3.isDirectory()) { - player.closeInventory(); - SaveWorldUtils.saveWorld(player, savePlayerID.toString(), SaveSlot.SLOT_3); - return; + if (allowSlots == null) { + if (!save3.isDirectory()) { + player.closeInventory(); + SaveWorldUtils.saveWorld(player, savePlayerID.toString(), SaveSlot.SLOT_3); + return; + } + new ChallengeSaveConfirmGui(player, savePlayerID, SaveSlot.SLOT_3, event.getCurrentItem()).open(); + } else if (allowSlots.contains(SaveSlot.SLOT_3)) { + if (!save3.isDirectory()) { + player.closeInventory(); + SaveWorldUtils.saveWorld(player, savePlayerID.toString(), SaveSlot.SLOT_3); + return; + } + new ChallengeSaveConfirmGui(player, savePlayerID, SaveSlot.SLOT_3, event.getCurrentItem()).open(); + } else { + p.closeInventory(); + plugin.getComponentUtil().sendErrorMessage(p, "Auf diesen Slot hat du kein Zugriff!"); } - new ChallengeSaveConfirmGui(player, savePlayerID, SaveSlot.SLOT_3, event.getCurrentItem()).open(); + } + case OTHER_SAVE_INDEX -> { + if (p.hasPermission("lobby.load.other") || p.hasPermission("challenges.load.admin")) { + p.closeInventory(); + new ChallengePlayerListGUI(p, plugin).open(); + } } default -> { } @@ -147,75 +230,97 @@ return StringUtil.formatDate(serverConfig.getLong("saveTime", 0)); } - private static ItemStack getDisplayItem(Player player, SaveSlot saveSlot, File save) { + private static ItemStack getDisplayItem(Player player, SaveSlot saveSlot, File save, List allowSlots) { ItemStack item; if (player.hasPermission(saveSlot.getPermission())) { - if (save.isDirectory()) { - File mapConfig = new File(getPluginFolder(save), "/serverconfig.yml"); - Material displayItem = null; - String displayName = null; - YamlConfiguration serverConfig = new YamlConfiguration(); - try { - serverConfig.load(mapConfig); - String itemType = serverConfig.getString("displayItem.item"); - String itemName = serverConfig.getString("displayItem.name"); - if (itemType != null) { - try { - displayItem = Material.valueOf(itemType); - } catch (IllegalArgumentException ignore) { - } - } - if (itemName != null) { - displayName = itemName; - } - } catch (IOException | InvalidConfigurationException ex) { - plugin.getLogger().log(Level.SEVERE, "Fehler beim laden der config", ex); - } - - ItemStack stack = new ItemStack(displayItem != null ? displayItem : Material.MAP); - ItemMeta meta = stack.getItemMeta(); - meta.displayName(displayName != null ? Component.text(displayName) : Component.text("Save " + saveSlot.getSlot(), Color.GREEN)); - - if (saveSlot == SaveSlot.SLOT_AUTO) { - meta.lore(List.of(Component.text("AutoSave kann nicht überschrieben werden!", Color.RED), Component.text("Gespeichert am " + getFileDate(serverConfig), Color.GREEN))); + if (allowSlots != null) { + if (!allowSlots.contains(saveSlot)) { + item = ItemUtils.createGuiItem(Material.TNT, Component.text(saveSlot.getSlot(), Color.GREEN), Component.text("Kein Zugriff!", Color.RED)); } else { - meta.lore(List.of(Component.text("Gespeichert am " + getFileDate(serverConfig), Color.GREEN))); + if (save.isDirectory()) { + File mapConfig = new File(FileUtils.getPluginFolder(save), "/serverconfig.yml"); + Material displayItem = null; + String displayName = null; + YamlConfiguration serverConfig = new YamlConfiguration(); + try { + serverConfig.load(mapConfig); + String itemType = serverConfig.getString("displayItem.item"); + String itemName = serverConfig.getString("displayItem.name"); + if (itemType != null) { + try { + displayItem = Material.valueOf(itemType); + } catch (IllegalArgumentException ignore) { + } + } + if (itemName != null) { + displayName = itemName; + } + } catch (IOException | InvalidConfigurationException ex) { + plugin.getLogger().log(Level.SEVERE, "Fehler beim laden der config", ex); + } + + ItemStack stack = new ItemStack(displayItem != null ? displayItem : Material.MAP); + ItemMeta meta = stack.getItemMeta(); + meta.displayName(displayName != null ? Component.text(displayName) : Component.text("Save " + saveSlot.getSlot(), Color.GREEN)); + + if (saveSlot == SaveSlot.SLOT_AUTO) { + meta.lore(List.of(Component.text("AutoSave kann nicht überschrieben werden!", Color.RED), Component.text("Gespeichert am " + getFileDate(serverConfig), Color.GREEN))); + } else { + meta.lore(List.of(Component.text("Gespeichert am " + getFileDate(serverConfig), Color.GREEN))); + } + + stack.setItemMeta(meta); + item = stack; + + + } else { + item = ItemUtils.createGuiItem(Material.LIME_STAINED_GLASS_PANE, Component.text("Frei", Color.GREEN)); + } } - - stack.setItemMeta(meta); - item = stack; - - } else { - item = ItemUtils.createGuiItem(Material.LIME_STAINED_GLASS_PANE, Component.text("Frei", Color.GREEN)); + if (save.isDirectory()) { + File mapConfig = new File(FileUtils.getPluginFolder(save), "/serverconfig.yml"); + Material displayItem = null; + String displayName = null; + YamlConfiguration serverConfig = new YamlConfiguration(); + try { + serverConfig.load(mapConfig); + String itemType = serverConfig.getString("displayItem.item"); + String itemName = serverConfig.getString("displayItem.name"); + if (itemType != null) { + try { + displayItem = Material.valueOf(itemType); + } catch (IllegalArgumentException ignore) { + } + } + if (itemName != null) { + displayName = itemName; + } + } catch (IOException | InvalidConfigurationException ex) { + plugin.getLogger().log(Level.SEVERE, "Fehler beim laden der config", ex); + } + + ItemStack stack = new ItemStack(displayItem != null ? displayItem : Material.MAP); + ItemMeta meta = stack.getItemMeta(); + meta.displayName(displayName != null ? Component.text(displayName) : Component.text("Save " + saveSlot.getSlot(), Color.GREEN)); + + if (saveSlot == SaveSlot.SLOT_AUTO) { + meta.lore(List.of(Component.text("AutoSave kann nicht überschrieben werden!", Color.RED), Component.text("Gespeichert am " + getFileDate(serverConfig), Color.GREEN))); + } else { + meta.lore(List.of(Component.text("Gespeichert am " + getFileDate(serverConfig), Color.GREEN))); + } + + stack.setItemMeta(meta); + item = stack; + + + } 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)); } return item; } - - private static File getPluginFolder(File saveSlot) { - File challengeFolder = null; - File challenges = new File(saveSlot, "/Challenges"); - File challenge = new File(saveSlot, "/Challenge"); - File adventure = new File(saveSlot, "/Adventure"); - if (challenges.isDirectory()) { - challengeFolder = challenges; - } else if (challenge.isDirectory()) { - challengeFolder = challenge; - } else if (adventure.isDirectory()) { - challengeFolder = adventure; - } - - if (challengeFolder == null) { - return null; - } - - if (!challengeFolder.isDirectory()) { - return null; - } - - return challengeFolder; - } } diff --git a/Challenge/src/main/java/de/fanta/challenge/guis/savegui/PlayerInfoEntry.java b/Challenge/src/main/java/de/fanta/challenge/guis/savegui/PlayerInfoEntry.java new file mode 100644 index 0000000..3b10a14 --- /dev/null +++ b/Challenge/src/main/java/de/fanta/challenge/guis/savegui/PlayerInfoEntry.java @@ -0,0 +1,33 @@ +package de.fanta.challenge.guis.savegui; + +import de.fanta.challenge.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/java/de/fanta/lobby/loadgui/ChallengeLoadGUI.java b/Lobby/src/main/java/de/fanta/lobby/loadgui/ChallengeLoadGUI.java index e14f0e6..808aa46 100644 --- a/Lobby/src/main/java/de/fanta/lobby/loadgui/ChallengeLoadGUI.java +++ b/Lobby/src/main/java/de/fanta/lobby/loadgui/ChallengeLoadGUI.java @@ -208,6 +208,10 @@ 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()); + } int slot = event.getSlot(); switch (slot) { @@ -217,15 +221,31 @@ return; } 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!")); + if (allowSlots == null) { + 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 (allowSlots.contains(SaveSlot.SLOT_1)) { + 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 { p.closeInventory(); - plugin.getComponentUtil().sendErrorMessage(p, "Du kannst nur einen Server starten!"); + plugin.getComponentUtil().sendErrorMessage(p, "Auf diesen Slot hat du kein Zugriff!"); } } else if (event.isRightClick()) { if (isOwnGUI) { @@ -239,15 +259,31 @@ return; } 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!")); + if (allowSlots == null) { + 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 (allowSlots.contains(SaveSlot.SLOT_2)) { + 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 { p.closeInventory(); - plugin.getComponentUtil().sendErrorMessage(p, "Du kannst nur einen Server starten!"); + plugin.getComponentUtil().sendErrorMessage(p, "Auf diesen Slot hat du kein Zugriff!"); } } else if (event.isRightClick()) { if (isOwnGUI) { @@ -261,15 +297,31 @@ return; } 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!")); + if (allowSlots == null) { + 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 (allowSlots.contains(SaveSlot.SLOT_3)) { + 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 { p.closeInventory(); - plugin.getComponentUtil().sendErrorMessage(p, "Du kannst nur einen Server starten!"); + plugin.getComponentUtil().sendErrorMessage(p, "Auf diesen Slot hat du kein Zugriff!"); } } else if (event.isRightClick()) { if (isOwnGUI) { @@ -283,15 +335,31 @@ 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!")); + if (allowSlots == null) { + 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 (allowSlots.contains(SaveSlot.SLOT_AUTO)) { + 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 { p.closeInventory(); - plugin.getComponentUtil().sendErrorMessage(p, "Du kannst nur einen Server starten!"); + plugin.getComponentUtil().sendErrorMessage(p, "Auf diesen Slot hat du kein Zugriff!"); } } else if (event.isRightClick()) { if (isOwnGUI) {