Configuration Résolu Java : problème de récupération d'élément dans une liste

Alex Fatta

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

Bon allons droit au but. Pour un kitpvp, je charge tous les kits depuis un fichier .yml et je les stocks dans une ArrayList. Je précise qu'il n'y aucune erreur dans les logs et que les kits se chargent très bien :

Console :
Code:
[01:08:42 INFO]: Kit Example_of_kits saved with success !
[01:08:42 INFO]: Kit Brute saved with success !
[01:08:42 INFO]: Kit Archer saved with success !
[01:08:42 INFO]: Loaded kits : [fr.alexfatta.kitpvp.kitManager.Kits@7d13349b, fr.alexfatta.kitpvp.kitManager.Kits@59693510, fr.alexfatta.kitpvp.kitManager.Kits@7ee96ec1]

Pour récupérer le kit par commande, je vais simplement chercher le kit dans l'arraylist par son nom. Seulement, le problème est que peu importe le nom du kit entré, c'est toujours le dernier kit qui est donné (ici Archer).

Voici le code qui s'occuper de giver le kit :

Code:
package fr.alexfatta.kitpvp.kitManager;

import org.bukkit.ChatColor;
import org.bukkit.entity.Player;

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

public class EquipPlayerWithKit {

    public static void equipKit (String kitName, Player player) {

        int slotNumber = 0;
        int i;

        for (i = 0; i < LoadKits.getLoadedKits().size(); i++) {

            Kits kit = LoadKits.getLoadedKits().get(i);
            if (kit.getKitName().equals(kitName) && kit != null) {

                //Armor
                try {
                    player.getInventory().setHelmet(kit.getArmor().getHelmet());
                    player.getInventory().setChestplate(kit.getArmor().getChestplate());
                    player.getInventory().setLeggings(kit.getArmor().getLeggings());
                    player.getInventory().setBoots(kit.getArmor().getBoots());
                } catch (NullPointerException e) {

                }

                //Armes
                for (int j = 0; j < Weapons.getListWeapons().size(); j++) {
                    if (Weapons.getListWeapons().get(j) != null) {
                        player.getInventory().setItem(slotNumber, Weapons.getListWeapons().get(j));
                        slotNumber += 1;
                    }
                }

                //Potions
                for (int k = 0; k < PotionsLots.getListOfPotions().size(); k++) {
                    if (PotionsLots.getListOfPotions().get(k) != null) {
                        player.getInventory().setItem(slotNumber, PotionsLots.getListOfPotions().get(k));
                        slotNumber += 1;
                    }
                }

                //Consommables
                for (int l = 0; l < Consumables.getMapConsumables().size(); l++) {
                    if (Consumables.getMapConsumables().get(l) != null) {
                        player.getInventory().setItem(slotNumber, Consumables.getMapConsumables().get(l));
                        slotNumber += 1;
                    }
                }

                player.sendMessage(ChatColor.GRAY + "Kit " + kit.getKitName() + " recu avec succès !");
            }
        }
    }
}

J'ai pensé que c'était du au fait que la boucle tournait à l'infini et ne donnait que le dernier (ce qui aurait pu être logique), donc j'ai essayé de mettre un break ou un return à la fin de la boucle mais la ca ne donnait plus aucun kit. Je ne sais vraiment pas d'où ca peut venir. Si vous avez besoin d'autres éléments concernant les objets crées, je suis tout disposé à les donner ;)

Merci d'avance ! :D

AlexFatta
 

robin4002

Expert en informatique et systèmes d'information
Staff
Responsable technique
Responsable forum
12 Novembre 2012
20 815
156
3 000
347
26
Alsace
www.minecraftforgefrance.fr
Salut,
Tu es sûr que la liste contient tous les kits ?
Un print de la valeur de LoadKits.getLoadedKits().size() permettrait de le savoir assez rapidement.
 

DiscowZombie

Développeur
Staff
Modérateur
Support
2 Mars 2017
2 659
1
931
298
Alsace
www.discowzombie.fr
Salut,

pourquoi ne pas profiter des lambdas plutôt qu'une veille boucle for ? ;)
Code:
Kits whoMatch = LoadKits.getLoadedKits()
                .stream()
                .filter(k -> k.getKitName().equalsIgnoreCase(kitName))
                .collect(Collectors.toList())
                .get(0);
 

Alex Fatta

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

