Plugin Résolu Code Java : player sender ne fonctionne pas

Alex Fatta

Commandant de la Flotte et de la Horde
13 Août 2014
1 389
1
191
187
Yo les gens c'est re-moi pour un code en java qui... ne fonctionne pas ! :D

Pour une raison X ou Y je ne sais pas pourquoi quand je rentre ma commande /gadgets et bah rien. Pas d'action en jeu, pas d'erreurs dans la console ni au démarrage ni lors de la saisie de la commande. C'est à croire qu'il ne détecte pas le (Player) sender; pourtant il est bien mis et il y a aucune erreur. Je m'en remet à vous développeurs ayant plus d'expériences et de connaissances que moi ^^

PHP:
    public boolean onCommand(Command sender, Command command, String label, String[] args){
       
        if(sender instanceof Player){
           
       
            Player p = (Player) sender;  
               
            if(label.equalsIgnoreCase("gadgets")){
                main.give(SpeedHackGadget.class, p);
                main.give(FireballGadget.class, p);
                main.give(PunchSkyGadget.class, p);
                main.give(coming.class, p);
                p.sendMessage("§aTu as recu les gadgets !");
               
            }  
        }
        return false;
    }

Voilà merci à vous ! :D

AlexFatta

PS : Si @Detobel36 vois ceci, j'ai regardé sur ce que tu m'as envoyé et j'en ai inséré 2-3 morceaux mais rien :/
 
Dernière édition:
Bonjour !

J'ai essayé ceci :
PHP:
    public boolean onCommand(Player sender, Command command, String label, String[] args){
               
            if(label.equalsIgnoreCase("gadgets")){
                sender.sendMessage("§aTu as recu les gadgets !");
               
            }  
        return false;
    }

Et même juste ceci ça ne fonctionne pas. J'ai aucune erreur dans la console je comprend vraiment pas d'où provient le problème :/

Merci à tous,

AlexFatta

EDIT : J'ai essayé avec ceci pour voir si ça venait de la commande ou d'ailleurs mais je ne sais pas quoi en conclure finalement x)

PHP:
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args){
        
        if(sender instanceof Player){
            
        
            Player p = (Player) sender;   
                
            if(label.equalsIgnoreCase("gadgets")){
                p.setGameMode(GameMode.SURVIVAL);
                
            }   
        }
        return false;
    }

Bien évidemment, rien ne se passe. Le Gamemode change pas, et lors des anciens pas de messages non plus. J'ai aucune erreur ni dans Eclipse ni dans la console.
 
Dernière édition:
Salut,

PS : Si @Detobel36 vois ceci, j'ai regardé sur ce que tu m'as envoyé et j'en ai inséré 2-3 morceaux mais rien :/
J'ai par reçu d'alerte pour ça... Mentionner quelqu'un lorsqu'on edit son message n'envoie pas de notif :/


Bête question mais, as-tu bien modifier ton plugin.yml pour y mettre ta commande ?

As-tu bien également définit une ligne tel que celle-ci dans ton "onEnable":
Code:
getCommand("basic").setExecutor(new MyPluginCommandExecutor(this));



Cordialement,
Detobel36
 
@Detobel36 si je met le "this" il surligne en rouge le "new MyGadgets" (Oui j'ai remplacé MyPluginCommandExecutor par le nom de ma classe où il y a la commande c'est cela ?)

AlexFatta

EDIT :

J'ai une erreur dans la console avec ça :
PHP:
    @Override
    public void onEnable() {
        addGadget(new SpeedHackGadget());
        addGadget(new FireballGadget());
        addGadget(new PunchSkyGadget());
        addGadget(new coming());
        getServer().getPluginManager().registerEvents(new GadgetsListener(this), this);
        getCommand("gadgets").setExecutor(new MyGadgets());
    }

