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