• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Probleme mit ItemStack und InventoryClickEvent

The_Fiesslinger

Minecrafter
Registriert
15 August 2017
Beiträge
8
Alter
33
Diamanten
241
Minecraft
The_Fiesslinger
Hallo liebe Community,

Ich bin gerade am Programmieren eines Sellshop Plugin für Spigot 1.12.1.
Der Shop soll Spielern ermöglichen gefarmte Items über eine NPC GUI zu verkaufen.

Das Plugin funktioniert soweit das über einen Command die Shopseite aufgerufen und geöffnet wird. Die Items werden auch Ordnungsgemäß angezeigt. Bei dem versuch das Item zu verkaufen bekomme ich nur meine Exception finde aber den Fehler nicht. Bzw er erkennt mein Item nicht.

Hier mal ein paar Code ausschnitte.
Hier wird mein das Shopitem erstellt mit Material, Menge, short, Verkaufspreis, Stückpreis, Name

PHP:
public class ItemStacks {
   
   
    private Material material;
    private int amount;
    private int shrt;
    private float sellPrice;
    private float stackPrice;
    private String displayName;
    private ItemStack item;

    // ItemStack
    public ItemStacks(Material material, int amount, short shrt, float sellPrice, float stackPrice, String displayName) {

        this.material = material;
        this.amount = amount;
        this.shrt = shrt;
        this.sellPrice = sellPrice;
        this.stackPrice = stackPrice;
       
        // ArrayList Lore
        List<String> lore = new java.util.ArrayList();
        lore.add(ChatColor.GREEN + "Links Klick: " + ChatColor.YELLOW + sellPrice);
        lore.add(ChatColor.GREEN + "Rechts Klick: " + ChatColor.YELLOW + stackPrice);
        lore.add(ChatColor.DARK_PURPLE + "Links x1 : Rechts x64");

        item = new ItemStack(material, amount, (short) shrt);
        ItemMeta meta = item.getItemMeta();
        meta.setDisplayName(displayName);
        meta.getDisplayName();
        meta.setLore(lore);
        item.setDurability(shrt);
        item.getDurability();
        item.setItemMeta(meta);
    }
   
    public int getshrt() {
        return shrt;
    }
    public String getName() {
        return displayName;
    }
   
    public int getAmount() {
        return amount;
    }

    public float getSellPrice() {
        return sellPrice;
    }

    public Material getMaterial() {
        return material;
    }

    public ItemStack getItem() {
        return item;
    }
}

Die Shop seine mit ItemID usw ...
...

PHP:
@Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        Player p = (Player) sender;

        if (args.length == 0) {
            Shop tp = new Shop("§1Tierische Produkte", 3, plugin);
            // Material.<Material>, int amount, int shrt, float sellPrice, (float) stackPrice, String Name
            tp.addItem(new ItemStacks(Material.getMaterial(319), 1, (short) 0, (float) 0.75, (float) 48.0, ""));
            tp.addItem(new ItemStacks(Material.getMaterial(363), 1, (short) 0, (float) 0.75, (float) 48.0, ""));
            tp.addItem(new ItemStacks(Material.getMaterial(423), 1, (short) 0, (float) 0.75, (float) 48.0, ""));
            tp.addItem(new ItemStacks(Material.getMaterial(365), 1, (short) 0, (float) 0.75, (float) 48.0, ""));
...


PHP:
// Item Verkaufen
    public void sellItem(ItemStacks item, Player p) {
        int amount = item.getAmount();
        float price = item.getSellPrice();

        ItemStack stack = new ItemStack(item.getMaterial(), amount);
        ItemMeta meta = stack.getItemMeta();

        if (p.getInventory().containsAtLeast(stack, amount)) {
            p.getInventory().removeItem(new ItemStack[]{stack});
            ShopMain.eco.depositPlayer(p, price);
            p.sendMessage("§a[AdminShop] §3" + p.getDisplayName() + " wurden §6" + price + " §6Duplonen §2Gutgeschrieben!");
        } else {
            p.sendMessage(ChatColor.RED + "§a[AdminShop] §4Item konnte nicht verkauft werden!");
        }
    }

    // Stack Verkaufen
    // Alles Verkaufen
    // Inventory Klick Event
    @EventHandler
    public void onClick(InventoryClickEvent e) {
        Player p = (Player) e.getWhoClicked();

        if (getViewers().contains(p)) {
            e.setCancelled(true);
            for (ItemStacks item : getItems()) {

                if (e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase(item.getMaterial().name())
                if (e.getAction() == org.bukkit.event.inventory.InventoryAction.PICKUP_ALL) {
                    sellItem(item, p);
                    p.sendMessage("left");
                    break;
                }
                if (e.getAction() == org.bukkit.event.inventory.InventoryAction.PICKUP_HALF) {
                    buyItem(item, p);
                    p.sendMessage("right");
                    break;
                }
            }
        }
    }

Falls ich was vergessen haben solle oder mehr Infos einfach bescheid geben.
Ich bedanke mich schon mal für die mühe.

Mit freundlichen Grüßen

The_Fiesslinger
 

JOO200

Braumeister
Registriert
18 Dezember 2016
Beiträge
442
Diamanten
228
Bitte sende doch noch den Stacktrace der Exception mit (der aus den Logs).

Des weiteren noch:
Code:
                if (e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase(item.getMaterial().name())
                if (e.getAction() == org.bukkit.event.inventory.InventoryAction.PICKUP_ALL) {
Das führt dazu, dass die 2. if-Abfrage ausgeführt wird, deine 3. allerdings nicht. Daher wirst du hierbei Probleme bekommen ;)
 

BlackHole

Workaholic
Registriert
1 Juli 2012
Beiträge
752
Diamanten
0
Minecraft
BlackHole
In deinem ersten Codeausschnitt sind die Zeilen 30 und 33 überflüssig.

Bei der Behandlung der Inventarklicks fehlt eine Menge Fehlerbehandlung. z.B. wird für ein leeres Inventarfeld (Material.AIR) das getItemMeta() null zurückliefern.
Zudem fragst du ab, ob der DisplayName des Items mit dem Material-Namen übereinstimmt, setzt in deinem Beispiel-Shop aber leere Displaynamen.
 
F

Figz

Guest
@Figz Ich würde vermuten, dass die Zeile 25 im letzten Codeausschnitte genau das macht. Die Implementierung von getViewers() ist leider nicht enthalten, sicher kann man sich also nicht sein.

Stimmt, da war ich zu voreilig. Ich habe i wie gelesen, dass er sich die Viewers auf i eine Art aus dem Event holt.

Mein Vorschlag.

Beim Instanziieren deines Listener (evtl. eine Extraklasse) erstellst du das Shopinventar und speicherst dieses als Instanzvariable ab.

Dann kannste du in dem InventoryClickEvent die dir das Inventar mit "getClickedInventory()" holen, dieses mit der Instanz deines gespeicherten Inventares vergleichen. Das wird dir etwas Performance schenken, da das Inventar nicht jedes mal beim Command erstellt werden muss.

Zudem ist die Abfrage auf die Referenz deutlich schneller, als wenn du alle Viewer immer in eine Liste packst.

Dann solltest du lieber anstatt auf die InventoryAction, auf den ClickType abfragen. (Ich weiß nicht wie das Event reagiert, wenn du mit Rechtsklick auf ein Item mit Stückzahl 1 klickst. Wird dann immernoch die InventoryAction ein PickHalf sein?)

Und wie schon erwähnt wurde, alles auf null Abfragen.. Das geklickte Inventar, das geklickte Item, den Namen des geklickten Item (hasDisplayname).
 
Oben