diff --git a/make_jar.jardesc b/make_jar.jardesc index dc3f8c1..ae33c3f 100644 --- a/make_jar.jardesc +++ b/make_jar.jardesc @@ -1,6 +1,6 @@ - + diff --git a/resources/plugin.yml b/resources/plugin.yml index 6c54d1c..741212e 100644 --- a/resources/plugin.yml +++ b/resources/plugin.yml @@ -1,6 +1,6 @@ name: PandacraftUtils main: net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils -version: 3.2 +version: 3.3 diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/ConfigManager.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/ConfigManager.java index b842874..65b53be 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/ConfigManager.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/ConfigManager.java @@ -153,22 +153,22 @@ public class ConfigManager { Map message; message = new HashMap(); - message.put("message", ChatColor.BLUE+"Bienvenue sur Pandacraft ! :) Pour pouvoir jouer, n'oubliez pas de vous inscrire en cliquant sur le lien en dessous%n &ahttp://mc-pandacraft.net/?p=inscription"); + message.put("message", ChatColor.BLUE+"Bienvenue sur Pandacraft ! :) Pour pouvoir jouer, n'oubliez pas de vous inscrire en cliquant sur le lien en dessous%n &ahttps://www.mc-pandacraft.net/?p=inscription"); message.put("permissions", "pandacraft.grade.default"); Automessages_messages.add(message); message = new HashMap(); - message.put("message", "Utilisez la commande &7/cubo"+ServerMessages_defaultColor+" en Survie pour protéger vos construction ! :)"); + message.put("message", "Utilisez la commande &7/cubo"+ServerMessages_defaultColor+" en Survie pour protéger vos construction ! :)%n&a https://www.mc-pandacraft.net/?p=antigrief#tuto_cubo"); message.put("permissions", "*"); Automessages_messages.add(message); message = new HashMap(); - message.put("message", "WorldEdit disponible en &bCréatif"+ServerMessages_defaultColor+" avec le grade &f[&eUltimate&f]"+ServerMessages_defaultColor+". Profitez en vite :D%n &a http://mc-pandacraft.net/?p=ultimate"); + message.put("message", "WorldEdit disponible en &bCréatif"+ServerMessages_defaultColor+" avec le grade %n&f[&eUltimate&f]"+ServerMessages_defaultColor+". Profitez en vite :D%n &a https://www.mc-pandacraft.net/?p=ultimate"); message.put("permissions", "*"); Automessages_messages.add(message); message = new HashMap(); - message.put("message", "Launcher disponible pour Pandacraft : Optifine intégré et mise à jour automatique avec le serveur.%n &ahttp://mc-pandacraft.net/?p=launcher"); + message.put("message", "Launcher disponible pour Pandacraft : Optifine intégré et mise à jour automatique avec le serveur.%n &ahttps://www.mc-pandacraft.net/?p=launcher"); message.put("permissions", "*"); Automessages_messages.add(message); /* diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandStaff.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandStaff.java index bc11943..b435891 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandStaff.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandStaff.java @@ -51,12 +51,11 @@ public class CommandStaff extends AbstractCommandExecutor { sender.sendMessage(ChatColor.GREEN+"Cette file d'attente sers à demander un service à une personne du staff connecté"); sender.sendMessage(ChatColor.RED+"Commande : "+ChatColor.GRAY+"/staff "+ChatColor.ITALIC+"Message"+ ChatColor.RED+" pour rentrer dans la file d'attente"); - sender.sendMessage(ChatColor.RED+"Si votre message n'est pas assez explicite ou détaillée, votre demande sera ignoré"); + sender.sendMessage(ChatColor.RED+"Si votre message n'est pas assez explicite ou détaillée, votre demande pourra être ignoré"); return true; } - staffManager.playerQueue.add(staffManager.new WaitingPlayer(((Player)sender).getName(), StringUtils.join(args, " "), ((Player)sender).getLocation())); - staffManager.updateScoreBoardWaitingList(); + staffManager.addWaitingPlayer((Player)sender, StringUtils.join(args, " ")); sender.sendMessage(ChatColor.GREEN+"Veuillez maintenant patienter quelques instant, le temps que le staff traite le début de la file d'attente ;)"); sender.sendMessage(ChatColor.GREEN+"Vous êtes à la position "+staffManager.getPlayerPosition((Player)sender)+" de la file d'attente"); return true; @@ -64,7 +63,7 @@ public class CommandStaff extends AbstractCommandExecutor { else if (sender instanceof Player) { // un joueur du staff if (args.length == 0) { - showWaintingList(sender); + staffManager.showWaintingList(sender); sender.sendMessage(ChatColor.GOLD+"Pour connaitre les commandes, faites "+ChatColor.GRAY+"/staff ?"); return true; } @@ -79,7 +78,7 @@ public class CommandStaff extends AbstractCommandExecutor { if (args.length == 0) { - showWaintingList(sender); + staffManager.showWaintingList(sender); return true; } else @@ -104,23 +103,39 @@ public class CommandStaff extends AbstractCommandExecutor { if (args[0].equalsIgnoreCase("?")) { // affichage de l'aide sender.sendMessage(ChatColor.GOLD+"--- Commandes administratives pour gérer la file d'attente ---"); - if (sender instanceof Player) + if (sender instanceof Player) { sender.sendMessage(ChatColor.GRAY+"/staff select "+ChatColor.RESET+" : prendre en charge un joueur de la file"); + sender.sendMessage(ChatColor.GRAY+"/staff finish"+ChatColor.RESET+" : quand vous avez fini de prendre en charge le joueur en cours"); + sender.sendMessage(ChatColor.GRAY+"/staff cancel"+ChatColor.RESET+" : quand vous ne pouvez pas prendre en charge le joueur en cours"); + } sender.sendMessage(ChatColor.GRAY+"/staff remove "+ChatColor.RESET+" : retire un joueur de la file sans le prendre en charge"); sender.sendMessage(ChatColor.GRAY+"/staff add "+ChatColor.RESET+" : ajoute un joueur dans la file"); return true; } else if (args[0].equalsIgnoreCase("select") && args.length > 1 && sender instanceof Player) { - WaitingPlayer wp = staffManager.getWaitingPlayer(args[1]); + WaitingPlayer wp; + // on vérifie si le membre du staff n'est pas déjà associé à un joueur + if ((wp = staffManager.getSelectedWaitingPlayer((Player)sender)) != null) { + sender.sendMessage(ChatColor.RED+"Vous vous occupez déjà d'un joueur. Faites "+ChatColor.GRAY+"/staff finish"+ChatColor.RED+" si vous en avez fini avec "+wp.getPlayerDisplayName()); + return true; + } + + // on vérifie que le joueur indiqué se trouve dans la file d'attente + wp = staffManager.getWaitingPlayer(args[1]); if (wp == null) { sender.sendMessage(ChatColor.RED+"Le joueur n'est pas dans la liste"); return true; } + // on vérifie si un membre du staff ne s'occupe pas déjà du joueur + if (wp.getStaffPlayerName() != null) { + sender.sendMessage(ChatColor.RED+wp.getStaffPlayerName()+" s'occupe déjà de ce joueur"); + return true; + } - staffManager.removePlayer(args[1]); + wp.setStaffPlayer((Player)sender); Player p = plugin.getServer().getPlayerExact(wp.getPlayerName()); if (p != null && p.isOnline()) { @@ -149,6 +164,42 @@ public class CommandStaff extends AbstractCommandExecutor { + return true; + + } + else if (args[0].equalsIgnoreCase("finish") && sender instanceof Player) + { + WaitingPlayer wp = staffManager.getSelectedWaitingPlayer((Player)sender); + if (wp == null) { + sender.sendMessage(ChatColor.RED+"Vous ne vous occupez actuellement de personne. Faites "+ChatColor.GRAY+"/staff"+ChatColor.RED+" pour voir si vous pouvez aider un joueur"); + return true; + } + + staffManager.removePlayer(wp.getPlayerName()); + + sender.sendMessage(ChatColor.GREEN+wp.getPlayerName()+ChatColor.RESET+ChatColor.GREEN+" a été retiré de la file d'attente"); + + return true; + + } + else if (args[0].equalsIgnoreCase("cancel") && sender instanceof Player) + { + WaitingPlayer wp = staffManager.getSelectedWaitingPlayer((Player)sender); + if (wp == null) { + sender.sendMessage(ChatColor.RED+"Vous ne vous occupez actuellement de personne. Faites "+ChatColor.GRAY+"/staff"+ChatColor.RED+" pour voir si vous pouvez aider un joueur"); + return true; + } + + wp.setStaffPlayer(null); + + Player p = plugin.getServer().getPlayerExact(wp.getPlayerName()); + if (p != null && p.isOnline()) { + p.sendMessage(ChatColor.RED+((Player)sender).getDisplayName()+ChatColor.RED+" ne s'occupe plus de vous, mais vous restez en file d'attente"); + } + + + sender.sendMessage(ChatColor.GREEN+wp.getPlayerName()+ChatColor.RESET+ChatColor.GREEN+" a été remis en attente"); + return true; } @@ -156,14 +207,14 @@ public class CommandStaff extends AbstractCommandExecutor { { WaitingPlayer wp = staffManager.getWaitingPlayer(args[1]); if (wp == null) { - sender.sendMessage(ChatColor.RED+"Le joueur n'est pas dans la liste"); + sender.sendMessage(ChatColor.RED+"Le joueur n'est pas dans la file"); return true; } staffManager.removePlayer(args[1]); Player p = plugin.getServer().getPlayerExact(wp.getPlayerName()); if (p != null && p.isOnline()) { - p.sendMessage(ChatColor.RED+"Vous avez été retiré de la liste des joueurs en attente"); + p.sendMessage(ChatColor.RED+"Vous avez été retiré de la file d'attente"); } sender.sendMessage(ChatColor.GREEN+wp.getPlayerName()+ChatColor.RESET+ChatColor.GREEN+" a été retiré de la file d'attente"); @@ -196,8 +247,7 @@ public class CommandStaff extends AbstractCommandExecutor { String message = StringUtils.join(args, " "); - staffManager.playerQueue.add(staffManager.new WaitingPlayer(p.getName(),message, p.getLocation())); - staffManager.updateScoreBoardWaitingList(); + staffManager.addWaitingPlayer(p, message); sender.sendMessage(ChatColor.GREEN+"Vous venez d'ajouter "+p.getDisplayName()+ChatColor.RESET+ChatColor.GREEN+" dans la file d'attente"); @@ -214,31 +264,6 @@ public class CommandStaff extends AbstractCommandExecutor { - - - private void showWaintingList(CommandSender sender) { - sender.sendMessage(ChatColor.BOLD+"-- File d'attente des joueurs pour le staff --"); - - int i=0; - for (WaitingPlayer wp : plugin.staffQueueManager.playerQueue) { - i++; - Player p = plugin.getServer().getPlayerExact(wp.getPlayerName()); - String name; - if (p == null || !p.isOnline()) - name = wp.getPlayerName(); - else - name = p.getDisplayName(); - - sender.sendMessage(i+". "+name+ChatColor.RESET+" : "+wp.getMessage()+" - " - +ChatColor.ITALIC+"Il y a "+TimeUtil.durationToString((new Date()).getTime() - wp.getDate().getTime())); - } - sender.sendMessage(ChatColor.BOLD+"-------------------------------------------"); - - } - - - - diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/StaffQueueManager.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/StaffQueueManager.java index 5145138..9cf6a09 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/StaffQueueManager.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/StaffQueueManager.java @@ -1,23 +1,24 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.modules; +import java.util.ArrayList; import java.util.Date; import java.util.LinkedList; import java.util.Queue; import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils; +import net.mc_pandacraft.java.util.ScoreBoardUtil; +import net.mc_pandacraft.java.util.TimeUtil; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.OfflinePlayer; +import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.scoreboard.DisplaySlot; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; import org.bukkit.scoreboard.Scoreboard; public class StaffQueueManager implements Listener { @@ -25,7 +26,7 @@ public class StaffQueueManager implements Listener { private PandacraftUtils plugin = PandacraftUtils.getInstance(); - public Queue playerQueue = new LinkedList(); + private Queue playerQueue = new LinkedList(); private Scoreboard scoreboardPlayerQueue = Bukkit.getScoreboardManager().getNewScoreboard(); @@ -35,6 +36,17 @@ public class StaffQueueManager implements Listener { } + // le joueur ajouté doit-être en ligne + public void addWaitingPlayer(Player p, String m) { + if (getWaitingPlayer(p) != null) return; // le joueur est déjà dans la file + playerQueue.add(new WaitingPlayer(p.getName(), m, p.getLocation())); + updateScoreBoardWaitingList(); + } + + + + + public WaitingPlayer getWaitingPlayer(String p) { for (WaitingPlayer wp : playerQueue) { @@ -57,7 +69,7 @@ public class StaffQueueManager implements Listener { for (WaitingPlayer wp : playerQueue) { i++; - if (wp != null && wp.getPlayerName().equalsIgnoreCase(p.getName())) + if (wp != null && wp.getPlayerName().equals(p.getName())) return i; } return -1; @@ -75,53 +87,98 @@ public class StaffQueueManager implements Listener { } public void removePlayer(OfflinePlayer p) { removePlayer(p.getName()); - updateScoreBoardWaitingList(); } - + public WaitingPlayer getSelectedWaitingPlayer(Player staffPlayer) { + String staffName = staffPlayer.getName(); + for (WaitingPlayer wp : playerQueue) + { + if (wp != null && wp.getStaffPlayerName() != null && wp.getStaffPlayerName().equals(staffName)) + return wp; + } + return null; + } public void updateScoreBoardWaitingList() { - Objective obj = scoreboardPlayerQueue.getObjective("file_attente"); - if (obj != null) - obj.unregister(); + // contient les joueurs qui sont associés à un membre du staff + ArrayList selectedPlayers = new ArrayList(); - obj = scoreboardPlayerQueue.registerNewObjective("file_attente", "dummy"); - obj.setDisplayName(ChatColor.GOLD+"File d'attente staff"); - obj.setDisplaySlot(DisplaySlot.SIDEBAR); + // contient les joueurs qui ne sont pas encore associés à un membre du staff connecté + ArrayList newPlayers = new ArrayList(); - int i=0; + int i = 1; for (WaitingPlayer wp : playerQueue) { - i++; - - Player p = plugin.getServer().getPlayerExact(wp.getPlayerName()); - String name; - if (p == null || !p.isOnline()) - name = wp.getPlayerName(); + String line = i+"."+wp.getPlayerDisplayName(); + if (wp.getStaffPlayerName() == null) + newPlayers.add(line); else - name = p.getPlayerListName(); - - String line = i+"."+name; - int boardPos = playerQueue.size()-i+1; - - - Score score = obj.getScore(plugin.getServer().getOfflinePlayer(line.substring(0, (line.length()>16)?16:line.length()))); - - score.setScore(boardPos); + selectedPlayers.add(line); + i++; } + + + // contients les lignes qui vont être affichés dans la sidebar + ArrayList lines = new ArrayList(); + + if (!selectedPlayers.isEmpty()) { + lines.add("En traitement :"); + lines.addAll(selectedPlayers); + } + if (!newPlayers.isEmpty()) { + lines.add("En attente :"); + lines.addAll(newPlayers); + } + + if (!lines.isEmpty()) { + lines.add(""); + lines.add("Commande :"); + lines.add(ChatColor.GRAY+" /staff"); + } + + ScoreBoardUtil.updateScoreboardSidebar(scoreboardPlayerQueue, ChatColor.GOLD+"File d'attente staff", lines); } + + public void showWaintingList(CommandSender sender) { + + + sender.sendMessage(ChatColor.BOLD+"--- File d'attente des joueurs pour le staff ---"); + + int i=1; + for (WaitingPlayer wp : playerQueue) { + + String staffPlayer = wp.getStaffPlayerName(); + if (staffPlayer != null) + staffPlayer = " ("+staffPlayer+ChatColor.RESET+")"; + else + staffPlayer = ""; + + sender.sendMessage(i+"."+staffPlayer+" "+wp.getPlayerDisplayName()+ChatColor.RESET+" : "+wp.getMessage()+" - " + +ChatColor.ITALIC+"Il y a "+TimeUtil.durationToString((new Date()).getTime() - wp.getDate().getTime())); + i++; + } + sender.sendMessage(ChatColor.BOLD+"-------------------------------------------"); + + + } + + + + + + @@ -144,6 +201,13 @@ public class StaffQueueManager implements Listener { @EventHandler public void onPlayerQuit(PlayerQuitEvent event) { + + // on vérifie si un membre du staff se déconnecte + for (WaitingPlayer wp : playerQueue) { + if (wp.getStaffPlayerName() != null && wp.getStaffPlayerName().equals(event.getPlayer().getName())) + wp.setStaffPlayer(null); + } + plugin.getServer().getScheduler().runTaskLater(plugin, new Runnable() { @Override public void run() { updateScoreBoardWaitingList(); } }, 2L); @@ -167,25 +231,47 @@ public class StaffQueueManager implements Listener { private String player; private String message; - private Date creationDate; - private Location location; + private Date creationDate = new Date(); + private Location location; // localisation du joueur au moment où il fait /staff + private String staffPlayer = null; public WaitingPlayer(String p, String m, Location l) { player = p; message = m; - creationDate = new Date(); location = l; } - + /** + * + * @return le pseudo du joueur + */ public String getPlayerName() { return player; } + /** + * + * @return le pseudo du joueur, avec la coloration si il est connecté + */ + public String getPlayerDisplayName() { + Player p = plugin.getServer().getPlayerExact(player); + if (p == null || !p.isOnline()) + return player; + else + return p.getPlayerListName(); + } + public String getMessage() { return message; } public Date getDate() { return creationDate; } public Location getLocation() { return location; } + + public void setStaffPlayer(Player p) { + if (p == null) staffPlayer = null; + else staffPlayer = p.getName(); + updateScoreBoardWaitingList(); + } + public String getStaffPlayerName() { return staffPlayer; } } } diff --git a/src/net/mc_pandacraft/java/util/ScoreBoardUtil.java b/src/net/mc_pandacraft/java/util/ScoreBoardUtil.java new file mode 100644 index 0000000..6de451b --- /dev/null +++ b/src/net/mc_pandacraft/java/util/ScoreBoardUtil.java @@ -0,0 +1,60 @@ +package net.mc_pandacraft.java.util; + +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; + +public class ScoreBoardUtil { + + /** + * Met à jour la Sidebar d'un Scoreboard donné + * @param scBrd Le Scoreboard à mettre à jour (ne doit pas être null) + * @param title Le titre de la Sidebar + * @param lines Les lignes qui doivent être affichés. Si un éléments du tableau est null, il sera compté comme une chaine vide. Toutes les lignes seront rognés aux 16 premiers caractères + */ + public static void updateScoreboardSidebar(Scoreboard scBrd, String title, String[] lines) { + if (scBrd == null) throw new IllegalArgumentException("scBrd doit être non null"); + Objective obj = scBrd.getObjective("sidebar_autogen"); + if (obj != null) + obj.unregister(); + + if (lines == null || lines.length == 0) + return; + + obj = scBrd.registerNewObjective("sidebar_autogen", "dummy"); + obj.setDisplayName(title == null ? "" : title); + obj.setDisplaySlot(DisplaySlot.SIDEBAR); + + int boardPos = lines.length; + for (String line : lines) { + if (line == null) line = ""; + + Score score = obj.getScore( + Bukkit.getServer().getOfflinePlayer( + line.substring( + 0, + (line.length()>16) ? 16 : line.length() + ) + ) + ); + + score.setScore(boardPos); + boardPos--; + } + } + + /** + * Met à jour la Sidebar d'un Scoreboard donné + * @param scBrd Le Scoreboard à mettre à jour + * @param title Le titre de la Sidebar + * @param lines Les lignes qui doivent être affichés. Si un éléments du tableau est null, il sera compté comme une chaine vide. Toutes les lignes seront rognés aux 16 premiers caractères + */ + public static void updateScoreboardSidebar(Scoreboard scBrd, String title, List lines) { + updateScoreboardSidebar(scBrd, title, lines.toArray(new String[lines.size()])); + } + +}