Recherche [1.7.10] Probleme Amount sur mon Plugin

Pierre Durif

Aventurier
23 Juin 2019
14
0
2
27
Bonjour,

Je fais actuellement un plugin de shop. Lorsque l'on fait un clique sur la molette sur un item dans un certain inventaire (inventaire pour le shop) ça devrait lui enlever tous les items de son inventaire correspondant à l'item cliqué dans l'inventaire de shop. Si il n'a pas l'item dans son inventaire, ca lui enverra un message "Vous n'avez pas cet item dans votre inventaire". Le truc c'est que ça ne marche pas, je n'arrive pas à supprimer les items quand ils sont dans des slots différents et aussi par exemple si j'ai dans le premier slot un bloc de dirt dans le deuxieme un bloc de pierre, j'ai l'impression que seul le bloc de dirt est détecté car si je clique dans l'inventaire du shop sur la pierre, ca me dit que je ne l'ai pas dans mon inventaire. Voici mon code : https://pastebin.com/quuwk24w

Merci :)
 
Dernière édition:
Bonsoir,

Merci d'envoyer toute la fonction car on n'a pas la définition de t, que je suppose être l'ItemStack.

Sinon au lieu d'itérer sur tout l'inventaire, utilise l'API de Bukkit :
Code:
ItemStack target = e.getCurrentItem();
// value check

PlayerInventory inventory = e.getPlayer().getInventory();
Map<Integer, ItemStack> matches = inventory.all(target.getMaterial());
int count = 0;

for(int slot : matches.keySet()) {
[INDENT]ItemStack item = matches.get(slot);
if(!item.isSimilar(target)) continue;

count += items.getAmount();
inventory.clear(slot);[/INDENT]
}

Ça enlèvera tous les items qui sont similaires (pareil qu'égal sauf que le nombre d'items est ignoré) de l'inventaire, et indiquera ce nombre dans count, pour je suppose ajouter la bonne somme d'argent.

Cordialement,
ShE3py.
 
Dernière édition:
Oui effectivement j'ai oublié de précisé que t = e.getCurrentItem(). Je peux quand même utiliser ton code ?
 
Yup d'ailleurs c'est #getCurentItem et non #getItem, je me suis trompé.
Je n'ai pas pris ton code du coup ça ne change rien. Copie le code dans le corps du if :
Code:
else if(e.getClick() == ClickType.MIDDLE) {
// ici
}
 
Merci mais j'ai quelques erreurs :
Code:
PlayerInventory inventory = e.getPlayer().getInventory();
le e.getPlayer() souligné en rouge, je dois cast avec OfflinePlayer ? Ensuite
Code:
target.getMaterial()
est aussi souligné en rouge, je peux cast un Object mais l'erreur est toujours la. Enfin
Code:
items.getAmount();
c'est pas plutôt item ?
 
le e.getPlayer()
#getWhoClicked

target.getMaterial()
#getType

items.getAmount();
Yup item au singulier j'ai fait un typo

J'écris sur mon tel donc pour écrire du code c'est pas pratique, par contre ce serait bien si tu pourrais faire des petits tours sur la javadoc car même si ce n'est pas le bon nom de fonction c'est assez obvious avec justement la javadoc.
 
J'ai encore un soucis. Par exemple, si j'ai dans le slot 1 32 dirt et dans le slot 2 j'ai 16 dirt, quand je clique pour vendre, ca m'enleve que 32 dirt dans mon inventaire au lieu des 48 blocs. Voici le code que j'ai un peu modifié :
Code:
} else if(e.getClick() == ClickType.MIDDLE) {
                      
                        ItemStack target = e.getCurrentItem();

                        PlayerInventory inventory = e.getWhoClicked().getInventory();
                        
                        if(!t.getItemMeta().getLore().get(2).equalsIgnoreCase("§cPrix de vente : §eNon-Vendable")) {
                        
                            Map<Integer, ? extends ItemStack> matches = inventory.all(target.getType());
                            
                            int count = 0;
    
                            for(int slot : matches.keySet()) {
                                
                                ItemStack item = matches.get(slot);
                                
                                if(item.getType() == target.getType() && item.getData().getData() == t.getData().getData()){
        
                                    count += item.getAmount();
                                    
                                    inventory.clear(slot);
                                
                                    p.sendMessage(main.prefix + "§aVous avez effectué la vente avec succès !");
                                    
                                    //donner argent
                                    
                                    p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 3, 3);

                                    p.closeInventory();
                                    
                                    break;
                                    
                                }
                                
                                
                            }
                        
                        } else {
                            
                            p.sendMessage(main.error + "L'item sélectionné ne peut pas être vendu !");

                        }
                            
                    }
 
Dernière édition:
En effet la boucle for enlève les items correspondants et compte ce nombre, donc mettre un break ignorera tous les autres slots. Tu dois ajouter ton argent après celle-ci.

Quelques remarques :
1. target peut être null si le joueur clique sur un slot vide, tu dois donc vérifier que target != null pour continuer

2. matches contient tous les slots des items ayant le même type que target, vérifier que item.getType() == target.getType() est inutile car toujours vrai

3. L'opérateur d'égalité == ne marche que sur les types primitifs (int, float, ...). Sur des objects cela vérifiera leurs pointeurs ;

Code:
String a = "pédro";
String b = "pédro";

a == b // FAUX, deux pointeurs (variables) différents
a == a // vrai

Pour comparer des objects tu dois utiliser #equals. Dans ton cas tu dois utiliser #isSimilar pour comparer les items ; celle-ci ignore la quantité (de sorte que si le joueur clique sur 9 cobblestones il accepte les stacks de 64), et prendra tout en compte style les enchantements.

4. Utilise des return au lieu d'else 14 km plus loin :
Code:
if(target == null) {
p.sendMessage("Nope");
return;
}

C'est plus lisible, tu quittes directement là où ça casse.

5. Tu peux NullPointerException ici :
if(!t.getItemMeta().getLore().get(2).equalsIgnoreCase("§cPrix de vente : §eNon-Vendable)
Si l'item n'a pas de meta -> NPE
Si l'item n'a pas de lore -> NPE
Si son lore n'a pas 3 lignes -> NPE