Résolu Class LocationContents : pouvoir stocker des localisations et les appeler depuis une autre classe

Booskap

Aventurier
7 Novembre 2019
10
3
3
25
Bonjour, c'est encore moi :fou:

Pour compléter mon plugin d'FFa avant de passer au système de config.yml et ajouter des commandes pour que ce soit complet, j'essaye de créer une classe comportant des locations pouvant être appeler depuis une Classe comportant un listener et affecter a une entité (Player dans mon cas).

Du coup j'ai chercher pas mal de solution mais la je bloque un peu c'est pourquoi je me tourne vers vous , si vous avez une idée ou que vous connaissez la manière de faire je suis preneur.

Donc arrêter moi si je me trompe, la base serait d'avoir une arraylist, pour pouvoir stocker les différentes locations j'ai donc essayé de la mettre dans le main et la classe concerner , j'ai essayé de faire un constructeur pour initialisé la classe au lancement du plugin et charger les positions d'entré de jeu ..Je suis donc a cours de munition je vous poste le dernier essaie que j'ai fais ça me laisse un null..

Java:
package eu.booskap.locationtest;

import java.util.ArrayList;

import org.bukkit.Location;
import org.bukkit.plugin.java.JavaPlugin;

import eu.booskap.locations.LocationContents;
import eu.booskap.locationtest.commands.CommandTest;

public class Main extends JavaPlugin {

    private static Main instance;

    public ArrayList<Location> gameloc = new ArrayList<>();

    @Override
    public void onEnable() {

        instance = this;
        new LocationContents(this.gameloc);
        getLogger().info("Enable");
        getCommand("randomtp").setExecutor(new CommandTest());
        super.onEnable();
//        getServer().getPluginManager().registerEvents(new , this);
    }

    public static Main getInstance() {
        return instance;
    }

}
Java:
package eu.booskap.locations;

import java.util.ArrayList;

import org.bukkit.Bukkit;
import org.bukkit.Location;

import eu.booskap.locationtest.Main;

public class LocationContents {

    private static final Main instance = Main.getInstance();
    private static final String WRLDNAME_DEFAULT = "world";
//    private static ArrayList<Location> listLoc = new ArrayList<>();

//    static {
//        instance.gameloc.add(new Location(Bukkit.getWorld(WRLDNAME_DEFAULT), 200, 5, -200, 25.0f, 14.0f));
//        instance.gameloc.add(new Location(Bukkit.getWorld(WRLDNAME_DEFAULT), 200, 5, -200, 25.0f, 14.0f));
//        instance.gameloc.add(new Location(Bukkit.getWorld(WRLDNAME_DEFAULT), 250, 5, -200, 25.0f, 14.0f));
//        instance.gameloc.add(new Location(Bukkit.getWorld(WRLDNAME_DEFAULT), 220, 5, -190, 25.0f, 14.0f));
//        instance.gameloc.add(new Location(Bukkit.getWorld(WRLDNAME_DEFAULT), 205, 5, -180, 25.0f, 14.0f));
//    }

    public LocationContents(ArrayList<Location> listloc) {
        instance.gameloc.add(new Location(Bukkit.getWorld(WRLDNAME_DEFAULT), 200, 5, -200, 25.0f, 14.0f));
        instance.gameloc.add(new Location(Bukkit.getWorld(WRLDNAME_DEFAULT), 200, 5, -200, 25.0f, 14.0f));
        instance.gameloc.add(new Location(Bukkit.getWorld(WRLDNAME_DEFAULT), 250, 5, -200, 25.0f, 14.0f));
        instance.gameloc.add(new Location(Bukkit.getWorld(WRLDNAME_DEFAULT), 220, 5, -190, 25.0f, 14.0f));
        instance.gameloc.add(new Location(Bukkit.getWorld(WRLDNAME_DEFAULT), 205, 5, -180, 25.0f, 14.0f));
    }

    public void put(Location loc) {
        if(instance.gameloc.contains(loc)) {
            instance.gameloc.remove(loc);
        }
        instance.gameloc.add(loc);
    }
}
Et je n'arrive pas a poster avec le code de celle-ci :confused:
du coup désolé du screen .. :
CommandExe.PNG

