Erreur Java

Résolu
Bonjour !

Quand je tape une commande qu'est censée me give un item dans un jeu alors que je suis admin etc tout ce que l'on veut, voilà sur quoi est-ce que je tombe. Quelqu'un peut-il m'aider à y voir plus clair ?
Merci par avance pour vos réponses.

6 réponses

Résumé de la discussion

La discussion porte sur une commande censée invoquer un item en jeu et analyse les paramètres, notamment le format additem:itemId:stack et la valeur STACK qui détermine la quantité à donner. La réponse la plus pertinente pointe vers la ligne 131 de itemSpawnPacket et précise que la commande se construit ainsi:additem:itemId:stack, STACK représentant la quantité à attribuer dans l'objet. D'autres contributions recommandent d'examiner les fichiers Java et les messages d'erreur associés, puis d'utiliser JD-GUI pour inspecter les classes exécutées et identifier les sources exactes du spawn dans le projet. Enfin, des remarques évoquent aussi des options comme localiser le code dans des fichiers .class ou dans une base de données et retiennent que le paramètre clé est bien le nombre d'items.

Bobot (l’IA à votre service)
  1. Modérateur
    Bonjour,

    Ton serveur tu ne sais pas comment il fonctionne, et tu vas avoir une erreur puis une autre, etc. jusqu'à peut-être arriver à un moment où ça marche.

    Mais on ne sait pas combien il y a d'erreurs à corriger et ton manque d'autonomie va faire qu'à chaque nouvelle erreur tu vas créer une discussion à laquelle ce sera la croix et la bannière pour corriger le problème...

    Donc je ne sais pas ce que tu as tapé comme commande ici, mais apparemment elle est incomplète, le programme attends (au moins) deux valeurs, mais la valeur "1" (donc la deuxième) n'existe pas.
    1. Pour t'expliquer, en clair la commande tapée est ",additem:VALUE", et là j'ai tapé ,additem:201071002 , qui correspond donc à un certain objet (l'ID est trouvé dans la database, et la commande dans un .txt avec les commandes), je suis perdu
    2. et la commande ,guildcreate:NAME ,quant-à-elle fonctionne correctement, donc la structure de la commande est correcte !
    3. Modérateur
      Ce n'est pas parce qu'une commande fonctionne que les autres sont forcément bonnes, regarde notre test avec .serverstatus et .ping dans ton autre discussion.
      Les deux étaient listés dans le .help mais bien que .ping fonctionne, .serverstatus ne fonctionnait pas...

      Dans la mesure où on ne sait pas vraiment ce qu'il y a dans le code, on peut aussi très bien imaginer que tu essayes de faire fonctionner une commande qui n'a jamais marché...
    4. Comment est-ce que je pourrais savoir comment me give un item ?
    5. Modérateur
      @EzekhxC'est du code spécifique à ton programme, donc soit c'est documenté, soit il faut aller chercher dans le code comment ça fonctionne...


  2. Voilà, j'ai vu ce truc là dans un de mes dossiers nommé "commands"
    1. Modérateur
      Vu que tu as l'air d'avoir accès au code, il faut s'intéresser aux lignes de codes qui sont marqués dans tes messages d'erreurs (et le code de contexte autour).

      • ItemSpawner.java ligne 17
      • ChatParser.java ligne 204
      • Chat.java ligne 239
      • GameServer.java ligne 195
    2. Donc je trouve où ces fameuses lignes de codes ? Dans la database HeidiSQL ou dans le fichier java ?
    3. Modérateur
      @EzekhxLes deux images que tu as montré précédemment c'est du code...
      Après, le mieux serait de le récupérer directement à la source, dans les fichiers .class qui sont exécutés par le programme (avec JD-GUI par exemple)
    4. Je m'en occupe de suite !
  3. Voilà les quelques lignes de codes apparemment du JAVA, mais il y a une dizaine de fichiers java dans mon fichier commandes, donc comment savoir lequel est le bon ?


    1. Modérateur
      Les fichiers que tu as là sont les bons (sous réserve qu'il n'y ait pas d'écarts entre le code et le programme compile).

      Pour le nom de dossiers ça se voit dans ton message d'erreur.
      Par exemple pour la première ligne, le code source sera dans
      chat/chatCommandHandlers/ItemSpawner.java
    2. Modérateur
      Par contre le plus simple c'est de copier-coller le code plutôt que de faire des impressions écrans et de ne pas oublier de cibler les lignes concernées par l'erreur.
    3. Oups, je le ferai dès maintenant


  4. Voilà ce que j'ai dans chat/chatCommandHandlers/ItemSpawner.java
    1. Modérateur
      Donc, comme je l'indiquais dans le premier message, la commande est incomplète, le programme attends (au moins) deux valeurs, en l’occurrence des entiers, que l'on voit dans le code :
      Integer.parseInt(parameters[1])
      et qui provoque l'erreur
      ArrayIndexOutOfBoundsException: 1
      car le tableau
      parameters
      ne contient pas la valeur 1...
    2. Donc du coup plus facilement, que dois-je faire ?
    3. Modérateur
      Il faudrait le reste du code... Là ça ne fait que confirmer ce que j'avais compris du message d'erreur. En particulier il faudrait savoir comment le programme calcule les paramètres afin de savoir pourquoi il n'en a qu'un au lieu des deux attendus. Mais cette partie là ne se fait pas dans le code de ItemSpawner donc il me faudrait les trois autres.
    4. Oula, jusque là encore je comprenais mais là je brasse grave ! Quels éléments te faudrait-il pour pouvoir comprendre ce qu'il manque ? Je peux t'expliquer un peu ce que j'ai fait pour avoir les fichiers etc ou même t'envoyer carrément le tuto papier de ce que j'ai fait pour avoir tout ça, si ça peut aider !
      Sinon pour faire court, j'ai une database sur MySQL, et des fichiers JAVA et CLASS. Et quand j'ai fini de faire la database sur MySQL, j'ai du faire un AutoCompileAll.bat
    5. Modérateur
      C'est ce que j'expliquais plus haut, tu as un message d'erreur qui fait apparaître 4 lignes de codes :
      • ItemSpawner.java ligne 17
      • ChatParser.java ligne 204
      • Chat.java ligne 239
      • GameServer.java ligne 195

      Donc avec ItemSpawner.java je peux confirmer qu'il attends 2 paramètres (des entiers), mais vu le message d'erreur il n'a pas le deuxième.

      Il faudrait donc savoir comment il est censé calculer ces deux paramètres et ça je le saurais dans l'un des 3 autres codes. Cela me permettra de savoir quel format est attendu pour ta commande pour que tu la corriges et lui transmettre convenablement les deux paramètres.


  5. Est-ce que ça t'aide ?
    1. Modérateur
      Ok, donc le format des commandes c'est
      COMMANDE:PARAM1:PARAM2:PARAM3...

      À partir de là il récupère d'une part le nom de la commande puis la liste des paramètres.

      Avec le nom de la commande il va chercher dans une liste qu'est-ce qui va permettre de l'interpréter, dans ton cas avec la commande "additem" c'est "ItemSpawner" qui va être utilisé et il attends deux paramètres entiers.

      Donc le format ce serait
      additem:entier1:entier2


      Par contre je ne sais pas à quoi correspond ces deux entiers, pour le savoir il faudrait regarder dans item/Item.java la méthode itemSpawnPacket et s'intéresser au rôle du deuxième et troisième paramètre (qui sont donc des entiers).

      Attention : je n'ai pas le code complet pour ItemSpawner, parce qu'il y a autre chose à droite de l'image que je ne vois pas (et qui sont peut être utiles) donc mon analyse est sous réserve qu'il n'y ait rien d'important caché après...
      (c'est pour ça qu'un copier coller du code c'est mieux qu'une image, au moins on a tout d'un coup...)
    2. Alors la formule incomplète c'est celle-ci :

      //System.out.println("About to spawn item: " + itemID + "x"+Integer.parseInt(parameters[1])+" at coordinates: " + cur.getlastknownX() + "," + cur.getlastknownY() );


      Et ensuite dans le item.java il y a ça :

      package item;
      
      import java.nio.ByteBuffer;
      import java.util.HashMap;
      import java.util.Map;
      import java.util.concurrent.ConcurrentHashMap;
      import java.util.concurrent.ConcurrentMap;
      
      import Connections.Connection;
      import Player.Character;
      import Player.PlayerConnection;
      import Tools.BitTools;
      /*
      
      
      * TODO: uhhh.. lots of stuff
      
      */
      public class Item {
       private int id;
       private int width, height;
       private boolean consumeable;
       private boolean permanent;
       private int npcPrice;
       private long expirationTime;
       private int minLvl, MaxLvl;
       private int type;
       
       public static final int EQUIPMENT = 1;
       public static final int POTION = 2;
       public static final int TELEPORT = 3;
       public static final int UPGRADE = 4;
       public static final int MANUAL = 5;
       public static final int MATERIAL = 6;
       
       public static int inc = 0;
       public static ConcurrentMap<Integer, Integer> iteMap = new ConcurrentHashMap<Integer, Integer>();
       public static ConcurrentMap<Integer, Integer> iteMapSTACK = new ConcurrentHashMap<Integer, Integer>();
       public static ConcurrentMap<Integer, Integer> iteMapcharid = new ConcurrentHashMap<Integer, Integer>();
       public static ConcurrentMap<Integer, Long> iteMapTimedrop = new ConcurrentHashMap<Integer, Long>();
       
       public Item(){
       }
       public Consumables getConsumable(){
        return null;
       }
       //public Equipment getEquipment(){
       // return null;
       //}
      
       public int getId() {
        return id;
       }
      
       public void setId(int id) {
        this.id = id;
       }
      
       public int getWidth() {
        return width;
       }
      
       public void setWidth(int width) {
        this.width = width;
       }
      
       public int getHeight() {
        return height;
       }
      
       public void setHeight(int height) {
        this.height = height;
       }
      
       public boolean isConsumeable() {
        return consumeable;
       }
      
       public void setConsumeable(boolean consumeable) {
        this.consumeable = consumeable;
       }
      
       public boolean isPermanent() {
        return permanent;
       }
      
       public void setPermanent(boolean permanent) {
        this.permanent = permanent;
       }
      
       public int getNpcPrice() {
        return npcPrice;
       }
      
       public void setNpcPrice(int npcPrice) {
        this.npcPrice = npcPrice;
       }
      
       public long getExpirationTime() {
        return expirationTime;
       }
      
       public void setExpirationTime(long expirationTime) {
        this.expirationTime = expirationTime;
       }
      
       public int getMinLvl() {
        return minLvl;
       }
      
       public void setMinLvl(int minLvl) {
        this.minLvl = minLvl;
       }
      
       public int getMaxLvl() {
        return MaxLvl;
       }
      
       public void setMaxLvl(int maxLvl) {
        MaxLvl = maxLvl;
       }
      
       public int getType() {
        return type;
       }
      
       public void setType(int type) {
        this.type = type;
       }
       
       public static byte[] itemSpawnPacket(int charID, int itemID, int STACK, float x, float y, Connection con) {
        Character cur = ((PlayerConnection)con).getActiveCharacter();
        inc++;
        byte[] item = new byte[56];
        byte[] spawnX = BitTools.floatToByteArray(x);
        byte[] spawnY = BitTools.floatToByteArray(y);
        byte[] chid = BitTools.intToByteArray(inc);
        byte[] itid = BitTools.intToByteArray(itemID);
        byte[] INVstack = BitTools.intToByteArray(STACK);
        
        item[0] = (byte)item.length;
        item[4] = (byte)0x05;
        item[6] = (byte)0x0e;
        
        for(int i=0;i<4;i++) {
         item[36+i] = spawnX[i];
         item[40+i] = spawnY[i];
         item[20+i] = itid[i];
         item[32+i] = chid[i]; 
         item[28+i] = INVstack[i]; // drop stack
        }
        iteMapTimedrop.put(Integer.valueOf(inc), Long.valueOf(System.currentTimeMillis()));
        iteMapcharid.put(Integer.valueOf(inc), Integer.valueOf(charID));
        iteMap.put(Integer.valueOf(inc), Integer.valueOf(itemID));
        iteMapSTACK.put(Integer.valueOf(inc), Integer.valueOf(STACK));
        cur.sendToMap(item);
        
        return item;
       }
       
      
      
      }


      Par contre dans le fichier item, y a aussi consumables, dropitem, equipment etc... Ca ne t'intéresse pas ?
    3. Modérateur
      Ce qui compte c'est la ligne 131 :

      itemSpawnPacket(int charID, int itemID, int STACK, float x, float y, Connection con)

      Donc le format de ta commande c'est
      additem:itemId:stack

      Je ne sais pas ce qu'est "STACK" dans ton contexte, mais il va falloir lui trouver une valeur et la passer dans ta commande...

      NB. C'est quand même du code très moche qu'on a là !
    4. Comment ça très moche ? ^^

      Stack ce serait pas le nombre d'items ? Eh attends je vais essayer en jeu j'arrive de suite !
    5. Et voilà, problème résolu ! C'était bien le nombre d'item à avoir ^^