Amélioration de la commande /staff et meilleure gestion de la file d'attente /Staff

This commit is contained in:
Marc Baloup 2015-01-27 02:37:46 -05:00
parent 85fa583ef5
commit b01ffd8bcb
6 changed files with 247 additions and 76 deletions

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<jardesc>
<jar path="PandacraftUtils/jar_export/PandacraftUtils-3.2.jar"/>
<jar path="PandacraftUtils/jar_export/PandacraftUtils-3.3.jar"/>
<options buildIfNeeded="true" compress="true" descriptionLocation="/PandacraftUtils/make_jar.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="false" overwrite="false" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
<storedRefactorings deprecationInfo="true" structuralOnly="false"/>
<selectedProjects/>

View File

@ -1,6 +1,6 @@
name: PandacraftUtils
main: net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils
version: 3.2
version: 3.3

View File

@ -153,22 +153,22 @@ public class ConfigManager {
Map<String, String> message;
message = new HashMap<String, String>();
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<String, String>();
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<String, String>();
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<String, String>();
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);
/*

View File

@ -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 <Joueur>"+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 <Joueur>"+ChatColor.RESET+" : retire un joueur de la file sans le prendre en charge");
sender.sendMessage(ChatColor.GRAY+"/staff add <Joueur> <Message>"+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+"-------------------------------------------");
}

View File

@ -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<WaitingPlayer> playerQueue = new LinkedList<WaitingPlayer>();
private Queue<WaitingPlayer> playerQueue = new LinkedList<WaitingPlayer>();
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<String> selectedPlayers = new ArrayList<String>();
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<String> newPlayers = new ArrayList<String>();
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<String> lines = new ArrayList<String>();
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 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; }
}
}

View File

@ -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<String> lines) {
updateScoreboardSidebar(scBrd, title, lines.toArray(new String[lines.size()]));
}
}