Voilà , donc si vous aviez une idée, une piste et/ ou une solution a me donner je suis preneur et je vous remercie pour votre aide :merci
 
Dernière édition:

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 129
162
461
247
21
Mìlhüsa
Bonsoir,

Java:
new LocationContents(this.gameloc);
instance = this;

Si tu définis ta variable instance après avoir appeler le constructeur statique de LocationContents, et bah il devrait te créer un joli petit NullPointerException dans les logs, non ? Car celui-ci essayera d'accéder à un membre d'une variable null.

Cordialement,
ShE3py.
 
  • J'aime
Reactions: Booskap

Booskap

Aventurier
7 Novembre 2019
10
3
3
25
Java:
new LocationContents(this.gameloc);
instance = this;
null.

Effectivement ça peut aider :fou: j'ai oublié l'importance de l'ordre , mais ça me cause encore un nullPointerExceptions, certainement du au fait que j'appel un index(null) dans commandTest ? aurais-tu une idée ?

En tout cas merci de m'avoir fait remarquer cette erreur peut être que d'autre code que j'ai essayé avant fonctionner et vue que je n'ai pas mis l'instance en premier ça ne fonctionner par je vais remanier tous ça ! :merci
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 129
162
461
247
21
Mìlhüsa
Bah normalement sous l'erreur tu as la ligne et la classe dans laquelle celle-ci s'est produite, alors bon je vois pas à quel autre moment il pourrait throw une autre NPE.
 

Booskap

Aventurier
7 Novembre 2019
10
3
3
25
Me revoilà , merci a toi @ShE3py , j'ai try / catch final pour essayé de trouver le problème et ma deuxième NPE venez du fait que le nom du monde était null
{name=null},x=200.0,y=5.0,z=-200.0,pitch=14.0,yaw=25.0}

Donc ça risqué de ne pas fonctionner correctement :bave:..

En tout cas j'ai remanier un peu le code , je mets la solution ici pour ce qui seront confronter a un problème similaire :
Java:
package eu.booskap.locationtest;

import org.bukkit.plugin.java.JavaPlugin;

import eu.booskap.locations.LocationContents;
import eu.booskap.locationtest.commands.CommandTest;

public class Main extends JavaPlugin {
   
    private static Main instance;
   
    @Override
    public void onEnable() {
       
        instance = this;
        new LocationContents(LocationContents.getGameLoc());
        getLogger().info("Enable");
        getCommand("randomtp").setExecutor(new CommandTest());
        super.onEnable();
    }
   
    public static Main getInstance() {
        return instance;
    }
   
}
Java:
package eu.booskap.locations;

import java.util.ArrayList;

import org.bukkit.Bukkit;
import org.bukkit.Location;

public class LocationContents {
   
    private static LocationContents locInstance = LocationContents.getLocIntance();
    private static ArrayList<Location> gameloc = new ArrayList<>();
   
   
    static {
        gameloc.add(new Location(Bukkit.getWorld("lobby"), 200, 5, -200, 25.0f, 14.0f));
        gameloc.add(new Location(Bukkit.getWorld("lobby"), 200, 5, -200, 25.0f, 14.0f));
        gameloc.add(new Location(Bukkit.getWorld("lobby"), 250, 5, -200, 25.0f, 14.0f));
        gameloc.add(new Location(Bukkit.getWorld("lobby"), 220, 5, -190, 25.0f, 14.0f));
        gameloc.add(new Location(Bukkit.getWorld("lobby"), 205, 5, -180, 25.0f, 14.0f));
    }
   
    public LocationContents(ArrayList<Location> listloc) {
        LocationContents.gameloc = listloc;
    }
   
    public static LocationContents getLocIntance() {
        return locInstance;
    }

    public static ArrayList<Location> getGameLoc(){
        return gameloc;
    }

}
Pour pouvoir tester le code en jeux à l'aide d'une commande mais peut être fais depuis un PlayerJoinEvent :
Elle veut toujours pas ce mettre en code il doit y avoir un bout de texte qui la chagrine.. du coup photo :dsl:
CommandExe2.PNG

Encore merci :merci