From f9504340307be2bd7c86eb2e8fed8873c11bfe5a Mon Sep 17 00:00:00 2001 From: Marc Baloup Date: Sun, 8 Feb 2015 22:28:57 -0500 Subject: [PATCH] =?UTF-8?q?Ajout=20de=20la=20requ=C3=AAte=20plater=5Flist?= =?UTF-8?q?=20dans=20le=20networkAPI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NetworkAPI protocole.md | 29 +++++++--- make_jar.jardesc | 2 +- resources/plugin.yml | 2 +- .../modules/PacketOutServerInfoListener.java | 39 ++++++-------- .../network_api/NetworkAPI.java | 14 ++--- .../pandacraftutils/network_api/Response.java | 11 +++- .../RequestExecutorPlayerList.java | 54 +++++++++++++++++++ .../pandacraftutils/players/OnlinePlayer.java | 11 ++++ .../players/OnlinePlayerManager.java | 20 +++++-- 9 files changed, 136 insertions(+), 46 deletions(-) create mode 100644 src/net/mc_pandacraft/java/plugin/pandacraftutils/network_api/request_executors/RequestExecutorPlayerList.java diff --git a/NetworkAPI protocole.md b/NetworkAPI protocole.md index a95b4d3..f32a337 100644 --- a/NetworkAPI protocole.md +++ b/NetworkAPI protocole.md @@ -41,13 +41,28 @@ Pareil que `command` mais cette fois, celle-ci n'est pas forcément exécutée d #### `broadcast` Affiche un message sur le chat pour tout le monde connecté. -Le message passé dans la partie **donnée** est diffusé +Le message passé dans la partie **donnée** est diffusé en convertissant les codes couleurs `&x` en `§x` #### `player_list` -Renvoi la liste des joueurs connectés visibles, avec quelques infos utiles en convertissant les codes couleurs `&x` en `§x` +Renvoi la liste des joueurs connectés, avec quelques infos utiles. + +Si la partie **donnée** de la requête contient `op` et seulement ça (c'est à dire que `data.trim().equalsIgnoreCase("op")` doit être vrai), la liste des joueurs contiendra +aussi les joueurs vanish. Sinon, les joueurs vanish ne seront pas inclus dans la liste retournée + +La première ligne de la réponse sera de la forme `5/30` avec le premier nombre représentant le nombre de joueur retourné, et le deuxième nombre étant le nombre de slots disponible sur le serveur. Le tout est suivi d'un `\n`. + +Ensuite, une ligne pour un joueur. Chaque ligne, séparé par un `\n`, aura cette forme : + + Pseudojoueur\0§f[§4Admin§f]§4Pseudojoueur§r\01\0creative;20;20\01 + +Chaque information sur une ligne sera séparé par un `\0` représentant le caractère NULL. Les informations données sont les suivantes : + +1. Pseudo réel du joueur (répondant à la regex `[A-Za-z0-9_]{2,16}`) +2. Pseudo du joueur tel qu'il est affiché IG (avec le préfixe et le suffixe, + éventuellement un nickname, et les codes couleurs de la forme `§x`) +3. `1` si le joueur est actif, `0` si il est AFK. +4. 3 informations séparés par des `;`
- Gamemode du joueur
- Point de vie arrondi à l'unité
- Point de faim arrondi à l'unité +5. `1` si le joueur est visible, `0` si il est vanish. -#### `player_list_op` -Renvoi la liste de tous les joueurs connectés (même vanish), avec quelques infos utiles en convertissant les codes couleurs `&x` en `§x` ## Structure d'une réponse La réponse est construite en mode texte, sur plusieurs lignes. Chaque ligne se fini par un '\n' : @@ -71,7 +86,7 @@ Réponse à une commande inexistante Réponse à une requête de type `player_list` OK - 56 - player\0disp_name - marcbal\0§f[§4Admin§f]§4marcbal§r + 52 + 1/30 + marcbal\0§f[§4Admin§f]§4marcbal§r\01\01;20;20\01 diff --git a/make_jar.jardesc b/make_jar.jardesc index 8bd8e9f..8bc5d8e 100644 --- a/make_jar.jardesc +++ b/make_jar.jardesc @@ -1,6 +1,6 @@ - + diff --git a/resources/plugin.yml b/resources/plugin.yml index 4f1ff3b..4cc7b23 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.5 +version: 3.6 diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/PacketOutServerInfoListener.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/PacketOutServerInfoListener.java index b365cfc..7192bcb 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/PacketOutServerInfoListener.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/PacketOutServerInfoListener.java @@ -2,6 +2,7 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.modules; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.List; import org.bukkit.entity.Player; @@ -18,7 +19,6 @@ import net.mc_pandacraft.java.plugin.pandacraftutils.ConfigManager; import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils; import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayer; import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayerManager; -import net.mc_pandacraft.java.plugin.pandacraftutils.plugin_interface.EssentialsInterface; public class PacketOutServerInfoListener { private PandacraftUtils plugin = PandacraftUtils.getInstance(); @@ -39,7 +39,7 @@ public class PacketOutServerInfoListener { @Override public void onPacketSending(PacketEvent event) { - Player[] pl_list = PacketOutServerInfoListener.this.plugin.getServer().getOnlinePlayers(); + Collection pl_list = OnlinePlayerManager.getAllNotVanished(); int count_player = 0; @@ -50,28 +50,21 @@ public class PacketOutServerInfoListener { List plPlayerPremium = new ArrayList(); List plPlayer = new ArrayList(); - for (Player p : pl_list) + for (OnlinePlayer op : pl_list) { - if (p != null && p.isOnline()) - { - // on passe si le joueur est vanish - if(EssentialsInterface.isPlayerVanished(p)) continue; - - OnlinePlayer op = OnlinePlayerManager.get(p); - - if (op.isInGroup("admins")) - plAdmin.add(p); - else if (op.isInStaff()) - plStaff.add(p); - else if (op.isInGroup("ultimate")) - plPlayerUltimate.add(p); - else if (op.isInGroup("premium")) - plPlayerPremium.add(p); - else - plPlayer.add(p); - - count_player++; - } + + if (op.isInGroup("admins")) + plAdmin.add(op.getPlayer()); + else if (op.isInStaff()) + plStaff.add(op.getPlayer()); + else if (op.isInGroup("ultimate")) + plPlayerUltimate.add(op.getPlayer()); + else if (op.isInGroup("premium")) + plPlayerPremium.add(op.getPlayer()); + else + plPlayer.add(op.getPlayer()); + + count_player++; } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/network_api/NetworkAPI.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/network_api/NetworkAPI.java index e43fede..797a90d 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/network_api/NetworkAPI.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/network_api/NetworkAPI.java @@ -3,6 +3,7 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.network_api; import net.mc_pandacraft.java.plugin.pandacraftutils.network_api.request_executors.RequestExecutorBroadcast; import net.mc_pandacraft.java.plugin.pandacraftutils.network_api.request_executors.RequestExecutorCommand; import net.mc_pandacraft.java.plugin.pandacraftutils.network_api.request_executors.RequestExecutorCommandAsync; +import net.mc_pandacraft.java.plugin.pandacraftutils.network_api.request_executors.RequestExecutorPlayerList; public class NetworkAPI { @@ -13,21 +14,14 @@ public class NetworkAPI { /* * Initialisation des exécuteurs des commandes réseau - * LEs constructeurs s'occupent eux même de se référencer dans l'instance de la classe NetworkAPIListener + * Les constructeurs s'occupent eux même de se référencer dans l'instance de la classe NetworkAPIListener */ new RequestExecutorCommand(); new RequestExecutorBroadcast(); new RequestExecutorCommandAsync(); + new RequestExecutorPlayerList(); } - /* - public static void main(String[] args) throws Throwable { - loadNewInstance(); - - System.out.println(NetworkAPIListener.getInstance().getCommandList()); - - NetworkAPIListener.getInstance().join(); - } - */ + } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/network_api/Response.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/network_api/Response.java index b125cc5..73a3852 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/network_api/Response.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/network_api/Response.java @@ -7,12 +7,21 @@ public class Response { public String data = ""; + public Response(boolean good, String data) { + this.good = good; + this.data = data; + } + + public Response() { + } + + public void sendPacket(PrintStream out) { if (data == null) data = ""; out.print((good?"OK":"ERROR")+"\n"); - out.print(data.length()+"\n"); + out.print(data.getBytes().length+"\n"); out.print(data); out.flush(); } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/network_api/request_executors/RequestExecutorPlayerList.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/network_api/request_executors/RequestExecutorPlayerList.java new file mode 100644 index 0000000..4461e8a --- /dev/null +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/network_api/request_executors/RequestExecutorPlayerList.java @@ -0,0 +1,54 @@ +package net.mc_pandacraft.java.plugin.pandacraftutils.network_api.request_executors; + +import java.util.Collection; + +import net.mc_pandacraft.java.plugin.pandacraftutils.network_api.Response; +import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayer; +import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayerManager; + +public class RequestExecutorPlayerList extends AbstractRequestExecutor { + + public RequestExecutorPlayerList() { + super("player_list"); + } + + @Override + protected Response run(String data) { + + boolean ope = data.trim().equalsIgnoreCase("op"); + + Collection players = ope ? + OnlinePlayerManager.getAll() : + OnlinePlayerManager.getAllNotVanished(); + + char nul = '\u0000', nl = '\n'; + + StringBuilder returnData = new StringBuilder(); + + // d'abord, le nombre de connecté / le nombre de slot + returnData.append(players.size()+"/"+plugin.getServer().getMaxPlayers()+nl); + + for (OnlinePlayer op : players) { + + returnData.append(op.getPlayer().getName()); + + returnData.append(nul+op.getPlayer().getDisplayName()); + + returnData.append(nul+(op.isAfk()?"0":"1")); + + + returnData.append(nul+op.getPlayer().getGameMode().toString()); + returnData.append(';'+op.getPlayer().getHealth()); + returnData.append(';'+op.getPlayer().getFoodLevel()); + + + returnData.append(nul+(op.isVanished()?"0":"1")); + + returnData.append(nl); + } + + + return new Response(true, returnData.toString()); + } + +} diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OnlinePlayer.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OnlinePlayer.java index f22f772..fd07947 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OnlinePlayer.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OnlinePlayer.java @@ -249,6 +249,17 @@ public class OnlinePlayer { + /** + * Indique si le joueur est vanish, en se basant sur le plugin Essentials, qui + * gère cette foncionnalitée + */ + public boolean isVanished() { + return EssentialsInterface.isPlayerVanished(player); + } + + + + diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OnlinePlayerManager.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OnlinePlayerManager.java index 64efc53..a70b490 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OnlinePlayerManager.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OnlinePlayerManager.java @@ -1,7 +1,10 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.players; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; +import java.util.Map; import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils; @@ -33,7 +36,7 @@ public final class OnlinePlayerManager implements Listener { - HashMap players = new HashMap(); + Map players = Collections.synchronizedMap(new HashMap()); private OnlinePlayerManager() { @@ -80,12 +83,23 @@ public final class OnlinePlayerManager implements Listener { } public static Collection getAll() { - return getInstance().players.values(); + return new ArrayList(getInstance().players.values()); } - public static boolean contains(Player p) { + public static boolean isOnline(Player p) { return getInstance().players.containsKey(p); } + public static Collection getAllNotVanished() { + Collection players = getAll(); + + for (OnlinePlayer op : players.toArray(new OnlinePlayer[players.size()])) { + if (op.isVanished()) + players.remove(op); + } + + return players; + } + }