Bon @robin4002 j'ai mis un size en sysout et il y a bien 3 éléments dedans. @DiscowZombie du coup j'ai enlevé la boucle for et mis ce que tu as proposé, malheureusement je recois toujours le même kit, peu importe le nom entré :/

AlexFatta
 

Alex Fatta

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

tu peux nous montrer la partie qui gère le chargement des kits depuis la config jusqu'à la liste
Oui je peux, mais accroches toi xDD Même si y'a des commentaires, j'espère que tu sauras comprendre ^^

Si tu as des questions sur le code (question un peu complexe pou comprendre) passe discord et je t'expliquerai. Puis on reviendra ici pour la réponse au souci ;)

Code:
package fr.alexfatta.kitpvp.kitManager;

import java.util.ArrayList;

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.PotionsLots;
import fr.alexfatta.kitpvp.kitManager.kitObjects.Weapons;
import fr.alexfatta.kitpvp.kitManager.listConsumables.ListConsumables;
import fr.alexfatta.kitpvp.kitManager.listWeapons.ListOfWeapons;


public class LoadKits {

    private static ArrayList<Kits> loadedKits = new ArrayList<>();

    private static Main main;

    public static void loadKit() {

        ConsoleCommandSender sender = Bukkit.getServer().getConsoleSender();


        //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;

            //On créer les éléments propres à chaque kit
            Armor armor = new Armor();
            ArrayList<ItemStack> listConsumables = new ArrayList<>();
            ArrayList<ItemStack> listWeapons = new ArrayList<>();
            ArrayList<ItemStack> listOfPotionsToLoad = new ArrayList<>();

            //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 que l'on est train de charger.
                String itemName = FileManager.getKits().getString("kits." + kitName + "." + elementName + ".name").replace('&', '�');
                @SuppressWarnings("unused")
                String type = FileManager.getKits().getString("kits." + kitName + "." + elementName + ".type");
                int numberOfItem = FileManager.getKits().getInt("kits." + kitName + "." + elementName + ".number");



                //C'est une arme, un consommable ou une armure
                if (FileManager.getKits().get("kits." + kitName + "." + elementName + ".type") instanceof String) {


                    //On gère l'armure séparemment
                    switch (elementName.toString()) {
                    case "Helmet":
                        ItemStack helmet = new ItemStack(attributeEnchants(kitName, elementName, itemName, Material.matchMaterial(FileManager.getKits().getString("kits." + kitName + "." + elementName + ".type")), true));
                        armor.setHelmet(helmet);
                        break;
                    case "Chestplate":
                        ItemStack chestplate = new ItemStack(attributeEnchants(kitName, elementName, itemName, Material.matchMaterial(FileManager.getKits().getString("kits." + kitName + "." + elementName + ".type")), true));
                        armor.setChestplate(chestplate);
                        break;
                    case "Leggings":
                        ItemStack leggings = new ItemStack(attributeEnchants(kitName, elementName, itemName, Material.matchMaterial(FileManager.getKits().getString("kits." + kitName + "." + elementName + ".type")), true));
                        armor.setLeggings(leggings);
                        break;
                    case "Boots":
                        ItemStack boots = new ItemStack(attributeEnchants(kitName, elementName, itemName, Material.matchMaterial(FileManager.getKits().getString("kits." + kitName + "." + elementName + ".type")), true));
                        armor.setBoots(boots);
                        break;

                    default:

                        //L'item n'est pas une pièce d'armure, donc on passe à la suite
                        Material element = Material.matchMaterial(FileManager.getKits().getString("kits." + kitName + "." + elementName + ".type"));


                        //Verification si l'objet est un consommables.
                        for (Material m : ListConsumables.getConsumables()) {
                            if (m.equals(element)) {
                                ItemStack ISToAddConsumables = new ItemStack(attributeEnchants(kitName, elementName, itemName, Material.matchMaterial(FileManager.getKits().getString("kits." + kitName + "." + elementName + ".type")), false));

                                ItemMeta ISMeta = ISToAddConsumables.getItemMeta();
                                ISMeta.setDisplayName(FileManager.getKits().getString("kits." + kitName + "." + elementName + ".name").replace("&", "§"));
                                ISToAddConsumables.setItemMeta(ISMeta);

                                ISToAddConsumables.setAmount(numberOfItem);
                                listConsumables.add(ISToAddConsumables);
                            }
                        }

                        //Verification si l'objet est une arme
                        for (Material m : ListOfWeapons.getWeaponsList()) {
                            if (m.equals(element)) {
                                ItemStack ISToAddWeapon = new ItemStack(attributeEnchants(kitName, elementName, itemName, Material.matchMaterial(FileManager.getKits().getString("kits." + kitName + "." + elementName + ".type")), true));
                                listWeapons.add(ISToAddWeapon);
                                totalWeaponNumber += 1;
                            }
                        }
                        break;
                    }
                } //Fin du if String


                //C'est une potion (int détécté)
                else if (FileManager.getKits().get("kits." + kitName + "." + elementName + ".type") instanceof Integer) {

                    int potionID = FileManager.getKits().getInt("kits." + kitName + "." + elementName + ".type");
                    int numberOfPotion = FileManager.getKits().getInt("kits." + kitName + "." + elementName + ".number");
                    ItemStack potion = new ItemStack(Material.POTION, numberOfPotion, (short) potionID);

                    //Partie en commentaire. Si je la laisse, ca met le nom à la potion mais la potion n'a plus d'effet
                    /*ItemMeta potionMeta = potion.getItemMeta();
                    potionMeta.setDisplayName(FileManager.getKits().getString("kits." + kitName + "." + elementName + ".name").replace("&", "§"));
                    potion.setItemMeta(potionMeta);*/

                    //On regarde le nombre de potion chargées
                    switch (totalPotionNumber) {

                    case 1:
                        listOfPotionsToLoad.add(potion);
                        totalPotionNumber += 1;
                        break;
                    case 2:
                        listOfPotionsToLoad.add(potion);
                        totalPotionNumber += 1;
                        break;
                    case 3:
                        listOfPotionsToLoad.add(potion);
                        totalPotionNumber += 1;
                        break;
                    default:
                        numberOfPotion = 1;
                        break;
                    }

                } //Fin de l'Integer

            } //Fin de la boucle elementName

