Configuration Java : récupérer un enchantement depuis un fichier .yml

Alex Fatta

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

Je cherche a récupérer un enchantement depuis un fichier en .yml et ensuite l'attribuer à un item. Concernant le .yml, je n'ai pas réussi à trouver le moyen de récupérer le type d'enchantement et à l'ajouter à un objet de type Enchantment (normal String et Enchantment ne sont pas les mêmes objets).

Mon fichiers .yml se présente comme ceci :
Code:
enchants: PROTECTION_ENVIRONMENTAL, 1; PROTECTION_PROJECTILE, 2
Je voudrais donc que sur l'item en question, ces deux enchantements lui soient attribués.

Les problèmes maintenant :

Commençons par le commencement : la lecture du String.
En effet ces éléments sont séparés par des , et des ;. J'ai donc trouvé ceci : https://openclassrooms.com/forum/sujet/lecture-d-un-fichier-avec-separateurs-13075 afin de lire chaque élément séparément. Puis après je me suis dit "tant qu'à faire, ce n'est que de la lecture de String, autant mettre une , entre chaque enchantement aussi" ce qui aurait fais que les valeur paires du tableau aurait été les enchantement et les valeurs impaires les puissances de l'enchantement (voir le lien pour comprendre cette histoire de tableau, c'est important pour la suite). Bon et dans un élan de motivation je me suis dit "mettons tous cela dans une Map, ce sera rangé et propre".
Donc pour la lecture du fichier j'en suis ici. Je vous demande déjà votre avis sur la façon de procéder et si vous avez mieux, bah je prends :p


Bon, viens maintenant la deuxième partie : relier le String à l'Enchantment.
Mon tableau (ou ma Map) contiennent donc le type d'enchante ainsi que la valeur souhaitée.

En parallèle, j'ai récupérer les meta de mon item afin d'y ajouter les enchantes. J'ai donc d'une part les tableaux avec mes enchantes et d'autre part mon meta pour ajouter mes enchantes.
Et soudain, c'est le drame. Comment je peux obtenir quelque chose de la forme :
Code:
Enchantment. + monTableau[0]
Eclipse me cri dessus et il a parfaitement raison. Donc comment puis-je utiliser la syntaxe
Code:
meta.addEnchant(MON_ENCHANTEMENT, VALEUR, true) ?

Voilà, j'espère avoir été assez clair sinon bah d'autres explication viendrons compléter le bousin.

Ah oui, je souhaite pouvoir attribuer X enchantement à mes items. Dans la mesure du possible (sinon on fera avec hein) je voudrais ne pas avoir à faire ENCHANTE_1=....ENCHANTE_2=... etc... Je voudrais que le plugin détecte tout seul le nombre d'enchante (d'où l'utilisation de ce système pour la lecture des enchantes).

Voilà ! :D

Je vous met le bout de code à la suite ;)

Code:
public static void loadKit() {
        for (String kitName : FileManager.getKits().getConfigurationSection("kits").getValues(false).keySet()) {
            for (String elementName : FileManager.getKits().getConfigurationSection("kits." + kitName).getValues(false).keySet()) {
            
                ItemStack element = null;
            
                String itemName = FileManager.getKits().getString("kits." + kitName + "." + elementName + ".name").replace('&', '§');
            
                switch (elementName) {
            
                case "Helmet": case "Chestplate": case "Leggings": case "Boots":
                    ItemStack armorPiece = new ItemStack(FileManager.getKits().getItemStack("kits." + kitName + "." + elementName + ".type"));
                    element = armorPiece;
                    break;
                default:
                    break;
                }
            
                try {
                
                
                    String line = FileManager.getKits().getString("kits." + kitName + "." + elementName + ".enchants");
                    String strPower[] = line.split(",");
                    HashMap<String, Integer> enchantMap = new HashMap<>();
                
                
                    ItemMeta meta = element.getItemMeta();
                    meta.setDisplayName(itemName);
                    meta.addEnchant((Enchantment) strPower[0], strPower[1], true);
                
                } catch (NullPointerException e) {
                    e.printStackTrace();
                }
            
            }
        }
    }

Les seuls éléments qui sont nommés dans le .yml, ce sont les pièces d'armure (pour se simplifier la vie), d'où ce switch un peu différent.

Et un exemple de mon .yml :
Code:
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

Voilà je pense avoir fais le tour ;)

Merci d'avance, :p

AlexFatta

PS : je viens d'avoir l'idée en rédigeant ce message, je soumet l'idée mais je ne sais pas si c'est opti ou même propre, mais ca fonctionnerai avec un switch pour les enchantes ? Même si ça fais quand même un très long switch...
 

Detobel36

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

Bah heu... Tu as ça:
https://hub.spigotmc.org/javadocs/s.../Enchantment.html#getByName-java.lang.String-

Donc:
PHP:
String line = FileManager.getKits().getString("kits." + kitName + "." + elementName + ".enchants");
String strEnchant[] = line.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.lenght == 2) {
        power = Integer.parseInt(strPower);
    } else {
        power = 1;
    }
    meta.addEnchant(objEnch, power, true);
}
element.setItemMeta(meta);
/!\ Le code a été fait de "tête". Rien n'a été testé, compilé, ... Bref, c'est juste "l'idée" du code ;)


Cordialement,
Detobel36
 
  • J'aime
Reactions: robin4002

Alex Fatta

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

Après finalisation du code, cela n'a pas l'air de fonctionné. Je vous laisse regarder le deuxième topic que je met en parallèle qui est assez proche de ce problème. Je vous laisse répondre sur le topic approprié ;)

AlexFatta