Aide debug d'un plugins en fabrication...

SkyBeast55

Architecte en herbe
30 Mars 2014
110
11
75
Bonjour, j'ai créé cette discutions pour demander de l'aide à la création d'un plugin qui a un problème que je ne sais pas résoudre ou même trouver. J'ai testé le plugin seul sur un serveur local, il ne fonctionnait pas, donc ce n'est pas une incompatibilité.

Le .java (Fichier Main): http://pastebin.com/0SwbSA8x
Le plugin.yml: http://pastebin.com/QTf1myT4

Mes logs: http://pastebin.com/pjyYr1Xr
le .jar final: https://www.dropbox.com/s/ip5eec44y0yftoc/Le plug final.jar?dl=0

Le but de ce plugin est de faire un /duel {Joueur} pour demander un duel à {Joueur}; Le Joueur recevant la demande l'accepte en utilisant la commande /duelaccept, puis ils sont TP dans un arène et peuvent PVP ! Si je Joueur recevant la demande ne répond pas, la demande se supprime au bout de 2s ... (à modifier les 5 secondes...)

C'est mon premier plugin, j'ai peut être trop foncer pour créer un plugin de ce genre ...

En espérant recevoir votre aide,
SkyBeast.
 
Ouais, effectivement, t'as sauté des étapes.
Déjà, si tu sais pas mettre de onEnable/onDisable, c'est que tu dois recommencer les cours. ._.
De plus, si tu regardais les logs, l'erreur est à la ligne 18.
Je te laisse corriger (tu devrais savoir le faire quand même), surtout que cette ligne est absolument inutile. o/

Je sais très bien mettre de ça mais je n'en vois pas l'utilité... C'est obligatoire ? Bon passons...
Sinon pour l’erreur à la ligne 18... j'ai fait un truc bizarre je l'accorde ... Mais je ne vois pas mon erreur, car en suppriment cette ligne et en changeant les choses à changer, ça ne marche toujours pas... Et l'erreur n'est pas ligne 18, mais 17 ...
Merci d'avoir répondu et j'attend impatiemment ta réponse !
 
Salut SkyBeast,

Il y a comme qui dirait quelques soucis dans ta classe Main.java. J'espère être assez clair dans la suite de ma réponse, si je dis quelque chose qui t'es flou, dis le moi.

- ligne 13 : La méthode onCommand() prend paramètre un objet nommé : sender, de type CommandSender. "CommandSender" qu'on pourrait traduire par "émetteur (comme l'auteur d'une lettre) de commande (une commande comme /duel)". Et qu'est ce qui peut envoyer une commande ? Un joueur ou bien la console du serveur qui sont deux choses très différentes. Donc ton caste est inutile voir même très dangereux car en faisant ça tu pourrais même créer une erreur fatale pour le fonctionnement de ton plugin par la suite.

- ligne 18 : Cette ligne là est inutile. Sache que les références reçues en paramètre restent valides entre le début et la fin de ta méthode. Pas la peine de la copier. Je ne suis pas sûr d'être clair. Simplement, je veux dire que tu peux accèder à : args, sans avoir besoin de faire quoi que ce soit.

- ligne 19 : Un tableau est indicé à partir de la case 0. Ce qui signfie que pour accèder à la première case de ton tableau du doit faire args[0] et non args[1]. D'où ton : java.lang.ArrayIndexOutOfBoundsException: 1. Array_Index_Out_Of_Bounds peut être traduit par : index du tableau hors limites. et 1 parce que [1].

En principe ceci devrait prévenir quelques problèmes et corriger le soucis majeur face au quel tu es. Tiens nous au courant.
 
  • J'aime
Reactions: SkyBeast55
J'ai éditer mon post, je ne sais pas si tu as vu. Ca ne fonctionne toujours pas ?

Je sais j'attendais juste que tu termine le message pour répondre...
Pour l'histoire du tableau, MERCI ! Ça paressait logique dans ma tête mais seulement dans ma tête =)
La ligne 18 j'ai fait un truc inutile, je le sais j'étais fatigué (excuse de malade...)
Pour l'histoire du CommandSender, j'ai compris mais je ne sais pas comment m'y prendre pour changer un CommandSender en Player...
Sinon merci de me répondre, ça m'aide beaucoup !

EDIT: Ah non pas besoin ! ça marche... Comment ça se fait que le CommandSender se transforme en Player ?
 
Très concrétement tu n'as pas besoin de t'en occuper ^^
La méthode sendMessage() est un membre de la classe CommandSender. Tu peux donc faire sender.sendMessage("Hello world !"); directement. Pas besoin de caster en Player.
 
  • J'aime
Reactions: SkyBeast55
Très concrétement tu n'as pas besoin de t'en occuper ^^
La méthode sendMessage() est un membre de la classe CommandSender. Tu peux donc faire sender.sendMessage("Hello world !"); directement. Pas besoin de caster en Player.

Donc si je comprends bien Sender et Player c'est la même chose sauf que Sender peut être la console ? Du coup faut que je fasse un if(sender.instanceof(Player)) {} pour éviter le les erreurs ? C'est pas du tout obligatoire si je me trompe pas...

Et je dois me coucher alors si tu me réponds je pourais te répondre seulement demain...
Et aussi: Comment je fais pour detecter si Args[0] est vide ? j'ai essayé if(args[0] == null) mais ça n'a pas l'air de fonctionner...
 
J'ai l'impression que tu ne maîtrises la programmation orientée objet mais en gros pour t'expliquer. Un camion est un véhicule, une voiture est un véhicule. Un véhicule peut-être conduit. C'est donc à la classe véhicule qu'appartient la méthode conduire, pas à la voiture, et au camion particulièrement. Donc pas besoin de faire de test.
Néanmoins, on peut imaginer que tu es une commande très puissante et donc très sensible (c'est à dire que personne à part l'administrateur du serveur ne puisse utiliser), tu pourrais donc vouloir pour être sur qu'aucun joueur n'y touche, qu'elle ne puisse être entrée que depuis la console. Et là ! Tu ferais un test " if(sender.instanceof(Player)) ".
A l'inverse, tu peux vouloir être sur que tes commandes ne sont éxécutées que par des joueurs.
 
  • J'aime
Reactions: SkyBeast55
J'ai l'impression que tu ne maîtrises la programmation orientée objet mais en gros pour t'expliquer. Un camion est un véhicule, une voiture est un véhicule. Un véhicule peut-être conduit. C'est donc à la classe véhicule qu'appartient la méthode conduire, pas à la voiture, et au camion particulièrement. Donc pas besoin de faire de test.
Néanmoins, on peut imaginer que tu es une commande très puissante et donc très sensible (c'est à dire que personne à part l'administrateur du serveur ne puisse utiliser), tu pourrais donc vouloir pour être sur qu'aucun joueur n'y touche, qu'elle ne puisse être entrée que depuis la console. Et là ! Tu ferais un test " if(sender.instanceof(Player)) ".
A l'inverse, tu peux vouloir être sur que tes commandes ne sont éxécutées que par des joueurs.

Ouais ça j'ai compris, donc Player est comme un type de CommandSender... Mais pour détecter que un joueur n'a pas mis d'Args à sa commande ?

EDIT: Trouvé ! Il faut pas test if (Args[0] == null) car il existe pas mais faut test le tableau: if args.length ==0