            //on crée le kit et on lui attribue ses différents éléments.

            Weapons weapons = new Weapons(listWeapons);
            Consumables consumables = new Consumables(listConsumables);
            PotionsLots potionsLots = new PotionsLots(listOfPotionsToLoad);

            //Coder la partie des armes
            Kits kitToLoad = new Kits(armor, weapons, totalWeaponNumber, potionsLots, consumables, kitName);

            //On ajoute le kit à la liste
            loadedKits.add(kitToLoad);

            sender.sendMessage(ChatColor.GREEN + "Kit " + ChatColor.YELLOW + kitToLoad.getKitName() + ChatColor.GREEN + " saved with success !");

        } //Fin de la boucle kitName For

        sender.sendMessage(ChatColor.GREEN + "Loaded kits : " + loadedKits);
        sender.sendMessage(ChatColor.GREEN + "" + loadedKits.size() + " kits loaded!");

    }

    public static ItemStack attributeEnchants(String kitName, String elementName, String itemName, Material elementToEnchant, boolean isEnchantable) {

        ItemStack elementItemStack = new ItemStack(elementToEnchant);

        //Enchantements
        if (isEnchantable) {
            try {
                String enchantements = FileManager.getKits().getString("kits." + kitName + "." + elementName + ".enchants");
                String strEnchant[] = enchantements.split(";");

                ItemMeta meta = elementItemStack.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);
                }
                elementItemStack.setItemMeta(meta);


            } catch (NullPointerException e) {
                System.out.println("Error : bad enchantment ! Cannot find or enchant the piece " + elementName + " of kit " + kitName);
            }
        }
        return elementItemStack;
    }

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

}

