Problème d’exécution des commands block

Nairolf_

Nairolf
15 Juillet 2020
66
4
35
22
www.youtube.com
Bonjour,
Je suis actuellement en train de créer un mod de jeu pour mon serveur Minecraft, et j’ai un problème plutôt gênant. Je m’explique:

J’ai crée un plugin pour mon mode de jeu, et j’ai de temps en temps besoin qu’un command block s’active. Ils fonctionnent bien, exécutent également les commandes des autres plugins, mais pas des mien...

Il y a deux principales commandes:
  • une commande qui place des blocks (comme le /setblock);
  • et une autre commande qui permet de teleporter le joueur le plus proche a un endroi.

Les 2 commandes fonctionnent si on les entres dans le chat, mais pas lorsque on les rentrent dans un command block.
Un message d’erreur s’affiche dans les logs du serveur (il fait une dizaine / vingtaine de lignes).
J’ai fait un test en mettant la commande à exécuter dans mon plugin, comme ça, je n’ai qu’à entrer la commande dans le chat permettant d’exécuter l’autre (celle qui ne marche pas), et rien ne fonctionne, et toujours le message d’erreur dans le chat.

Merci d‘avoir pris du temps à avoir lu mon message.
Cordialement

Nairolf_
 
Dernière édition:

ShE3py

Développeur en autodidacte
Support
26 Septembre 2015
2 517
58
359
247
20
Mìlhüsa
Bonsoir,

Un message d’erreur s’affiche dans les logs du serveur
Tu pourrais envoyer ladite erreur, avec le code source de la commande.

Le tout dans des balises code, pour que cela soit lisible :
Code:
[code]
Copie-colle l'exception/le code entre ces deux balises
[*/code]


Sans l'astérisque « * ».
Mais bon, d'après ce que tu as dit, je suppose que c'est une ClassCastException.

Cordialement,
ShE3py.
 
  • J'aime
Reactions: Nairolf_

Nairolf_

Nairolf
15 Juillet 2020
66
4
35
22
www.youtube.com
Oui, je pense que c’était écrit ClassCastExeption dans les logs

Le code source de la commande:
Code:
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "setblock cordonnées minecraft:nom_du_block");
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "setblock cordonnées minecraft:nom_du_block");
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "setblock cordonnées minecraft:nom_du_block");
...

Sinon, le code source, je ne l’ai pas sous les yeux, mais je te le montrerai des que possible. :)
 
Dernière édition:

ShE3py

Développeur en autodidacte
Support
26 Septembre 2015
2 517
58
359
247
20
Mìlhüsa
Envoie les logs et le code source quand tu les auras alors, parce que là tu as envoyé ton workaround, de tête je suppose car il ne veut rien dire. Je ne peux rien en tirer.
 

ShE3py

Développeur en autodidacte
Support
26 Septembre 2015
2 517
58
359
247
20
Mìlhüsa
Tu essayes de récupérer le joueur qui a exécuté la commande en castant le CommandSender. Mais ce n'est pas un joueur qui exécute la commande.

Je peux te donner une solution si tu envoies la code source de StbPlayer.java.
 
  • J'aime
Reactions: Nairolf_

ShE3py

Développeur en autodidacte
Support
26 Septembre 2015
2 517
58
359
247
20
Mìlhüsa
Java:
if(args.length >= 1) {
    StringBuilder bc = new StringBuilder();
    for(String part : args) {
        bc.append(part + " ");
    }
    
    if(args[0].equalsIgnoreCase("1")) {
        Player player1 = (Player) sender;
        System.out.println("§4Player 1 {" + player1.getName() + "} set to " + bc.toString());
        Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "tp " + player1.getName() + " 156 24.5 -49");
    }
}

Rien n'oblige sender à être castable en Player. Dans ton cas, le commandblock n'est pas un joueur.

Et sinon, au lieu de passer par un StringBuilder, tu peux passer par :
Java:
String flatArgs = String.join(" ", args);
Il joindra tous les éléments dans args avec un espace.

Et sinon, n'utilise pas Thread#sleep(long) pour attendre une seconde : tu arrêtes tout le serveur pendant une seconde.
Passe par le Scheduler de Bukkit, en utilisant par ex. BukkitScheduler#runTaskLater(Plugin, Runnable, long).

Enfin, si tu veux faire quelque chose, utilise une fonction et ne simule pas l'exécution d'une commande.
Java:
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "tp " + player1.getName() + " 156 24.5 -49");
// le jeu va regarder si la commande 'tp' existe, et vérifier tous les arguments
// convertir la chaîne de caractère en nombres
// 
// cela revient à ouvrir tous les tiroirs d'une chambre pour chercher un objet
// dont on connait déjà dans quel tiroir il se trouve

player1.teleport(new Location(player1.getWorld(), 156d, 24.5d, -49d));
// plus lisible, tu peux changer le monde et promouvoir la location en variable
// + l'appel est direct

// de plus, un plugin peut annuler la téléportation
// ex: WorldGuard empêche un joueur de rentrer dans une zone protégée
boolean success = player1.teleport(location);
if(!success)
    sender.sendMessage("Hmmmmm");

// enfin, la commande n'apparaît pas dans les logs
// le cas échéant, tu aurais une ligne par téléportation
 
  • J'aime
Reactions: Nairolf_