src/main/java/PlayerStatusSign.java aktualisiert
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
import org.bstats.bukkit.Metrics; // bStats import
|
import org.bstats.bukkit.Metrics;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.GameMode;
|
import org.bukkit.GameMode;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
@@ -16,7 +17,10 @@ import org.bukkit.event.Listener;
|
|||||||
import org.bukkit.event.block.Action;
|
import org.bukkit.event.block.Action;
|
||||||
import org.bukkit.event.block.BlockBreakEvent;
|
import org.bukkit.event.block.BlockBreakEvent;
|
||||||
import org.bukkit.event.block.SignChangeEvent;
|
import org.bukkit.event.block.SignChangeEvent;
|
||||||
|
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||||
|
import org.bukkit.event.inventory.InventoryDragEvent;
|
||||||
import org.bukkit.event.player.PlayerInteractEvent;
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
import org.bukkit.event.player.PlayerMoveEvent;
|
import org.bukkit.event.player.PlayerMoveEvent;
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
import org.bukkit.inventory.Inventory;
|
import org.bukkit.inventory.Inventory;
|
||||||
@@ -27,8 +31,12 @@ import org.bukkit.scheduler.BukkitRunnable;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.net.URL;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.Scanner;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public class PlayerStatusSign extends JavaPlugin implements Listener {
|
public class PlayerStatusSign extends JavaPlugin implements Listener {
|
||||||
|
|
||||||
@@ -61,6 +69,10 @@ public class PlayerStatusSign extends JavaPlugin implements Listener {
|
|||||||
private static final int BSTATS_PLUGIN_ID = 26877; // <-- bStats Service-ID hier eintragen!
|
private static final int BSTATS_PLUGIN_ID = 26877; // <-- bStats Service-ID hier eintragen!
|
||||||
private Metrics metrics;
|
private Metrics metrics;
|
||||||
|
|
||||||
|
// Neue Variablen zum Speichern des Update-Status
|
||||||
|
private boolean updateAvailable = false;
|
||||||
|
private String latestVersion = null;
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
// Lifecycle
|
// Lifecycle
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
@@ -84,6 +96,30 @@ public class PlayerStatusSign extends JavaPlugin implements Listener {
|
|||||||
metrics = new Metrics(this, BSTATS_PLUGIN_ID);
|
metrics = new Metrics(this, BSTATS_PLUGIN_ID);
|
||||||
getLogger().info("bStats wurde gestartet (Plugin-ID: " + BSTATS_PLUGIN_ID + ")");
|
getLogger().info("bStats wurde gestartet (Plugin-ID: " + BSTATS_PLUGIN_ID + ")");
|
||||||
|
|
||||||
|
// ---- Spigot Update Checker ----
|
||||||
|
int resourceId = 127335; // Ersetze dies mit der ID deiner Plugin-Ressource auf SpigotMC
|
||||||
|
new UpdateChecker(this, resourceId).getVersion(version -> {
|
||||||
|
if (this.getDescription().getVersion().equals(version)) {
|
||||||
|
getLogger().info("Das Plugin ist auf dem neuesten Stand.");
|
||||||
|
updateAvailable = false;
|
||||||
|
latestVersion = null;
|
||||||
|
} else {
|
||||||
|
getLogger().info("Eine neue Plugin-Version ist verfügbar: " + version);
|
||||||
|
updateAvailable = true;
|
||||||
|
latestVersion = version;
|
||||||
|
|
||||||
|
// Sofort Nachricht an alle Operatoren oder “statussign.admin”-Permission
|
||||||
|
Bukkit.getScheduler().runTask(this, () -> {
|
||||||
|
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||||
|
if (player.isOp() || player.hasPermission("statussign.admin")) {
|
||||||
|
player.sendMessage(ChatColor.GREEN + "Es ist eine neue Version von PlayerStatusSign verfügbar: " + ChatColor.GOLD + version);
|
||||||
|
player.sendMessage(ChatColor.GREEN + "Lade sie auf SpigotMC herunter!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Konsolenmeldung beim Plugin-Start
|
// Konsolenmeldung beim Plugin-Start
|
||||||
getLogger().info("[>] ========================================== [<]");
|
getLogger().info("[>] ========================================== [<]");
|
||||||
getLogger().info(" PlayerStatusSign - " + getDescription().getVersion() + " (cfg " + CONFIG_VERSION + ")");
|
getLogger().info(" PlayerStatusSign - " + getDescription().getVersion() + " (cfg " + CONFIG_VERSION + ")");
|
||||||
@@ -116,6 +152,47 @@ public class PlayerStatusSign extends JavaPlugin implements Listener {
|
|||||||
savePlayers();
|
savePlayers();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Spieler-Join Event für Ingame Update-Nachricht
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
if (updateAvailable && (player.isOp() || player.hasPermission("statussign.admin"))) {
|
||||||
|
player.sendMessage(ChatColor.GREEN + "Es ist eine neue Version von PlayerStatusSign verfügbar: " + ChatColor.GOLD + latestVersion);
|
||||||
|
player.sendMessage(ChatColor.GREEN + "Lade sie auf SpigotMC herunter!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ... (restliche Methoden wie loadConfig, EventHandler etc. hier weiterhin einfügen) ...
|
||||||
|
|
||||||
|
// ------------------------------------------------------------
|
||||||
|
// UpdateChecker Klasse (innerhalb derselben Datei oder als separate Datei)
|
||||||
|
// ------------------------------------------------------------
|
||||||
|
public static class UpdateChecker {
|
||||||
|
|
||||||
|
private final JavaPlugin plugin;
|
||||||
|
private final int resourceId;
|
||||||
|
|
||||||
|
public UpdateChecker(JavaPlugin plugin, int resourceId) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
this.resourceId = resourceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void getVersion(final Consumer<String> consumer) {
|
||||||
|
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
|
||||||
|
try (InputStream is = new URL("https://api.spigotmc.org/legacy/update.php?resource=" + resourceId).openStream();
|
||||||
|
Scanner scanner = new Scanner(is)) {
|
||||||
|
if (scanner.hasNext()) {
|
||||||
|
consumer.accept(scanner.next());
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
plugin.getLogger().warning("Unable to check for updates: " + e.getMessage());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
// Config / Storage
|
// Config / Storage
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
@@ -420,12 +497,12 @@ public class PlayerStatusSign extends JavaPlugin implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
// GUI
|
// GUI
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
private void openStatsGUI(Player viewer, String targetPlayerName) {
|
private void openStatsGUI(Player viewer, String targetPlayerName) {
|
||||||
try {
|
try {
|
||||||
Player target = getServer().getPlayerExact(targetPlayerName);
|
Player target = getServer().getPlayerExact(targetPlayerName);
|
||||||
Inventory gui = getServer().createInventory(null, 9, ChatColor.translateAlternateColorCodes('&', "&6Statistiken von " + targetPlayerName));
|
Inventory gui = getServer().createInventory(null, 9, ChatColor.translateAlternateColorCodes('&', "&3Statistiken von " + targetPlayerName));
|
||||||
|
|
||||||
long playTimeTicks = 0;
|
long playTimeTicks = 0;
|
||||||
int deaths = 0;
|
int deaths = 0;
|
||||||
@@ -453,9 +530,10 @@ public class PlayerStatusSign extends JavaPlugin implements Listener {
|
|||||||
distanceWalkedCm = playersConfig.getDouble("players." + targetPlayerName + ".stats.distance-walked", 0);
|
distanceWalkedCm = playersConfig.getDouble("players." + targetPlayerName + ".stats.distance-walked", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
double playTimeHours = playTimeTicks / 72000.0; // 20 Ticks * 3600 Sekunden
|
double playTimeHours = playTimeTicks / 72000.0;
|
||||||
double distanceWalkedKm = distanceWalkedCm / 100000.0;
|
double distanceWalkedKm = distanceWalkedCm / 100000.0;
|
||||||
|
|
||||||
|
// Spielzeit
|
||||||
ItemStack playTimeItem = new ItemStack(Material.CLOCK);
|
ItemStack playTimeItem = new ItemStack(Material.CLOCK);
|
||||||
ItemMeta playTimeMeta = playTimeItem.getItemMeta();
|
ItemMeta playTimeMeta = playTimeItem.getItemMeta();
|
||||||
if (playTimeMeta != null) {
|
if (playTimeMeta != null) {
|
||||||
@@ -465,6 +543,7 @@ public class PlayerStatusSign extends JavaPlugin implements Listener {
|
|||||||
}
|
}
|
||||||
gui.setItem(0, playTimeItem);
|
gui.setItem(0, playTimeItem);
|
||||||
|
|
||||||
|
// Tode
|
||||||
ItemStack deathsItem = new ItemStack(Material.SKELETON_SKULL);
|
ItemStack deathsItem = new ItemStack(Material.SKELETON_SKULL);
|
||||||
ItemMeta deathsMeta = deathsItem.getItemMeta();
|
ItemMeta deathsMeta = deathsItem.getItemMeta();
|
||||||
if (deathsMeta != null) {
|
if (deathsMeta != null) {
|
||||||
@@ -474,6 +553,7 @@ public class PlayerStatusSign extends JavaPlugin implements Listener {
|
|||||||
}
|
}
|
||||||
gui.setItem(1, deathsItem);
|
gui.setItem(1, deathsItem);
|
||||||
|
|
||||||
|
// Kills
|
||||||
ItemStack killsItem = new ItemStack(Material.DIAMOND_SWORD);
|
ItemStack killsItem = new ItemStack(Material.DIAMOND_SWORD);
|
||||||
ItemMeta killsMeta = killsItem.getItemMeta();
|
ItemMeta killsMeta = killsItem.getItemMeta();
|
||||||
if (killsMeta != null) {
|
if (killsMeta != null) {
|
||||||
@@ -483,6 +563,7 @@ public class PlayerStatusSign extends JavaPlugin implements Listener {
|
|||||||
}
|
}
|
||||||
gui.setItem(2, killsItem);
|
gui.setItem(2, killsItem);
|
||||||
|
|
||||||
|
// Abgebaute Blöcke
|
||||||
ItemStack blocksMinedItem = new ItemStack(Material.IRON_PICKAXE);
|
ItemStack blocksMinedItem = new ItemStack(Material.IRON_PICKAXE);
|
||||||
ItemMeta blocksMinedMeta = blocksMinedItem.getItemMeta();
|
ItemMeta blocksMinedMeta = blocksMinedItem.getItemMeta();
|
||||||
if (blocksMinedMeta != null) {
|
if (blocksMinedMeta != null) {
|
||||||
@@ -492,6 +573,7 @@ public class PlayerStatusSign extends JavaPlugin implements Listener {
|
|||||||
}
|
}
|
||||||
gui.setItem(3, blocksMinedItem);
|
gui.setItem(3, blocksMinedItem);
|
||||||
|
|
||||||
|
// Gelaufene Distanz
|
||||||
ItemStack distanceItem = new ItemStack(Material.COMPASS);
|
ItemStack distanceItem = new ItemStack(Material.COMPASS);
|
||||||
ItemMeta distanceMeta = distanceItem.getItemMeta();
|
ItemMeta distanceMeta = distanceItem.getItemMeta();
|
||||||
if (distanceMeta != null) {
|
if (distanceMeta != null) {
|
||||||
@@ -501,12 +583,94 @@ public class PlayerStatusSign extends JavaPlugin implements Listener {
|
|||||||
}
|
}
|
||||||
gui.setItem(4, distanceItem);
|
gui.setItem(4, distanceItem);
|
||||||
|
|
||||||
|
// NEU 5: Geflogene Distanz
|
||||||
|
double flewDistanceCm = (target != null && target.isOnline()) ?
|
||||||
|
target.getStatistic(Statistic.FLY_ONE_CM) :
|
||||||
|
playersConfig.getDouble("players." + targetPlayerName + ".stats.flew-distance", 0);
|
||||||
|
double flewDistanceKm = flewDistanceCm / 100000.0;
|
||||||
|
ItemStack flewDistanceItem = new ItemStack(Material.ELYTRA);
|
||||||
|
ItemMeta flewMeta = flewDistanceItem.getItemMeta();
|
||||||
|
if (flewMeta != null) {
|
||||||
|
flewMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&9Geflogene Distanz"));
|
||||||
|
flewMeta.setLore(Collections.singletonList(ChatColor.translateAlternateColorCodes('&', String.format("&7%.2f km", flewDistanceKm))));
|
||||||
|
flewDistanceItem.setItemMeta(flewMeta);
|
||||||
|
}
|
||||||
|
gui.setItem(5, flewDistanceItem);
|
||||||
|
|
||||||
|
// NEU 6: Crafting
|
||||||
|
int craftedCount = 0;
|
||||||
|
if (target != null && target.isOnline()) {
|
||||||
|
for (Material m : Material.values()) {
|
||||||
|
if (m.isItem()) {
|
||||||
|
try { craftedCount += target.getStatistic(Statistic.CRAFT_ITEM, m); } catch (Exception ignored) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
craftedCount = playersConfig.getInt("players." + targetPlayerName + ".stats.crafted-items", 0);
|
||||||
|
}
|
||||||
|
ItemStack craftedItem = new ItemStack(Material.CRAFTING_TABLE);
|
||||||
|
ItemMeta craftedMeta = craftedItem.getItemMeta();
|
||||||
|
if (craftedMeta != null) {
|
||||||
|
craftedMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&eItems hergestellt"));
|
||||||
|
craftedMeta.setLore(Collections.singletonList(ChatColor.translateAlternateColorCodes('&', "&7" + craftedCount)));
|
||||||
|
craftedItem.setItemMeta(craftedMeta);
|
||||||
|
}
|
||||||
|
gui.setItem(6, craftedItem);
|
||||||
|
|
||||||
|
// NEU 7: Blöcke gesetzt
|
||||||
|
int blocksPlaced = 0;
|
||||||
|
if (target != null && target.isOnline()) {
|
||||||
|
for (Material m : Material.values()) {
|
||||||
|
if (m.isBlock()) {
|
||||||
|
try { blocksPlaced += target.getStatistic(Statistic.USE_ITEM, m); } catch (Exception ignored) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
blocksPlaced = playersConfig.getInt("players." + targetPlayerName + ".stats.blocks-placed", 0);
|
||||||
|
}
|
||||||
|
ItemStack placedItem = new ItemStack(Material.OAK_PLANKS);
|
||||||
|
ItemMeta placedMeta = placedItem.getItemMeta();
|
||||||
|
if (placedMeta != null) {
|
||||||
|
placedMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&aGesetzte Blöcke"));
|
||||||
|
placedMeta.setLore(Collections.singletonList(ChatColor.translateAlternateColorCodes('&', "&7" + blocksPlaced)));
|
||||||
|
placedItem.setItemMeta(placedMeta);
|
||||||
|
}
|
||||||
|
gui.setItem(7, placedItem);
|
||||||
|
|
||||||
|
// NEU 8: Zeit seit letztem Tod
|
||||||
|
long lastDeathMs;
|
||||||
|
if (target != null && target.isOnline()) {
|
||||||
|
lastDeathMs = System.currentTimeMillis() - (target.getStatistic(Statistic.TIME_SINCE_DEATH) * 50L);
|
||||||
|
} else {
|
||||||
|
long recordedTime = playersConfig.getLong("players." + targetPlayerName + ".stats.last-death-time", System.currentTimeMillis());
|
||||||
|
lastDeathMs = System.currentTimeMillis() - recordedTime;
|
||||||
|
}
|
||||||
|
// Zeit seit letztem Tod in Stunden
|
||||||
|
if (target != null && target.isOnline()) {
|
||||||
|
lastDeathMs = System.currentTimeMillis() - (target.getStatistic(Statistic.TIME_SINCE_DEATH) * 50L);
|
||||||
|
} else {
|
||||||
|
long recordedTime = playersConfig.getLong("players." + targetPlayerName + ".stats.last-death-time", System.currentTimeMillis());
|
||||||
|
lastDeathMs = System.currentTimeMillis() - recordedTime;
|
||||||
|
}
|
||||||
|
double hoursSinceDeath = lastDeathMs / 3600000.0; // Millisekunden → Stunden
|
||||||
|
ItemStack deathItem = new ItemStack(Material.CLOCK);
|
||||||
|
ItemMeta deathMeta = deathItem.getItemMeta();
|
||||||
|
if (deathMeta != null) {
|
||||||
|
deathMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&6Zeit seit letztem Tod"));
|
||||||
|
deathMeta.setLore(Collections.singletonList(ChatColor.translateAlternateColorCodes('&',
|
||||||
|
String.format("&7%.2f Stunden", hoursSinceDeath))));
|
||||||
|
deathItem.setItemMeta(deathMeta);
|
||||||
|
}
|
||||||
|
gui.setItem(8, deathItem);
|
||||||
|
|
||||||
|
|
||||||
viewer.openInventory(gui);
|
viewer.openInventory(gui);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
getLogger().warning("Fehler beim Öffnen der Statistik-GUI für " + targetPlayerName + ": " + e.getMessage());
|
getLogger().warning("Fehler beim Öffnen der Statistik-GUI für " + targetPlayerName + ": " + e.getMessage());
|
||||||
viewer.sendMessage(getMessage("gui-error"));
|
viewer.sendMessage(getMessage("gui-error"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
// Commands
|
// Commands
|
||||||
@@ -662,6 +826,22 @@ public class PlayerStatusSign extends JavaPlugin implements Listener {
|
|||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onInventoryClick(InventoryClickEvent event) {
|
||||||
|
String title = ChatColor.stripColor(event.getView().getTitle());
|
||||||
|
if (title != null && title.startsWith("Statistiken von ")) {
|
||||||
|
event.setCancelled(true); // Verhindert Herausnehmen/Verschieben von Items im Stats-GUI
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onInventoryDrag(InventoryDragEvent event) {
|
||||||
|
String title = ChatColor.stripColor(event.getView().getTitle());
|
||||||
|
if (title != null && title.startsWith("Statistiken von ")) {
|
||||||
|
event.setCancelled(true); // Verhindert Drag & Drop im Stats-GUI
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.LOW)
|
@EventHandler(priority = EventPriority.LOW)
|
||||||
public void onBlockBreak(BlockBreakEvent event) {
|
public void onBlockBreak(BlockBreakEvent event) {
|
||||||
if (event.isCancelled()) return;
|
if (event.isCancelled()) return;
|
||||||
|
Reference in New Issue
Block a user