Configuration Résolu (Go direct à la page 4)Java : Check si un joueur est dans une zone

DiscowZombie

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

je pense avoir trouver le problème, une erreur toute conne totalement de ma faute !

Je m'explique : lorsque je t'ai donné le code du LocationManager et LocSaver dans les premiers messages, je t'ai dit d'utiliser un
Code:
getConfig().getStringList();
Or, cette ligne permet de récupérer une simple liste de chaine de caractères, ce qui n'est pas ton cas car toi tu as des sections !

Pour bien que tu fasse la différence, voici un exemple :
  • String List: [element1, element2,...].
  • Configuration Section:
Code:
  element1:
    souselement: machin
    valeur: 152

Du coup, pour régler ton problème, c'est assez simple, il suffit de te rendre dans ta class principale, dans ton onEnable là ou tu ajoute tes bases à ta HashMap. Normalement tu as un code comme ceci :
Code:
for(String s : getConfig().getStringList("Bases")){
    //quelque chose...
}
Il faut le remplacer par ceci :
Code:
for(String s : getConfig().getConfigurationSection("Bases").getValues(false).keySet()){
Cette ligne permet de récuprer la config (getConfig()) puis de récupérer la section "Bases" (qui est l'endroit ou tu as tes coordonnées et le nom du monde). Ensuite on va prendre les valeurs, c'est à dire le nom de tes régions (par exemple, rouge, orange, etc...) . Le "false" nous indique que l'on ne s'occupe pas du reste de la section, ce qui nous intéresse c'est seulement les valeurs. Et enfin, le keySet() permet de récupérer un tableau de String de toutes ces valeurs.

Voilà pour l'explication si tu as encore des questions n’hésite pas ;)

Vraiment désolé pour cette erreur toutes bêtes, je ne sait pas pourquoi j'ai confondu, ça aurait pu être régler depuis très longtemps :/

Un petit conseil pour optimiser ta class LocationManager encore :
Vu que ta HashMap est static, il serait plus intéressant de mettre ton getRegions() en static également. Ce qui donne ceci :
Code:
public static HashMap<String, LocSaver> getRegions(){
        return bases;
    }

Du coup, tu peut supprimer ceci :
Code:
public LocationManager(){}

Je te conseille également un petit changement au niveau de la HashMap, c'est de la mettre null par défaut (plus simple pour voir si tu as aucune région), ce qui te donne ceci au niveau du code :
Code:
private static HashMap<String, LocSaver> bases = null;
Du coup, tu est obligé d'ajouter ceci dans les premières lignes ton add():
Code:
if(bases == null || bases.size() == 0){
            bases = new HashMap<>();
        }

Du coup, pour récurer les régions maintenant, tu doit écrire LocationManager.getRegions();.

C'est à peu près tout pour ces petits changements, voici à quoi devrait ressembler ton LocationManager :
Code:
private static HashMap<String, LocSaver> bases = null;
   
    private String name;
   
    public LocationManager(String name){
        this.name = name;
    }
   
    public void add(String worldname, int x1, int x2, int z1, int z2){
        if(bases == null || bases.size() == 0){
            bases = new HashMap<>();
        }
        bases.put(name, new LocSaver(worldname, x1, x2, z1, z2));
        System.out.println(bases);
    }
   
    public LocSaver get(){
        if(bases.containsKey(name)){
            return bases.get(name);
        }
        return null;
    }
   
    public static HashMap<String, LocSaver> getRegions(){
        return bases;
    }

J'espère que tout cela fonctionnera pour toi, je reste à disposition pour toutes questions,
Mathéo.


PS: Désolé pour le temps de réponse, quelques soucis de Wifi :/
 
  • J'aime
Reactions: Alex Fatta

Alex Fatta

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

Merci bien de ta réponse très complète . J'ai effectué les modifications que tu as énoncée et optimisé la class.

Cette fois-ci je suis absolument sûr et certains que la boucle for s'initialise dans le onEnable puisque j'ai une erreur dedans, mais une nouvelle erreur :p :

Code:
[13:27:41 INFO]: [FallenKingdoms] Enabling FallenKingdoms v1.1.0
[13:27:41 ERROR]: Error occurred while enabling FallenKingdoms v1.1.0 (Is it up to date?)
java.lang.IllegalArgumentException: Name cannot be null
        at org.apache.commons.lang.Validate.notNull(Validate.java:192) ~[spigot_1.10.jar:git-Spigot-6016ac7-10c10b3]
        at org.bukkit.craftbukkit.v1_10_R1.CraftServer.getWorld(CraftServer.java:1023) ~[spigot_1.10.jar:git-Spigot-6016ac7-10c10b3]
        at org.bukkit.Bukkit.getWorld(Bukkit.java:500) ~[spigot_1.10.jar:git-Spigot-6016ac7-10c10b3]
        at fr.alexfatta.fallenkingdoms.main.onEnable(main.java:69) ~[?:?]
        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:292) ~[spigot_1.10.jar:git-Spigot-6016ac7-10c10b3]
        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:340) [spigot_1.10.jar:git-Spigot-6016ac7-10c10b3]
        at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:405) [spigot_1.10.jar:git-Spigot-6016ac7-10c10b3]
        at org.bukkit.craftbukkit.v1_10_R1.CraftServer.loadPlugin(CraftServer.java:362) [spigot_1.10.jar:git-Spigot-6016ac7-10c10b3]
        at org.bukkit.craftbukkit.v1_10_R1.CraftServer.enablePlugins(CraftServer.java:322) [spigot_1.10.jar:git-Spigot-6016ac7-10c10b3]
        at net.minecraft.server.v1_10_R1.MinecraftServer.t(MinecraftServer.java:416) [spigot_1.10.jar:git-Spigot-6016ac7-10c10b3]
        at net.minecraft.server.v1_10_R1.MinecraftServer.l(MinecraftServer.java:381) [spigot_1.10.jar:git-Spigot-6016ac7-10c10b3]
        at net.minecraft.server.v1_10_R1.MinecraftServer.a(MinecraftServer.java:336) [spigot_1.10.jar:git-Spigot-6016ac7-10c10b3]
        at net.minecraft.server.v1_10_R1.DedicatedServer.init(DedicatedServer.java:270) [spigot_1.10.jar:git-Spigot-6016ac7-10c10b3]
        at net.minecraft.server.v1_10_R1.MinecraftServer.run(MinecraftServer.java:539) [spigot_1.10.jar:git-Spigot-6016ac7-10c10b3]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_121]

