diff --git a/pom.xml b/pom.xml index 04edf56..af2f6a6 100644 --- a/pom.xml +++ b/pom.xml @@ -69,6 +69,12 @@ 1.0.0-SNAPSHOT provided + + de.iani.cubeside + PlayerUUIDCache + 2.0.0-SNAPSHOT + provided + diff --git a/src/main/java/de/fanta/challenges/Challenges.java b/src/main/java/de/fanta/challenges/Challenges.java index c866c09..15829ab 100644 --- a/src/main/java/de/fanta/challenges/Challenges.java +++ b/src/main/java/de/fanta/challenges/Challenges.java @@ -18,6 +18,7 @@ import de.fanta.challenges.utils.Statistics; import de.fanta.challenges.utils.VanishUtils; import de.iani.cubesidestats.api.CubesideStatisticsAPI; +import de.iani.playerUUIDCache.PlayerUUIDCache; import de.speedy64.globalport.GlobalApi; import org.apache.commons.io.FileUtils; import org.bukkit.BanList; @@ -56,6 +57,7 @@ public FileConfiguration ServerConfig; public RandomDropsChallenge rndDrops; public NMSUtils nmsUtils; + public PlayerUUIDCache playerUUIDCache; public String texturepacklink = null; public int resetTaskId = -1; public boolean reset = false; @@ -107,6 +109,7 @@ LOGGER = getLogger(); plugin = this; nmsUtils = getServer().getServicesManager().load(NMSUtils.class); + playerUUIDCache = (PlayerUUIDCache) Bukkit.getPluginManager().getPlugin("PlayerUUIDCache"); try { cubesideStatistics = getServer().getServicesManager().load(CubesideStatisticsAPI.class); } catch (NoClassDefFoundError ex) { @@ -613,6 +616,10 @@ return statistics; } + public PlayerUUIDCache getPlayerUUIDCache() { + return playerUUIDCache; + } + public void addstatisticPlayers(UUID uuid) { statisticPlayers.add(uuid); } diff --git a/src/main/java/de/fanta/challenges/commands/CommandRegistration.java b/src/main/java/de/fanta/challenges/commands/CommandRegistration.java index f778939..fc4e228 100644 --- a/src/main/java/de/fanta/challenges/commands/CommandRegistration.java +++ b/src/main/java/de/fanta/challenges/commands/CommandRegistration.java @@ -11,6 +11,7 @@ import de.fanta.challenges.commands.challenges.ChallengesMemoryCommand; import de.fanta.challenges.commands.challenges.ChallengesPingCommand; import de.fanta.challenges.commands.challenges.ChallengesSaveCommand; +import de.fanta.challenges.commands.event.EventSaveScoresCommand; import de.fanta.challenges.commands.challenges.ChallengesSpeedCommand; import de.fanta.challenges.commands.challenges.ChallengesUnBanCommand; import de.fanta.challenges.commands.challenges.TeleportCommand; @@ -122,6 +123,8 @@ eventRouter.addCommandMapping(new CreateTeamsCommand(), "createteams"); eventRouter.addCommandMapping(new EventTeamsSetTeamSpawnCommand(), "setteamspawn"); eventRouter.addCommandMapping(new EventForceTeamCommand(), "forceteam"); + eventRouter.addCommandMapping(new EventSaveScoresCommand(plugin), "savescores"); + CommandRouter bingoRouter = new CommandRouter(plugin.getCommand("bingo")); bingoRouter.addCommandMapping(new BingoCommand(plugin)); diff --git a/src/main/java/de/fanta/challenges/commands/event/EventSaveScoresCommand.java b/src/main/java/de/fanta/challenges/commands/event/EventSaveScoresCommand.java new file mode 100644 index 0000000..c94f9d7 --- /dev/null +++ b/src/main/java/de/fanta/challenges/commands/event/EventSaveScoresCommand.java @@ -0,0 +1,61 @@ +package de.fanta.challenges.commands.event; + +import de.fanta.challenges.Challenges; +import de.fanta.challenges.scoreboard.Scorable; +import de.fanta.challenges.utils.ChatUtil; +import de.iani.cubesideutils.bukkit.commands.SubCommand; +import de.iani.cubesideutils.commands.ArgsParser; +import de.iani.playerUUIDCache.CachedPlayer; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; + +public class EventSaveScoresCommand extends SubCommand { + + private final Challenges plugin; + + public EventSaveScoresCommand(Challenges plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String alias, String commandString, ArgsParser args) { + if (sender.hasPermission("Challenges.editor.override")) { + if (args.hasNext()) { + boolean publishToPlayerStats = Boolean.parseBoolean(args.getNext()); + if (publishToPlayerStats) { + HashMap scoreList = plugin.getScoreManager().getTournamentScores(plugin.getScoreManager().getPositions()); + + for (Scorable scorable : scoreList.keySet()) { + int score = scoreList.get(scorable); + CachedPlayer cp = plugin.getPlayerUUIDCache().getPlayerFromNameOrUUID(scorable.getName()); + plugin.getStatistics().increaseChallengeWeekStats(cp.getUUID(), score); + } + } + + if (sender instanceof Player player) { + plugin.getScoreManager().saveScores(player); + } else { + plugin.getScoreManager().saveScores(null); + } + } else { + ChatUtil.sendErrorMessage(sender, "/challenge saveeventscores "); + } + + } else { + ChatUtil.sendErrorMessage(sender, "Keine Rechte!"); + } + return true; + } + + @Override + public Collection onTabComplete(CommandSender sender, Command command, String alias, ArgsParser args) { + String[] values = new String[]{"true", "false"}; + return new ArrayList<>(Arrays.asList(values)); + } +} diff --git a/src/main/java/de/fanta/challenges/commands/event/EventToggleCommand.java b/src/main/java/de/fanta/challenges/commands/event/EventToggleCommand.java index 8b3fa95..f68ff37 100644 --- a/src/main/java/de/fanta/challenges/commands/event/EventToggleCommand.java +++ b/src/main/java/de/fanta/challenges/commands/event/EventToggleCommand.java @@ -43,7 +43,6 @@ Bukkit.getPluginManager().callEvent(new EventStatusChangedEvent(false)); plugin.getTimer().stopTimer(); ChatUtil.sendTitleToAll("Event", "Event-Modus deaktiviert", ChatUtil.RED); - plugin.getScoreManager().saveScores(p); } else { ChatUtil.sendErrorMessage(p, "Aktuell läuft kein Event!"); return true; diff --git a/src/main/java/de/fanta/challenges/guis/eventgui/EventGui.java b/src/main/java/de/fanta/challenges/guis/eventgui/EventGui.java index aa50de9..54b8550 100644 --- a/src/main/java/de/fanta/challenges/guis/eventgui/EventGui.java +++ b/src/main/java/de/fanta/challenges/guis/eventgui/EventGui.java @@ -151,7 +151,6 @@ switch (slot) { case NULL_EVENT_INDEX -> { if (!Objects.equals(Config.getString("event.type"), "nix")) { - plugin.getScoreManager().saveScores(p); plugin.getScoreManager().resetScores(); Config.setValue("event.type", "nix"); ChatUtil.sendTitleToAll("Event", "Event beendet", ChatUtil.RED); diff --git a/src/main/java/de/fanta/challenges/guis/eventgui/EventSettingsGui.java b/src/main/java/de/fanta/challenges/guis/eventgui/EventSettingsGui.java index 1a9406a..3376393 100644 --- a/src/main/java/de/fanta/challenges/guis/eventgui/EventSettingsGui.java +++ b/src/main/java/de/fanta/challenges/guis/eventgui/EventSettingsGui.java @@ -17,6 +17,7 @@ public static final int INVENTORY_SIZE = 27; private static final int MINI_LWC_INDEX = 10; + private static final int TOURNAMENT_INDEX = 11; public EventSettingsGui(Player player) { super(player, Bukkit.createInventory(player, INVENTORY_SIZE, plugin.getGUIPREFIX() + " >> Event Settings")); @@ -46,6 +47,16 @@ } player.closeInventory(); } + case TOURNAMENT_INDEX -> { + if (Config.getBoolean("event.tournament")) { + Config.setValue("event.tournament", false); + ChatUtil.sendTitleToAll("Event", "Turnier Modus deaktiviert.", ChatUtil.RED, true); + } else { + Config.setValue("event.tournament", true); + ChatUtil.sendTitleToAll("Event", "Turnier Modus aktiviert.", ChatUtil.GREEN, true); + } + player.closeInventory(); + } default -> { } } @@ -63,6 +74,13 @@ item = GUIUtils.createGuiItem(Material.BARREL, ChatUtil.RED + "Mini LWC deaktiviert."); } } + case TOURNAMENT_INDEX -> { + if (Config.getBoolean("event.tournament")) { + item = GUIUtils.createGuiItem(Material.TARGET, ChatUtil.GREEN + "Turnier Modus aktiviert."); + } else { + item = GUIUtils.createGuiItem(Material.TARGET, ChatUtil.RED + "Turnier Modus deaktiviert."); + } + } default -> item = GUIUtils.EMPTY_ICON; } this.getInventory().setItem(i, item); diff --git a/src/main/java/de/fanta/challenges/scoreboard/ScoreManager.java b/src/main/java/de/fanta/challenges/scoreboard/ScoreManager.java index 88c9d01..7d811bf 100644 --- a/src/main/java/de/fanta/challenges/scoreboard/ScoreManager.java +++ b/src/main/java/de/fanta/challenges/scoreboard/ScoreManager.java @@ -8,6 +8,7 @@ import de.fanta.challenges.utils.ChatUtil; import de.fanta.challenges.utils.Config; import de.iani.cubesideutils.HastebinUtil; +import de.iani.cubesideutils.StringUtil; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.scoreboard.Team; @@ -201,20 +202,13 @@ public void saveScores(@Nullable Player player) { StringBuilder sb = new StringBuilder(); - String ownerName = plugin.hasEditor() ? plugin.getCurrentEditor().getName() : "Console"; + String ownerName = player != null ? player.getName() : "Console"; SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy - HH:mm:ss"); Date currentTime = new Date(); - sb.append("Challenges Event -> ").append(Config.getString("event.type")); - sb.append('\n'); - sb.append("=".repeat(20)); - sb.append('\n'); - sb.append("Editor: ").append(ownerName).append('\n'); - if (player != null) { - sb.append("Erstellt von: ").append(player.getName()).append('\n'); - } else { - sb.append("Erstellt von: Unbekannt").append('\n'); - } + sb.append("Challenges Event -> ").append(StringUtil.capitalizeFirstLetter(Config.getString("event.type"), false)).append('\n'); + sb.append("=".repeat(20)).append('\n'); + sb.append("Erstellt von: ").append(ownerName).append('\n'); sb.append("Erstellt am: ").append(formatter.format(currentTime)).append('\n'); sb.append("Timer: ").append(plugin.getTimer().formatTime()).append('\n'); if (Objects.equals(Config.getString("event.type"), "sammelfieber")) { @@ -226,10 +220,8 @@ sb.append("Cubes pro Spieler: ").append(SammelFieberSettingsGui.MONEY * SammelFieberChallengeEvent.getCount() / scores.size()).append('\n'); } } - sb.append("=".repeat(20)); - sb.append('\n'); - Map participants = getScores(); - sb.append("Teilnehmer (").append(participants.size()).append("):\n"); + sb.append("=".repeat(20)).append('\n'); + sb.append("Teilnehmer (").append(this.scores.size()).append("):\n"); if (this.scores.isEmpty()) { sb.append(" Das Event hatte keine Teilnehmer!\n"); @@ -245,23 +237,35 @@ } } } else { - for (ScoreData entry : positions) { - sb.append(entry.getPostition()).append(". ").append(entry.getScorable().getName()).append(" ").append(entry.getScore()).append("\n"); + if (Config.getBoolean("event.tournament")) { + HashMap tournamentScores = getTournamentScores(new ArrayList<>(positions)); + for (ScoreData entry : positions) { + sb.append(entry.getPostition()).append(". ").append(entry.getScorable().getName()).append(" ").append(entry.getScore()).append(" (").append(tournamentScores.get(entry.getScorable())).append(")").append("\n"); + } + } else { + for (ScoreData entry : positions) { + sb.append(entry.getPostition()).append(". ").append(entry.getScorable().getName()).append(" ").append(entry.getScore()).append("\n"); + } } } } HastebinUtil.paste(sb.toString(), new HastebinUtil.PasteCompletedListener() { @Override public void onSuccess(String url) { - ChatUtil.sendNormalMessage(player, "Event Log gepastet: " + url); + if (player != null) { + ChatUtil.sendNormalMessage(player, "Event Log gepastet: " + url); + } plugin.getLogger().log(Level.SEVERE, "Event Log gepastet: " + url); plugin.getScoreManager().resetScores(); } @Override public void onError(Exception e) { - ChatUtil.sendErrorMessage(player, "Paste konnte nicht erstellt werden"); + if (player != null) { + ChatUtil.sendErrorMessage(player, "Paste konnte nicht erstellt werden"); + } plugin.getLogger().log(Level.SEVERE, "Could not paste event log", e); + plugin.getLogger().log(Level.SEVERE, "Log Score String", sb.toString()); } }); } @@ -274,4 +278,28 @@ public Map getScores() { return scores; } + + public List getPositions() { + return positions; + } + + public HashMap getTournamentScores(List scoreData) { + HashMap tournamentScores = new HashMap<>(); + int length = scoreData.size(); + int threePoints = Math.round((length - 3) / 3.0f + 3); + int twoPoints = Math.round((length - 3) / 3.0f * 2 + 3); + for (int i = 0; i < length; i++) { + Scorable scorable = scoreData.get(i).getScorable(); + if (i < 3) { + tournamentScores.put(scorable, 6 - i); + } else if (i < threePoints) { + tournamentScores.put(scorable, 3); + } else if (i < twoPoints) { + tournamentScores.put(scorable, 2); + } else { + tournamentScores.put(scorable, 1); + } + } + return tournamentScores; + } } diff --git a/src/main/java/de/fanta/challenges/utils/Statistics.java b/src/main/java/de/fanta/challenges/utils/Statistics.java index 2138be1..c8f012b 100644 --- a/src/main/java/de/fanta/challenges/utils/Statistics.java +++ b/src/main/java/de/fanta/challenges/utils/Statistics.java @@ -24,6 +24,8 @@ private final StatisticKey speedRunsWonTeam; private final StatisticKey speedRunsTimeTeam; + private final StatisticKey challengeWeekStats; + public Statistics(Challenges plugin) { this.plugin = plugin; statistics = plugin.getCubesideStatistics(); @@ -65,6 +67,15 @@ speedRunsTimeTeam = statistics.getStatisticKey("challenge.speedruns.team.time"); speedRunsTimeTeam.setDisplayName("Beste Zeit (Team)"); speedRunsTimeTeam.setIsMonthlyStats(true); + + + challengeWeekStats = statistics.getStatisticKey("challenge.challengeweek"); + challengeWeekStats.setDisplayName("Beste Spieler Challenge Woche"); + challengeWeekStats.setIsMonthlyStats(false); + } + + public void increaseChallengeWeekStats(UUID uuid, int points) { + statistics.getStatistics(uuid).increaseScore(challengeWeekStats, points); } public void addSpeedRunWonSolo(UUID uuid, int time) { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 995cfe3..ab6a1cb 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -56,6 +56,7 @@ teams: false teamselect: false autoteams: false + tournament: false minilwc: false sammelfieber: item: AIR diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 83d9744..9c0d29c 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -3,7 +3,7 @@ version: ${project.version} author: ${project.author} api-version: 1.13 -depend: [CubesideUtils, VanishNoPacket, GlobalPort, CubesideNMSUtils] +depend: [CubesideUtils, VanishNoPacket, GlobalPort, CubesideNMSUtils, PlayerUUIDCache] softdepend: [CubesideStatistics] commands: hp: