Welcome to Bukkit France

Inscrivez-vous maintenant pour profiter d'un accès total à tout le contenu offert par la meilleur communauté Bukkit française ! Une fois inscrit et connecté, vous pourrez contribuez à la communauté en postant vos propres sujets et questions ou en répondant à ceux existants. Vous pourrez aussi customiser votre profil, recevoir des points de réputations, communiquer avec les autres membres via le chat, et plus encore! 

Dow1t

Membres
  • Compteur de contenus

    1123
  • Inscription

  • Dernière visite

Réputation sur la communauté

458 Aimé

À propos de Dow1t

  • Rang
    Novice en JAVA.

Informations de profil

  • Sexe Femme

Visiteurs récents du profil

5341 visualisations du profil
  1. [1.7.2] DataInputStream

    Merci beaucoup @TheElectronWill !   Donc au final dans mon plugin je me retrouve avec ceci ?   out.writeByte(1); out.writeByte(1); out.writeByte(1); out.writeDouble(5000.0D); out.writeDouble(6000.0D); out.writeUTF("Item1"); //Niveau client method getItemFrom(); out.writeShort(item.getTypeId()); out.writeShort(item.getAmount()); out.writeShort(item.getData().getData()); Map<Enchantment, Integer> enchants = item.getEnchantments(); out.writeByte(enchants.size()); // enchantsCount for(Map.Entry<Enchantment, Integer> entry : enchants.entrySet()) { Enchantment enchant = entry.getKey(); Integer level = entry.getValue(); out.writeByte(enchant.getId()); out.writeByte(level); } //fin method getItemFrom out.writeDouble(1.0D); return b.toByteArray();  
  2. [1.7.2] DataInputStream

    Merci @Yovach ! Je bloque ici je comprends pas vraiment comment envoyer les données   this.shopItem[i] = getItemFrom(in); //METHODE getItemFrom(in); private ItemStack getItemFrom(ByteArrayDataInput in) { int id = in.readShort(); int amount = in.readByte(); int data = in.readShort(); int enchantsCount = in.readByte();*/ ItemStack stack = new ItemStack(Item.getItemById(id), amount, data); for (int i = 0; i < enchantsCount; i++) { stack.addEnchantment(Enchantment.enchantmentsList[in.readByte()], in.readByte()); } return stack; }   encore merci !
  3. [1.7.2] DataInputStream

    VERSION: 1.7.2 IDE: Eclipse API: MCP 903 PROBLEME: envois de donnée par S3FPacketCustomPayload, Explication:   Bonjour BUKKIT ! Je rencontre un soucis donc je fais appel à vous ! J'utilise le packet S3FPacketCustomPayload pour envoyer des informations au client depuis le serveur. Pour cela, dans mon plugin j'envoie simplement le packet au joueur avec un taleau de byte[] comme ceci :   this.sendData("NTK|SHOP", e.getPlayer(), this.getShopInfo());   protected void sendData(String channel, Player p, byte[] data) { EntityPlayer entity = ((CraftPlayer)p).getHandle(); entity.playerConnection.sendPacket(new PacketPlayOutCustomPayload(channel, data)); }   La méthode getShopInfo :   protected byte[] getShopInfo() { ByteArrayOutputStream b = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(b); try { out.writeByte(1); out.writeByte(1); out.writeByte(1); out.writeDouble(5000.0D); out.writeDouble(6000.0D); out.writeUTF("Item1"); out.writeShort(513); out.writeByte(1); out.writeShort(1); out.writeInt(0); out.writeDouble(1.0D); return b.toByteArray(); } catch(Exception e) { e.printStackTrace(); return new byte[] { 0 }; } }   Côté client je regarde si le channel est "NTK|SHOP":   else if("NTK|SHOP".equalsIgnoreCase(p_147240_1_.func_149169_c())) { this.gameController.displayGuiScreen(new GuiShop(new ShopData(p_147240_1_.func_149168_d()))); }   Le shop data lui, récupère le nombre d'item dans le shop, le nom, id, prix de vente etc:   public class ShopData { public byte[] a; public ItemStack[] shopItem; private String[] shopItemName; private double[] sellPrice; private double[] buyPrice; private int shopItems; private double b; private byte c; public ShopData(byte[] bytes) { ByteArrayDataInput in = ByteStreams.newDataInput(bytes); this.c = in.readByte(); this.shopItems = in.readByte(); tableauSize(); for (int i = 0; i < this.shopItems; i++) { this.a[i] = in.readByte(); this.buyPrice[i] = in.readDouble(); this.sellPrice[i] = in.readDouble(); this.shopItemName[i] = in.readUTF(); this.shopItem[i] = getItemFrom(in); } this.b = in.readDouble(); } private ItemStack getItemFrom(ByteArrayDataInput in) { int id = in.readShort(); int amount = in.readByte(); int data = in.readShort(); int enchantsCount = in.readByte(); ItemStack stack = new ItemStack(Item.getItemById(id), amount, data); for (int i = 0; i < enchantsCount; i++) { stack.addEnchantment(Enchantment.enchantmentsList[in.readByte()], in.readByte()); } return stack; } public int getTotalItems() { return this.shopItems; } public byte a(int i) { return this.a[i]; } public ItemStack getShopItem(int i) { return this.shopItem[i]; } public String getShopItemName(int i) { return this.shopItemName[i]; } public byte c() { return this.c; } public double b() { return this.b; } public double getBuyPrice(int i) { return this.buyPrice[i]; } public double getSellPrice(int i) { return this.sellPrice[i]; } private void tableauSize() { this.a = new byte[this.shopItems]; this.shopItem = new ItemStack[this.shopItems]; this.shopItemName = new String[this.shopItems]; this.buyPrice = new double[this.shopItems]; this.sellPrice = new double[this.shopItems]; }   (C'est un code repris [AVEC AUTORISATION] )   Le problème est que niveau plugin je ne comprends pas comment je dois envoyer le packet pour que le client fasse ceci :   ByteArrayDataInput in = ByteStreams.newDataInput(bytes); this.c = in.readByte(); this.shopItems = in.readByte(); tableauSize(); for (int i = 0; i < this.shopItems; i++) { this.a[i] = in.readByte(); this.buyPrice[i] = in.readDouble(); this.sellPrice[i] = in.readDouble(); this.shopItemName[i] = in.readUTF(); this.shopItem[i] = getItemFrom(in); } this.b = in.readDouble();   Merci à vous ! bonne journée
  4. [1.7.2] DataInputStream -> readUTF(); : writeUTF();

    En effet ! Faute d'attention de ma part merci !
  5. VERSION: 1.7.2 IDE: Eclipse API: MCP 903 PROBLEME: envois de donnée par S3FPacketCustomPayload, readUTF est vide Explication:   Bonjour BUKKIT ! Je rencontre un soucis donc je fais appel à vous ! J'utilise le packet S3FPacketCustomPayload pour envoyer des informations au client depuis le serveur. Pour cela, dans mon plugin j'envoie simplement le packet au joueur avec un taleau de byte[] comme ceci :   public void sendItem(ItemStack is) { this.sendData("BKT|ITEM", toByte(is)); }   protected void sendData(String channel, Player p, byte[] data) { EntityPlayer entity = ((CraftPlayer)p).getHandle(); entity.playerConnection.sendPacket(new PacketPlayOutCustomPayload(channel, data)); }   protected byte[] toByte(ItemStack is) { int offers = this.getOffers(); int offerID = 1234; int itemID = is.getTypeId(); short durability = is.getDurability(); int amount = is.getAmount(); int price = 999; long expi = 999; String name = "MyItems"; String sellerName = "Dow1t"; byte[] enchantIDs = new byte[100]; byte[] enchantLevels = new byte[100]; int i = 0; for(Entry<Enchantment, Integer> e : is.getEnchantments().entrySet()) { enchantIDs[i] = (byte) e.getKey().getId(); enchantLevels[i] = (byte) e.getValue().intValue(); Bukkit.broadcastMessage("ENCHANTS ?: " + i + " - : - " + enchantIDs[i] + " - : - " + enchantLevels[i]); i++; } ByteArrayOutputStream b = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(b); try { out.writeByte(1); out.writeInt(offers); out.writeInt(offerID); out.writeInt(itemID); out.writeShort(durability); out.writeInt(amount); out.writeInt(price); out.writeLong(expi); out.writeUTF(name); out.writeUTF(sellerName); out.writeInt(i); out.write(enchantIDs); out.write(enchantLevels); return b.toByteArray(); } catch(Exception e) { e.printStackTrace(); return new byte[] { 0 }; } }   Le problème est que niveau client quand je le récupère, le name et sellerName sont comme vide: ""   else if("WPX|HDV".equalsIgnoreCase(p_147240_1_.func_149169_c())) { byte[] data = p_147240_1_.func_149168_d(); try { ByteArrayInputStream bais = new ByteArrayInputStream(data); DataInputStream is = new DataInputStream(bais); /** * @param 1 -> ADD * @param 2 -> CLEAR * @param 4 -> OPEN * @param 6 -> PING */ byte flags = is.readByte(); boolean add = (flags & 0x1) != 0; boolean clear = (flags & 0x2) != 0; boolean open = (flags & 0x4) != 0; boolean ping = (flags & 0x8) != 0; System.out.println("flags is:" + flags + " is add ? " + add + " is clear ?" + clear + " is open ?" + open + " is ping ?" + ping); if(clear) { this.gameController.theClient.getClient().getShop().clearALL(); Warphoenix.getClient().getLogger().info("Deleting all offers from shop !"); } if(open) { //this.gameController.displayGuiScreen(); } int n = is.readInt(); System.out.println("nombre d'offre : " + n); for(int i = 0; i < n; i++) { int offerID = is.readInt(); System.out.println("l'id de l'offre est: " + offerID); if(add) { int id = is.readInt(); System.out.println("ItemID : " + id); short dura = (short)is.readUnsignedShort(); System.out.println("Item dura : " + dura); int amount = is.readInt(); System.out.println("Item amount : " + amount); int price = is.readInt(); System.out.println("Item price : " + price); long expiration = System.currentTimeMillis() + is.readInt() * 1000; System.out.println("Item expi : " + expiration); String customName = is.readUTF(); System.out.println("Item name : " + customName); //DEUX DEBUG POUR ESSAYER this.gameController.thePlayer.addChatMessage(new ChatComponentText("LE NOM DE LITEM EST: " + customName)); String sellerName = is.readUTF(); System.out.println("Item seller : " + sellerName); int enchantAmount = is.readInt(); System.out.println("Enchant amount is: " + enchantAmount); byte[] enchantIDs = new byte[enchantAmount]; System.out.println("Enchant ID is: " + enchantIDs); byte[] enchantLevels = new byte[enchantAmount]; System.out.println("Enchant LEVEL is: " + enchantLevels); for (int b = 0; b < enchantAmount; b = b + 1) { enchantIDs[b] = ((byte)is.readUnsignedByte()); enchantLevels[b] = ((byte)is.readUnsignedByte()); System.out.println("ADD ENCHANT: " + enchantIDs[b] + " level is :" + enchantLevels[b]); } ShopOffer o = new ShopOffer(offerID, id, dura, amount, price, expiration, customName, sellerName, enchantIDs, enchantLevels); System.out.println("Addind item: " + o); this.gameController.theClient.getClient().getShop().addItemToShop(o); } else { boolean sold = is.readBoolean(); this.gameController.theClient.getClient().getShop().sellOffer(offerID, sold); } } } catch(IOException e) { }   LE DEBUG EST :   flags is:1 is add ? true is clear ?false is open ?false is ping ?false N is: 1 offer is: 1234 ItemID is :538 ItemID dura :0 ItemID amount :1 ItemID price :999 ItemID expi :1516795759990 Item name :   mais il ne va pas plus loin   Merci de votre aide ! bonne journée !
  6. Skype bot in java

    Un tableau commence de 0 en java c'est pas comme ceci ?   if(args[0] != null && !args[0].equals(""))return args[0];
  7. une commande /<kit> avec un un tab complation

    Tu aura besoin d'utiliser la bonne méthode et la bonne implémentation pour ça !   public class BukkitTabComplete implements TabCompleter   Eclipse va te demander d'ajouter une méthode automatiquement;   public List<String> onTabComplete(CommandSender paramCommandSender, Command paramCommand, String paramString, String[] paramArrayOfString) { }   c'est les même paramètre pour une commande sauf que cette méthode ci ne renvois pas boolean mais une liste de string   Utilisation simple, tu vérifie si la commande est "/kit"   if (paramCommand.getName().equalsIgnoreCase("kit")) {}   ensuite on va utiliser un iterator pour lister les kits du joueur comme ceci:   if (!paramArrayOfString[1].isEmpty()) { Object kitList = pw.getOwnedKits(); // ArrayList tabContent = new ArrayList(); Iterator it; for (it = ((List)kitList).iterator(); it.hasNext();) { String str1 = (String)it.next(); String str2 = paramArrayOfString[1].toLowerCase(); if (str1.toLowerCase().startsWith(str2)) { tabContent.add(str1); } } return localArrayList; } Object kitList = pw.getOwnedKits(); Collections.sort((List)kitList); return (List<String>)kitList;   En espérant que ta méthode  getOwnedKits return quelque chose comme ceci :   public static ArrayList<String> getBoats() { try { ArrayList localArrayList = new ArrayList(); Iterator localIterator = Main.getPlugin().getConfig().getConfigurationSection("Boats").getKeys(false).iterator(); while (localIterator.hasNext()) { String str = (String)localIterator.next(); localArrayList.add(str); } return localArrayList; } catch (Exception localException) {} return null; }   Cest un code que j'ai récupérer dans un de mes anciens plugin de bateau (le but était de prendre le contrôle du bateau)
  8. [1.7.2] ItemStack depuis un String

    Mais ce n'est pas vraiment pour envoyer des items stack c'est juste quelques essais que je fais. Mais je me tourne déjà vers les packet   L'item stack est juste pour savoir si niveau client on sait deserializer ou non le toString    Merci de ta réponse rapide ! 
  9. VERSION: 1.7.2 IDE: Eclipse API : MCP 903 Problème rencontré : Convertir un String en ItemStack Explications:   Bonjour Bukkit ! Je fais appel à vous car je tourne en rond depuis pas mal de temps. Après avoir chercher sur le net (à mon avis j'ai mal chercher ou je me suis mal exprimé) j'aimerais savoir si vous savez m'aider. J'essaie de faire parvenir des informations depuis le serveur jusqu'au client. Pour l'exemple ci, j'ai des bottes en ONYX x1 avec un nom : "&eItemname" et un lore "test" avec deux enchantements: protection 4; unbreaking 3 J'ai donc créer une simple commande pour envoyer un message au joueur avec donc:   ItemStack is = p.getItemInHand(); p.sendMessage("[SOME-CODE] " + is.toString()); Quand je l'envoie, côté joueur je reçoit ceci :   ItemStack{ONYX_BOOTS x 1, UNSPECIFIC_META:{meta-type=UNSPECIFIC, display-name=Itemname, lore=[test], enchants={DURABILITY=1, PROTECTION_ENVIRONMENTAL=4}}}   Donc dans le NetHandlerPlayClient dans la méthode handleChat, je récupère simplement le message   public void handleChat(S02PacketChat p_147251_1_) { String unFormattedMsg = p_147251_1_.func_148915_c().getUnformattedText(); String prefix = "[SOME-CODE] "; if(unFormattedMsg.startsWith(prefix)) { String unFormattedMsgSub = unFormattedMsg.substring(prefix.length()); //ItemStack is = ItemTransformer.getItemFromData(unFormattedMsgSub); } }   Le soucis est que je ne vois pas comment je peux récupérer l'item il n'y a pas de méthode fromString ou deserialize ? Merci à vous !
  10. [PACKET S3FPacketCustomPayload] Quelques questions

    Merci énormément @toss pour tes explications !   @PimaPvP j'ai demandé à l'auteur son accord pour me servir de son packet SKT|HDV reprendre toute ma méthode.   Je vais essayer ça dès que j'ai accès à mon pc merci beaucoup à vous tous   ! 
  11. [PACKET S3FPacketCustomPayload] Quelques questions

    Salut ! Wow merci pour cette explication. Ce code je l'ai trouvé dans un client dans la class NetHandlerPlayClient dans la méthode :   public void handleCustomPayload(S3FPacketCustomPayload p_147240_1_)   Et je vais pas le cacher, je vais le prendre pour m'en servir (j'ai demander à l'auteur il est d'accord).   Serais tu juste m'expliquer, comment je dois faire pour envoyer ce fameux packet S3FPacketCustomPayload au client depuis mon serveur ? Quels informations je dois mettre dedans ? Admettons que je garde le code tel quel.   Parceque j'ai trouver cette méthode aussi :   public static void updateItem(Offer offer) { if (offer == null) { return; } ByteArrayOutputStream os = new ByteArrayOutputStream(); DataOutputStream d = new DataOutputStream(os); try { d.writeByte(1); d.writeInt(offer.offerID); Minecraft.getMinecraft().getNetHandler().addToSendQueue(new S3FPacketCustomPayload("SKT|HDV", os.toByteArray())); d.close(); os.close(); } catch (IOException e) { e.printStackTrace(); } }   Mais je ne comprends pas vraiment Mise à part qu'on write un byte = 1 et un int = l'id de l'offre et qu'on envoi le tout au serveur.   Depuis le serveur (un plugin) comment je vais pour envoyer le packet ? avec les bons bytes etc ? Depuis le client comment j'envoie le packet au serveur ? là j'ai juste la méthode updateItem() mais c'est tout. Je ne comprends pas vraiment le système des bytes   (flags & 0x1) <=> ('0b00000110' & '0b00000001') == '0b00000000' == 0 (flags & 0x2) <=> ('0b00000110' & '0b00000010') == '0b00000010' == 2 != 0 (flags & 0x4) <=> ('0b00000110' & '0b00000100') == '0b00000100' == 4 != 0   Dans la méthode updateItem on peux voir d.writeByte(1) je suppose que le flag vaut 1 dans ce cas ?   Encore merci à toi @toss !
  12. VERSION: MCP 903 IDE: Eclipse API: MCP Problème : S3FPacketCustomPayload Explications :   Bonjour bukkit ! J'aimerais savoir si l'un d'entre vous à déjà utiliser le Packet S3FPacketCustomPayload. Car je ne comprends pas vraiment comment il fonctionne Il m'intrigue car j'ai trouver un code ici :   else if("SKT|HDV".equalsIgnoreCase(p_147240_1_.func_149169_c())) { byte[] data = p_147240_1_.func_149168_d(); try { ByteArrayInputStream bais = new ByteArrayInputStream(data); DataInputStream is = new DataInputStream(bais); byte flags = is.readByte(); boolean add = (flags & 0x1) != 0; boolean clear = (flags & 0x2) != 0; boolean open = (flags & 0x4) != 0; boolean ping = (flags & 0x8) != 0; if(clear) { HdvUtils.clearALL(); } if(open) { this.gameController.displayGuiScreen(new GuiYesNo(new GuiScreen() { public void confirmClicked(boolean ok, int i) { if(ok) { HdvUtils.trySomeCode(); } Minecraft.getMinecraft().displayGuiScreen(null); } }, I18n.format("multiplayer.texturePrompt.line1", new Object[0]), I18n.format("multiplayer.texturePrompt.line2", new Object[0]), 0)); } int n = is.readInt(); for(int i = 0; i < n; i++) { int offerID = is.readInt(); if(add) { short id = (short)is.readUnsignedShort(); short dura = (short)is.readUnsignedShort(); byte amount = (byte)is.readUnsignedByte(); int price = is.readInt(); long expiration = System.currentTimeMillis() + is.readInt() * 1000; String customName = is.readUTF(); String sellerName = is.readUTF(); byte enchantAmount = (byte)is.readUnsignedByte(); byte[] enchantIDs = new byte[enchantAmount]; short[] enchantLevels = new short[enchantAmount]; for (byte b = 0; b < enchantAmount; b = (byte)(b + 1)) { enchantIDs[b] = ((byte)is.readUnsignedByte()); enchantLevels[b] = ((short)is.readUnsignedShort()); } HdvItem o = new HdvItem(offerID, id, dura, amount, price, expiration, customName, sellerName, enchantIDs, enchantLevels); HdvUtils.addItemToHDV(o); } else { boolean sold = is.readBoolean(); HdvUtils.sellHdvItem(offerID, sold); } } if(ping) { long pingDelay = is.readByte() ^ 0x55; int pingID = is.readInt(); Minecraft.getMinecraft().HASH_PING.put(Long.valueOf(System.nanoTime() + pingDelay * 1000000000L), Integer.valueOf(pingID)); } } catch(IOException e) { } }   mais je comprends pas vraiment les bytes etc :/   merci !  
  13. Communiquer entre plugins et mods et inversement

    Salut ceci peut t'aider ? https://www.minecraftforgefrance.fr/showthread.php?tid=1118
  14. [1.7.2][MCP] nom de faction au dessus des joueurs

    Bonjour à vous je tiens a vous remercier pour vos réponses rapides !   J'ai effectuer quelques changement pour avoir une petite facilité supplémentaire pour envoyer le pseudo du chef par packet, j'ai changer entity player par string Ensuite j'ai changer ma HashMap par une ArrayList<Faction>   Voilà les codes modifiés :   RENDER:   if(p_147906_1_ instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)p_147906_1_; Faction own_faction = Warphoenix.getClient().getFactionManager().getPlayerFaction(Minecraft.getMinecraft().getSession().getUsername()); Faction his_faction = Warphoenix.getClient().getFactionManager().getPlayerFaction(player.getCommandSenderName()); Relation relation = Warphoenix.getClient().getFactionManager().getRelationWithFaction(own_faction, his_faction); int string_lenght = -var12.getStringWidth(relation.getRelationColor() + his_faction.getFactionName() + " §7(§e" + his_faction.getFactionRank() + "§7)") / 2; var12.drawString(tag + p_147906_2_, -var12.getStringWidth(tag + p_147906_2_) / 2, var16, 553648127); if(SHOW_FACTION) { var12.drawString(relation.getRelationColor() + his_faction.getFactionName() + " §7(§e" + his_faction.getFactionRank() + "§7)", string_lenght, -6, 553648127); } }   @Override public void readPacketData(PacketBuffer var1) throws IOException { this.owner = var1.readStringFromBuffer(32767); this.f_name = var1.readStringFromBuffer(32767); this.rank = var1.readVarIntFromBuffer(); } @Override public void writePacketData(PacketBuffer var1) throws IOException { var1.writeStringToBuffer(this.owner); var1.writeStringToBuffer(this.f_name); var1.writeInt(this.rank); } ICI je suis toujours bloquer pour write ces arraylist : private ArrayList<String> members; private ArrayList<Faction> allies; private ArrayList<Faction> enemys; Je ne sais pas si je dois faire une boucle for (String s : this.members) { var1.writeStringToBuffer(s); } ou autrement   public Faction(String owner, String f_name, int rank, ArrayList<String>members, ArrayList<Faction>allies, ArrayList<Faction>enemys) { this.setFactionOwner(owner); this.setFactionName(f_name); this.setFactionRank(rank); this.setFactionMembers(members); this.setFactionAllies(allies); this.setFactionEnemys(enemys); this.real_faction = true; } public Faction(String owner, String f_name, int rank) { this.setFactionOwner(owner); this.setFactionName(f_name); this.setFactionRank(rank); this.real_faction = false; } private ArrayList<Faction> FACTIONS = new ArrayList<Faction>(); public FactionManager() { Faction fac = new Faction("Toto", "Domos", 55, new ArrayList<String>(), new ArrayList<Faction>(), new ArrayList<Faction>()); Faction fac2 = new Faction("Dow1t", "Minecraft", 1, new ArrayList<String>(), new ArrayList<Faction>(), new ArrayList<Faction>()); this.addNewFaction(fac); this.addNewFaction(fac2); } public void addNewFaction(String owner, String f_name, int rank, ArrayList<String>members, ArrayList<Faction>allies, ArrayList<Faction>enemys) { Faction faction = new Faction(owner, f_name, rank, members, allies, enemys); this.addNewFaction(faction); } public void addNewFaction(Faction f) { System.out.println("Adding new faction in data: " + f.getFactionName() + " Owner is: " + f.getFactionOwner()); System.out.println(this.ref.CUT); if(!this.factionAlreadyExist(f)) { this.FACTIONS.add(f); } } public boolean factionAlreadyExist(Faction f) { for(Faction faction : this.FACTIONS) { if(faction.getFactionName().equals(f.getFactionName())) { return true; } return false; } return false; }   Encore merci  !
  15. Authme

    Pourtant c'est un bug qu'il ont fixé il y a un bail ^^   Je me souviens de la faille en 1.4.7 ou tu prennais comme pseudo //// + PseudoAdmin pour être op sinon par exemple y'avais aussi Toto qui était OP si tu te connectais entant que ToTO tu était op aussi. Mais essentials l'a patch   je vais voir ce que je peux faire