J'ai ça dans la console :
Code:
[14:43:26 INFO]: [Gadgets] Enabling Gadgets v1.0.0
[14:43:26 ERROR]: Error occurred while enabling Gadgets v1.0.0 (Is it up to date?)
java.lang.IllegalArgumentException: Plugin already initialized!
        at org.bukkit.plugin.java.PluginClassLoader.initialize(PluginClassLoader.java:122) ~[spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.java.JavaPlugin.<init>(JavaPlugin.java:66) ~[spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at com.gadgets.fr.MyGadgets.<init>(MyGadgets.java:15) ~[?:?]
        at com.gadgets.fr.MyGadgets.onEnable(MyGadgets.java:25) ~[?:?]
        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:321) ~[spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:340) [spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:405) [spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.craftbukkit.v1_8_R3.CraftServer.loadPlugin(CraftServer.java:357) [spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.craftbukkit.v1_8_R3.CraftServer.enablePlugins(CraftServer.java:317) [spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.s(MinecraftServer.java:414) [spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.k(MinecraftServer.java:378) [spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.a(MinecraftServer.java:333) [spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.DedicatedServer.init(DedicatedServer.java:263) [spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:525) [spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_111]
Caused by: java.lang.IllegalStateException: Initial initialization
        at org.bukkit.plugin.java.PluginClassLoader.initialize(PluginClassLoader.java:125) ~[spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.java.JavaPlugin.<init>(JavaPlugin.java:66) ~[spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at com.gadgets.fr.MyGadgets.<init>(MyGadgets.java:15) ~[?:?]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_111]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) ~[?:1.8.0_111]
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) ~[?:1.8.0_111]
        at java.lang.reflect.Constructor.newInstance(Unknown Source) ~[?:1.8.0_111]
        at java.lang.Class.newInstance(Unknown Source) ~[?:1.8.0_111]
        at org.bukkit.plugin.java.PluginClassLoader.<init>(PluginClassLoader.java:76) ~[spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:131) ~[spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.java:329) ~[spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:251) ~[spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.craftbukkit.v1_8_R3.CraftServer.loadPlugins(CraftServer.java:292) ~[spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.DedicatedServer.init(DedicatedServer.java:198) ~[spigot_server.jar:git-Spigot-db6de12-18fbb24]
        ... 2 more

Et donc de base dans mon onEnable j'ai ça :
PHP:
    @Override
    public void onEnable() {
        addGadget(new SpeedHackGadget());
        addGadget(new FireballGadget());
        addGadget(new PunchSkyGadget());
        addGadget(new coming());
        getServer().getPluginManager().registerEvents(new GadgetsListener(this), this);
    }
 
Salut,

Faut réfléchir à ce que tu fais...
Moi j'ai fais que posé des questions, a aucun moment j'ai mis une solution :)

Quand tu fais un "new". Tu créés un objet. La ligne que je t'ai donné est extraite du wiki de bukkit. Ils ont décidé de passé en paramètre lors de la création de l'objet, le main.
En d'autres mot, lorsque tu fais un:
Code:
new SuperObjet(this);
Il faut que dans la class SuperObjet il y ai qqch comme ceci:
Code:
class SuperObjet {

    // Ceci est un constructeur
    public SuperObjet(Object obj) {
        /// BLABLA
    }
Où évidemment "object" doit être replacé par le nom de la class où l'objet est appelé.

En effet "this" représente la class actuelle. Et plus précisément l'instance actuelle de l'objet.
Si tu lis un peu de documentation concernant l’orienté objet et notamment l'encapsulation, ... tu verra que c'est très puissant et que ça s'adapte très bien. Exemple concret:
Code:
class A {
    public int bla() {
        return 2;
    }

    public int salut() {
        return 5;
    }

}

class B extends A {
   
    public int lol() {
        return this.salut() + super.bla();
    }

    public int lol2() {
        return this.salut() + this.bla();
    }

    public int bla() {
        return 100;
    }

}

Les résultats seront:
Code:
B objB = new B();
objB.lol(); // donne 7
objB.lol2(); // donne 105

A objA = new A();
objA.bla(); // donne 2

Bref, on s'éloigne du sujet (même si normalement ça devrait réintégré et aider un peu à ta compréhension général).

Dans le cas présent la solution et juste tout simplement mettre la ligne que je t'ai donné sans le "this" dans la création de ta class (sauf si tu as fait un constructeur qui le nécessite).


Cordialement,
Detoble36
 
OMG mais ans la class SuperObject (Pour garder ton exemple) je sais pas quoi mettre dedans xDDD Oui j'ai créer une class MyCommandGadgetsExecutor et dedans j'ai :
PHP:
public class MyCommandGadgetsExecutor implements CommandExecutor {

    @Override
    public boolean onCommand(CommandSender arg0, Command arg1, String arg2, String[] arg3) {
        // TODO Auto-generated method stub
        return false;
    }

}

Mais je n'ai aucune idée de quoi mettre dedans. Je rappel que je suis novice mon @Detobel36 x)


AlexFatta
 
Salut,

Je rappel que je suis novice mon @Detobel36 x)
Raison de plus pour te documenter :)

Mais tu te complique la vie...
Je suppose que tu appel ton main "MyGadget" ? (sans infos moi je peux pas deviner...).

Du coup:
MyGadget.java
PHP:
public class MyGadget extends JavaPlugin {

    @Override
    public void onEnable() {
        addGadget(new SpeedHackGadget());
        addGadget(new FireballGadget());
        addGadget(new PunchSkyGadget());
        addGadget(new coming());
        getServer().getPluginManager().registerEvents(new GadgetsListener(this), this);
        getCommand("gadgets").setExecutor(new MyCommandGadgetsExecutor());
    }

}

MyCommandGadgetsExecutor
PHP:
public class MyCommandGadgetsExecutor implements CommandExecutor {

    public boolean onCommand(Command sender, Command command, String label, String[] args){
      
        if(sender instanceof Player && label.equalsIgnoreCase("gadgets")) {
            Player p = (Player) sender; 
              
            // Je ne sais pas ce que représente "main"...  A toi de le savoir :)
            main.give(SpeedHackGadget.class, p);
            main.give(FireballGadget.class, p);
            main.give(PunchSkyGadget.class, p);
            main.give(coming.class, p);
            p.sendMessage("§aTu as recu les gadgets !");
            return true;
        }

        return false;
    }


}


Cordialement,
Detobel36
 
Aaaah ! Non x) Merci Jamy on tient le bon bout ! Cette fois-ci quand je rentre la commande j'ai "An internal error occurred while attempting to perform this command"

J'ai ceci dans mon MyCommandGadgetsExecutor :
PHP:
package com.gadgets.fr;

import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

import com.gadgets.all.FireballGadget;
import com.gadgets.all.PunchSkyGadget;
import com.gadgets.all.SpeedHackGadget;
import com.gadgets.all.coming;

public class MyCommandGadgetsExecutor implements CommandExecutor {

    private MyGadgets main;
    
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String args[]){
        if(sender instanceof Player && label.equalsIgnoreCase("gadgets")) {
            Player p = (Player) sender;
              
            // Je ne sais pas ce que représente "main"...  A toi de le savoir :)
            main.give(SpeedHackGadget.class, p);
            main.give(FireballGadget.class, p);
            main.give(PunchSkyGadget.class, p);
            main.give(coming.class, p);
            p.sendMessage("§aTu as recu les gadgets !");
            return true;
        }

        return false;
    }

}

Et ceci dans la console :
PHP:
[15:24:46 INFO]: AlexFatta issued server command: /gadgets
[15:24:46 ERROR]: null
org.bukkit.command.CommandException: Unhandled exception executing command 'gadgets' in plugin Gadgets v1.0.0
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) ~[spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchCommand(CraftServer.java:641) ~[spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PlayerConnection.handleCommand(PlayerConnection.java:1162) [spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:997) [spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:45) [spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:1) [spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) [spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_111]
        at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_111]
        at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44) [spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:715) [spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [spigot_server.jar:git-Spigot-db6de12-18fbb24]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_111]
Caused by: java.lang.NullPointerException
        at com.gadgets.fr.MyCommandGadgetsExecutor.onCommand(MyCommandGadgetsExecutor.java:23) ~[?:?]
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[spigot_server.jar:git-Spigot-db6de12-18fbb24]
        ... 15 more


AlexFatta
 
Salut,

Allé allé... réfléchit stp :(
Déjà lis l'erreur... Elle est la pour toi (et non contre toi).

Caused by: java.lang.NullPointerException
at com
.gadgets.fr.MyCommandGadgetsExecutor.onCommand(MyCommandGadgetsExecutor.java:23) ~[?:?]
L'erreur vient d'un "null pointer". En gros une variable vide.
Qui se trouve dans "MyCommandGadgetsExecutor" en ligne 23. Tu vois tout ça dans l'erreur ci-dessus ? Prend le temps de check stp ;)

Ligne 23 on a ça:
Code:
main.give(SpeedHackGadget.class, p);
Après analyse, tu te rend compte que "p" ne peut pas être null (le premier "if" n'aurait jamais été "true"), le "SpeedHackGadget.class" ne peut pas être vide non plus, c'est une référence vers une class. Ton plugin n'aurait pas compilé.
Seule explication, "main" est vide.

Effectivement, main n'est jamais initialisé.

2 solutions pour initialiser cette variable. Soit faire un constructeur et le passé en paramètre comme Bukkit le proposait ;)
Soit faire une méthode static dans ton mail qui permet de faire un "getInstance" et de récupérer l'instance de ton plugin.

N'essayes pas à tout pris d'arriver à un résultat ;) Comprend ce que tu fais. Y a pleins de tutoriel sur Java, la création de plugin bukkit ect.


Cordialement,
Detobel36
 
Bonsoir @Detobel36 !

J'ai lu et relu ce que tu as dit. J'ai fais quelques recherche mais y'a vraiment des choses que je comprend pas par manque de connaissance. Il y a quand même une chose qui me perturbe : c'est que même juste en mettant un simple message à envoyer, le plugin ne fait rien. Et sur d'autre plugin que j'ai fais en suivant des tutos on avait pas fait 18 000 class o_O J'ai constaté en tout cas que en java il y a plusieurs moyens d'arriver à la solution. Tu m'en proposes une, je ne le comprend pas vraiment mais je suis curieux ^^ En tout cas je vois vraiment pas comment effectuer les actions que tu as citées plus haut. Je te jure j'essaie de réfléchir xD Mes parents me disent souvent "Fais marcher ton cerveau" x) Enfin bref. Si tu es une âme généreuse et aimable tu pourrais m’éclairer un peu ? xD

Voilà voilà ! :D

AlexFatta