Ajout de la commande /staff

This commit is contained in:
Marc Baloup 2014-12-03 14:30:11 +01:00
parent f3a87f8bbf
commit 2a64175718
2 changed files with 438 additions and 1 deletions

View File

@ -46,6 +46,10 @@ commands:
usage: //selection usage: //selection
aliases : [/select] aliases : [/select]
permission: pandacraft.selection permission: pandacraft.selection
staff:
description: Gère la file d'attente de joueurs qui ont besoin de l'assitance du staff
usage: /staff [annuler|<Message>]
permission: pandacraft.staff
@ -84,6 +88,10 @@ permissions:
pandacraft.me: pandacraft.me:
description: Utiliser la commande me description: Utiliser la commande me
default: true default: true
pandacraft.staff:
description: Utiliser la commande staff
default: true
pandacraft.afk: pandacraft.afk:
description: Utiliser la commande afk description: Utiliser la commande afk
@ -127,4 +135,7 @@ permissions:
default: false default: false
pandacraft.grade.not_default: pandacraft.grade.not_default:
description: Représente tout les joueurs inscrits description: Représente tout les joueurs inscrits
default: false default: false
pandacraft.grade.staff:
description: Représente tout le staff
default: false

View File

@ -0,0 +1,426 @@
package net.mc_pandacraft.java.plugin.pandacraftutils.simple_commands.staff_player_help;
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.TimeUtil;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
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 CommandStaff implements CommandExecutor, Listener {
private PandacraftUtils plugin;
private Queue<WaitingPlayer> playerQueue = new LinkedList<WaitingPlayer>();
private Scoreboard scoreboardPlayerQueue;
public CommandStaff(PandacraftUtils pl) {
plugin = pl;
plugin.getCommand("staff").setExecutor(this);
plugin.getServer().getPluginManager().registerEvents(this, plugin);
scoreboardPlayerQueue = Bukkit.getScoreboardManager().getNewScoreboard();
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String alias,
String[] args) {
if (sender instanceof Player && !((Player)sender).hasPermission("pandacraft.grade.staff"))
{ // un joueur qui n'est pas du staff
// le joueur est-il déjà en file d'attente ?
if (getWaitingPlayer((Player)sender) != null) {
if (args.length > 0 && args[0].equalsIgnoreCase("annuler")) {
removePlayer((Player)sender);
updateScoreBoardWaitingList();
sender.sendMessage(ChatColor.GREEN+"Vous avez été retiré de la file d'attente");
return true;
}
else if (args.length > 0 && args[0].equalsIgnoreCase("position")) {
sender.sendMessage(ChatColor.GREEN+"Vous êtes à la position "+getPlayerPosition((Player)sender)+" de la file d'attente");
return true;
}
sender.sendMessage(ChatColor.GREEN+"Vous êtes déjà dans la file d'attente");
sender.sendMessage(ChatColor.GREEN+"Commande : "+ChatColor.GRAY+"/staff position"+ChatColor.RED+" pour connaitre votre position"+
"ou "+ChatColor.GRAY+"/staff annuler"+ChatColor.RED+" pour sortir de la file d'attente");
return true;
}
// le joueur n'a-t-il pas mis un message en argument de la commande
if (args.length == 0) {
sender.sendMessage(ChatColor.GREEN+"Vous n'êtes pas dans la file d'attente");
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");
return true;
}
playerQueue.add(new WaitingPlayer(((Player)sender).getName(), String.join(" ", args), ((Player)sender).getLocation()));
updateScoreBoardWaitingList();
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 "+getPlayerPosition((Player)sender)+" de la file d'attente");
return true;
}
else if (sender instanceof Player)
{ // un joueur du staff
if (args.length == 0) {
showWaintingList(sender);
sender.sendMessage(ChatColor.GOLD+"Pour connaitre les commandes, faites "+ChatColor.GRAY+"/staff ?");
return true;
}
else
{
return onCommand_admin_commands(sender, args);
}
}
else
{ // ce n'est pas un joueur (console)
if (args.length == 0) {
showWaintingList(sender);
return true;
}
else
{
return onCommand_admin_commands(sender, args);
}
}
}
private boolean onCommand_admin_commands(CommandSender sender, String[] args) {
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)
sender.sendMessage(ChatColor.GRAY+"/staff select <Joueur>"+ChatColor.RESET+" : prendre en charge un joueur de la file");
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 = getWaitingPlayer(args[1]);
if (wp == null) {
sender.sendMessage(ChatColor.RED+"Le joueur n'est pas dans la liste");
return true;
}
removePlayer(args[1]);
updateScoreBoardWaitingList();
Player p = plugin.getServer().getPlayerExact(wp.getPlayerName());
if (p != null && p.isOnline()) {
// le joueur est en ligne
sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------");
sender.sendMessage(p.getName()+ChatColor.RESET+" : "+wp.getMessage()+" - "+ChatColor.ITALIC+"Il y a "+TimeUtil.durationToString((new Date()).getTime() - wp.getDate().getTime()));
sender.sendMessage(ChatColor.GREEN+"Vous avez été téléporté vers ce joueur");
((Player)sender).teleport(p.getLocation());
sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------");
sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------");
p.sendMessage(((Player)sender).getDisplayName()+ChatColor.RESET+ChatColor.GREEN+" s'occupe maintenant de vous :)");
sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------");
}
else {
// le joueur n'est pas en ligne
sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------");
sender.sendMessage(wp.getPlayerName()+ChatColor.RESET+" : "+wp.getMessage());
sender.sendMessage(ChatColor.GREEN+"Vous avez été téléporté vers l'endroit concerné par la demande du joueur");
((Player)sender).teleport(wp.getLocation());
sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------");
sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------");
p.sendMessage(((Player)sender).getDisplayName()+ChatColor.RESET+ChatColor.GREEN+" s'occupe maintenant de vous :)");
sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------");
return true;
}
return true;
}
else if (args[0].equalsIgnoreCase("remove") && args.length > 1)
{
WaitingPlayer wp = getWaitingPlayer(args[1]);
if (wp == null) {
sender.sendMessage(ChatColor.RED+"Le joueur n'est pas dans la liste");
return true;
}
removePlayer(args[1]);
updateScoreBoardWaitingList();
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");
}
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("add") && args.length > 1)
{
Player p = plugin.getServer().getPlayer(args[1]);
if (p == null || !p.isOnline()) {
sender.sendMessage(ChatColor.RED+"Le joueur n'existe pas ou n'est pas en ligne");
return true;
}
WaitingPlayer wp = getWaitingPlayer(p.getName());
if (wp != null) {
sender.sendMessage(ChatColor.RED+"Le joueur est déjà dans la liste");
return true;
}
// on trafique le message pour 2 raisons :
// - on retire les paramètres qui ne font pas partie du message ("add" et le nom du joueur ajouté)
// - on les replaces par l'info sur le membre du staff qui l'a ajouté à la liste
args[0] = ChatColor.ITALIC+"(Ajouté par";
args[1] = sender.getName() +")"+ ChatColor.RESET;
String message = String.join(" ", args);
playerQueue.add(new WaitingPlayer(p.getName(),message, p.getLocation()));
updateScoreBoardWaitingList();
sender.sendMessage(ChatColor.GREEN+"Vous venez d'ajouter "+p.getDisplayName()+ChatColor.RESET+ChatColor.GREEN+" dans la file d'attente");
p.sendMessage(ChatColor.GREEN+sender.getName()+" vous a ajouté dans la file d'attente pour traiter votre demande plus tard");
return true;
}
return false;
}
private WaitingPlayer getWaitingPlayer(String p) {
for (WaitingPlayer wp : playerQueue)
{
if (wp != null && wp.getPlayerName().equalsIgnoreCase(p))
return wp;
}
return null;
}
private WaitingPlayer getWaitingPlayer(OfflinePlayer p) {
return getWaitingPlayer(p.getName());
}
private int getPlayerPosition(OfflinePlayer p) {
int i = 0;
for (WaitingPlayer wp : playerQueue)
{
if (wp != null && wp.getPlayerName().equalsIgnoreCase(p.getName()))
return i;
i++;
}
return -1;
}
private void removePlayer(String p) {
WaitingPlayer wp = getWaitingPlayer(p);
if (wp != null)
playerQueue.remove(wp);
}
private void removePlayer(OfflinePlayer p) {
removePlayer(p.getName());
}
private void showWaintingList(CommandSender sender) {
sender.sendMessage(ChatColor.BOLD+"----- File d'attente des joueurs pour le staff -----");
int i=0;
for (WaitingPlayer wp : 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+"-----------------------------------------------");
}
private void updateScoreBoardWaitingList() {
Objective obj = scoreboardPlayerQueue.getObjective("file_attente");
if (obj != null)
obj.unregister();
obj = scoreboardPlayerQueue.registerNewObjective("file_attente", "dummy");
obj.setDisplaySlot(DisplaySlot.SIDEBAR);
obj.setDisplayName(ChatColor.GOLD+"File d'attente staff");
int i=0;
for (WaitingPlayer wp : playerQueue) {
i++;
Player p = plugin.getServer().getPlayerExact(wp.getPlayerName());
String name;
if (p == null || !p.isOnline())
name = wp.getPlayerName();
else
name = p.getDisplayName();
String line = i+". "+name;
int boardPos = playerQueue.size()-i;
Score score = obj.getScore(plugin.getServer().getOfflinePlayer(line));
score.setScore(boardPos);
}
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Player p = event.getPlayer();
if (p.hasPermission("pandacraft.grade.staff"))
p.setScoreboard(scoreboardPlayerQueue);
updateScoreBoardWaitingList();
}
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
// lancer l'update un ou deux tick plus tard si ça ne marche pas comme ça
updateScoreBoardWaitingList();
}
private class WaitingPlayer {
private String player;
private String message;
private Date creationDate;
private Location location;
public WaitingPlayer(String p, String m, Location l) {
player = p;
message = m;
creationDate = new Date();
location = l;
}
public String getPlayerName() { return player; }
public String getMessage() { return message; }
public Date getDate() { return creationDate; }
public Location getLocation() { return location; }
}
}