Configuration Java | ConfigFile : récupérer une liste de données dans fichier.yml

Alex Fatta

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

Je suis de retour sur le forum ! (Hélas oui je sais :33)

Je vous adresse la demande suivante : comment récupérer plusieurs données bien distinctes dans un fichier en .yml.

Je m'explique, j'ai codé un système de placement de point géographique et pour que ces points ne se perdent pas lors d'un restart server, je les stock dans un fichier "bases.yml" que voici :

Code:
Bases:
  rouge:
    world: world
    x1: -231
    x2: -201
    z1: -42
    z2: -12
  orange:
    world: world
    x1: -166
    x2: -136
    z1: -30
    z2: 0

Et donc je cherche à récupérer les valeurs des variables x1, x2, z1, z2 de la base rouge et de la base orange. J'ai pensé à faire un tableau qui contient les noms des bases (rouge, orange etc..) et qui s'écrit tout seul quand on rentre la commande pour créer une base. Du coup je pensais à un système qui prendrait les unes apres les autres les valeurs du tableau comme ceci :

getConfig().getInt(bases.tab[valeur]);

Et faire en sorte que des variables prennent les valeurs des valeurs contenues dans le fichier en .yml.

Pensez-vous que c'est une bonne idée ou existe-il une meilleure façon de faire ?

Si vous avez des questions hésitez pas :p

AlexFatta
 

Alex Fatta

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

Merci @DiscowZombie pour ta réponse :p Mais je me suis heurté à un nouveau problème :33 Quand je déclare mon tableau, comment je met le nom des bases dedans ? Je veux dire, comment je fais pour que automatiquement rouge et orange soient ajoutés au tableau. Je me doute qu'il faudrait faire un tableau bi-dimensionnel, et également je me pose la question de la taille du tableau, va-t-elle s'allouer toute seule ou je dois faire un truc du style Malloc (ou c'est que en C ?). L'idée ce serait que tout seul le tableau prennent les valeurs des différents noms de base peu importe le nombre qu'il y'en a (j'ai crée une variable base_count qui s'incrémente toute seule quand on crée une nouvelle base, je me doute bien que cela va être utile). Donc l'idée ce serait que le tableau ressemble à ça :

String tab[] = {{rouge},{orange},{autre base},{encore autre base}};

et que toutes les bases s'y mettent automatiquement à l'allumage du plugin (donc charger les données dans le onEnable()) pour pouvoir s'en servir par la suite comme je le disais dans mon premier message.

Donc, du coup xD Ma question est la suivante : comment faire pour que le tableau prennent les valeurs de tous les noms des bases contenus dans le fichier bases.yml ? :)

AlexFatta
 

DiscowZombie

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

si j'étais à ta place, j'utiliserai plutôt les tableaux dynamique que statiques. Ensuite, le + simple serait de créer un manager pour stocker tout ceci ;)

Si tu veut, je te fait un petit code vite fait :p
 

Alex Fatta

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

Je veux bien aller voir des cours et des tutos pour comprendre le fonctionnement des tableaux dynamiques mais si t'as le temps de faire un "petit code vite fait" oui je veux bien xDD :p

AlexFatta
 

DiscowZombie

Développeur
Staff
Modérateur
Support
2 Mars 2017
2 659
1
931
298
Alsace
www.discowzombie.fr
D'accord, voici un petit cadeau pour toi ;)

Avant de te lancer la dedans, je te conseille quand même de comprendre l’utilisation des tableaux dynamiques en java et principalement des HashMap<>() et de la POO. (car c'est ce que j'utilise ici)

Je précise également que j'ai fait ce code assez rapidement, donc il n'est évidement pas le meilleur et il peut y avoir des ajustements à faire ;)

Voici les trois class qui fonctionnent ensembles:

Code:
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin {
    
    @Override
    public void onEnable() {
        
        for(String s : getConfig().getStringList("Bases")){
            new LocationManager(s).add(getConfig().getString("Bases."+s+".world"), getConfig().getInt("Bases."+s+".x1"), getConfig().getInt("Bases."+s+".x2"), getConfig().getInt("Bases."+s+".z1"), getConfig().getInt("Bases."+s+".z2"));
        }
        
    }

}

Code:
import java.util.HashMap;

public class LocationManager {
    
    static HashMap<String, LocSaver> bases = new HashMap<>();
    
    private String name;
    
    public LocationManager(String name){
        this.name = name;
    }
    
    public void add(String worldname, int x1, int x2, int z1, int z2){
        bases.put(name, new LocSaver(worldname, x1, x2, z1, z2));
    }
    
    public LocSaver get(){
        if(bases.containsKey(name)){
            return bases.get(name);
        }
        return null;
    }
    
}

Code:
public class LocSaver {
    
    private String worldname;
    private int x1, x2, z1, z2;
    
    public LocSaver(String worldname, int x1, int x2, int z1, int z2){
        this.worldname = worldname;
        this.x1 = x1;
        this.x2 = x2;
        this.z1 = z1;
        this.z2 = z2;
    }
    
    public String getWorldName(){
        return this.worldname;
    }
    
    public int getX1(){
        return this.x1;
    }
    
    public int getX2(){
        return this.x2;
    }
    
    public int getZ1(){
        return this.z1;
    }
    
    public int getZ2(){
        return this.z2;
    }

}

Si tu as des questions, surtout n’hésite pas :)
 

Alex Fatta

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

J'ai tout compris. Je vais essayer d'intégrer tout ça correctement dans mon code et je ferais des tests. Merci à toi !! :D

J'essaierai de vous tenir informé (en fait le but de ceci est de faire une gestion de zone, c'est à dire à l'allumage le plugin charge les données des bases, et quand un joueur pose un bloc, le plugin va à chaque fois essayer ces coordonnées et si le joueur n'est pas dedans, bah il annule l'évènement. Tu pense que ca peut fonctionner avec ce code ?) :)

AlexFatta
 

Alex Fatta

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

Attends j'ai une question xD ici :

" for(String s : getConfig().getStringList("Bases")){"

Le "Bases" je doit le remplacer par le nom des bases ou ça se fait tout seul ?

AlexFatta
 

DiscowZombie

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

Attends j'ai une question xD ici :

" for(String s : getConfig().getStringList("Bases")){"

Le "Bases" je doit le remplacer par le nom des bases ou ça se fait tout seul ?

AlexFatta
Je pense que c'est le getConfig().getStringList(); qui te pose problème ;)

Cette ligne permet juste de récupérer la config et ensuite de récupérer une liste de chaine de caractère, comme ceci :
Code:
MaListe:
    Element1:
    Element2:
    Element3:
du coup dans cet exemple, t'a liste contiendrait les valeurs suivantes : Element1, Element2 et Element3.

Donc, dans ton cas, il faut que tu laisse "Bases" car tu l'a appeler comme ça plus haut (voir ton premier message) :

Du coup, dans ton cas, t'a liste contiendra le nom de chaque team ;) (à savoir, rouge, orange, etc...)

J'espère avoir été clair, si tu as encore des questions n'hésite pas :D
 
Dernière édition:
  • J'aime
Reactions: Alex Fatta