Pour t'aider un peu, je te met l'exemple par défaut du kit dans le kits.yml (pour t'aider à comprendre comment fonctionne le système) ;)

Kits.yml :
Code:
kits:
  Example_of_kits:
    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,1
    Boots:
      name: Boots
      type: IRON_BOOTS
      enchants: PROTECTION_ENVIRONMENTAL,1
    Potions:
      name: '&4Example of potion'
      type: 8197
      number: 2
    Sword:
      name: Example of Sword
      type: GOLD_SWORD
      enchants: DAMAGE_ALL,4
      
  Brute:
    Helmet:
      name: '&4Casque de brute'
      type: IRON_HELMET
    Chestplate:
      name: '&4Plastron de brute'
      type: LEATHER_CHESTPLATE
      enchants: PROTECTION_ENVIRONMENTAL,2
    Leggings:
      name: '&4Pantalon de brute'
      type: LEATHER_LEGGINGS
      enchants: PROTECTION_ENVIRONMENTAL,2
    Boots:
      name: '&4Bottes de brute'
      type: LEATHER_BOOTS
      enchants: PROTECTION_ENVIRONMENTAL,2
    PotionsHeal:
      name: Potion
      type: 8197
      number: 2
    PotionStrength:
      name: Potion
      type: 8201
      number: 2
    Sword:
      name: '&4Épée de brute'
      type: STONE_SWORD
      enchants: DAMAGE_ALL,3
    Food:
      name: '&4Steak de la brute'
      type: COOKED_BEEF
      number: 64
      
  Archer:
    Helmet:
      name: '&7Tête d"Archer'
      type: IRON_HELMET
    Chestplate:
      name: '&7Plastron d"Archer'
      type: IRON_CHESTPLATE
      enchants: PROTECTION_ENVIRONMENTAL,2
    Leggings:
      name: '&7Pantalon d"Archer'
      type: IRON_LEGGINGS
      enchants: PROTECTION_ENVIRONMENTAL,2
    Boots:
      name: '&7Bottes d"Archer'
      type: IRON_BOOTS
      enchants: PROTECTION_ENVIRONMENTAL,2
    Potions:
      name: '&7Popo de Heal'
      type: 8197
      number: 2
    Sword:
      name: '&7Épée d"Archer'
      type: STONE_SWORD
      enchants: DAMAGE_ALL,1
    Bow:
      name: '&7Arc d"Archer'
      type: BOW
      enchants: ARROW_INFINITE,1;ARROW_KNOCKBACK,1;ARROW_DAMAGE,3
    Arrow:
      name: '&7Flèche unique...'
      type: ARROW
      number: 1
    Food:
      name: '&7Nourriture du turfu'
      type: COOKED_BEEF
      number: 64

Voilà ! Bon j'ai conscience que c'est un peu complexe. Là encore, discord n'est pas un problème pour expliquer un peu le code ^^

Merci à vous ! :D

AlexFatta
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 087
157
455
247
21
Mìlhüsa
Pourquoi ne peut utiliser une Map au lieu d'une List ? C'est fait pour récupérer un objet à partir d'un autre.

Et sinon, à ta ligne
Code:
if(kit.getKitName().equals(kitName) && kit != null)

Il faudrait inverser les deux conditions, car si le kit est null il va d'abord tenter d'appeler la méthode getKitName() et va lancer un NullPointerException, tandis qu'à l'inverse si le kit est null il va tout de suite passer la section sans vérifier les autres conditions, il n'y aura donc pas d'exception de lancée.

P.S: Je viens de voir dans tes logs que tu as ceci :
Code:
[01:08:42 INFO]: Loaded kits : [fr.alexfatta.kitpvp.kitManager.Kits@7d13349b, fr.alexfatta.kitpvp.kitManager.Kits@59693510, fr.alexfatta.kitpvp.kitManager.Kits@7ee96ec1]
Je te conseille d'override la méthode toString() de java.lang.Object comme ça tu pourras afficher autre chose que la classe@son hash, comme son nom. Sa aide quand tu met des System.out partout ^c^.

Cordialement,
ShE3py.
 
Dernière édition:
  • J'aime
Reactions: DiscowZombie

Alex Fatta

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

Bon du coup j'ai modifié ma list en HashMap<String, Kits> et j'ai mis un toString pour la HashMap (bon du coup dans les logs j'obtiens un truc pas très beau) :
Code:
[18:23:00 INFO]: Loaded kits : {Brute=fr.alexfatta.kitpvp.kitManager.Kits@2e8b364d, Archer=fr.alexfatta.kitpvp.kitManager.Kits@56f0ffc8, Example_of_kits=fr.alexfatta.kitpvp.kitManager.Kits@59e288bc}

Et sinon j'ai toujours le même souci, c'est toujours le kit archer qui s'équipe, les autres kits ne s'équipent pas :/

Mais ca aurait du fonctionner, je ne sais pas pourquoi ca ne fonctionne pas.

AlexFatta

EDIT : Alors pour une raison inconnue, passer d'une ArrayList à une HashMap, l'armure ne fonctionne plus.
 
Dernière édition: