Ajouter une liste dans le config.yml

LEZIKO

Architecte en herbe
2 Novembre 2021
93
2
69
19
Bonjour à tous, je débute dans le java et je n'arrive vraiment pas à comprendre le fonctionnement des fichiers de configs j'ai réussi à créer une liste dans laquelle les joueurs ne sont pas touchés par la maintenance mais malheureusement quand je reload le serveur la liste se reset alors j'ai déjà test quelque petites choses, je vous mets tous ça !

Class main: https://pastebin.com/yB9L9gBp

Commande de maintenance: https://pastebin.com/GD5r2S51

Le plugin.yml: https://pastebin.com/2XbyxmfW

Le config.yml: https://pastebin.com/FuDGiDF9

En espérant pouvoir comprendre et en vous remerciant,

LEZIKO
 
Dernière édition:

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 140
163
464
247
21
Mìlhüsa
Bonsoir,

Même si tu sauvegardes ta liste dans un fichier, tu initialises toujours ta liste à un ensemble vide.
Si tu ne dis pas à ton programme de charger la liste depuis le disque dur, il ne va pas faire ce que tu lui demandes pas de faire.

Java:
public class MyPlugin extends JavaPlugin {
    public static List<OfflinePlayer> playersWhoBypassMaintenance;
    
    @Override
    public void onEnable() {
        playersWhoBypassMaintenance = (List<OfflinePlayer>) this.getConfig().getList("liste.maintenanceliste", new ArrayList<OfflinePlayer>());
    }
}

Tu dois aussi sauvegarder les changements sur le disque dur à chaque modification ; tu n'effectues pas de sauvegarde après la suppression d'un joueur.

Cordialement,
ShE3py
 

LEZIKO

Architecte en herbe
2 Novembre 2021
93
2
69
19
Bonsoir,

Même si tu sauvegardes ta liste dans un fichier, tu initialises toujours ta liste à un ensemble vide.
Si tu ne dis pas à ton programme de charger la liste depuis le disque dur, il ne va pas faire ce que tu lui demandes pas de faire.

Java:
public class MyPlugin extends JavaPlugin {
    public static List<OfflinePlayer> playersWhoBypassMaintenance;
   
    @Override
    public void onEnable() {
        playersWhoBypassMaintenance = (List<OfflinePlayer>) this.getConfig().getList("liste.maintenanceliste", new ArrayList<OfflinePlayer>());
    }
}

Tu dois aussi sauvegarder les changements sur le disque dur à chaque modification ; tu n'effectues pas de sauvegarde après la suppression d'un joueur.

Cordialement,
ShE3py
ah super merci je ne comprenais pas x) merci pour ton aide :)
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 140
163
464
247
21
Mìlhüsa
Java:
public static ArrayList list;
Tu ne dois jamais utiliser un generic sans spécifier son type, car là tu as une ArrayList<Object>. Tu veux que ta liste contiennent des joueurs, pas n'importe quoi.

Java:
public static ArrayList<UUID> list;

Cela te permettra d'avoir un avertissement sur les erreurs de type :
Java:
if(!Main.list.contains(target.getUniqueId())) {
    Main.list.add(args[1]);
}

if(Main.list.contains(target.getUniqueId())) {
    Main.list.remove(args[1]);
}

for(Player players : Bukkit.getServer().getOnlinePlayers()) {
    if(Main.statut == true) {
        if(!Main.list.contains(players)) {
            players.kickPlayer("§4Maintenance en cours...");
        }
    }
}

target.getUniqueId() est un UUID, args[1] est un String, players est un Player.

Or pour tout UUID uuid, String str et Player player, tu as :
  • uuidstr
  • uuidplayer
  • struuid
  • strplayer
  • playeruuid
  • playerstr
Tu ajoutes des args[1] à ta liste — soit les pseudos des joueurs — et tu cherches s'ils sont dans ta liste avec des target.getUniqueId() — soit l'UUID du joueur. Ta liste ne contient aucun UUID, donc ta liste ne contiendra jamais l'UUID d'un joueur particulier.

