Configuration Résolu Java : chargement de données inopérant

Alex Fatta

Commandant de la Flotte et de la Horde
13 Août 2014
1 391
1
191
187
Bonjour !

Je code un plugin de KitPvP qui permet de charger des kits depuis un fichier kits.yml.

J'ai déjà ouvert un topic concernant les enchantements, pour l'instant qui ne fonctionne pas.

Pour cela, j'ai crée différents objets en java : un objet Armor, un objet Consumables et un dernier objet Weapons. Chacun de ces objets sont des listes d'ItemStack, excepté l'armor, dont j'attribue directement les valeurs : ItemStack helmet, chestplate, leggings et boots. Voici les classes de ces 3 objets :

Code:
//Armor

import org.bukkit.inventory.ItemStack;

public class Armor {
    
    private ItemStack helmet, chestplate, leggings, boots;
    
    public Armor() {
        
    }
    
    public Armor (ItemStack helmet, ItemStack chestplate, ItemStack leggings, ItemStack boots) {
        
        this.helmet = helmet;
        this.chestplate = chestplate;
        this.leggings = leggings;
        this.boots = boots;
        
    }

Code:
//Consumables

package fr.alexfatta.kitpvp.kitManager.kitObjects;

import java.util.HashMap;

import org.bukkit.inventory.ItemStack;

public class Consumables {
    
    private ItemStack potion1, potion2, potion3, food;
    private int potions_slot, food_slot;
    private static HashMap<ItemStack, Integer> mapConsumables = new HashMap<>();
    
    public Consumables(){
    }
    
    public Consumables(HashMap<ItemStack, Integer> listOfConsumables) {
        Consumables.mapConsumables = listOfConsumables;
    }
    
    public Consumables(ItemStack potion1, Integer potions_slot, HashMap<ItemStack, Integer> listOfConsumables) {
        this.potion1 = potion1;
        this.setPotions_slot(potions_slot);
        Consumables.mapConsumables = listOfConsumables;
    }
    
    public Consumables(ItemStack potion1, ItemStack potion2, Integer potions_slot, HashMap<ItemStack, Integer> listOfConsumables) {
        this.potion1 = potion1;
        this.potion2 = potion2;
        this.setPotions_slot(potions_slot);
        Consumables.mapConsumables = listOfConsumables;
    }
    
    public Consumables(ItemStack potion1, ItemStack potion2, ItemStack potion3, Integer potions_slot, HashMap<ItemStack, Integer> listOfConsumables) {
        this.potion1 = potion1;
        this.potion2 = potion2;
        this.potion3 = potion3;
        this.setPotions_slot(potions_slot);
        Consumables.mapConsumables = listOfConsumables;
    }

Code:
//Weapons

import java.util.ArrayList;

import org.bukkit.inventory.ItemStack;

public class Weapons {
    
    private static ArrayList<ItemStack> listWeapons = new ArrayList<>();
    
    public Weapons() {
    }
    
