Comment récupérer le type de variable d'un argument (clique pour + d'info) ?

TaoTechCraft

Aventurier
6 Mai 2019
7
0
1
Bonjour,

J'aimerais savoir comment récupérer le type de variable(String, int, boolean etc...) d'un argument d'une commande ?
 
Dernière édition:

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 150
164
464
247
21
Mìlhüsa
Bonsoir,

Les arguments des commandes sont parsés comme des chaînes de caractères, tu dois manuellement les convertir.
Tu as des fonctions standard pour cela : Integer#parseInt, Double#parseDouble, etc.
Elle peut renvoyer un NumberFormatException si l'argument n'est pas convertissable en ce type, comme toujours ne jamais faire confiance à l'utilisateur.

Exemple :
Code:
int foo;

try {
   foo = Integer.parseInt(args[0]);
}
catch(NumberFormatException ignored) {
   sender.sendMessage("Nice one");
 
   return true;
}

Cordialement,
ShE3py.
 

TaoTechCraft

Aventurier
6 Mai 2019
7
0
1
Merci.

Bonjour,

Merci beaucoup pour la réponse mais je ne sais pas trop où placer le code exactement et j'ai envie de faire un plugin clean sans erreur. Voici le code :
 
Dernière édition par un modérateur:

Alex Fatta

Commandant de la Flotte et de la Horde
13 Août 2014
1 391
1
191
187
Bonjour !

Tu peux utiliser une technique sale mais je te le conseil pas. C'est pas le plus sécurisé et ca risque de planter. Mais c'est bien pour un test ou un tout petit plugin par exemple :

Code:
if (args[0] instanceof Integer) {
    ton code
}

A toi ensuite de remplacer Integer par les types souhaités.

Mais penches toi sur ce qu'a dit ShE3py.

AlexFatta
 

TaoTechCraft

Aventurier
6 Mai 2019
7
0
1
Enfaite la commande c'est un /pay et je veux vérifier que le joueur a bien fait /pay <pseudo(String)> <montant(Int)>.
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 150
164
464
247
21
Mìlhüsa
Je verrais un truc dans le genre
Code:
public class PayCommand implements CommandExecutor {
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if(!sender.hasPermission("foo.bar")) { sender.sendMessage("§cVous n'avez pas la permission !"); return true; }
        if(args.length != 2) { sender.sendMessage("Usage: /pay <player> <amount>"); return true; }
        
        OfflinePlayer target = Bukkit.getOfflinePlayer(args[0]);
        if(!target.hasPlayedBefore()) { sender.sendMessage("§cLe joueur " + args[0] + " n'existe pas"); return true; }
        
        int amount;
        try {
            amount = Integer.parseInt(args[1]);
        }
        catch(NumberFormatException ignored) {
            sender.sendMessage("§c" + args[1] + " n'est pas un nombre valide");
            
            return true;
        }
        
        if(sender instanceof Player) doTransaction((Player) sender, target, amount);
        else giveMoney(target, amount);
        
        return true;
    }
}

  • Utilise OfflinePlayer à la place de Player, comme ça le système marchera pour les joueurs déconnectés
  • Bukkit#getOfflinePlayer renverra toujours un joueur, tu dois utiliser #hasPlayedBefore au lieu d'un null-check
  • Celui qui exécute la commande n'est pas forcément un joueur, tu dois d'abord vérifier avec instanceof. Tu peux ainsi faire des spécialisations, par ex. que la console ait un compte en banque infini
  • Si tu passes par des fonctions asynchrones, fait attention à l'atomicité
  • N'écoute pas l’aberration d'@Alex Fatta (mais oui, Integer est connu pour être une sous-classe de String ^c^)
    upload_2019-8-2_15-47-35.png
 
  • J'aime
Reactions: DiscowZombie

TaoTechCraft

Aventurier
6 Mai 2019
7
0
1
Merci beacoup ShE3py tu m'aides bcp

Mais quand j'utilise ton code doTransaction et giveMoney ont une erreur. Sais tu pourquoi ?
 
Dernière édition par un modérateur:

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 150
164
464
247
21
Mìlhüsa
Car comme te l'indiques ton IDE, les fonctions n'existent pas. Je ne vais pas faire tout ton plugin quand même. Tu dois relayer les appels vers ta classe utilitaire qui gère les comptes.<
Et modifie ton dernier message au lieu de poster deux messages consécutifs, comme tu peux le voir c'est un forum.