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;
+ }
+
}