    public Weapons(ArrayList<ItemStack> mapWeapons) {
        Weapons.listWeapons = mapWeapons;
    }

Bon, ensuite, depuis un kits.yml, je charge directement mes données dans les listes du plugin. Le fichier ressemble à ceci (Je n'ai pas mis le kit en entier, juste quelque éléments histoire de tester) :

Code:
kits: 
archer:
    Helmet:
      name: Helmet
      type: IRON_HELMET
      enchants: PROTECTION_ENVIRONMENTAL,1; PROTECTION_PROJECTILE,2
    Chestplate:
      name: Chestplate
      type: IRON_CHESTPLATE
      enchants: PROTECTION_ENVIRONMENTAL,1; PROTECTION_PROJECTILE,2
    Leggings:
      name: Leggings
      type: IRON_LEGGINGS
      enchants: PROTECTION_ENVIRONMENTAL
    Boots:
      name: Boots
      type: IRON_BOOTS
      enchants: PROTECTION_ENVIRONMENTAL
    Potions:
      name: '&4Example of potion'
      type: 8197
      enchants: PROTECTION_ENVIRONMENTAL
      slot (Only if this element IS NOT an armor piece || number between 0 and 35): 1
      number (consumables like food or potions only): 2
    Sword:
      name: Example of Sword
      type: STONE_SWORD
      enchants: DAMAGE_ALL,4

Et je charge les données dans le plugin avec la classe suivante (là ca se complique déjà un peu) :
(Concernant les potions, je les insères grâce aux ID, mais ça n'a pas l'air de fonctionner).

Code:
package fr.alexfatta.kitpvp.kitManager;

import java.util.ArrayList;
import java.util.HashMap;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

import fr.alexfatta.kitpvp.Main;
import fr.alexfatta.kitpvp.fileManager.FileManager;
import fr.alexfatta.kitpvp.kitManager.kitObjects.Armor;
import fr.alexfatta.kitpvp.kitManager.kitObjects.Consumables;
import fr.alexfatta.kitpvp.kitManager.kitObjects.Weapons;
import fr.alexfatta.kitpvp.kitManager.listConsumables.ListConsumables;
import fr.alexfatta.kitpvp.kitManager.listWeapons.ListOfWeapons;

/*
 *kits
 *  Example_of_kits:
      Helmet:
        name: 'Helmet'
        type: IRON_HELMET
        enchants: PROTECTION_ENVIRONMENTAL, 1; PROTECTION_PROJECTILE, 2
        slot (Only if this element IS NOT an armor piece || number between 0 and 35): 0
        number (consumables like food or potions only): 0
 */

public class LoadKits {
    
    private static ArrayList<Kits> loadedKits = new ArrayList<>();
    
    private static Main main;
    
    public static void loadKit() {
        
        
        //On récupère le nom et la section du Kit à charger
        for (String kitName : FileManager.getKits().getConfigurationSection("kits").getValues(false).keySet()) {
            int totalPotionNumber = 1;
            int totalWeaponNumber = 0;
            
            Armor armor = new Armor();
            HashMap<ItemStack, Integer> mapConsumables = new HashMap<>();
            ArrayList<ItemStack> mapWeapons = new ArrayList<>();
            Consumables consumables = new Consumables(mapConsumables);
            Weapons weapons = new Weapons();
            
            //On récupère l'élément à charger du kit en chargement
            for (String elementName : FileManager.getKits().getConfigurationSection("kits." + kitName).getValues(false).keySet()) {
                
                //On définit le type, le slot et le nombre d'item.
                final String itemName = FileManager.getKits().getString("kits." + kitName + "." + elementName + ".name").replace('&', '§');
                final String type = FileManager.getKits().getString("kits." + kitName + "." + elementName + ".type");
                final int slot = FileManager.getKits().getInt("kits." + kitName + "." + elementName + ".slot (Only if this element IS NOT an armor piece || number between 0 and 35)");
                final int numberOfItem = FileManager.getKits().getInt("kits." + kitName + "." + elementName + ".number (consumables like food or potions only)");
                
                
                
                //C'est une arme, un consommable ou une armure
                if (FileManager.getKits().get("kits." + kitName + "." + elementName + ".type") instanceof String) {
                    
                    ItemStack element = new ItemStack(Material.getMaterial(FileManager.getKits().getString("kits." + kitName + "." + elementName + ".type")));
                    
                    //On vient définir element sur l'une des pièces d'armure
                    switch (elementName) {
                    case "Helmet":
                        ItemStack helmet = new ItemStack(Material.getMaterial(FileManager.getKits().getString("kits." + kitName + "." + elementName + ".type")));
                        armor.setHelmet(helmet);
                        break;
                    case "Chestplate":
                        ItemStack chestplate = new ItemStack(Material.getMaterial(FileManager.getKits().getString("kits." + kitName + "." + elementName + ".type")));
                        armor.setChestplate(chestplate);
                        break;
                    case "Leggings":
                        ItemStack leggings = new ItemStack(Material.getMaterial(FileManager.getKits().getString("kits." + kitName + "." + elementName + ".type")));
                        armor.setLeggings(leggings);
                        break;
                    case "Boots":
                        ItemStack boots = new ItemStack(Material.getMaterial(FileManager.getKits().getString("kits." + kitName + "." + elementName + ".type")));
                        armor.setBoots(boots);
                        break;
                    default:
                        break;
                    }
                    
                    
                    //Verification si l'objet est un consommables.
                    for (Material m : ListConsumables.getConsumables()) {
                        if (m.equals(Material.getMaterial(type))) {
                            ItemStack ISToAddConsumables = new ItemStack(Material.getMaterial(type), numberOfItem);
                            mapConsumables.put(ISToAddConsumables, slot);
                        }
                    }
                    
                    Consumables.setMapConsumables(mapConsumables);
                    
                    
                    //Verification si l'objet est une arme
                    for (Material m : ListOfWeapons.getWeaponsList()) {
                        if (m.equals(Material.getMaterial(type))) {
                            ItemStack ISToAddWeapon = new ItemStack(Material.getMaterial(type), numberOfItem);
                            mapWeapons.add(ISToAddWeapon);
                            totalWeaponNumber += 1;
                        }
                    }
                    
                    Weapons.setListWeapons(mapWeapons);
                    
                    //Enchantements
                    try {
                        String enchantements = FileManager.getKits().getString("kits." + kitName + "." + elementName + ".enchants");
                        String strEnchant[] = enchantements.split(";");
                        
                        
                        final ItemMeta meta = element.getItemMeta();
                        meta.setDisplayName(itemName);
                        
                        for (String enchant : strEnchant) {
                             String strPower[] = enchant.split(",");
                             Enchantment objEnch = Enchantment.getByName(strPower[0]);
                             final int power;
                            
                             if (strPower.length == 2) {
                                 power = Integer.parseInt(strPower[1]);
                             } else {
                                 power = 1;
                             }                         
                            
                             meta.addEnchant(objEnch, power, true);

                        }
                        element.setItemMeta(meta);
                        
                        
                    } catch (NullPointerException e) {
                        e.printStackTrace();
                    }
                } //Fin du String
                
                
                //C'est une potion
                else if (FileManager.getKits().get("kits." + kitName + "." + elementName + ".type") instanceof Integer) {
                    
                    int potionID = FileManager.getKits().getInt("kits." + kitName + "." + elementName + ".type");
                    int slotOfPotion = FileManager.getKits().getInt("kits." + kitName + "." + elementName + ".slot (Only if this element IS NOT an armor piece || number between 0 and 35)");
                    int numberOfPotion = FileManager.getKits().getInt("kits." + kitName + "." + elementName + ".number (consumables like food or potions only)");
                    ItemStack potion = new ItemStack(Material.POTION, numberOfPotion, (short) potionID);
                    
                    switch (totalPotionNumber) {
                    
                    case 1:
                        consumables.setPotion1(potion);
                        totalPotionNumber += 1;
                        break;
                    case 2:
                        consumables.setPotion2(potion);
                        totalPotionNumber += 1;
                        break;
                    case 3:
                        consumables.setPotion3(potion);
                        totalPotionNumber += 1;
                        break;
                    default:
                        numberOfPotion = 1;
                        break;
                    }
                    
                    consumables.setPotions_slot(slotOfPotion);
                    
                    //Créer les objets Armor, consommable et weapons
                    //Puis créer l'objet kit
                } //Fin de l'Integer
            
            } //Fin de la boucle elementName
            
            //Coder la partie des armes
            Kits kitToLoad = new Kits(armor, weapons, totalWeaponNumber, totalPotionNumber, consumables, kitName);
            
            loadedKits.add(kitToLoad);
            
            ConsoleCommandSender sender = Bukkit.getServer().getConsoleSender();
            sender.sendMessage(ChatColor.GREEN + "Kit " + ChatColor.YELLOW + kitToLoad.getKitName() + ChatColor.GREEN + " saved with success !");
            
        } //Fin de la boucle kitName
    }

    public static Main getMain() {
        return main;
    }

    public static void setMain(Main main) {
        LoadKits.main = main;
    }

    public static ArrayList<Kits> getLoadedKits() {
        return loadedKits;
    }

    public void setLoadedKits(ArrayList<Kits> loadedKits) {
        LoadKits.loadedKits = loadedKits;
    }

}

Donc ensuite je crée mon objet Kits kitToLoad avec tous les éléments défini dans la méthode et je le charge dans une ArrayList.

Maintenant viens enfin la partie intéréssante : l'équipement du joueur avec le kit.
Le code ne fonctionne pas, je vous exlique mes tentatives après le code :

Code:
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;

import fr.alexfatta.kitpvp.kitManager.kitObjects.Consumables;
import fr.alexfatta.kitpvp.kitManager.kitObjects.Weapons;

public class EquipPlayerWithKit {
    
    public static void equipKit (String kitName, Player player) {
        
        System.out.println("Début de l'équipement");
        
        int slotNumber = 0;
        int i = 0;
        while (i < LoadKits.getLoadedKits().size()) {
            
            System.out.println("Boucle while " + i);
            
            //ajouter une sécurité pour le nom du kit
            
            Kits kit = LoadKits.getLoadedKits().get(i);
            System.out.println(kit.getKitName());
            if (kit.getKitName().toString() == kitName) {
                
                System.out.println("Entrer if");
                
                //Armor
                player.getInventory().setHelmet(kit.getHelmet());
                player.getInventory().setChestplate(kit.getChestplate());
                player.getInventory().setLeggings(kit.getLeggings());
                player.getInventory().setBoots(kit.getBoots());
                
                
                //Armes
                for (int j = 0; j < Weapons.getListWeapons().size(); j++) {
                    player.getInventory().setItem(j, Weapons.getListWeapons().get(j));
                    slotNumber += 1;
                }
                
                //Consommables
                for (ItemStack isConsumables : Consumables.getMapConsumables().keySet()) {
                    
                    player.getInventory().setItem(slotNumber, isConsumables);
                    slotNumber += 1;
                }
                
                player.sendMessage(ChatColor.GRAY + "Kit " + kit.getKitName() + " recu avec succès !");
                
            }
            
            i++;
        }
        
    }

}

(Oui dans mes objets je ne les aient pas mis mais il y a des Getter et des Setter pour chaque éléments).
Bon ce code est bourré de Sysout pour du débeuguage. C'est la ligne if (kit.getKitName().toString() == kitName) qui foire. Si je la laisse, le code n'entre pas dans le if même si la condition est bonne (je suis que c'est bien "archer" qui est vérifié). Voici les sysout avec le if :

Code:
[14:55:08 INFO]: Début de l'équipement
[14:55:08 INFO]: Boucle while 0
[14:55:08 INFO]: Example_of_kits
[14:55:08 INFO]: Boucle while 1
[14:55:08 INFO]: archer

Donc c'est bien archer qui est vérifié, ce doit être le kitname qui déconne. mais je ne vois pas où.
Quand j'enlève le if, je n'obtient qu'une armure en fer, non enchantée. Dans les logs, toujours aucune erreur.

Donc je n'obtient que l'armure (dans le bon matériaux ça ça va) mais sans enchantements. Pour l'épée en pierre et la potion, je ne reçois rien. Ce doit être une erreur dans les HashMap et les ArrayList mais je ne vois pas où.

Sauriez-vous donc pourquoi je ne reçois ni les enchantements, ni les consomables ni les enchantes ?

Voilà !

En espérant avoir donné suffisament de détails et de précisions. Sinon je vous donnerai ce qui vous manque ;)

Merci d'avance !

AlexFatta
 

Oromis

Command-blocker slimesque
Staff
Modérateur
Support
11 Février 2014
3 345
2
1 053
297
24
Bretagne
Bon, j'ai pas eu le temps de tout lire, mais je remarque un truc :
Code:
 if (kit.getKitName().toString() == kitName)
Tu compares 2 strings à l'aide de l'opérateur ==, dans mes souvenirs, on recommande plutôt l'utilisation de la méthode equals dans le cas de la comparaison de String ^^
Le problème pourrait donc venir du fait que ton opération logique compare deux instances et non pas deux contenus, d'où le fait que ce soit toujours faux
 

attila46

Bucheron
8 Mars 2018
10
1
14
22
String est une class donc on peut pas la comparé comme sa il faut utilisé equals
Code:
if(kit.getKitName().equals(kitName))
 
  • J'aime
Reactions: Alex Fatta

Oromis

Command-blocker slimesque
Staff
Modérateur
Support
11 Février 2014
3 345
2
1 053
297
24
Bretagne
Yep, c'est ce que je disais au-dessus, mais ce n'est pas le seul problème, je suis en train de voir pour les autres
 
  • J'aime
Reactions: Alex Fatta

Alex Fatta

Commandant de la Flotte et de la Horde
13 Août 2014
1 391
1
191
187
Bonsoir ! :D

Merci beaucoup pour les réponses déjà ! :p Je regardes ça tout de suite et j'attends vos réponses avec impatience aussi :p

J'avais oublié que l'equals existait ;)

AlexFatta
 

Detobel36

Créateur de plugins (PhoenixRebirth)
Support
17 Août 2012
10 530
24
2 247
347
27
Bruxelles - Belgique
www.phoenix-rebirth.fr
Salut,

Alors oui et non les mecs ;)
Voyez plus tôt:
capt.png

Donc oui, il vaut mieux utiliser le "equals", ça c'est sûr. Je ne remet pas du tout ça en question...

Donc le "==" compare les "adresses" des deux variables. Quand on initialise une variable avec un string comme je l'ai fait pour le cas [1], on initialise une "constante" ;) C'est la même chose que de faire:
PHP:
String strTest = "test";
String var = strTest;
String var2 = strTest;

Donc au final, oui ils auront la même adresse.
Je sais que c'est un détail et que ici ça importe peu et que quoi qu'il arrive, il vaut mieux mettre le "equals", mais au moins ça aura appris des choses à certaines personnes ;)

J'avais oublié que l'equals existait ;)
Change d'IDE... Netbeans ou Intelji (à vérifier celui-la) te signale automatiquement ce genre de choses.


Cordialement,
Detobel36