diff --git a/pom.xml b/pom.xml index 3477929..ef67579 100644 --- a/pom.xml +++ b/pom.xml @@ -33,13 +33,17 @@ spigot-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + sonatype + https://oss.sonatype.org/groups/public/ + org.spigotmc - spigot + spigot-api 1.8.8-R0.1-SNAPSHOT provided diff --git a/src/main/java/fr/revivemc/Main.java b/src/main/java/fr/revivemc/Main.java index 521e16b..5c16eda 100644 --- a/src/main/java/fr/revivemc/Main.java +++ b/src/main/java/fr/revivemc/Main.java @@ -1,13 +1,164 @@ package fr.revivemc; +import fr.revivemc.listeners.BreadListener; +import fr.revivemc.commands.PlayeriaCom; +import fr.revivemc.listeners.ConnectListener; +import fr.revivemc.listeners.CreeperListener; +import fr.revivemc.listeners.HealthListener; +import fr.revivemc.ui.PlayeriaScoreboard; +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitRunnable; + +import java.io.File; +import java.io.IOException; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +import static fr.revivemc.listeners.BreadListener.nmbrPain; +import static fr.revivemc.listeners.CreeperListener.nmbrCreeper; public class Main extends JavaPlugin { @Override - public void onEnable() {} + public void onEnable() { + + try { + readAndWrite(); + } catch (IOException e) { + getLogger().severe("Erreur lors de la lecture du fichier data.yml !"); + e.printStackTrace(); + } + + PlayeriaScoreboard scoreboard = new PlayeriaScoreboard(this); + + for (Player player : Bukkit.getOnlinePlayers()) { + scoreboard.update(player); + } + + getCommand("playeria").setExecutor(new PlayeriaCom(this, scoreboard)); + getServer().getPluginManager().registerEvents(new BreadListener(this, scoreboard), this); + getServer().getPluginManager().registerEvents(new ConnectListener(scoreboard), this); + getServer().getPluginManager().registerEvents(new HealthListener(this, scoreboard), this); + getServer().getPluginManager().registerEvents(new CreeperListener(scoreboard), this); + getLogger().info("Le plugin a démarré avec succès"); + + new BukkitRunnable() { + + @Override + public void run() { + try { + save(); + getLogger().info("Auto-save effectué."); + } catch (IOException e) { + getLogger().severe("Erreur lors de l'auto-save !"); + e.printStackTrace(); + } + } + + }.runTaskTimer(this, 0L,6000L ); + } @Override - public void onDisable() {} + public void onDisable() { + try { + save(); + } catch (IOException e) { + getLogger().severe("Erreur lors de la sauvegarde du fichier data.yml !"); + e.printStackTrace(); + } + } + + public void createDataFile() { + + File path = getDataFolder(); + File file = new File(path,"data.yml"); + + path.mkdirs(); + try { + file.createNewFile(); + } catch (IOException e) { + getLogger().severe("Erreur lors de la création du fichier data.yml !"); + e.printStackTrace(); + } + } + + public void save() throws IOException { + + File path = getDataFolder(); + File file = new File(path,"data.yml"); + + // Sécurité au cas où + if (!file.exists()) { + createDataFile(); + } + // Sauvegarde + YamlConfiguration data = YamlConfiguration.loadConfiguration(file); + + data.set("bread", null); + data.set("creeper", null); + for (Map.Entry entry : nmbrPain.entrySet()) { + + UUID uuid = entry.getKey(); + int score = entry.getValue(); + + data.set("bread." + uuid, score); + } + for (Map.Entry entry : nmbrCreeper.entrySet()) { + + UUID uuid = entry.getKey(); + int score = entry.getValue(); + + data.set("creeper." + uuid, score); + } + data.save(file); + } + + public void readAndWrite() throws IOException { + + File path = getDataFolder(); + File file = new File(path,"data.yml"); + + // --- Si le fichier n'existe pas → sauvegarder puis lire --- + if (!file.exists()) { + createDataFile(); + } + + // --- Lire le fichier YML --- + YamlConfiguration data = YamlConfiguration.loadConfiguration(file); + nmbrPain.clear(); + nmbrCreeper.clear(); + + if (data.getConfigurationSection("bread") != null) { + + Set key = data.getConfigurationSection("bread").getKeys(false); + + for (String element : key) { + int score = data.getInt("bread." + element); + UUID uuid = UUID.fromString(element); + nmbrPain.put(uuid, score); + } + } + if (data.getConfigurationSection("creeper") != null) { + + Set key = data.getConfigurationSection("creeper").getKeys(false); + + for (String element : key) { + int score = data.getInt("creeper." + element); + UUID uuid = UUID.fromString(element); + nmbrCreeper.put(uuid, score); + } + } + } + + public Map getPain() { + return nmbrPain; + } + public Map getCreeper() { + return nmbrCreeper; + } } diff --git a/src/main/java/fr/revivemc/commands/PlayeriaCom.java b/src/main/java/fr/revivemc/commands/PlayeriaCom.java new file mode 100644 index 0000000..fc369c5 --- /dev/null +++ b/src/main/java/fr/revivemc/commands/PlayeriaCom.java @@ -0,0 +1,105 @@ +package fr.revivemc.commands; + +import fr.revivemc.Main; +import fr.revivemc.ui.PlayeriaScoreboard; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.io.IOException; + +import static fr.revivemc.listeners.BreadListener.nmbrPain; +import static fr.revivemc.listeners.CreeperListener.nmbrCreeper; +import static org.bukkit.Bukkit.getLogger; + +public class PlayeriaCom implements CommandExecutor { + + private final Main plugin; + private final PlayeriaScoreboard scoreboard; + + public PlayeriaCom(Main plugin, PlayeriaScoreboard scoreboard) { + this.plugin = plugin; + this.scoreboard = scoreboard; + } + + @Override + public boolean onCommand(CommandSender commandSender, Command command, String s, String[] args) { + + if (args.length != 0) { + switch (args[0]) { + case "help": + commandSender.sendMessage("§6===== Playeria Commands ====="); + commandSender.sendMessage("§e/playeria help §7- affiche les commandes"); + commandSender.sendMessage("§e/playeria save §7- sauvegarde les données"); + commandSender.sendMessage("§e/playeria clear bread §7- reset le compteur de pains pour tous les joueurs"); + commandSender.sendMessage("§e/playeria clear creeper §7- reset le compteur de creepers pour tous les joueurs"); + commandSender.sendMessage("§e/playeria clear all §7- reset le compteur de creepers et de pains pour tous les joueurs"); + break; + case "save": + if (!commandSender.hasPermission("playeria.admin")) { + commandSender.sendMessage("§cTu n'as pas la permission pour executer cette commande !"); + return true; + } + try { + plugin.save(); + commandSender.sendMessage("§2Sauvegarde réussie"); + if (commandSender instanceof Player) { + getLogger().info("Sauvegarde demandée par " + commandSender.getName()); + } + } catch (IOException e) { + commandSender.sendMessage("§4Erreur lors de la sauvegarde du fichier data.yml, voir les logs pour plus de détail !"); + + getLogger().severe("Erreur lors de la sauvegarde du fichier data.yml !"); + e.printStackTrace(); + } + break; + case "clear" : + if (!commandSender.hasPermission("playeria.admin")) { + commandSender.sendMessage("§cTu n'as pas la permission pour executer cette commande !"); + return true; + } + if (args.length >= 2) { + switch (args[1]){ + case "bread" : + nmbrPain.clear(); + for (Player player : Bukkit.getOnlinePlayers()) { + scoreboard.update(player); + } + commandSender.sendMessage("§2Le compteur de pains a été reset pour tous les joueurs !"); + + break; + case "creeper" : + nmbrCreeper.clear(); + for (Player player : Bukkit.getOnlinePlayers()) { + scoreboard.update(player); + } + commandSender.sendMessage("§2Le compteur de creepers a été reset pour tous les joueurs !"); + break; + case "all": + nmbrPain.clear(); + nmbrCreeper.clear(); + for (Player player : Bukkit.getOnlinePlayers()) { + scoreboard.update(player); + } + commandSender.sendMessage("§2Toutes les stats ont été reset pour tous les joueurs !"); + break; + default: + commandSender.sendMessage("§4Mauvaise commande. \nListe des commandes disponibles avec /playeria : \n - /playeria help"); + break; + } + } else { + commandSender.sendMessage("§4Commande mal exécutée. \nFaite /playeria help pour plus d'info"); + } + break; + default: + commandSender.sendMessage("§4Mauvaise commande. \nListe des commandes disponibles avec /playeria : \n - /playeria help"); + break; + } + } else { + commandSender.sendMessage("§4Commande mal exécutée. \nFaite /playeria help pour plus d'info"); + } + return true; + } +} diff --git a/src/main/java/fr/revivemc/listeners/BreadListener.java b/src/main/java/fr/revivemc/listeners/BreadListener.java new file mode 100644 index 0000000..e9a6b26 --- /dev/null +++ b/src/main/java/fr/revivemc/listeners/BreadListener.java @@ -0,0 +1,83 @@ +package fr.revivemc.listeners; + +import fr.revivemc.ui.PlayeriaScoreboard; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.CraftItemEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.HashMap; +import java.util.UUID; + + +public class BreadListener implements Listener { + + private final JavaPlugin pluginInstance; + private final PlayeriaScoreboard scoreboard; + + public BreadListener(JavaPlugin pluginInstance, PlayeriaScoreboard scoreboard){ + this.pluginInstance = pluginInstance; + this.scoreboard = scoreboard; + } + + + public static HashMap nmbrPain = new HashMap<>(); + + + @EventHandler + public void onCraft(CraftItemEvent event) { + if (event.getWhoClicked() instanceof Player) { + + Player player = (Player) event.getWhoClicked(); + + UUID uuid = player.getUniqueId(); + + + if (event.getCurrentItem() != null && event.getCurrentItem().getType() == Material.BREAD) { + // Shift click traité séparément + if (event.isShiftClick()) { + int nmbrPainAvant = 0; + + for (ItemStack item : player.getInventory().getContents()) { + if (item != null) { + if (item.getType() == Material.BREAD) { + nmbrPainAvant += item.getAmount(); + } + } + } + + final int finalPainAvant = nmbrPainAvant; + + // fait le craft puis compte les objets dans l'inv après + Bukkit.getScheduler().runTask(pluginInstance, () -> { + + int nmbrPainApres = 0; + + for (ItemStack item : player.getInventory().getContents()) { + if (item != null) { + if (item.getType() == Material.BREAD) { + nmbrPainApres += item.getAmount(); + } + } + } + + int ancienScore = nmbrPain.getOrDefault(uuid, 0); + int diff = nmbrPainApres -finalPainAvant; + nmbrPain.put(uuid, ancienScore + diff); + scoreboard.update(player); + + }); + + } else { + int ancienScore = nmbrPain.getOrDefault(uuid, 0); + nmbrPain.put(uuid, ancienScore + event.getCurrentItem().getAmount()); + scoreboard.update(player); + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/fr/revivemc/listeners/ConnectListener.java b/src/main/java/fr/revivemc/listeners/ConnectListener.java new file mode 100644 index 0000000..57e7596 --- /dev/null +++ b/src/main/java/fr/revivemc/listeners/ConnectListener.java @@ -0,0 +1,21 @@ +package fr.revivemc.listeners; + +import fr.revivemc.ui.PlayeriaScoreboard; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; + +public class ConnectListener implements Listener { + + private final PlayeriaScoreboard scoreboard; + + public ConnectListener(PlayeriaScoreboard scoreboard) { + this.scoreboard = scoreboard; + } + + @EventHandler + public void onConnection(PlayerJoinEvent event) { + scoreboard.update(event.getPlayer()); + } +} diff --git a/src/main/java/fr/revivemc/listeners/CreeperListener.java b/src/main/java/fr/revivemc/listeners/CreeperListener.java new file mode 100644 index 0000000..6ee82a6 --- /dev/null +++ b/src/main/java/fr/revivemc/listeners/CreeperListener.java @@ -0,0 +1,36 @@ +package fr.revivemc.listeners; + +import fr.revivemc.ui.PlayeriaScoreboard; +import org.bukkit.entity.Creeper; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDeathEvent; + +import java.util.HashMap; +import java.util.UUID; + +public class CreeperListener implements Listener { + + public static HashMap nmbrCreeper = new HashMap<>(); + private final PlayeriaScoreboard scoreboard; + + public CreeperListener(PlayeriaScoreboard scoreboard) { + this.scoreboard = scoreboard; + } + + @EventHandler + public void onCreeperKill(EntityDeathEvent event) { + if (event.getEntity() instanceof Creeper) { + + Creeper creeper = (Creeper) event.getEntity(); + Player player = creeper.getKiller(); + + if (creeper.getKiller() != null) { + int ancienScore = nmbrCreeper.getOrDefault(player.getUniqueId(), 0); + nmbrCreeper.put(player.getUniqueId(), ancienScore + 1); + scoreboard.update(player); + } + } + } +} diff --git a/src/main/java/fr/revivemc/listeners/HealthListener.java b/src/main/java/fr/revivemc/listeners/HealthListener.java new file mode 100644 index 0000000..28d1525 --- /dev/null +++ b/src/main/java/fr/revivemc/listeners/HealthListener.java @@ -0,0 +1,42 @@ +package fr.revivemc.listeners; + +import fr.revivemc.ui.PlayeriaScoreboard; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityRegainHealthEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.plugin.java.JavaPlugin; + +public class HealthListener implements Listener { + + private final PlayeriaScoreboard scoreboard; + private final JavaPlugin plugin; + + public HealthListener(JavaPlugin plugin, PlayeriaScoreboard scoreboard) { + this.scoreboard = scoreboard; + this.plugin = plugin; + } + + @EventHandler + public void onDamage(EntityDamageEvent event) { + if (event.getEntity() instanceof Player) { + Bukkit.getScheduler().runTask(plugin, () -> scoreboard.update((Player) event.getEntity())); + } + } + + @EventHandler + public void onHeal(EntityRegainHealthEvent event) { + if (event.getEntity() instanceof Player) { + Bukkit.getScheduler().runTask(plugin, () -> scoreboard.update((Player) event.getEntity())); + } + } + + @EventHandler + public void onRespawn(PlayerRespawnEvent event) { + Bukkit.getScheduler().runTask(plugin, () -> scoreboard.update(event.getPlayer())); + } +} diff --git a/src/main/java/fr/revivemc/ui/PlayeriaScoreboard.java b/src/main/java/fr/revivemc/ui/PlayeriaScoreboard.java new file mode 100644 index 0000000..7973b49 --- /dev/null +++ b/src/main/java/fr/revivemc/ui/PlayeriaScoreboard.java @@ -0,0 +1,35 @@ +package fr.revivemc.ui; + +import fr.revivemc.Main; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.scoreboard.*; + + +public class PlayeriaScoreboard { + + private final Main plugin; + + public PlayeriaScoreboard(Main plugin) { + this.plugin = plugin; + } + + public void update(Player player) { + ScoreboardManager manager = Bukkit.getScoreboardManager(); + Scoreboard scoreboard = manager.getNewScoreboard(); + + Objective objective = scoreboard.registerNewObjective("playeriaSc", "dummy"); + + objective.setDisplaySlot(DisplaySlot.SIDEBAR); + objective.setDisplayName(" §b§lPlayeria "); + + + objective.getScore("-------------------").setScore(5); + objective.getScore("Pseudo : §f" + player.getName()).setScore(4); + objective.getScore("Vie : §c" + (int) player.getHealth() + " ❤").setScore(3); + objective.getScore("Creepers : §2" + plugin.getCreeper().getOrDefault(player.getUniqueId(), 0)).setScore(2); + objective.getScore("Pains : " + plugin.getPain().getOrDefault(player.getUniqueId(), 0)).setScore(1); + + player.setScoreboard(scoreboard); + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 6606242..afd709f 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,4 +1,18 @@ name: ReviveTechnicalTest version: '${project.version}' main: fr.revivemc.Main -author: ReviveMC \ No newline at end of file +author: ReviveMC + +commands : + playeria : + description : La commande principale de l'échosystème du plugin + permission : playeria + +permissions: + playeria: + description: Permet d'utiliser /playeria + default: true + + playeria.admin: + description: Commandes admin Playeria + default: op \ No newline at end of file