Configuration Plugin Résolu Problème avec L'api d'essentials :v

Luca_008

Architecte en herbe
21 Novembre 2016
150
20
125
24
Bonjour/bonsoir,

voilà un bon moment que je n'avais plus demandé d'aide ici, mais ce soir je suis bloqué..

Je m'explique,
Je veux créer un "TabCompleter" via la méthode
Code:
    @Override
    public List<String> onTabComplete(CommandSender sender, Command cmd, String arg2, String[] args) {
        return null;
    }
qui implémente;
Code:
public class TabComplete implements TabCompleter {

Donc j'ai "return" ma liste c'est bon c'est fonctionnel. Simplement que maintenant j'aimerais ajouter cette méthode sur une commande qui ne vient pas de MON plugin.

Je m'explique, j'ai créé une fonction qui récupère tout les noms des prisons crées via le plugin Essentials. "/createjail <nom>". Et donc maintenant j'aimerais ajouter cette fonction directement sur la commande "jail" du plugin Essentials.

Pour ce faire j'ai tenté de récupérer le plugin Essentials via la méthode;
Code:
Essentials ess = (Essentials) Bukkit.getServer().getPluginManager().getPlugin("Essentials");

C'est fonctionnel, cependant dans mon "onEnable()" je mets ceci;
Code:
ess.getCommand("jail").setTabCompleter(new TabComplete());

Et la console me retourne une "nullPointerException" à cette ligne.

Voilà toutes mes classes;
Code:
package me.Luca008.Tuto;

import org.bukkit.Bukkit;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;

import com.earth2me.essentials.Essentials;

public class Main extends JavaPlugin{
    Essentials ess = (Essentials) Bukkit.getServer().getPluginManager().getPlugin("Essentials");
    
    public void onEnable(){
        LoadConfig();
        PluginManager pm = getServer().getPluginManager();
        ess.getCommand("jail").setTabCompleter(new TabComplete());
    }
    
    private void LoadConfig(){
        getConfig().options().copyDefaults(true);
        saveConfig();
    }

}
Code:
package me.Luca008.Tuto;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.bukkit.entity.Player;

import com.earth2me.essentials.Essentials;

import net.ess3.api.IJails;

public class TabComplete implements TabCompleter {
    
    Essentials ess = (Essentials) Bukkit.getServer().getPluginManager().getPlugin("Essentials");

