Plugin Problème de détection d'une commande et bug sur l'arret d'un runTaskTimer

Game_T

Bucheron
13 Septembre 2017
15
1
14
19
Bonjour,
As tu une stacktrace lors de l'exécution de ton plugin ou d'une des commandes ?
 

HeliCrypt

Apprenti dév. Java
16 Novembre 2019
9
0
1
Quelque part
Pour mon plugin ainsi que mes autres commandes oui mais quand j'execute la commande "/village", ça me dit juste dans la console :

Code:
Poke_Diamond issued server command: /village
 

Game_T

Bucheron
13 Septembre 2017
15
1
14
19
Bonsoir,
J'ai regardé un petit peu ton code, et j'ai modifié pas mal de choses.
Je t'invite à aller voir les 3 classes que j'ai posté sur Github. (/!\ Code non testé)
N'hésite pas a revenir vers moi si ça ne marche pas du tout, ou si tu ne comprends pas.
Bonne soirée.
EDIT: dans le code, il manquera une partie (les booleans ne sont jamais vrais, mais je ne sais cependant pas quand es ce que tu veux que ceux-ci le deviennent)
 
Dernière édition:

HeliCrypt

Apprenti dév. Java
16 Novembre 2019
9
0
1
Quelque part
Suite à un récent test du plugin, je me suis rendu compte que malgré votre changement, le plugin ne fonctionnais pas. J'ai donc modifié le code pour le rendre plus lisible pour moi étant donné que je ne maîtrise pas les hashmaps et donc j'ai utilisé d'autres méthode mais malgré ça, le bug sur l'arrêt du chrono ne fonctionne pas. J'ai observé ce qu'il se passait avec différentes méthodes et j'ai donc conclu que le problème venait de la condition qui n'était jamais vraie et donc que le chrono ne s'arrêtait jamais à moins de déco reco ou de reload le serveur.
Lien du github sur lequel mon plugin est :
GitHub
 

ShE3py

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

Bon on va pas se mentir ton code est légèrement bordélique, je tiens juste à te faire remarquer que les identifiants des variables, comme ceux des fonctions, n'ont a priori pas de limite de taille, évite donc d'utiliser des abréviations telles que paiementP, paiementR, minep, TimerP et tout particulèrement A. Sans contexte, aucune idée de savoir ce que A représente. Avec l'autocomplétion, tu peux taper une variable de 20 caractères en tapant les 3 premiers, tu ne perds pas vraiment de temps et cela rendra ton code plus lisible, surtout que l'on doit déchiffrer leur signification, même si toi tu connais le nom entier dans une semaine tu ne sauras que l'abréviation, ce qu'elle abrège seul Dieu le saura.

Bon sinon, stocke les BukkitTask qui prélève l'argent toutes les minutes dans une Map<Player, BukkitTask>, car là en faisant une boucle while qui bloque le traitement de la commande, tu vas juste demander au watchdog de faire crash le serveur.
Tu dis que tu ne maîtrises pas les Hashmaps, mais ce sont vraiment les conteneurs de base en programmation et ils sont plus qu'utiles.

Cordialement,
ShE3py.
 

Detobel36

Créateur de plugins (PhoenixRebirth)
Support
17 Août 2012
10 531
24
2 247
347
27
Bruxelles - Belgique
www.phoenix-rebirth.fr
Salut,

Pour information on ne push normalement jamais les fichiers compilé (donc le dossier "bin" n'a rien a faire sur github). Pour éviter cela, on utilise un fichier nommé ".gitignore" qui permet de mettre tous les dossiers que l'on ne veut pas envoyé en ligne.

Egalement pour information:
Java:
System.out.println("Le plugin BusinessWorld vient de s'allumer");
C'est très bien pour du Java de base... Ici tu fais un plugin. System.out c'est pas tip top.
Utilise le système de log de bukkig: Bukkit.getLogger().info("ton message");. Ou mieux, le logger attaché à ton plugin (dans ton main, ou en récupérant l'instant du main): getLogger().info("ton message");

Au passage j'ai remarqué que ton code n'était pas encodé en UTF-8. Prend le temps de configurer ton IDE, c'est quand même la norme aujourd'hui ;)

Java:
getCommand("test").setExecutor(new CommandTest());
getCommand("alert").setExecutor(new CommandTest());
Donc la tu as créé deux fois l'objet "CommandTest"... Pourquoi faire ?
Java:
final CommandTest cmdTest = new CommandTest();
getCommand("test").setExecutor(cmdTest);
getCommand("alert").setExecutor(cmdTest);
Pareil pour le "GameCommand" hein ;)

Bon maintenant "CommandTest":
Java:
if(cmd.getName().equalsIgnoreCase("bw test")) {
Dans ma tête (je n'ai pas fait le test, donc je me trompe peut-être), le "cmd" continent uniquement la commande. Donc si tu tapes: /super nouvelle commande
cmd contient "super" et la variable args contient ["nouvelle", "commande"].

Surtout que dans le main tu dis que la commande c'est soit "test", soit "alert"... Donc tu ne peux pas vérifié si la commande égale "bw".
Y a quelque chose de pas logique la...


Bon dans GameCommand:
Java:
Mine mine = new Mine(false, false);
Tu es au courant que tu créé un nouvel objet Mine chaque fois qu'on fait la commande... (au passage, même si le joueur tape la commande /moneygivechrono m'enfin c'est un détail ça).

Dans ta condition pour arrêté la boucle tu mets ça:
Java:
minepa.schedule(new TimerTask() {                        
    @Override
    public void run() {
        if(!mine.getMineP()) {
            ...
        }
    }
});
Sauf qu'en fait une fois la commande exécuté tu ne touche plus à l'objet "mine". Vu que tu en recréer un nouveau (c'est bien pour ça qu'on met "new").

Pour bien t'expliquer, quand je fait la commande /mine (sans argument). Il y a une erreur, mais tu créé quand même une instance de l'objet "Mine". Appelons cette instance "mine1". (Exactement comme pour les joueurs. Tu as un objet "Player" et une instance par joueur "Player(Detobel36)" par exemple).
Si maintenant je fais /mine p, une nouvelle instance "Mine" est créé, disons "mine2". Et le compteur est lancé sur "mine2".
Si maintenant je fais /village et bien il créé encore une instance de "Mine", disons "mine3" et il fait un setMineP(false) sur l'instance "mine3". Pas sur l'instance "mine2".

Pour corrigé ton problème il faut sortir la variable de la méthode...
Je t'ai rapidement corrigé ton fichier ici: https://github.com/HeliCrypt-mc/business-world/pull/1
Il y a beaucoup de choses à améliorer si tu veux un code nickel... Mais au moins ici cela devrait fontionner.


Cordialement,
Detobel36
 

HeliCrypt

Apprenti dév. Java
16 Novembre 2019
9
0
1
Quelque part
Je reviens vers vous car après quelques test, ça ne fonctionne pas et ça continue à effectuer des paiements malgré le fait que l'on effectue la commande /village.