Résolu Limite d'utilisation d'une commande en java.

Karmix

C#
21 Septembre 2019
10
0
12
22
Bonjour,

Depuis peu je cherche une solution pour avoir une commande avec un nombre d'utilisation limité.
Pour un nouveau UHC entre ami. Donc j'ai ouvert une discussion pour que quelqu'un m'aide.
Merci à vous.

Cordialement
Karmix
 

ShE3py

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

Avec un tableau associatif ?
Java:
Map<UUID, Integer> remainingUses = new HashMap<>();

final int initialNumberOfUses = 12;

final Player player = ...;
final int remainingPlayerUses = remainingUses.getOrDefault(player.getUniqueId(), initialNumberOfUses);

if(remaningPlayerUses > 0) {
    // TODO: execute command
    // ...
    remainingUses.put(player.getUniqueId(), remainingPlayerUses - 1);
}
else {
    // TODO: no-more-use error message
    // ...
}

Cordialement,
ShE3py
 

Karmix

C#
21 Septembre 2019
10
0
12
22
Bonsoir,

Avec un tableau associatif ?
Java:
Map<UUID, Integer> remainingUses = new HashMap<>();

final int initialNumberOfUses = 12;

final Player player = ...;
final int remainingPlayerUses = remainingUses.getOrDefault(player.getUniqueId(), initialNumberOfUses);

if(remaningPlayerUses > 0) {
    // TODO: execute command
    // ...
    remainingUses.put(player.getUniqueId(), remainingPlayerUses - 1);
}
else {
    // TODO: no-more-use error message
    // ...
}

Cordialement,
ShE3py
Je suis débutant sur Java donc je n'ai pas tout compris au bloc. En faites ma commande permet de donner 2 Golden Apple et je voudrai que le joueur ne puisse utiliser cette commande que 3 fois, si vous voulez un screen tenez.
1658178767751.png
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 139
162
464
247
21
Mìlhüsa
Tu as besoin d'une variable qui permet d'associer un unique nombre à n'importe quel joueur, un peu à la manière d'un annuaire téléphonique.
Pour identifier le joueur on prendra son UUID, donc UUID playerId = player.getUniqueId();
L'on veut associer un nombre à chaque UUID, donc un int, or Java veut un objet et non une primitive pour l'annuaire donc on prendra Integer qui est un objet contenant un int.

Ensuite on initialise notre annuaire qui sera initialement vide :
Java:
Map<UUID, Integer> remainingUses = new HashMap<>();

L'idée ensuite pour exécuter la commande est de récupérer la valeur dans l'annuaire, et si le joueur n'y est pas on assumera que c'est la première fois qu'il exécute cette commande, donc on prendra 3 par défaut :
Java:
int remainingPlayerUses = remainingUses.getOrDefault(playerId, 3);

Puis si le nombre est strictement supérieur à zéro, alors on exécute la commande puis on décrémente d'un le nombre dans l'annuaire :
Java:
remainingUses.put(playerId, remainingPlayerUses - 1);

Bref :
Java:
public class CommandGaps implements CommandExecutor {
    private static final int MAX_USES = 3;
    private static final ItemStack RESULT = new ItemStack(Material.GOLDEN_APPLE, 2);
    
    private final Map<UUID, Integer> remainingUses = new HashMap<>();
    
    @Override
    public boolean onKommand(CommandSender sender, Command command, String label, String[] args) {
        // c'est pour moi plus lisible de `return` tout de suite que dans les `else` plus loin
        if(!(sender instanceof Player)) {
            sender.sendMessage("§cVous devez être un joueur pour pouvoir exécuter cette commande.");
            return true;
        }
        
        // il faut mettre le (cast) après l'`instanceof` sinon ça sert à rien
        Player player = (Player) sender;
        UUID playerId = player.getUniqueId();
        
        if(args.length != 1 || !args[0].equalsIgnoreCase("gaps")) {
            return false; // bad usage
        }
        
        int remainingUses = this.remainingUses.getOrDefault(playerId, MAX_USES);
        if(remainingUses > 0) {
            // FIXME: vérifier la place dans l'inventaire du joueur
            player.getInventory().addItem(RESULT);
            
            this.remainingUses.put(playerId, remainingUses - 1);
            sender.sendMessage("Vous avez reçu deux pommes d'or.");
        }
        else {
            sender.sendMessage("§cVous ne pouvez plus recevoir de pomme d'or.");
        }
        
        return true;
    }
}
 

Niz

l | l | l | l | l
18 Août 2013
1 064
1
639
267
(Je tiens juste à remarquer que le plugin s'appelle "GogoleUHC" xD)
 
Dernière édition:

Karmix

C#
21 Septembre 2019
10
0
12
22
Tu as besoin d'une variable qui permet d'associer un unique nombre à n'importe quel joueur, un peu à la manière d'un annuaire téléphonique.
Pour identifier le joueur on prendra son UUID, donc UUID playerId = player.getUniqueId();
L'on veut associer un nombre à chaque UUID, donc un int, or Java veut un objet et non une primitive pour l'annuaire donc on prendra Integer qui est un objet contenant un int.

Ensuite on initialise notre annuaire qui sera initialement vide :
Java:
Map<UUID, Integer> remainingUses = new HashMap<>();

L'idée ensuite pour exécuter la commande est de récupérer la valeur dans l'annuaire, et si le joueur n'y est pas on assumera que c'est la première fois qu'il exécute cette commande, donc on prendra 3 par défaut :
Java:
int remainingPlayerUses = remainingUses.getOrDefault(playerId, 3);

Puis si le nombre est strictement supérieur à zéro, alors on exécute la commande puis on décrémente d'un le nombre dans l'annuaire :
Java:
remainingUses.put(playerId, remainingPlayerUses - 1);

Bref :
Java:
public class CommandGaps implements CommandExecutor {
    private static final int MAX_USES = 3;
    private static final ItemStack RESULT = new ItemStack(Material.GOLDEN_APPLE, 2);
   
    private final Map<UUID, Integer> remainingUses = new HashMap<>();
   
    @Override
    public boolean onKommand(CommandSender sender, Command command, String label, String[] args) {
        // c'est pour moi plus lisible de `return` tout de suite que dans les `else` plus loin
        if(!(sender instanceof Player)) {
            sender.sendMessage("§cVous devez être un joueur pour pouvoir exécuter cette commande.");
            return true;
        }
       
        // il faut mettre le (cast) après l'`instanceof` sinon ça sert à rien
        Player player = (Player) sender;
        UUID playerId = player.getUniqueId();
       
        if(args.length != 1 || !args[0].equalsIgnoreCase("gaps")) {
            return false; // bad usage
        }
       
        int remainingUses = this.remainingUses.getOrDefault(playerId, MAX_USES);
        if(remainingUses > 0) {
            // FIXME: vérifier la place dans l'inventaire du joueur
            player.getInventory().addItem(RESULT);
           
            this.remainingUses.put(playerId, remainingUses - 1);
            sender.sendMessage("Vous avez reçu deux pommes d'or.");
        }
        else {
            sender.sendMessage("§cVous ne pouvez plus recevoir de pomme d'or.");
        }
       
        return true;
    }
}
C'est une super réponse, je n'aurai pas pu avoir mieux.
Merci à vous de m'avoir aider.
Si je peut vous rendre la pareille je le ferai avec plaisir !

(Je tiens juste à remarquer que le plugin s'appelle "GogoleUHC" xD)
Effectivement, c'est un mode de jeu un peu particulier avec des amis. x)
 
Dernière édition par un modérateur: