diff --git a/pom.xml b/pom.xml
index 56b5870..ff75340 100644
--- a/pom.xml
+++ b/pom.xml
@@ -115,6 +115,10 @@
btegermany
https://repo.dachstein.cloud/nexus/content/repositories/btegermany
+
+ jitpack
+ https://jitpack.io/
+
@@ -178,5 +182,11 @@
1.6
provided
+
+ com.github.decentsoftware-eu
+ decentholograms
+ 2.8.6
+ provided
+
diff --git a/src/main/java/dev/nachwahl/lobby/Lobby.java b/src/main/java/dev/nachwahl/lobby/Lobby.java
index 0e0957d..8baa20e 100644
--- a/src/main/java/dev/nachwahl/lobby/Lobby.java
+++ b/src/main/java/dev/nachwahl/lobby/Lobby.java
@@ -28,9 +28,9 @@
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.tag.standard.StandardTags;
import org.bukkit.Bukkit;
+import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
-import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.plugin.messaging.PluginMessageListener;
@@ -40,8 +40,6 @@
import java.util.HashMap;
import java.util.Optional;
import java.util.UUID;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
@Getter
public final class Lobby extends JavaPlugin implements PluginMessageListener {
@@ -65,6 +63,7 @@ public final class Lobby extends JavaPlugin implements PluginMessageListener {
private MiniGameBlockUtil miniGameBlockUtil;
private CinematicUtil cinematicUtil;
private LeaderboardManager leaderboardManager;
+ private BOTMScoreAPI botmScoreAPI;
private QuestManager questManager;
private PoolManager poolManager;
@@ -115,6 +114,7 @@ public void onEnable() {
this.hotbarItems = new HotbarItems(this);
this.locationAPI = new LocationAPI(this);
this.userSettingsAPI = new UserSettingsAPI(this);
+ this.botmScoreAPI = new BOTMScoreAPI(this);
this.realTime = new RealTime(this.getConfig().getString("time.timezone"), this.getConfig().getInt("time.updateInterval"), Bukkit.getWorld("world"));
this.vanish = new Vanish();
this.hologramAPI = new HologramAPI(this);
@@ -147,16 +147,27 @@ public void onEnable() {
throw new RuntimeException(e);
}
-
// Update scoreboards
getServer().getScheduler().runTaskTimer(this, () -> {
scoreboard.updateScoreboards();
}, 0, 100L);
+// try {
+// Location location = botmScoreAPI.getLocation();
+// if (location != null) {
+// BOTMCommand.create(location, this.getDatabase());
+// }
+// } catch (SQLException e) {
+// Bukkit.getLogger().warning("Es wurde keine Location für das BOTM Hologramm gefunden.");
+// throw new RuntimeException(e);
+// }
+// botmScoreAPI.clearLocation();
+
}
@Override
public void onDisable() {
+
Bukkit.getLogger().info("Das Lobby Plugin wurde deaktiviert.");
this.database.disconnect();
this.getServer().getMessenger().unregisterOutgoingPluginChannel(this);
@@ -197,6 +208,7 @@ public void registerCommand() {
this.manager.registerCommand(new SoonCommand());
this.manager.registerCommand(new VisitCommand());
this.manager.registerCommand(new CinematicCommand(cinematicUtil));
+ this.manager.registerCommand(new BOTMCommand(this));
}
diff --git a/src/main/java/dev/nachwahl/lobby/commands/BOTMCommand.java b/src/main/java/dev/nachwahl/lobby/commands/BOTMCommand.java
new file mode 100644
index 0000000..1e5be4c
--- /dev/null
+++ b/src/main/java/dev/nachwahl/lobby/commands/BOTMCommand.java
@@ -0,0 +1,120 @@
+package dev.nachwahl.lobby.commands;
+
+import co.aikar.commands.BaseCommand;
+import co.aikar.commands.annotation.*;
+import co.aikar.idb.Database;
+import co.aikar.idb.DbRow;
+import dev.nachwahl.lobby.Lobby;
+import dev.nachwahl.lobby.language.Language;
+import eu.decentsoftware.holograms.api.DHAPI;
+import org.bukkit.ChatColor;
+import org.bukkit.Location;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+
+import java.sql.SQLException;
+import java.util.*;
+
+@CommandAlias("botm")
+public class BOTMCommand extends BaseCommand {
+
+ @Dependency
+ private static Lobby lobby;
+
+ public BOTMCommand(Lobby lobby) {
+ this.lobby = lobby;
+ }
+
+ private static final int entries = 3;
+
+
+ @CommandPermission("bteg.lobby.botm")
+ @Subcommand("create")
+ public void onBOTMCreate(CommandSender sender) throws SQLException {
+ Player player = (Player) sender;
+
+ player.sendMessage(create(player.getLocation(), this.lobby.getDatabase(), this.lobby.getLanguageAPI().getLanguage(player)));
+ }
+
+ @CommandPermission("bteg.lobby.botm")
+ @Subcommand("move")
+ public void onBOTMMove(CommandSender sender) throws SQLException {
+ DHAPI.moveHologram("BOTM", ((Player)sender).getLocation());
+ this.lobby.getLocationAPI().setLocation(((Player) sender).getLocation(), "botm");
+ this.lobby.getLanguageAPI().sendMessageToPlayer((Player) sender, "botm.moved");
+ }
+
+ @CommandPermission("bteg.lobby.botm")
+ @Subcommand("remove")
+ public void onBOTMRemove(CommandSender sender) {
+ DHAPI.removeHologram("BOTM");
+ this.lobby.getLanguageAPI().sendMessageToPlayer((Player) sender, "botm.removed");
+ }
+
+ @CommandPermission("bteg.lobby.botm")
+ @Syntax("")
+ @Subcommand("add")
+ public void onBOTMAdd(CommandSender sender, String target) throws SQLException {
+
+ Player player = (Player) sender;
+
+ this.lobby.getBotmScoreAPI().addPoints(target);
+ update(player);
+
+ this.lobby.getLanguageAPI().sendMessageToPlayer(player, "botm.added");
+ }
+
+ public static String create(Location location, Database database, Language language) throws SQLException {
+
+ HashMap scores = new HashMap<>();
+ List dbRows = database.getResults("SELECT * FROM botm");
+
+ dbRows.forEach(row -> {
+ String name = row.getString("name");
+ int score = row.getInt("score");
+ scores.put(name, score);
+ });
+
+ // Create a hologram
+ if (scores.size() >= 3) {
+
+ ArrayList keys = new ArrayList<>(scores.keySet());
+
+ Map.Entry[] relevantEntries = new Map.Entry[entries];
+
+ for (int i = 0; i < entries; i++) {
+
+ TreeMap map = new TreeMap<>();
+
+ for (String key : keys) {
+ map.put(scores.get(key), key);
+ }
+ relevantEntries[i] = map.lastEntry();
+ keys.remove(relevantEntries[i].getValue());
+ }
+
+ List lines = new ArrayList<>();
+ lines.add(ChatColor.GOLD + "Build of the Month");
+ for (int i = 0; i < entries; i++) lines.add(ChatColor.GRAY + relevantEntries[i].getValue() + ": " + ChatColor.GREEN + relevantEntries[i].getKey());
+
+ DHAPI.createHologram("BOTM", location, lines);
+ lobby.getLocationAPI().setLocation(location, "botm");
+
+ return lobby.getLanguageAPI().getMessageString(language, "botm.create.success");
+ } else {
+ // Send feedback
+ return lobby.getLanguageAPI().getMessageString(language, "botm.create.failed");
+
+ }
+ }
+
+ public void update(Player player) throws SQLException {
+ if (DHAPI.getHologram("BOTM") != null) {
+ Location location = DHAPI.getHologram("BOTM").getLocation();
+
+ DHAPI.removeHologram("BOTM");
+ create(location, this.lobby.getDatabase(), this.lobby.getLanguageAPI().getLanguage(player));
+ }
+ }
+
+}
diff --git a/src/main/java/dev/nachwahl/lobby/events/PlayerEvents.java b/src/main/java/dev/nachwahl/lobby/events/PlayerEvents.java
index 12ef48c..f7a8d13 100644
--- a/src/main/java/dev/nachwahl/lobby/events/PlayerEvents.java
+++ b/src/main/java/dev/nachwahl/lobby/events/PlayerEvents.java
@@ -2,12 +2,17 @@
import co.aikar.idb.DbRow;
import dev.nachwahl.lobby.Lobby;
+import dev.nachwahl.lobby.commands.BOTMCommand;
import dev.nachwahl.lobby.guis.PrivacyGUI;
+import dev.nachwahl.lobby.language.Language;
import dev.nachwahl.lobby.utils.Actions;
import dev.triumphteam.gui.builder.item.ItemBuilder;
+import eu.decentsoftware.holograms.api.DHAPI;
import lombok.SneakyThrows;
import net.kyori.adventure.text.Component;
+import org.bukkit.Bukkit;
import org.bukkit.GameMode;
+import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.EntityType;
@@ -24,6 +29,8 @@
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.ItemStack;
+import java.sql.SQLException;
+
public class PlayerEvents implements Listener {
private Lobby lobby;
@@ -63,6 +70,18 @@ public void onJoin(PlayerJoinEvent event) {
this.lobby.getScoreboard().initScoreboard(player);
}
+ if (DHAPI.getHologram("BOTM") == null && this.lobby.getLocationAPI().getLocation("botm") != null) {
+ try {
+ Location location = this.lobby.getLocationAPI().getLocation("botm");
+ if (location != null) {
+ Bukkit.getLogger().info(BOTMCommand.create(location, this.lobby.getDatabase(), Language.GERMAN));
+ }
+ } catch (SQLException e) {
+ Bukkit.getLogger().warning("Es wurde keine Location für das BOTM Hologramm gefunden.");
+ throw new RuntimeException(e);
+ }
+ }
+
}
@EventHandler
diff --git a/src/main/java/dev/nachwahl/lobby/utils/BOTMScoreAPI.java b/src/main/java/dev/nachwahl/lobby/utils/BOTMScoreAPI.java
new file mode 100644
index 0000000..86890cc
--- /dev/null
+++ b/src/main/java/dev/nachwahl/lobby/utils/BOTMScoreAPI.java
@@ -0,0 +1,62 @@
+package dev.nachwahl.lobby.utils;
+
+import co.aikar.idb.DbRow;
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import dev.nachwahl.lobby.Lobby;
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+
+import java.sql.SQLException;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+
+public class BOTMScoreAPI {
+
+
+ private final Cache scoreCache = CacheBuilder.newBuilder()
+ .expireAfterWrite(5, TimeUnit.MINUTES)
+ .build();
+ private final Lobby lobby;
+
+ public BOTMScoreAPI(Lobby lobby) {
+ this.lobby = lobby;
+ }
+
+ public void setScore(String name, int score) throws SQLException {
+ scoreCache.put(name, score);
+
+ this.lobby.getDatabase().executeUpdate("INSERT INTO botm (name, score) VALUES (?, ?) ON DUPLICATE KEY UPDATE score = VALUES(score)", name, score);
+ }
+
+ public void getScore(String name, Consumer callback) throws SQLException {
+ Integer cache = scoreCache.getIfPresent(name);
+
+ if (cache == null) {
+ DbRow dbRow = this.lobby.getDatabase().getFirstRow("SELECT * FROM botm WHERE name = ?", name);
+ if (dbRow == null) {
+ callback.accept(0);
+ } else {
+ scoreCache.put(name, dbRow.get("score"));
+ callback.accept(dbRow.get("score"));
+ }
+ }else {
+ callback.accept(cache);
+ }
+ }
+
+ public void addPoints(String name) throws SQLException {
+ getScore(name, score -> {
+ try{
+ if (score == null) {
+ setScore(name, 1);
+ }else {
+ setScore(name, score + 1);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ });
+ }
+}
diff --git a/src/main/resources/lang_de_DE.properties b/src/main/resources/lang_de_DE.properties
index 0af69bb..f2fa46b 100644
--- a/src/main/resources/lang_de_DE.properties
+++ b/src/main/resources/lang_de_DE.properties
@@ -47,4 +47,10 @@ map.tpll.description=Nutze diesen Befehl um mithilfe von Koordinaten zu einem ex
map.tpll.message= Schaue dir das Tutorial hier an: youtube.com.
tutorials.title=✕ Tutorials ✕
-scoreboard.playtime=Spielzeit
\ No newline at end of file
+scoreboard.playtime=Spielzeit
+
+botm.added=[BOTM] Punkte wurden hinzugefügt.
+botm.removed=[BOTM] Hologramm wurde entfernt.
+botm.moved=[BOTM] Hologramm wurde verschoben.
+botm.create.success=[BOTM] Hologramm wurde erstellt.
+botm.create.failed=[BOTM] Hologramm konnte nicht erstellt werden. Sind genug Ergebnisse eingetragen?
\ No newline at end of file
diff --git a/src/main/resources/lang_en_EN.properties b/src/main/resources/lang_en_EN.properties
index 62c4ce2..ad27a6e 100644
--- a/src/main/resources/lang_en_EN.properties
+++ b/src/main/resources/lang_en_EN.properties
@@ -47,4 +47,10 @@ map.tpll.description=Use this command to get to an exact location using coordina
map.tpll.message= Check out the tutorial here: youtube.com.
tutorials.title=✕ Tutorials ✕
-scoreboard.playtime=Playtime
\ No newline at end of file
+scoreboard.playtime=Playtime
+
+botm.added=[BOTM] Points have been added.
+botm.removed=[BOTM] Hologram has been removed.
+botm.moved=[BOTM] Hologram has been moved.
+botm.create.success=[BOTM] Hologram has been created.
+botm.create.failed=[BOTM] Could not create hologram. Perhaps there are not enough entries.
\ No newline at end of file