Java:
@Override
public void onEnable() {
    list = (ArrayList<UUID>) this.getConfig().getList("liste.maintenanceliste", new ArrayList<UUID>());
    
    FileConfiguration config = this.getConfig();
    config.set("liste.listjoueurs", this.list);
    try {
        config.save(new File(this.getDataFolder(), "config.yml"));
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}
Pourquoi copies-tu list.maintenancelist dans liste.listjoueurs au démarrage ?
 

LEZIKO

Architecte en herbe
2 Novembre 2021
93
2
69
19
Oui pour la config je me suis perdu dans plusieurs tutos et je n'arrive pas à enregistrer la liste dans le fichier de config
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 140
163
464
247
21
Mìlhüsa
Peux-tu envoyer un .zip de ton projet ? Sans ton code actuel je ne peux pas faire grand-chose.
Vérifie aussi que tu n'aies pas d'erreur dans la console.
 

LEZIKO

Architecte en herbe
2 Novembre 2021
93
2
69
19
Merci de ton aide j'ai enfin compris la première étape à savoir ajouter les UUID dans la liste ça fonctionne nickel dcp je t'envoi le code en fichier rar ou zip jsp et voilà mon objectif est juste de stocker la liste dans la config je te donne tout le code actuel :)
 

Fichiers joints

  • Codemaintenance.rar
    2.2 KB · Affichages: 85

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 140
163
464
247
21
Mìlhüsa
/command.txt
Java:
FileConfiguration config = main.getConfig();
Main.list = (ArrayList<UUID>) config.getList("Liste", new ArrayList<UUID>());

config.set("liste", main.list);
// ...
Les noms de clefs sont sensibles à la casse, c'est-à-dire que « Liste » et « liste » sont deux clefs différentes.
De plus cela ne sert à rien de charger une valeur depuis un fichier puis de sauvegarder cette valeur identique vers ce même fichier.

Java:
if(args[0].equalsIgnoreCase("add")){
    OfflinePlayer target = Bukkit.getPlayer(args[1]);
    UUID targetUUID = target.getUniqueId();
    if(!Main.list.contains(targetUUID)){
        Main.list.add(targetUUID);
        player.sendMessage("§6§l[§9§lMaintenance§6§l] §aTu as ajouté §b" + target.getName() + " §aà la §bMaintenance §a!" + Main.list);
    } else {
        player.sendMessage("§6§l[§9§lMaintenance§6§l] §cTu as déjà ajouté ce joueur à la liste");
    }
}
Main.list est une variable, donc stockée en mémoire, donc perdue à l'arrêt du programme.
Tu dois sauvegarder cette variable sur le disque dur à chaque modification si tu veux qu'elle soit sauvegardée sur le disque dur.

Un programme ne peut modifier que des données en mémoire à travers des variables, donc si tu veux qu'une variable survive à un arrêt il faut la sauvegarder sur le disque dur, donc oui à chaque fois que tu modifieras ta liste en ajoutant ou en supprimant un joueur il faudra sauvegarder le fichier avec les nouvelles données ; cependant le fichier n'est lu qu'au démarrage du programme dans le but de faire la copie disque dur → mémoire.
 

LEZIKO

Architecte en herbe
2 Novembre 2021
93
2
69
19
/command.txt
Java:
FileConfiguration config = main.getConfig();
Main.list = (ArrayList<UUID>) config.getList("Liste", new ArrayList<UUID>());

config.set("liste", main.list);
// ...
Les noms de clefs sont sensibles à la casse, c'est-à-dire que « Liste » et « liste » sont deux clefs différentes.
De plus cela ne sert à rien de charger une valeur depuis un fichier puis de sauvegarder cette valeur identique vers ce même fichier.

Java:
if(args[0].equalsIgnoreCase("add")){
    OfflinePlayer target = Bukkit.getPlayer(args[1]);
    UUID targetUUID = target.getUniqueId();
    if(!Main.list.contains(targetUUID)){
        Main.list.add(targetUUID);
        player.sendMessage("§6§l[§9§lMaintenance§6§l] §aTu as ajouté §b" + target.getName() + " §aà la §bMaintenance §a!" + Main.list);
    } else {
        player.sendMessage("§6§l[§9§lMaintenance§6§l] §cTu as déjà ajouté ce joueur à la liste");
    }
}
Main.list est une variable, donc stockée en mémoire, donc perdue à l'arrêt du programme.
Tu dois sauvegarder cette variable sur le disque dur à chaque modification si tu veux qu'elle soit sauvegardée sur le disque dur.

Un programme ne peut modifier que des données en mémoire à travers des variables, donc si tu veux qu'une variable survive à un arrêt il faut la sauvegarder sur le disque dur, donc oui à chaque fois que tu modifieras ta liste en ajoutant ou en supprimant un joueur il faudra sauvegarder le fichier avec les nouvelles données ; cependant le fichier n'est lu qu'au démarrage du programme dans le but de faire la copie disque dur → mémoire.
Merci de ton aide j'vais essayer