Initial commit

This commit is contained in:
2024-12-03 10:11:14 +00:00
parent db28d9c897
commit c42d895f28

154
PlayerStatistics.java Normal file
View File

@@ -0,0 +1,154 @@
package com.example.mcstats;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.*;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.configuration.file.FileConfiguration;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public class PlayerStatistics extends JavaPlugin implements Listener {
private Map<UUID, PlayerStatistics> playerStats;
private FileConfiguration config;
@Override
public void onEnable() {
playerStats = new ConcurrentHashMap<>();
saveDefaultConfig();
config = getConfig();
loadStats();
getServer().getPluginManager().registerEvents(this, this);
// Register commands
getCommand("stats").setExecutor((sender, command, label, args) -> {
if (sender instanceof Player) {
Player player = (Player) sender;
showStats(player);
}
return true;
});
// Auto-save task (every 5 minutes)
getServer().getScheduler().runTaskTimerAsynchronously(this, this::saveStats, 6000L, 6000L);
}
@Override
public void onDisable() {
saveStats();
}
private void loadStats() {
if (config.contains("players")) {
for (String uuid : config.getConfigurationSection("players").getKeys(false)) {
UUID playerUUID = UUID.fromString(uuid);
PlayerStatistics stats = new PlayerStatistics();
String path = "players." + uuid + ".";
stats.blocksMined = config.getInt(path + "blocksMined");
stats.blocksPlaced = config.getInt(path + "blocksPlaced");
stats.mobKills = config.getInt(path + "mobKills");
stats.deaths = config.getInt(path + "deaths");
stats.distanceTraveled = config.getDouble(path + "distanceTraveled");
stats.itemsCrafted = config.getInt(path + "itemsCrafted");
stats.foodConsumed = config.getInt(path + "foodConsumed");
playerStats.put(playerUUID, stats);
}
}
}
private void saveStats() {
for (Map.Entry<UUID, PlayerStatistics> entry : playerStats.entrySet()) {
String path = "players." + entry.getKey().toString() + ".";
PlayerStatistics stats = entry.getValue();
config.set(path + "blocksMined", stats.blocksMined);
config.set(path + "blocksPlaced", stats.blocksPlaced);
config.set(path + "mobKills", stats.mobKills);
config.set(path + "deaths", stats.deaths);
config.set(path + "distanceTraveled", stats.distanceTraveled);
config.set(path + "itemsCrafted", stats.itemsCrafted);
config.set(path + "foodConsumed", stats.foodConsumed);
}
saveConfig();
}
private void showStats(Player player) {
PlayerStatistics stats = playerStats.computeIfAbsent(player.getUniqueId(), k -> new PlayerStatistics());
player.sendMessage("§6=== Your Statistics ===");
player.sendMessage("§7Blocks Mined: §f" + stats.blocksMined);
player.sendMessage("§7Blocks Placed: §f" + stats.blocksPlaced);
player.sendMessage("§7Mob Kills: §f" + stats.mobKills);
player.sendMessage("§7Deaths: §f" + stats.deaths);
player.sendMessage("§7Distance Traveled: §f" + String.format("%.2f", stats.distanceTraveled) + " blocks");
player.sendMessage("§7Items Crafted: §f" + stats.itemsCrafted);
player.sendMessage("§7Food Consumed: §f" + stats.foodConsumed);
}
// Event Handlers
@EventHandler
public void onBlockBreak(BlockBreakEvent event) {
PlayerStatistics stats = playerStats.computeIfAbsent(event.getPlayer().getUniqueId(), k -> new PlayerStatistics());
stats.blocksMined++;
}
@EventHandler
public void onBlockPlace(BlockPlaceEvent event) {
PlayerStatistics stats = playerStats.computeIfAbsent(event.getPlayer().getUniqueId(), k -> new PlayerStatistics());
stats.blocksPlaced++;
}
@EventHandler
public void onEntityDeath(EntityDeathEvent event) {
if (event.getEntity().getKiller() instanceof Player) {
Player player = event.getEntity().getKiller();
PlayerStatistics stats = playerStats.computeIfAbsent(player.getUniqueId(), k -> new PlayerStatistics());
stats.mobKills++;
}
}
@EventHandler
public void onPlayerDeath(PlayerDeathEvent event) {
PlayerStatistics stats = playerStats.computeIfAbsent(event.getEntity().getUniqueId(), k -> new PlayerStatistics());
stats.deaths++;
}
@EventHandler
public void onPlayerMove(PlayerMoveEvent event) {
if (event.getFrom().distance(event.getTo()) > 0) {
PlayerStatistics stats = playerStats.computeIfAbsent(event.getPlayer().getUniqueId(), k -> new PlayerStatistics());
stats.distanceTraveled += event.getFrom().distance(event.getTo());
}
}
@EventHandler
public void onItemConsume(PlayerItemConsumeEvent event) {
if (event.getItem().getType().isEdible()) {
PlayerStatistics stats = playerStats.computeIfAbsent(event.getPlayer().getUniqueId(), k -> new PlayerStatistics());
stats.foodConsumed++;
}
}
private static class PlayerStatistics {
int blocksMined = 0;
int blocksPlaced = 0;
int mobKills = 0;
int deaths = 0;
double distanceTraveled = 0.0;
int itemsCrafted = 0;
int foodConsumed = 0;
}
}