commit d9c6d84ad360c52669e99c72858d228551b3a88b Author: FirephoenixX02 Date: Sat Dec 6 19:25:23 2025 +0100 Initial version diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4788b4b --- /dev/null +++ b/.gitignore @@ -0,0 +1,113 @@ +# User-specific stuff +.idea/ + +*.iml +*.ipr +*.iws + +# IntelliJ +out/ + +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +target/ + +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next + +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +.mvn/wrapper/maven-wrapper.jar +.flattened-pom.xml + +# Common working directory +run/ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..fc99061 --- /dev/null +++ b/pom.xml @@ -0,0 +1,84 @@ + + + 4.0.0 + + me.firephoenix + deathcounter + 1.0-SNAPSHOT + jar + + deathcounter + + + 21 + UTF-8 + + + + clean package + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-shade-plugin + 3.5.3 + + + package + + shade + + + + + + + + src/main/resources + true + + + + + + + papermc-repo + https://repo.papermc.io/repository/maven-public/ + + + placeholderapi + https://repo.extendedclip.com/releases/ + + + + + + io.papermc.paper + paper-api + 1.21.10-R0.1-SNAPSHOT + provided + + + + org.xerial + sqlite-jdbc + 3.51.1.0 + + + me.clip + placeholderapi + 2.11.7 + provided + + + diff --git a/src/main/java/me/firephoenix/deathcounter/DeathCounter.java b/src/main/java/me/firephoenix/deathcounter/DeathCounter.java new file mode 100644 index 0000000..04b9f57 --- /dev/null +++ b/src/main/java/me/firephoenix/deathcounter/DeathCounter.java @@ -0,0 +1,89 @@ +package me.firephoenix.deathcounter; + +import me.clip.placeholderapi.PlaceholderAPI; +import me.firephoenix.deathcounter.listener.DeathListener; +import org.bukkit.Bukkit; +import org.bukkit.plugin.java.JavaPlugin; + +import java.sql.*; +import java.util.HashMap; +import java.util.UUID; +import java.util.logging.Level; + +public final class DeathCounter extends JavaPlugin { + public String dataBaseURL; + public HashMap playerDeaths = new HashMap<>(); + + public HashMap getPlayerDeaths() { + return playerDeaths; + } + + public String getDataBaseURL() { + return dataBaseURL; + } + + @Override + public void onEnable() { + // Plugin startup logic + this.saveDefaultConfig(); + + Bukkit.getServer().getPluginManager().registerEvents(new DeathListener(this), this); + + dataBaseURL = "jdbc:sqlite:" + this.getDataPath() + "/deaths.db"; + + createSqLiteDatabase(); + + if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { // + new DeathPlaceholderExpansion(this).register(); // + } + } + + private void createSqLiteDatabase() { + try (var conn = DriverManager.getConnection(dataBaseURL)) { + if (conn != null) { + String sql = "CREATE TABLE IF NOT EXISTS deaths_counts (" + + " id BIGINT auto_increment," + + " uuid VARCHAR(36) NOT NULL UNIQUE," + + " deaths BIGINT NOT NULL," + + " primary key (id));"; + + Statement statement = conn.createStatement(); + statement.execute(sql); + } + } catch (SQLException e) { + Bukkit.getLogger().log(Level.WARNING, e.getMessage()); + } + } + + public int requestDeathCountForPlayer(UUID uuid) { + //Search our cache first + if (getPlayerDeaths().containsKey(uuid)) { + return getPlayerDeaths().get(uuid); + } else { + int deaths = 0; + try (var conn = DriverManager.getConnection(this.getDataBaseURL())) { + if (conn != null) { + String getSQL = "SELECT deaths FROM deaths_counts WHERE uuid = " + "'" + uuid + "'" + ";"; + + Statement statement = conn.createStatement(); + ResultSet resultSet = statement.executeQuery(getSQL); + + if (resultSet.next()) { + deaths = resultSet.getInt(1); + } + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + + getPlayerDeaths().put(uuid, deaths); + + return deaths; + } + } + + @Override + public void onDisable() { + // Plugin shutdown logic + } +} diff --git a/src/main/java/me/firephoenix/deathcounter/DeathPlaceholderExpansion.java b/src/main/java/me/firephoenix/deathcounter/DeathPlaceholderExpansion.java new file mode 100644 index 0000000..4b7c806 --- /dev/null +++ b/src/main/java/me/firephoenix/deathcounter/DeathPlaceholderExpansion.java @@ -0,0 +1,59 @@ +package me.firephoenix.deathcounter; + +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author NieGestorben + * Copyright© (c) 2025, All Rights Reserved. + */ +public class DeathPlaceholderExpansion extends PlaceholderExpansion { + + DeathCounter plugin; + + public DeathPlaceholderExpansion(DeathCounter plugin) { + this.plugin = plugin; + } + + @Override + public @NotNull List getPlaceholders() { + ArrayList placeholders = new ArrayList<>(); + placeholders.add("%deathcount%"); + + return placeholders; + } + + @Override + public String onRequest(OfflinePlayer player, @NotNull String params) { + int deaths = plugin.requestDeathCountForPlayer(player.getUniqueId()); + + return String.valueOf(deaths); + } + + @Override + public String onPlaceholderRequest(Player player, @NotNull String params) { + int deaths = plugin.requestDeathCountForPlayer(player.getUniqueId()); + + return String.valueOf(deaths); + } + + @Override + public @NotNull String getIdentifier() { + return "deathcounter"; + } + + @Override + public @NotNull String getAuthor() { + return "NieGestorben"; + } + + @Override + public @NotNull String getVersion() { + return "1.0.0"; + } +} diff --git a/src/main/java/me/firephoenix/deathcounter/listener/DeathListener.java b/src/main/java/me/firephoenix/deathcounter/listener/DeathListener.java new file mode 100644 index 0000000..44ca80f --- /dev/null +++ b/src/main/java/me/firephoenix/deathcounter/listener/DeathListener.java @@ -0,0 +1,48 @@ +package me.firephoenix.deathcounter.listener; + +import me.firephoenix.deathcounter.DeathCounter; +import org.bukkit.Bukkit; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; + +import java.sql.*; +import java.util.UUID; +import java.util.logging.Level; + +/** + * @author NieGestorben + * Copyright© (c) 2025, All Rights Reserved. + */ +public class DeathListener implements Listener { + + public DeathCounter plugin; + + public DeathListener(DeathCounter plugin) { + this.plugin = plugin; + } + + @EventHandler + public void onPlayerDeath(PlayerDeathEvent event) { + UUID playerUUID = event.getPlayer().getUniqueId(); + + try (var conn = DriverManager.getConnection(plugin.getDataBaseURL())) { + if (conn != null) { + int deaths = plugin.requestDeathCountForPlayer(playerUUID); + + deaths++; + + //Updated cache + plugin.getPlayerDeaths().replace(playerUUID, deaths); + + String updateSQL = "REPLACE INTO deaths_counts (uuid, deaths) VALUES ('" + playerUUID + "', " + deaths + ");"; + + Statement updateStatement = conn.createStatement(); + updateStatement.execute(updateSQL); + } + } catch (SQLException e) { + Bukkit.getLogger().log(Level.WARNING, e.getMessage()); + } + } + +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..2284de0 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,6 @@ +name: DeathCounter +version: '1.0' +main: me.firephoenix.deathcounter.DeathCounter +api-version: '1.21' +description: Counts Deaths of all players via Scoreboard and Tablist +depend: ["PlaceholderAPI"] \ No newline at end of file