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: