From b1f7e28af4f42045635319949727ac2c69b812f5 Mon Sep 17 00:00:00 2001 From: Tintinkung Date: Fri, 19 Apr 2024 03:40:23 +0700 Subject: [PATCH] feat: Paged Country Board * country board for displaying available plots per country per city * fix design patten on DecentHologramPagedDisplay to match our new built in paging api --- .../com/alpsbte/plotsystem/PlotSystem.java | 10 +- .../commands/admin/CMD_PReload.java | 6 +- .../commands/admin/CMD_SetLeaderboard.java | 8 +- .../core/holograms/CountryBoard.java | 231 ++++++++++++++++++ .../core/holograms/HologramManager.java | 5 +- ...oardManager.java => HologramRegister.java} | 25 +- .../core/holograms/MessagesManager.java | 17 -- .../core/holograms/PlotsLeaderboard.java | 2 +- .../core/holograms/ScoreLeaderboard.java | 2 +- .../core/holograms/WelcomeMessage.java | 24 +- .../connector/DecentHologramDisplay.java | 53 ++-- .../connector/DecentHologramPagedDisplay.java | 67 +++-- .../plotsystem/core/system/Builder.java | 72 +++++- .../plotsystem/utils/io/ConfigPaths.java | 5 + src/main/resources/config.yml | 26 +- 15 files changed, 432 insertions(+), 121 deletions(-) create mode 100644 src/main/java/com/alpsbte/plotsystem/core/holograms/CountryBoard.java rename src/main/java/com/alpsbte/plotsystem/core/holograms/{LeaderboardManager.java => HologramRegister.java} (68%) delete mode 100644 src/main/java/com/alpsbte/plotsystem/core/holograms/MessagesManager.java diff --git a/src/main/java/com/alpsbte/plotsystem/PlotSystem.java b/src/main/java/com/alpsbte/plotsystem/PlotSystem.java index a00c8203..28ec2398 100644 --- a/src/main/java/com/alpsbte/plotsystem/PlotSystem.java +++ b/src/main/java/com/alpsbte/plotsystem/PlotSystem.java @@ -29,10 +29,8 @@ import com.alpsbte.alpslib.utils.AlpsUtils; import com.alpsbte.alpslib.utils.head.AlpsHeadEventListener; import com.alpsbte.plotsystem.commands.*; -import com.alpsbte.plotsystem.core.holograms.HologramManager; -import com.alpsbte.plotsystem.core.holograms.MessagesManager; import com.alpsbte.plotsystem.core.holograms.connector.DecentHologramDisplay; -import com.alpsbte.plotsystem.core.holograms.LeaderboardManager; +import com.alpsbte.plotsystem.core.holograms.HologramRegister; import com.alpsbte.plotsystem.core.system.Builder; import com.alpsbte.plotsystem.core.system.plot.Plot; import com.alpsbte.plotsystem.core.system.plot.utils.PlotUtils; @@ -62,6 +60,7 @@ import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; +import java.sql.SQLException; import java.util.*; import java.util.function.Consumer; import java.util.logging.Level; @@ -184,8 +183,7 @@ public void onEnable() { }); DecentHologramDisplay.registerPlugin(this); - LeaderboardManager.init(); - MessagesManager.init(); + HologramRegister.init(); PlotUtils.checkPlotsForLastActivity(); PlotUtils.syncPlotSchematicFiles(); PlotUtils.syncPlotGeoCoordinate(); @@ -226,7 +224,7 @@ public void onDisable() { Bukkit.getConsoleSender().sendMessage(ChatColor.DARK_GRAY + "> " + ChatColor.GRAY + "GitHub: " + ChatColor.WHITE + "https://github.com/AlpsBTE/Plot-System"); Bukkit.getConsoleSender().sendMessage(ChatColor.GOLD + "------------------------------------------------------"); - LeaderboardManager.getActiveDisplays().forEach(DecentHologramDisplay::delete); + HologramRegister.getActiveDisplays().forEach(DecentHologramDisplay::delete); } else { // Unload plots for (UUID player : PlotUtils.Cache.getCachedInProgressPlots().keySet()) { diff --git a/src/main/java/com/alpsbte/plotsystem/commands/admin/CMD_PReload.java b/src/main/java/com/alpsbte/plotsystem/commands/admin/CMD_PReload.java index 56b2be1c..a16b94cc 100644 --- a/src/main/java/com/alpsbte/plotsystem/commands/admin/CMD_PReload.java +++ b/src/main/java/com/alpsbte/plotsystem/commands/admin/CMD_PReload.java @@ -28,7 +28,7 @@ import com.alpsbte.plotsystem.commands.BaseCommand; import com.alpsbte.plotsystem.core.database.DatabaseConnection; import com.alpsbte.plotsystem.core.holograms.HologramConfiguration; -import com.alpsbte.plotsystem.core.holograms.LeaderboardManager; +import com.alpsbte.plotsystem.core.holograms.HologramRegister; import com.alpsbte.plotsystem.utils.Utils; import org.bukkit.Bukkit; import org.bukkit.command.Command; @@ -50,9 +50,9 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @N PlotSystem.getPlugin().reloadConfig(); sender.sendMessage(Utils.ChatUtils.getInfoFormat("Successfully reloaded config!")); - LeaderboardManager.getActiveDisplays().forEach(leaderboard -> leaderboard.setLocation(LeaderboardManager + HologramRegister.getActiveDisplays().forEach(leaderboard -> leaderboard.setLocation(HologramRegister .getLocation((HologramConfiguration) leaderboard))); - LeaderboardManager.reload(); + HologramRegister.reload(); sender.sendMessage(Utils.ChatUtils.getInfoFormat("Successfully reloaded leaderboards!")); DatabaseConnection.InitializeDatabase(); diff --git a/src/main/java/com/alpsbte/plotsystem/commands/admin/CMD_SetLeaderboard.java b/src/main/java/com/alpsbte/plotsystem/commands/admin/CMD_SetLeaderboard.java index 4b393e4a..087b989d 100644 --- a/src/main/java/com/alpsbte/plotsystem/commands/admin/CMD_SetLeaderboard.java +++ b/src/main/java/com/alpsbte/plotsystem/commands/admin/CMD_SetLeaderboard.java @@ -26,7 +26,7 @@ import com.alpsbte.plotsystem.commands.BaseCommand; import com.alpsbte.plotsystem.core.holograms.HologramConfiguration; -import com.alpsbte.plotsystem.core.holograms.LeaderboardManager; +import com.alpsbte.plotsystem.core.holograms.HologramRegister; import com.alpsbte.plotsystem.core.holograms.connector.DecentHologramDisplay; import com.alpsbte.plotsystem.utils.Utils; import org.bukkit.Bukkit; @@ -54,7 +54,7 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @N if (args.length != 1) { sendInfo(sender); player.sendMessage("§8------- §6§lLeaderboards §8-------"); - for(DecentHologramDisplay holo : LeaderboardManager.getActiveDisplays()) { + for(DecentHologramDisplay holo : HologramRegister.getActiveDisplays()) { player.sendMessage(" §6> §f" + holo.getId()); } player.sendMessage("§8--------------------------"); @@ -62,7 +62,7 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @N } // Find leaderboard by name - DecentHologramDisplay leaderboard = LeaderboardManager.getActiveDisplays().stream() + DecentHologramDisplay leaderboard = HologramRegister.getActiveDisplays().stream() .filter(holo -> holo.getId().equalsIgnoreCase(args[0])) .findFirst() .orElse(null); @@ -72,7 +72,7 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @N player.sendMessage(Utils.ChatUtils.getAlertFormat("Leaderboard could not be found!")); return true; } - LeaderboardManager.saveLocation(leaderboard.getId(), (HologramConfiguration) leaderboard, getPlayer(sender).getLocation()); + HologramRegister.saveLocation(leaderboard.getId(), (HologramConfiguration) leaderboard, getPlayer(sender).getLocation()); player.sendMessage(Utils.ChatUtils.getInfoFormat("Successfully updated hologram location!")); player.playSound(player.getLocation(), Utils.SoundUtils.DONE_SOUND,1,1); return true; diff --git a/src/main/java/com/alpsbte/plotsystem/core/holograms/CountryBoard.java b/src/main/java/com/alpsbte/plotsystem/core/holograms/CountryBoard.java new file mode 100644 index 00000000..3d827945 --- /dev/null +++ b/src/main/java/com/alpsbte/plotsystem/core/holograms/CountryBoard.java @@ -0,0 +1,231 @@ +package com.alpsbte.plotsystem.core.holograms; + +import com.alpsbte.plotsystem.PlotSystem; +import com.alpsbte.plotsystem.core.holograms.connector.DecentHologramPagedDisplay; +import com.alpsbte.plotsystem.core.system.Builder; +import com.alpsbte.plotsystem.core.system.tutorial.AbstractTutorial; +import com.alpsbte.plotsystem.utils.enums.Status; +import com.alpsbte.plotsystem.utils.io.ConfigPaths; +import com.alpsbte.plotsystem.utils.io.ConfigUtil; +import eu.decentsoftware.holograms.api.DHAPI; +import eu.decentsoftware.holograms.api.holograms.Hologram; +import it.unimi.dsi.fastutil.Hash; +import net.md_5.bungee.api.ChatMessageType; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; + +import java.sql.Array; +import java.sql.SQLException; +import java.text.DecimalFormat; +import java.util.*; +import java.util.logging.Level; +import java.util.stream.Collectors; + +public class CountryBoard extends DecentHologramPagedDisplay implements HologramConfiguration { + private final DecimalFormat df = new DecimalFormat("#.##"); + private ArrayList, + Builder.DatabaseEntry>> projectsData = null; + private ArrayList>>> plotEntries = null; + private static final String contentSeparator = "§7---------------"; + private int currentPage = 0; + + protected CountryBoard() { + super( "country-board", null, false, PlotSystem.getPlugin()); + setEnabled(PlotSystem.getPlugin().getConfig().getBoolean(getEnablePath())); + setLocation(HologramManager.getLocation(this)); + + try { + this.projectsData = Builder.getProjectsSorted(); + this.plotEntries = Builder.getPlotsSorted(); + } + catch (SQLException ex) { + PlotSystem.getPlugin().getLogger().log(Level.SEVERE, "An error occurred while reading country board content", ex); + } + } + + @Override + public void create(Player player) { + if (!PlotSystem.getPlugin().isEnabled()) return; + if (getPages().isEmpty()) { + PlotSystem.getPlugin().getLogger().log(Level.WARNING, "Unable to initialize Score-Leaderboard - No display pages enabled! Check config for display-options."); + return; + } + super.setPageCount(projectsData != null? projectsData.size() : 1); + super.create(player); + } + + @Override + public void reload(UUID playerUUID) { + super.reload(playerUUID); + + Hologram holo = DHAPI.getHologram(playerUUID.toString() + "-" + "country-board"); + if (holo == null | projectsData == null) return; + super.setClickListener((clickEvent) -> { + int nextViewPage = currentPage + 1; + if(nextViewPage == projectsData.size()) nextViewPage = 0; + holo.show(holo.getViewerPlayers().get(0), nextViewPage); + currentPage = nextViewPage; + Bukkit.getLogger().log(Level.INFO, "Recieved Country Board Pages Event " + clickEvent.getClick() + "\nChanging to pahe " + nextViewPage); + }); + } + + @Override + public ItemStack getItem() { + return new ItemStack(Material.NETHER_STAR); + } + + @Override + public String getTitle(UUID playerUUID) { + return "§b§lCOUNTRY BOARD §6§l"; + } + + @Override + public List> getContent(UUID var1) { + return null; + } + + @Override + public List>> getPagedHeader(UUID playerUUID) { + List>> header = new ArrayList<>(); + if(projectsData == null) super.getPagedHeader(playerUUID); + for (Builder.DatabaseEntry< + Builder.DatabaseEntry, + Builder.DatabaseEntry> cityProject + : projectsData + ) { + header.add(Arrays.asList( + new ItemLine(this.getItem()), + new TextLine(this.getTitle(playerUUID)), + new TextLine("----- " + cityProject.getKey().getValue() + " -----") + )); + } + + + return header; + } + + @Override + public List>> getPagedContent(UUID playerUUID) { + List>> content = new ArrayList<>(); + if(projectsData == null) super.getPagedHeader(playerUUID); + for (Builder.DatabaseEntry< + Builder.DatabaseEntry, + Builder.DatabaseEntry> cityProject + : projectsData + ) { + for (Builder.DatabaseEntry>> plots : plotEntries) + { + Bukkit.getLogger().log(Level.INFO, "Looking for " + cityProject.getValue().getKey() + " " + plots.getKey()); + ArrayList> lines = new ArrayList<>(); + + for (int i = 0; i < 10; i++) { + lines.add(new HologramRegister.CountryBoardPositionLine("§8#" + 0,null, null)); + } + + int index = 0; + if(cityProject.getValue().getKey().equals(plots.getKey())) + { + HashMap sortedEntries = new HashMap<>(); + + for(Builder.DatabaseEntry entry : plots.getValue()) { + sortedEntries.put(entry.getKey(), Status.valueOf(entry.getValue())); + Bukkit.getLogger().log(Level.INFO, "Found " + entry.getKey() + " " + entry.getValue()); + } + + for(Map.Entry plot : plotStatusSorter(sortedEntries)) { + String statusText = plot.getValue().toString(); + switch (plot.getValue()) { + case unclaimed: statusText = "&8" + statusText; + case unfinished: statusText = "&6" + statusText; + case unreviewed: statusText = "&3" + statusText; + case completed: statusText = "&a" + statusText; + } + lines.set(index, new HologramRegister.CountryBoardPositionLine("§e#" + plot.getKey(), + cityProject.getValue().getValue(), // city name + statusText)); // city status + index++; + } + } + content.add(lines); + } + + } + + + return content; + } + + private static ArrayList> plotStatusSorter(HashMap entries) { + // Create an ArrayList and insert all hashmap key-value pairs. + ArrayList> sortEntries = new ArrayList<>(entries.entrySet()); + + // Sort the Arraylist using a custom comparator. + sortEntries.sort(new Comparator>() { + @Override + public int compare(Map.Entry o1, Map.Entry o2) { + if (o1.getValue() == o2.getValue()) + return o1.getKey().compareTo(o2.getKey()); + + return Integer.compare(o1.getValue().ordinal(), o2.getValue().ordinal()); + } + }); + + return sortEntries; + + // Create a LinkedHashMap. + // Map sortedMap = new LinkedHashMap<>(); + + // Iterate over the ArrayList and insert the key-value pairs into LinkedHashMap. +// for (int i = 0; i hashmap){ +// for (Map.Entry entry : hashmap.entrySet()) { +// System.out.println("Key : " + entry.getKey() + " \t value : " + entry.getValue()); +// } +// } + } + + @Override + public List getPages() { + if (ConfigUtil.getInstance() == null) return new ArrayList<>(); + FileConfiguration config = PlotSystem.getPlugin().getConfig(); + return Arrays.stream(ScoreLeaderboard.LeaderboardTimeframe.values()) + .filter(p -> config.getBoolean(p.configPath)).map(ScoreLeaderboard.LeaderboardTimeframe::toString).collect(Collectors.toList()); + } + + @Override + public long getInterval() { + return PlotSystem.getPlugin().getConfig().getInt(ConfigPaths.DISPLAY_OPTIONS_INTERVAL) * 20L; + } + + @Override + public String getEnablePath() { + return ConfigPaths.COUNTRY_BOARD_ENABLE; + } + + @Override + public String getXPath() { + return ConfigPaths.COUNTRY_BOARD_X; + } + + @Override + public String getYPath() { + return ConfigPaths.COUNTRY_BOARD_Y; + } + + @Override + public String getZPath() { + return ConfigPaths.COUNTRY_BOARD_Z; + } + + @Override + public boolean hasViewPermission(UUID uuid) { + return true; + } + +} diff --git a/src/main/java/com/alpsbte/plotsystem/core/holograms/HologramManager.java b/src/main/java/com/alpsbte/plotsystem/core/holograms/HologramManager.java index bb3b9da1..319d488c 100644 --- a/src/main/java/com/alpsbte/plotsystem/core/holograms/HologramManager.java +++ b/src/main/java/com/alpsbte/plotsystem/core/holograms/HologramManager.java @@ -12,15 +12,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -import java.util.logging.Level; public abstract class HologramManager { public static List activeDisplays = new ArrayList<>(); public static void reload() { for (DecentHologramDisplay display : activeDisplays) { - Bukkit.getLogger().log(Level.INFO, "Enabling Hologram: " + PlotSystem.getPlugin().getConfig().getBoolean(((HologramConfiguration) display).getEnablePath())); - // Register and create holograms if (PlotSystem.getPlugin().getConfig().getBoolean(((HologramConfiguration) display).getEnablePath())) { display.setEnabled(true); @@ -52,7 +49,7 @@ public static void saveLocation(String id, HologramConfiguration configPaths, Lo config.set(configPaths.getZPath(), newLocation.getZ()); ConfigUtil.getInstance().saveFiles(); - LeaderboardManager.getActiveDisplays().stream().filter(leaderboard -> leaderboard.getId().equals(id)).findFirst() + HologramRegister.getActiveDisplays().stream().filter(leaderboard -> leaderboard.getId().equals(id)).findFirst() .ifPresent(holo -> holo.setLocation(newLocation)); } diff --git a/src/main/java/com/alpsbte/plotsystem/core/holograms/LeaderboardManager.java b/src/main/java/com/alpsbte/plotsystem/core/holograms/HologramRegister.java similarity index 68% rename from src/main/java/com/alpsbte/plotsystem/core/holograms/LeaderboardManager.java rename to src/main/java/com/alpsbte/plotsystem/core/holograms/HologramRegister.java index 880b3342..55120697 100644 --- a/src/main/java/com/alpsbte/plotsystem/core/holograms/LeaderboardManager.java +++ b/src/main/java/com/alpsbte/plotsystem/core/holograms/HologramRegister.java @@ -24,28 +24,17 @@ package com.alpsbte.plotsystem.core.holograms; -import com.alpsbte.plotsystem.PlotSystem; import com.alpsbte.plotsystem.core.holograms.connector.DecentHologramDisplay; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import java.util.Objects; -import java.util.logging.Level; +import java.sql.SQLException; -public final class LeaderboardManager extends HologramManager { +public final class HologramRegister extends HologramManager { public static void init() { - for (DecentHologramDisplay display : activeDisplays) { - Bukkit.getLogger().log(Level.INFO, "Enabling Hologram: " + PlotSystem.getPlugin().getConfig().getBoolean(((HologramConfiguration) display).getEnablePath())); - - // Register and create holograms - if (PlotSystem.getPlugin().getConfig().getBoolean(((HologramConfiguration) display).getEnablePath())) - for (Player player : Objects.requireNonNull(Bukkit.getWorld(display.getLocation().getWorld().getName())).getPlayers()) - display.create(player); - else display.removeAll(); - } activeDisplays.add(new ScoreLeaderboard()); activeDisplays.add(new PlotsLeaderboard()); + activeDisplays.add(new WelcomeMessage()); + activeDisplays.add(new CountryBoard()); } public static class LeaderboardPositionLine extends DecentHologramDisplay.TextLine { @@ -53,4 +42,10 @@ public LeaderboardPositionLine(int position, String username, int score) { super("§e#" + position + " " + (username != null ? "§a" + username : "§8No one, yet") + " §7- §b" + score); } } + + public static class CountryBoardPositionLine extends DecentHologramDisplay.TextLine { + public CountryBoardPositionLine(String id, String city, String status) { + super(id + " " + (city != null ? "§a" + city : "§8No plot left") + " §7- §b" + (status != null ? status : "§8Null")); + } + } } \ No newline at end of file diff --git a/src/main/java/com/alpsbte/plotsystem/core/holograms/MessagesManager.java b/src/main/java/com/alpsbte/plotsystem/core/holograms/MessagesManager.java deleted file mode 100644 index b979440a..00000000 --- a/src/main/java/com/alpsbte/plotsystem/core/holograms/MessagesManager.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.alpsbte.plotsystem.core.holograms; - -import com.alpsbte.plotsystem.core.holograms.connector.DecentHologramDisplay; -import eu.decentsoftware.holograms.api.DHAPI; -import eu.decentsoftware.holograms.api.holograms.Hologram; -import eu.decentsoftware.holograms.api.holograms.HologramLine; -import eu.decentsoftware.holograms.api.utils.entity.HologramEntity; -import org.bukkit.Bukkit; -import org.bukkit.entity.EntityType; - -import java.util.logging.Level; - -public class MessagesManager extends HologramManager { - public static void init() { - activeDisplays.add(new WelcomeMessage()); - } -} diff --git a/src/main/java/com/alpsbte/plotsystem/core/holograms/PlotsLeaderboard.java b/src/main/java/com/alpsbte/plotsystem/core/holograms/PlotsLeaderboard.java index e9ba26cc..7cc5e1df 100644 --- a/src/main/java/com/alpsbte/plotsystem/core/holograms/PlotsLeaderboard.java +++ b/src/main/java/com/alpsbte/plotsystem/core/holograms/PlotsLeaderboard.java @@ -62,7 +62,7 @@ public List> getContent(UUID playerUUID) { List> entries = Builder.getBuildersByCompletedBuilds(10); for(int i = 0; i < 10; i++ ) { Builder.DatabaseEntry entry = i < entries.size() && entries.get(i).getValue() != 0 ? entries.get(i) : null; - lines.add(new LeaderboardManager.LeaderboardPositionLine(i + 1, entry != null ? entry.getKey() : null, entry != null ? entry.getValue() : 0)); + lines.add(new HologramRegister.LeaderboardPositionLine(i + 1, entry != null ? entry.getKey() : null, entry != null ? entry.getValue() : 0)); } return lines; diff --git a/src/main/java/com/alpsbte/plotsystem/core/holograms/ScoreLeaderboard.java b/src/main/java/com/alpsbte/plotsystem/core/holograms/ScoreLeaderboard.java index c23f1455..de61ec03 100644 --- a/src/main/java/com/alpsbte/plotsystem/core/holograms/ScoreLeaderboard.java +++ b/src/main/java/com/alpsbte/plotsystem/core/holograms/ScoreLeaderboard.java @@ -250,7 +250,7 @@ public enum LeaderboardTimeframe { } } - private class LeaderboardPositionLineWithPayout extends LeaderboardManager.LeaderboardPositionLine { + private class LeaderboardPositionLineWithPayout extends HologramRegister.LeaderboardPositionLine { private final int position; public LeaderboardPositionLineWithPayout(int position, String username, int score) { diff --git a/src/main/java/com/alpsbte/plotsystem/core/holograms/WelcomeMessage.java b/src/main/java/com/alpsbte/plotsystem/core/holograms/WelcomeMessage.java index 7ff23631..d0ba9cfb 100644 --- a/src/main/java/com/alpsbte/plotsystem/core/holograms/WelcomeMessage.java +++ b/src/main/java/com/alpsbte/plotsystem/core/holograms/WelcomeMessage.java @@ -3,23 +3,18 @@ import com.alpsbte.alpslib.utils.AlpsUtils; import com.alpsbte.plotsystem.PlotSystem; import com.alpsbte.plotsystem.core.holograms.connector.DecentHologramDisplay; -import com.alpsbte.plotsystem.core.system.Builder; import com.alpsbte.plotsystem.utils.io.ConfigPaths; import com.alpsbte.plotsystem.utils.io.LangPaths; import com.alpsbte.plotsystem.utils.io.LangUtil; -import org.bukkit.Location; + import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import org.geysermc.geyser.api.GeyserApi; import org.geysermc.geyser.api.connection.GeyserConnection; -import org.jetbrains.annotations.NotNull; -import java.sql.SQLException; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.UUID; -import java.util.logging.Level; public class WelcomeMessage extends DecentHologramDisplay implements HologramConfiguration { public static String contentSeparator = "§7---------------"; @@ -43,12 +38,18 @@ public WelcomeMessage() { setLocation(HologramManager.getLocation(this)); } - @Override + @Override // Floating golden apple at the top public ItemStack getItem() { return new ItemStack(Material.ENCHANTED_GOLDEN_APPLE); } - @Override + @Override // ASEAN Build The Earth title + public String getTitle(UUID playerUUID) { + String title = LangUtil.getInstance().get(playerUUID, LangPaths.WelcomeMessage.WELCOME_TITLE); + return "<#ANIM:burn:<#fc3903>,<#fcba03>&l>" + title + ""; + } + + @Override // Welcome message to guide people public List> getContent(UUID playerUUID) { GeyserConnection connection = GeyserApi.api().connectionByUuid(playerUUID); String header = LangUtil.getInstance().get(playerUUID, LangPaths.WelcomeMessage.WELCOME_HEADER); @@ -64,12 +65,7 @@ public List> getContent(UUID playerUUID) { LangUtil.getInstance().get(playerUUID, LangPaths.WelcomeMessage.WELCOME_BEDROCK2)); } - @Override - public String getTitle(UUID playerUUID) { - String title = LangUtil.getInstance().get(playerUUID, LangPaths.WelcomeMessage.WELCOME_HEADER); - return "<#ANIM:burn:<#fc3903>,<#fcba03>&l>" + title + ""; - } - @Override + @Override // Line footer with cute axolotl buddy public List> getFooter(UUID playerUUID) { ArrayList> lines = new ArrayList<>(); lines.add(new TextLine(contentSeparator)); diff --git a/src/main/java/com/alpsbte/plotsystem/core/holograms/connector/DecentHologramDisplay.java b/src/main/java/com/alpsbte/plotsystem/core/holograms/connector/DecentHologramDisplay.java index ab1079bb..b4aa2bbd 100644 --- a/src/main/java/com/alpsbte/plotsystem/core/holograms/connector/DecentHologramDisplay.java +++ b/src/main/java/com/alpsbte/plotsystem/core/holograms/connector/DecentHologramDisplay.java @@ -112,7 +112,7 @@ public void reload(UUID playerUUID) { List> footer = getFooter(playerUUID); if (footer != null) dataLines.addAll(footer); - updateDataLines(holograms.get(playerUUID), 0, dataLines); + updateDataLines(holograms.get(playerUUID).getPage(0), 0, dataLines); } public void reloadAll() { @@ -166,77 +166,68 @@ public HashMap getHolograms() { return this.holograms; } - protected static void updateDataLines(Hologram hologram, int startIndex, List> dataLines) { + protected static void updateDataLines(HologramPage page, int startIndex, List> dataLines) { int index = startIndex; - Bukkit.getLogger().log(Level.INFO, "Updating dataline of: " + hologram + " with: " + dataLines); - Bukkit.getLogger().log(Level.INFO, "Looking for pages: " + hologram.getPage(0) + " of line: " + hologram.getPage(0).getLines()); + Bukkit.getLogger().log(Level.INFO, "Updating dataline of: " + page + " with: " + dataLines); + Bukkit.getLogger().log(Level.INFO, "Looking for pages: " + page + " of line: " + page.getLines()); - if (index == 0 && hologram.getPage(0).getLines().size() > dataLines.size()) { - int removeCount = hologram.getPage(0).getLines().size() - dataLines.size(); + if (index == 0 && page.getLines().size() > dataLines.size()) { + int removeCount = page.getLines().size() - dataLines.size(); for(int i = 0; i < removeCount; ++i) { - int lineIndex = hologram.getPage(0).getLines().size() - 1; + int lineIndex = page.getLines().size() - 1; if (lineIndex >= 0) { - hologram.getPage(0).getLines().remove(lineIndex); + page.getLines().remove(lineIndex); } } } for (DataLine data : dataLines) { - if (data instanceof TextLine) replaceLine(hologram, index, ((TextLine) data).getLine()); - else if (data instanceof ItemLine) replaceLine(hologram, index, ((ItemLine) data).getLine()); + if (data instanceof TextLine) replaceLine(page, index, ((TextLine) data).getLine()); + else if (data instanceof ItemLine) replaceLine(page, index, ((ItemLine) data).getLine()); index++; } } - protected static void replaceLine(Hologram hologram, int line, ItemStack item) { - Bukkit.getLogger().log(Level.INFO, "Replacing data item of: " + hologram.getPage(0).getLines().size() + " with: " + item); - - if(hologram.getPages().isNotEmpty() && hologram.getPages().size() > 1) - Bukkit.getLogger().log(Level.SEVERE, "Trying to replace text to invalid hologram of page: " + hologram.getPages()); - - HologramPage page = hologram.getPage(0); + protected static void replaceLine(HologramPage page, int line, ItemStack item) { + Bukkit.getLogger().log(Level.INFO, "Replacing data item of: " + page.getLines().size() + " with: " + item); if (page.getLines().size() < line + 1) { Bukkit.getLogger().log(Level.INFO, "Inserting item 1: " + line); - DHAPI.addHologramLine(hologram, item); + DHAPI.addHologramLine(page, item); } else { Bukkit.getLogger().log(Level.INFO, "Inserting item 2: " + item); HologramLine hologramLine = page.getLines().get(line); if (hologramLine != null) { - DHAPI.insertHologramLine(hologram, line, item); - DHAPI.removeHologramLine(hologram, line + 1); + DHAPI.insertHologramLine(page, line, item); + DHAPI.removeHologramLine(page, line + 1); } else { Bukkit.getLogger().log(Level.INFO, "Inserting item 3: " + line); - DHAPI.setHologramLine(hologram, line, item); + DHAPI.setHologramLine(page, line, item); } } } - protected static void replaceLine(Hologram hologram, int line, String text) { - Bukkit.getLogger().log(Level.INFO, "Replacing dataline of: " + hologram.getPage(0).getLines().size() + " with: " + text); - - if(hologram.getPages().isNotEmpty() && hologram.getPages().size() > 1) - Bukkit.getLogger().log(Level.SEVERE, "Trying to replace text to invalid hologram of page: " + hologram.getPages()); + protected static void replaceLine(HologramPage page, int line, String text) { + Bukkit.getLogger().log(Level.INFO, "Replacing dataline of: " + page.getLines().size() + " with: " + text); - HologramPage page = hologram.getPage(0); if (page.getLines().size() < line + 1) { Bukkit.getLogger().log(Level.INFO, "Inserting 1: " + line); - DHAPI.addHologramLine(hologram, text); + DHAPI.addHologramLine(page, text); } else { Bukkit.getLogger().log(Level.INFO, "Inserting 2: " + line); HologramLine hologramLine = page.getLines().get(line); if (hologramLine != null) { - DHAPI.insertHologramLine(hologram, line, text); - DHAPI.removeHologramLine(hologram, line + 1); + DHAPI.insertHologramLine(page, line, text); + DHAPI.removeHologramLine(page, line + 1); } else { Bukkit.getLogger().log(Level.INFO, "Inserting 3: " + line); - DHAPI.setHologramLine(hologram, line, text); + DHAPI.setHologramLine(page, line, text); } } diff --git a/src/main/java/com/alpsbte/plotsystem/core/holograms/connector/DecentHologramPagedDisplay.java b/src/main/java/com/alpsbte/plotsystem/core/holograms/connector/DecentHologramPagedDisplay.java index 29773181..323fce73 100644 --- a/src/main/java/com/alpsbte/plotsystem/core/holograms/connector/DecentHologramPagedDisplay.java +++ b/src/main/java/com/alpsbte/plotsystem/core/holograms/connector/DecentHologramPagedDisplay.java @@ -1,5 +1,9 @@ package com.alpsbte.plotsystem.core.holograms.connector; +import eu.decentsoftware.holograms.api.DHAPI; +import eu.decentsoftware.holograms.api.holograms.Hologram; +import eu.decentsoftware.holograms.api.holograms.HologramManager; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; @@ -7,14 +11,13 @@ import org.bukkit.scheduler.BukkitTask; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.UUID; +import java.util.*; +import java.util.logging.Level; public abstract class DecentHologramPagedDisplay extends DecentHologramDisplay { protected String sortByPage; public BukkitTask changePageTask = null; + private int pageCount = 1; private int changeState = 0; private long changeDelay = 0; private final Plugin plugin; @@ -26,28 +29,59 @@ public DecentHologramPagedDisplay(@NotNull String id, Location position, boolean this.plugin = plugin; } + public void setPageCount(int pageCount) { + this.pageCount = pageCount; + } + @Override public void create(Player player) { if (getPages() != null && getPages().size() > 0) sortByPage = getPages().get(0); - super.create(player); - // if (automaticallySkipPage) startChangePageTask(); + if(!super.isEnabled()) return; + if (this.hasViewPermission(player.getUniqueId())) { + if (this.holograms.containsKey(player.getUniqueId())) { + this.reload(player.getUniqueId()); + } else { + HologramManager hologramManager = decentHolograms.getHologramManager(); + hologramManager.updateVisibility(player); + + Hologram hologram = DHAPI.createHologram(player.getUniqueId() + "-" + super.getId(), super.getLocation()); + for(int i = 1; i <= pageCount; i++) hologram.addPage(); + + // Allow only player to see + hologram.setDefaultVisibleState(false); + hologram.setShowPlayer(player); + Bukkit.getLogger().log(Level.INFO, "Creating a hologram: " + hologram + " of hologram: " + hologramManager.getHologram(player.getUniqueId().toString())); + + this.holograms.put(player.getUniqueId(), hologram); + this.reload(player.getUniqueId()); + } + } } @Override public void reload(UUID playerUUID) { if (!holograms.containsKey(playerUUID)) return; - List> dataLines = new ArrayList<>(); - List> header = getHeader(playerUUID); - if (header != null) dataLines.addAll(header); + List>> header = getPagedHeader(playerUUID); + List>> content = getPagedContent(playerUUID); + List>> footer = getPagedFooter(playerUUID); + + for(int i = 0; i < pageCount; i++) { - List> content = getContent(playerUUID); - if (content != null) dataLines.addAll(content); + List> dataLines = new ArrayList<>(); - List> footer = getFooter(playerUUID); - if (footer != null) dataLines.addAll(footer); + if (header != null && header.size() > 1) dataLines.addAll(header.get(i)); + else if (header != null && header.size() == 1) dataLines.addAll(header.get(0)); + + if (content != null && content.size() > 1) dataLines.addAll(content.get(i)); + else if (content != null && content.size() == 1) dataLines.addAll(content.get(0)); + + if (footer != null && footer.size() > 1) dataLines.addAll(footer.get(i)); + else if (footer != null && footer.size() == 1) dataLines.addAll(footer.get(0)); + + updateDataLines(holograms.get(playerUUID).getPage(i), 0, dataLines); + } - updateDataLines(holograms.get(playerUUID), 0, dataLines); } private void startChangePageTask() { @@ -66,7 +100,7 @@ public void run() { else changePageTask.cancel(); } else { changeState++; - getHolograms().forEach((uuid, holo) -> updateDataLines(holo,holo.getPage(0).getLines().size() - 1, getFooter(uuid))); + // getHolograms().forEach((uuid, holo) -> updateDataLines(holo,holo.getPage(0).getLines().size() - 1, getFooter(uuid))); } } }.runTaskTimer(plugin, 0, changeDelay); @@ -97,6 +131,9 @@ public void remove(UUID playerUUID) { public abstract long getInterval(); public abstract List getPages(); + public List>> getPagedHeader(UUID playerUUID) { return new ArrayList<>(Collections.singletonList(getHeader(playerUUID))); } + public List>> getPagedContent(UUID playerUUID) { return new ArrayList<>(Collections.singletonList(getContent(playerUUID))); } + public List>> getPagedFooter(UUID playerUUID) { return new ArrayList<>(Collections.singletonList(getFooter(playerUUID))); } public void nextPage() { String next = getNextListItem(getPages(), sortByPage); diff --git a/src/main/java/com/alpsbte/plotsystem/core/system/Builder.java b/src/main/java/com/alpsbte/plotsystem/core/system/Builder.java index a1d275f0..f4b9ee82 100644 --- a/src/main/java/com/alpsbte/plotsystem/core/system/Builder.java +++ b/src/main/java/com/alpsbte/plotsystem/core/system/Builder.java @@ -28,7 +28,7 @@ import com.alpsbte.alpslib.utils.item.LegacyLoreBuilder; import com.alpsbte.plotsystem.PlotSystem; import com.alpsbte.plotsystem.core.database.DatabaseConnection; -import com.alpsbte.plotsystem.core.holograms.LeaderboardManager; +import com.alpsbte.plotsystem.core.holograms.HologramRegister; import com.alpsbte.plotsystem.core.holograms.PlotsLeaderboard; import com.alpsbte.plotsystem.core.holograms.ScoreLeaderboard; import com.alpsbte.plotsystem.core.holograms.connector.DecentHologramDisplay; @@ -187,7 +187,7 @@ public void addScore(int score) throws SQLException { .setValue(getScore() + score).setValue(getUUID().toString()) .executeUpdate(); - Bukkit.getScheduler().runTask(PlotSystem.getPlugin(), () -> LeaderboardManager.getActiveDisplays().stream() + Bukkit.getScheduler().runTask(PlotSystem.getPlugin(), () -> HologramRegister.getActiveDisplays().stream() .filter(leaderboard -> leaderboard instanceof ScoreLeaderboard).findFirst().ifPresent(DecentHologramDisplay::reloadAll)); } @@ -196,7 +196,7 @@ public void addCompletedBuild(int amount) throws SQLException { .setValue(getCompletedBuilds() + amount).setValue(getUUID().toString()) .executeUpdate(); - Bukkit.getScheduler().runTask(PlotSystem.getPlugin(), () -> LeaderboardManager.getActiveDisplays().stream() + Bukkit.getScheduler().runTask(PlotSystem.getPlugin(), () -> HologramRegister.getActiveDisplays().stream() .filter(leaderboard -> leaderboard instanceof PlotsLeaderboard).findFirst().ifPresent(DecentHologramDisplay::reloadAll)); } @@ -282,6 +282,72 @@ public static int getBuilderScore(UUID uuid, ScoreLeaderboard.LeaderboardTimefra } } + /** + * + * @return + * @throws SQLException + */ + public static ArrayList, DatabaseEntry>> getProjectsSorted() throws SQLException { + String query = "SELECT countries.id AS country_id, " + + "countries.name AS country_name, " + + "city_projects.id AS project_id, " + + "city_projects.name AS project_name " + + "FROM plotsystem_countries AS countries\n" + + "LEFT JOIN plotsystem_city_projects AS city_projects ON countries.id = city_projects.country_id\n" + + "ORDER BY country_id"; + + try(ResultSet rs = DatabaseConnection.createStatement(query).executeQuery()) { + ArrayList, DatabaseEntry>> result = new ArrayList<>(); + + while(rs.next()) { + result.add(new DatabaseEntry<>( + new DatabaseEntry<>(rs.getInt("country_id"), rs.getString("country_name")), + new DatabaseEntry<>(rs.getInt("project_id"), rs.getString("project_name")) + )); + } + + DatabaseConnection.closeResultSet(rs); + return result; + } + } + + public static ArrayList>>> getPlotsSorted() throws SQLException { + String query = "SELECT city_projects.id AS city_id, " + + "city_projects.name AS city_name, plots.status, plots.id " + + "FROM plotsystem_city_projects AS city_projects\n" + + "RIGHT JOIN plotsystem_plots AS plots " + + "ON city_projects.id = plots.city_project_id\n" + + "ORDER BY city_projects.id"; + + try(ResultSet rs = DatabaseConnection.createStatement(query).executeQuery()) { + ArrayList>>> result = new ArrayList<>(); + + int currentCursor = 0; + ArrayList> entries = new ArrayList<>(); + + while(rs.next()) { + int currentCity = rs.getInt("city_id"); + if(currentCity == currentCursor) { + entries.add(new DatabaseEntry<>(rs.getInt("id"), rs.getString("status"))); + if(rs.isLast()) result.add(new DatabaseEntry<>(currentCity, entries)); + } + else { + if(entries.isEmpty()) { + entries.add(new DatabaseEntry<>(rs.getInt("id"), rs.getString("status"))); + currentCursor++; + } + else { + result.add(new DatabaseEntry<>(currentCity, entries)); + entries.clear(); + } + } + } + + DatabaseConnection.closeResultSet(rs); + return result; + } + } + public static int getBuilderScorePosition(UUID uuid, ScoreLeaderboard.LeaderboardTimeframe sortBy) throws SQLException { String query = getBuildersByScoreQuery(sortBy, 0); diff --git a/src/main/java/com/alpsbte/plotsystem/utils/io/ConfigPaths.java b/src/main/java/com/alpsbte/plotsystem/utils/io/ConfigPaths.java index 7e5ea14e..74d217c7 100644 --- a/src/main/java/com/alpsbte/plotsystem/utils/io/ConfigPaths.java +++ b/src/main/java/com/alpsbte/plotsystem/utils/io/ConfigPaths.java @@ -54,6 +54,11 @@ public abstract class ConfigPaths { public static final String WELCOME_MESSAGE_X = HOLOGRAMS + WELCOME_MESSAGE + ".wm-x"; public static final String WELCOME_MESSAGE_Y = HOLOGRAMS + WELCOME_MESSAGE + ".wm-y"; public static final String WELCOME_MESSAGE_Z = HOLOGRAMS + WELCOME_MESSAGE + ".wm-z"; + public static final String COUNTRY_BOARD = "country-board"; + public static final String COUNTRY_BOARD_ENABLE = HOLOGRAMS + COUNTRY_BOARD + ".cb-enable"; + public static final String COUNTRY_BOARD_X = HOLOGRAMS + COUNTRY_BOARD + ".cb-x"; + public static final String COUNTRY_BOARD_Y = HOLOGRAMS + COUNTRY_BOARD + ".cb-y"; + public static final String COUNTRY_BOARD_Z = HOLOGRAMS + COUNTRY_BOARD + ".cb-z"; public static final String SCORE_LEADERBOARD = "score-leaderboard"; public static final String SCORE_LEADERBOARD_ENABLE = HOLOGRAMS + SCORE_LEADERBOARD + ".sl-enable"; public static final String SCORE_LEADERBOARD_X = HOLOGRAMS + SCORE_LEADERBOARD + ".sl-x"; diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 522b952b..e2de346a 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -52,22 +52,34 @@ database: holograms: # Displays Welcome message welcome-message: - wm-enable: false + wm-enable: true wm-x: 650 wm-y: 71 wm-z: 105 # Displays the top 10 builders with the highest score score-leaderboard: - sl-enable: false - sl-x: 657 + sl-enable: true + sl-x: 652 sl-y: 72 - sl-z: 107 + sl-z: 114 # Displays the top 10 players with the most completed plots plots-leaderboard: - pl-enable: false - pl-x: 646 + pl-enable: true + pl-x: 640 pl-y: 72 - pl-z: 99 + pl-z: 104 + # Displays the top 10 players with the most completed plots + country-board: + cb-enable: true + cb-x: 646 + cb-y: 72 + cb-z: 99 + # Displays the top 10 builders with the highest score + player-dashboard: + pd-enable: true + pd-x: 657 + pd-y: 72 + pd-z: 107 # Switch score-leaderboard between different time stamps # [interval] -> default: 15 seconds