Voici un bout de a class principale :

Code:
    final File file = new File(getDataFolder(), "bases.yml");
    final YamlConfiguration configuration = YamlConfiguration.loadConfiguration(file);
    
    private static String gamePrefix = ChatColor.GRAY + "[" + ChatColor.RED + "FallenKingdoms" + ChatColor.GRAY + "] ";
    private static String argument = ChatColor.RED + "Erreur : ce n'est pas le bon argument !";

    
    @Override
    public void onEnable() {
         saveDefaultConfig();
         PluginFile();
         setInt();
         Bukkit.getServer().getPluginManager().registerEvents(new playerJoinListener(), this);
         Bukkit.getServer().getPluginManager().registerEvents(new BlockPlaceManager(), this);
         Bukkit.getServer().getPluginManager().registerEvents(this, this);
         for (String s : configuration.getConfigurationSection("Bases").getValues(false).keySet()) {
             if (s != null) {
                new LocationManager(s).add(Bukkit.getWorld(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"));
             }
         }
         System.out.println(LocationManager.getRegions());
         getCommand("fkstart").setExecutor(new FkStart());
         getCommand("fkstop").setExecutor(new FkStop());
         getCommand("fkpause").setExecutor(new FkPause());
         getCommand("fkplay").setExecutor(new FkPlay());
         getCommand("fkhelp").setExecutor(new FkHelp());
         getCommand("fkbase").setExecutor(new FkBase(this));
         INSTANCE = this;
         getLogger().info("Plugin de FallenKingdoms actif !");
        
    }

J'ai essayé comme tu as vu si 's' n'est pas = null mais ca fonctionne pas xDD

AlexFatta
 

DiscowZombie

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

comme indiqué le nom est null, la ligne de ton erreur est celle ci :
at fr.alexfatta.fallenkingdoms.main.onEnable(main.java:69) ~[?:?]

Étant que je n'ait pas les numéro de ligne, je ne peut voir laquelle c'est, mais je suppose que c'est celle ci :
new LocationManager(s).add(Bukkit.getWorld(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"));

Possible de me le confirmer ?
 

Alex Fatta

Commandant de la Flotte et de la Horde
13 Août 2014
1 391
1
191
187
Salut,

comme indiqué le nom est null, la ligne de ton erreur est celle ci :


Étant que je n'ait pas les numéro de ligne, je ne peut voir laquelle c'est, mais je suppose que c'est celle ci :


Possible de me le confirmer ?
Oui pardon je ne l'ai pas précisé mais oui c'est celle-ci :p

AlexFatta
 

DiscowZombie

Développeur
Staff
Modérateur
Support
2 Mars 2017
2 659
1
931
298
Alsace
www.discowzombie.fr
D'accord, donc c'est ton nom de monde qui est null. C'est donc que Bukkit n'arrive pas à trouver un monde portant le nom de celui donné dans la config. Pour éviter ceci, assure toi que ton nom est valide, et/ou insère un :
Code:
if ((s != null) && (Bukkit.getWorld(getConfig().getString("Bases."+s+".world")) != null)) {
 

Alex Fatta

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

J'ai rajouté ceci mais la même erreur est présente, sauf le numéro de la ligne qui change xDD Ca fonctionne pas x) Combien de fois j'ai dit ça dans ce topic xDD

AlexFatta
 

Alex Fatta

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

@DiscowZombie je suis un handicapéééééééééééé.... :(

Depuis le début on dit que les données sont dans le fichier bases.yml. Or le getConfig() c'est pour le config.yml xDD

Pourtant tu noteras que dans la boucle for j'avais réglé ce soucis, mais pas dans ce que fait la boucle for xDDD

Bon du coup voici console et code pour les prochains curieux :p

Main.java :

Code:
    final File file = new File(getDataFolder(), "bases.yml");
    final YamlConfiguration configuration = YamlConfiguration.loadConfiguration(file);

    
    @Override
    public void onEnable() {
         saveDefaultConfig();
         PluginFile();
         setInt();
         Bukkit.getServer().getPluginManager().registerEvents(new playerJoinListener(), this);
         Bukkit.getServer().getPluginManager().registerEvents(new BlockPlaceManager(), this);
         Bukkit.getServer().getPluginManager().registerEvents(this, this);
         for (String s : configuration.getConfigurationSection("Bases").getValues(false).keySet()) {
             System.out.println(s);
             if ((s != null) && (Bukkit.getWorld(configuration.getString("Bases."+s+".world")) != null)) {
                new LocationManager(s).add(Bukkit.getWorld(configuration.getString("Bases."+s+".world")), configuration.getInt("Bases."+s+".x1"),
                        configuration.getInt("Bases."+s+".x2"), configuration.getInt("Bases."+s+".z1"), configuration.getInt("Bases."+s+".z2"));
             }
         }
         System.out.println(LocationManager.getRegions());
         getCommand("fkstart").setExecutor(new FkStart());
         getCommand("fkstop").setExecutor(new FkStop());
         getCommand("fkpause").setExecutor(new FkPause());
         getCommand("fkplay").setExecutor(new FkPlay());
         getCommand("fkhelp").setExecutor(new FkHelp());
         getCommand("fkbase").setExecutor(new FkBase(this));
         INSTANCE = this;
         getLogger().info("Plugin de FallenKingdoms actif !");
        
    }

Console à l'allumage :

Code:
[12:35:28 INFO]: [FallenKingdoms] Enabling FallenKingdoms v1.1.0
[12:35:28 INFO]: rouge
[12:35:28 INFO]: {rouge=fr.alexfatta.fallenkingdoms.getDataBases.LocSaver@69740ea1}
[12:35:28 INFO]: orange
[12:35:28 INFO]: {orange=fr.alexfatta.fallenkingdoms.getDataBases.LocSaver@100ea8ce, rouge=fr.alexfatta.fallenkingdoms.getDataBases.LocSaver@69740ea1}
[12:35:28 INFO]: {orange=fr.alexfatta.fallenkingdoms.getDataBases.LocSaver@100ea8ce, rouge=fr.alexfatta.fallenkingdoms.getDataBases.LocSaver@69740ea1}
[12:35:28 INFO]: [FallenKingdoms] Plugin de FallenKingdoms actif !
[12:35:28 INFO]: Server permissions file permissions.yml is empty, ignoring it
[12:35:28 INFO]: Done (5,383s)! For help, type "help" or "?"

Bon du coup le code ne fonctionne pas. Enfin si mais non x) Il detecte bien que je pose un bloc mais les région ne fonctionne pas, il ne me pose pas bon block que je sois dans une région ou non. Donc je vais faire des tests et regarder encore la vidéo que tu as envoyé @DiscowZombie.

Voici la console quand je pose des blocs, au moins je suis sûr que tout fonctionne correctement x)

Console à la pose des blocs (y'a plusieurs lignes j'ai fais plusieurs tests ;) ) :

Code:
[12:40:47 INFO]: GRASS
[12:40:47 INFO]: fr.alexfatta.fallenkingdoms.getDataBases.LocSaver@100ea8ce
[12:40:47 INFO]: Location{world=CraftWorld{name=world},x=192.0,y=0.0,z=322.0,pitch=0.0,yaw=0.0}
[12:40:47 INFO]: Location{world=CraftWorld{name=world},x=222.0,y=0.0,z=352.0,pitch=0.0,yaw=0.0}
[12:40:48 INFO]: fr.alexfatta.fallenkingdoms.getDataBases.LocSaver@69740ea1
[12:40:48 INFO]: Location{world=CraftWorld{name=world},x=186.0,y=0.0,z=273.0,pitch=0.0,yaw=0.0}
[12:40:48 INFO]: Location{world=CraftWorld{name=world},x=216.0,y=0.0,z=303.0,pitch=0.0,yaw=0.0}
[12:40:53 INFO]: GRASS
[12:40:53 INFO]: fr.alexfatta.fallenkingdoms.getDataBases.LocSaver@100ea8ce
[12:40:53 INFO]: Location{world=CraftWorld{name=world},x=192.0,y=0.0,z=322.0,pitch=0.0,yaw=0.0}
[12:40:53 INFO]: Location{world=CraftWorld{name=world},x=222.0,y=0.0,z=352.0,pitch=0.0,yaw=0.0}
[12:40:53 INFO]: fr.alexfatta.fallenkingdoms.getDataBases.LocSaver@69740ea1
[12:40:53 INFO]: Location{world=CraftWorld{name=world},x=186.0,y=0.0,z=273.0,pitch=0.0,yaw=0.0}
[12:40:53 INFO]: Location{world=CraftWorld{name=world},x=216.0,y=0.0,z=303.0,pitch=0.0,yaw=0.0}
[12:41:07 INFO]: GRASS
[12:41:07 INFO]: fr.alexfatta.fallenkingdoms.getDataBases.LocSaver@100ea8ce
[12:41:07 INFO]: Location{world=CraftWorld{name=world},x=192.0,y=0.0,z=322.0,pitch=0.0,yaw=0.0}
[12:41:07 INFO]: Location{world=CraftWorld{name=world},x=222.0,y=0.0,z=352.0,pitch=0.0,yaw=0.0}
[12:41:07 INFO]: fr.alexfatta.fallenkingdoms.getDataBases.LocSaver@69740ea1
[12:41:07 INFO]: Location{world=CraftWorld{name=world},x=186.0,y=0.0,z=273.0,pitch=0.0,yaw=0.0}
[12:41:07 INFO]: Location{world=CraftWorld{name=world},x=216.0,y=0.0,z=303.0,pitch=0.0,yaw=0.0}
[12:41:20 INFO]: GRASS
[12:41:20 INFO]: fr.alexfatta.fallenkingdoms.getDataBases.LocSaver@100ea8ce
[12:41:20 INFO]: Location{world=CraftWorld{name=world},x=192.0,y=0.0,z=322.0,pitch=0.0,yaw=0.0}
[12:41:20 INFO]: Location{world=CraftWorld{name=world},x=222.0,y=0.0,z=352.0,pitch=0.0,yaw=0.0}
[12:41:20 INFO]: fr.alexfatta.fallenkingdoms.getDataBases.LocSaver@69740ea1
[12:41:20 INFO]: Location{world=CraftWorld{name=world},x=186.0,y=0.0,z=273.0,pitch=0.0,yaw=0.0}
[12:41:20 INFO]: Location{world=CraftWorld{name=world},x=216.0,y=0.0,z=303.0,pitch=0.0,yaw=0.0}

AlexFatta
 

DiscowZombie

Développeur
Staff
Modérateur
Support
2 Mars 2017
2 659
1
931
298
Alsace
www.discowzombie.fr
Depuis le début on dit que les données sont dans le fichier bases.yml. Or le getConfig() c'est pour le config.yml xDD
Ça c'est ton soucis, j’étaie pas censé le savoir XDDD

Bon du coup le code ne fonctionne pas. Enfin si mais non x) Il detecte bien que je pose un bloc mais les région ne fonctionne pas, il ne me pose pas bon block que je sois dans une région ou non. Donc je vais faire des tests et regarder encore la vidéo que tu as envoyé @DiscowZombie.
D'accord, fait signe quand tu as des nouvelles ;)