Recherche [1.7.10] Probleme Amount sur mon Plugin

Pierre Durif

Aventurier
23 Juin 2019
14
0
2
26
Merci de ta réponse mais pour tout ce qui concerne les return null / NPE je les avais déjà mis car j'ai mis à jour mon code. La tout marche bien sauf que j'ai encore un petit problème mais cette fois c'est pour un autre "type" de vente. J'ai donc fait en sorte que lorsque un joueur fait un clique droit sur un item, il lui demande dans le chat le montant qu'il souhaite pour cet item. Mias j'ai toujours le même problème: quand le joueur veut vendre par exemple 1 stone et qu'il a 1 stack de stones dans 2 slots différents (soit 128 stones au total), ca lui enlèvera 1 stone de chaque slot contenant une stone au lieu d'une stone pour le total de la stone qu'il a dans son inventaire (en l'occurence, 1 stone sur 128 de son inventaire, de sorte qu'il a 63 stones dans un slot et 64 dans l'autre). Mon code: https://pastebin.com/5NyvzCmW
 
Dernière édition:

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 087
160
459
247
21
Mìlhüsa
Code:
public class Foo implements Listener {
   private static Map<Player, Predicate<AsyncPlayerChatEvent>> WAITING_FOR_INPUT = new HashMap<>();
 
   @EventHandler
   public void onInventoryClick(InventoryClickEvent e) {
       [...]
     
       else if(e.getClick() == ClickType.MIDDLE) {
           ItemStack target = e.getCurrentItem();
           Player player = e.getWhoClicked();
           PlayerInventory inventory = player.getInventory();
         
           if(target == null) return;
           if(!target.hasItemMeta() || !target.getItemMeta().hasLore() || target.getItemMeta().getLore().size() < 3 || !target.getItemMeta().getLore().get(2).startsWith("§cPrix de vente : §e")) {
               player.sendMessage("Cet item n'est pas vendable");
             
               return;
           }
         
           if(!waitInput(player, event -> {
               int requested;
             
               try {
                   requested = Integer.parseInt(event.getMessage());
                 
                   if(requested <= 0) throw new NumberFormatException();
               }
               catch(NumberFormatException e) {
                   if(event.getMessage().equalsIgnoreCase("exit"))
                       return true;
                 
                   player.sendMessage("Veuillez enter un nombre valide");
                   return false;
               }
             
               Map<Integer, ? extends ItemStack> matches = inventory.all(target.getType());
               int remaining = requested;
             
               for(int slot : matches.keySet()) {
                   ItemStack item = matches.get(slot);
                   if(!item.isSimilar(target)) continue;
                 
                   remaining -= item.getAmount();
                   inventory.clear(slot);
                 
                   if(remaining < 0) {
                       item.setAmount(-remaining);
                       inventory.setItem(slot, item);
                     
                       remaining = 0;
                   }
                 
                   if(remaining == 0)
                       break;
               }
             
               float unitPrice = Float.parseFloat(target.getItemMeta().getLore().get(2).substring(20).replace("€", ""));
               int taken = requested - remaining;
             
               main.economy.depositPlayer(player, taken * unitPrice);
             
               player.playSound(player.getLocation(), Sound.SUCCESSFUL_HIT, 3, 3);
               player.sendMessage("Vous avez vendu " + taken + "*" + target);
             
               return true;
             
           })) {
               player.sendMessage("Une transaction est déjà en cours.");
             
               return;
           }
         
           player.sendMessage("Veuillez entrer le nombre d'objets à vendre. Tapez 'exit' pour annuler.");
       }
     
       [...]
   }
 
   @EventHandler
   public void onPlayerChat(AsyncPlayerChatEvent e) {
       Player player = e.getPlayer();
     
       synchronized(WAITING_FOR_INPUT) {
           if(!WAITING_FOR_INPUT.containsKey(player)) return;
         
           Predicate<AsyncPlayerChatEvent> handler = WAITING_FOR_INPUT.get(player);
           if(handler.test(e))
               WAITING_FOR_INPUT.remove(player);
       }
   }
 
   public static boolean waitInput(Player player, Predicate<AsyncPlayerChatEvent> handler) {
       if(WAITING_FOR_INPUT.containsKey(player)) return false;
     
       WAITING_FOR_INPUT.put(player, handler);
       return true;
   }
}

Pas testé le chargeur de mon PC m'a abandonné :(
 
Dernière édition:

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 087
160
459
247
21
Mìlhüsa
Effectivement il y a deux parenthèses fermantes

J'ai aussi remarqué un typo avec #containsKey qui ne prend qu'un seul t
 

Pierre Durif

Aventurier
23 Juin 2019
14
0
2
26
Y'a un probleme, lorsque j'écrit un chiffre dans le chat, ca m'enleve aucun item et me dit que j'ai vendu 0 * ItemStack{...}
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 087
160
459
247
21
Mìlhüsa
Tu peux vérifier les valeurs ?
Code:
player.sendMessage("Vous avez vendu " + taken + "*" + target);
player.sendMessage("[" + requested + ", " + remaining + ", " + matches.size() + ", " + matches.values().stream().filter(item -> item.isSimilar(target)).count() + "]");

Et dis aussi avec quoi tu test.
 

Pierre Durif

Aventurier
23 Juin 2019
14
0
2
26
J'ai test en tapant 5 dans le chat (pour vendre 5 cobblestones)
 

Fichiers joints

  • Capture.PNG
    Capture.PNG
    69.2 KB · Affichages: 351

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 087
160
459
247
21
Mìlhüsa
Il a trouvé la cobblestone mais elles ne sont pas similaires, est-ce qu'elles ont le même lore ou tu sélectionne l'item depuis un shop ?