    @Override
    public List<String> onTabComplete(CommandSender sender, Command cmd, String arg2, String[] args) {
        if(cmd.getName().equalsIgnoreCase("jail")){
            Collection<String> Collec = null; //Collection qui stockera les jails(Car la fonction "getJails()" d'essentials retourne une collection) 
            try {
                IJails jails = ess.getJails(); //récupérer tout les jails
                Collec = jails.getList(); //les mettre dans ma collection
            } catch (Exception e) {
                e.printStackTrace();
            }
            ArrayList<String> listJ = new ArrayList<String>(Collec);//Transformation de ma collection en ArrayList
            ArrayList<String> finalL = new ArrayList<String>();//Contiendra tout les jails sous forme de String
            ArrayList<String> returns = new ArrayList<String>();//Contiendra des jails selon certaines conditions
            String[] jail = listJ.toString().replace("[", "").replace("]", "").replace(" ", "").split(",");//Mettre tout les jails sous forme de tableau en replaçant les "[","]" et les espaces(car les jails sont donnés sous la forme [ Jail1, Jails2, Jail..etc ]). Et au final en les séparant à la virgule.
            for(int i=0;i<jail.length;i++){
                finalL.add(jail[i]);//On ajoute tout les jails à notre liste
            }
            Collections.sort(finalL);//Je crois que cette ligne est inutile xD
            if(args.length == 1){
                String pname = "";
                for(Player pls : Bukkit.getOnlinePlayers()){
                    pname = pls.getName();
                    returns.add(pname);//Pour l'argument 0 de la commande /jail d'essentials, c'est le joueur, donc on ajoute tout les joueurs en ligne dans la liste
                }
                return returns;//On renvoit.
            }
            else if(args.length == 2){
                if(!args[1].equals("")){
                    boolean firstLetter = false;//boolean
                    String args1letter = args[1].substring(0, 1);//Je récupère la 1ère lettre de l'argument 1
                    for(int i=0;i<finalL.size();i++){
                        firstLetter = finalL.get(i).startsWith(args1letter);//Je regarde si ma liste contient un jail qui commence par la lettre de mon argument
                        if(firstLetter){//Si elle en contient
                            returns.add(finalL.get(i));//J'ajoute le/les jails à la liste
                            return returns;//Je renvoie
                        }
                    }
                }
                else{
                    return finalL;//Si la liste ne contient pas de jail qui commence par la 1ere lettre de l'argument 1 je retourne à tout les jails
                }
            }
        }
        return null;//null
    }

}
(Fonctionnel sur une commande crée sur MON propre plugin, c'est à dire que la commande est inscrite dans le "plugin.yml")
PHP:
[20:07:14] [Server thread/ERROR]: Error occurred while enabling TutoPlugin v1.2 (Is it up to date?)
java.lang.NullPointerException
at me.Luca008.Tuto.Main.onEnable(Main.java:15) ~[?:?]
at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:321) ~[spigotmc-1.8.8-R0.1.jar:git-Spigot-e4d4710-e1ebe52]
at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:340) [spigotmc-1.8.8-R0.1.jar:git-Spigot-e4d4710-e1ebe52]
at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:405) [spigotmc-1.8.8-R0.1.jar:git-Spigot-e4d4710-e1ebe52]
at org.bukkit.craftbukkit.v1_8_R3.CraftServer.loadPlugin(CraftServer.java:357) [spigotmc-1.8.8-R0.1.jar:git-Spigot-e4d4710-e1ebe52]
at org.bukkit.craftbukkit.v1_8_R3.CraftServer.enablePlugins(CraftServer.java:317) [spigotmc-1.8.8-R0.1.jar:git-Spigot-e4d4710-e1ebe52]
at org.bukkit.craftbukkit.v1_8_R3.CraftServer.reload(CraftServer.java:741) [spigotmc-1.8.8-R0.1.jar:git-Spigot-e4d4710-e1ebe52]
at org.bukkit.Bukkit.reload(Bukkit.java:535) [spigotmc-1.8.8-R0.1.jar:git-Spigot-e4d4710-e1ebe52]
at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:25) [spigotmc-1.8.8-R0.1.jar:git-Spigot-e4d4710-e1ebe52]
at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) [spigotmc-1.8.8-R0.1.jar:git-Spigot-e4d4710-e1ebe52]
at org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchCommand(CraftServer.java:641) [spigotmc-1.8.8-R0.1.jar:git-Spigot-e4d4710-e1ebe52]
at net.minecraft.server.v1_8_R3.PlayerConnection.handleCommand(PlayerConnection.java:1162) [spigotmc-1.8.8-R0.1.jar:git-Spigot-e4d4710-e1ebe52]
at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:997) [spigotmc-1.8.8-R0.1.jar:git-Spigot-e4d4710-e1ebe52]
at net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:45) [spigotmc-1.8.8-R0.1.jar:git-Spigot-e4d4710-e1ebe52]
at net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:1) [spigotmc-1.8.8-R0.1.jar:git-Spigot-e4d4710-e1ebe52]
at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) [spigotmc-1.8.8-R0.1.jar:git-Spigot-e4d4710-e1ebe52]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_141]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_141]
at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44) [spigotmc-1.8.8-R0.1.jar:git-Spigot-e4d4710-e1ebe52]
at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:715) [spigotmc-1.8.8-R0.1.jar:git-Spigot-e4d4710-e1ebe52]
at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [spigotmc-1.8.8-R0.1.jar:git-Spigot-e4d4710-e1ebe52]
at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [spigotmc-1.8.8-R0.1.jar:git-Spigot-e4d4710-e1ebe52]
at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [spigotmc-1.8.8-R0.1.jar:git-Spigot-e4d4710-e1ebe52]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_141]

Je pense avoir donné toute les informations nécessaires, en attendant une réponse de votre part, je vous souhaite une très bonne soirée!

Cordialement,
Luca008.
 
Réponse pour les éventuels intéressés;

Je ne peux pas initialiser ma variable "ess" dans ma class main tout simplement car aucun autre plugin n'est chargé lorsque la classe est instanciée, ce qui rend cette valeur nulle.

Donc lorsque j'essaye de faire;
"ess.getCommand("togglejail")" il n'a pas de valeur définie à "ess". Forcément on retourne donc à une "NullPointerException".

Résolution;
Code:
        Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable(){
            @Override
            public void run() {
                Essentials ess = (Essentials) Bukkit.getPluginManager().getPlugin("Essentials");
                ess.getCommand("togglejail").setTabCompleter(new TabComplete());
            }           
        },60L);
Dans le "onEnable()"

Ensuite, la commande d'essentials "jail" n'est pas vraiment une commande mais un aliase de la commande "togglejail". Donc dans la class "TabComplete()" dans ma première condition;
Code:
if(cmd.getName().equalsIgnoreCase("jail")){
}
Il suffit de remplacer "jail" par "togglejail".

Et voilà le tabCompleter est sur la commande du plugin essentials.


Bonne soirée.