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