• 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!

Bestimmtes Item und Amount entfernen

SahraCookiee

Schafhirte
Registriert
27 März 2013
Beiträge
140
Diamanten
1
Hallo,
zurzeit probiere ich bestimmte Items aus dem Inventar zu löschen und sie mitzuzählen.
Leider scheitert es daran das nur die halben Items gelöscht werden und teilweise übersehen werden.
Außerdem wird die Counter Nachricht nicht zusammengezählt sondern einzeln ausgezogen.
Hier mein Code

Code:
package de.SCDev.SocietyCity.Factions.Police;

import de.SCDev.SocietyCity.Helper.inventoryClass;
import de.SCDev.SocietyCity.Introduction.main;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;

/**
* Created by lukas on 03.12.2016.
*/
public class checkPlayerDrugInventory implements Listener {

    ItemStack isKk = new ItemStack(inventoryClass.createItem(Material.GOLD_BARDING, 1, 0, "§7Kokain"));
    ItemStack isE = new ItemStack(inventoryClass.createItem(Material.IRON_BARDING, 1, 0, "§5Ecstasy"));
    ItemStack isB = new ItemStack(inventoryClass.createItem(Material.DIAMOND_BARDING, 1, 0, "§9Blue Meth"));

    @EventHandler
    public void onClickDrugCheck(PlayerInteractEvent e) {
        int count = 0;

        Player p = e.getPlayer();
        Player otherpl = (Player) main.checkDrugs.get(p);

        if (e.getAction() == Action.LEFT_CLICK_AIR || e.getAction() == Action.LEFT_CLICK_BLOCK) {
            if (p.getItemInHand().getItemMeta().getDisplayName().equals("§cDrogen-Check")) {
                for (ItemStack i : p.getInventory().getContents()) {
                    if (i.getType().equals(isKk)) {
                        otherpl.getInventory().remove(isKk);
                        otherpl.updateInventory();
                        count = +1;
                    }
                    p.sendMessage("Drogen gefunden" + count);
                }
            }


        } else if (p.getItemInHand().getItemMeta().getDisplayName().equals("§6Cancel")) {
            p.getInventory().setItem(0, new ItemStack(Material.AIR));
            p.getInventory().setItem(1, new ItemStack(Material.AIR));
            p.getInventory().setItem(3, new ItemStack(Material.AIR));
            p.getInventory().setItem(4, new ItemStack(Material.AIR));
            p.getInventory().setItem(5, new ItemStack(Material.AIR));
            p.getInventory().setItem(8, new ItemStack(Material.AIR));
            main.checkDrugs.remove(p, p);
            main.checkDrugs.remove(otherpl, otherpl);
            policeInventory.policeInventory(p);
        }
    }
}

Würde mich über ein Beispeil freuen :)
 
F

Figz

Guest
Die Nachricht wird einzeln geschickt, weil du sie in der Schleife mit drinne hast, das bedeutet bei jedem ItemStack dass geprüft wird, wird die Nachricht geschickt, in deinem Fall ist es sogar egal, ob es "Kokain" ist oder nicht :D

Funktioniert das Prüfen des Items wirklich mit "i.getType().equals(isKk)"?

Und nun noch als kleine Hilfe, was dein Lösch-Problem angeht:
https://hub.spigotmc.org/javadocs/b...removeItem(org.bukkit.inventory.ItemStack...)
Die Methode removeItem(ItemStack itemStack) hat da so einen Rückgabewert (In der Javadocu nachzulesen)
 

PSandro

Kuhfänger
Registriert
7 November 2016
Beiträge
51
Diamanten
302
Ich hätte das ganze etwas flexibler gestaltet:
Code:
public static int removeDrugs(Player player, Material material) {
        PlayerInventory inventar = player.getInventory();
        ItemStack[] items = inventar.getContents();
       
        //Inventar ohne die "Drogen"
        List<ItemStack> clearedInventory = new ArrayList<>();
       
       
        int anzahl = 0;
        for (ItemStack item : items) {
            if (item.getType() == material) {
                anzahl += item.getAmount();
                continue;
            }
            //Nur wenn das Item kein Goldbarren ist, wird es in das 'neue' Inventar gelegt.
            clearedInventory.add(item);
        }
       
        inventar.setContents(clearedInventory.toArray(new ItemStack[clearedInventory.size()]));
        return anzahl;
    }

Funktioniert das Prüfen des Items wirklich mit "i.getType().equals(isKk)"?
@Munkel Es ist tatsächlich besser, "==" zum Vergleichen von Enums zu nutzen, jedoch dürfte "#equals()" auch funktionieren.



Code ist ungetestet
 

SahraCookiee

Schafhirte
Registriert
27 März 2013
Beiträge
140
Diamanten
1
Ich bekomme 2 NullPointerExeption

Code:
[01:45:07 ERROR]: Could not pass event PlayerInteractEvent to SocietyCity v1.0
org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:310) ~[spigot.jar:git-Spigot-1e4dd71-4db0855]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot.jar:git-Spigot-1e4dd71-4db0855]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) [spigot.jar:git-Spigot-1e4dd71-4db0855]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487) [spigot.jar:git-Spigot-1e4dd71-4db0855]
        at org.bukkit.craftbukkit.v1_10_R1.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:231) [spigot.jar:git-Spigot-1e4dd71-4db0855]
        at org.bukkit.craftbukkit.v1_10_R1.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:198) [spigot.jar:git-Spigot-1e4dd71-4db0855]
        at org.bukkit.craftbukkit.v1_10_R1.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:194) [spigot.jar:git-Spigot-1e4dd71-4db0855]
        at net.minecraft.server.v1_10_R1.PlayerConnection.a(PlayerConnection.java:1389) [spigot.jar:git-Spigot-1e4dd71-4db0855]
        at net.minecraft.server.v1_10_R1.PacketPlayInArmAnimation.a(SourceFile:32) [spigot.jar:git-Spigot-1e4dd71-4db0855]
        at net.minecraft.server.v1_10_R1.PacketPlayInArmAnimation.a(SourceFile:9) [spigot.jar:git-Spigot-1e4dd71-4db0855]
        at net.minecraft.server.v1_10_R1.PlayerConnectionUtils$1.run(SourceFile:13) [spigot.jar:git-Spigot-1e4dd71-4db0855]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_111]
        at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_111]
        at net.minecraft.server.v1_10_R1.SystemUtils.a(SourceFile:45) [spigot.jar:git-Spigot-1e4dd71-4db0855]
        at net.minecraft.server.v1_10_R1.MinecraftServer.D(MinecraftServer.java:732) [spigot.jar:git-Spigot-1e4dd71-4db0855]
        at net.minecraft.server.v1_10_R1.DedicatedServer.D(DedicatedServer.java:400) [spigot.jar:git-Spigot-1e4dd71-4db0855]
        at net.minecraft.server.v1_10_R1.MinecraftServer.C(MinecraftServer.java:668) [spigot.jar:git-Spigot-1e4dd71-4db0855]
        at net.minecraft.server.v1_10_R1.MinecraftServer.run(MinecraftServer.java:567) [spigot.jar:git-Spigot-1e4dd71-4db0855]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_111]
Caused by: java.lang.NullPointerException
        at de.SCDev.SocietyCity.Helper.RemoveItem.removeDrugs(RemoveItem.java:58) ~[?:?]
        at de.SCDev.SocietyCity.Factions.Police.checkPlayerDrugInventory.onClickDrugCheck(checkPlayerDrugInventory.java:40) ~[?:?]
        at sun.reflect.GeneratedMethodAccessor29.invoke(Unknown Source) ~[?:?]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_111]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_111]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot.jar:git-Spigot-1e4dd71-4db0855]
        ... 18 more

Hier beide Klassen
Code:
package de.SCDev.SocietyCity.Factions.Police;

import de.SCDev.SocietyCity.Helper.RemoveItem;
import de.SCDev.SocietyCity.Helper.inventoryClass;
import de.SCDev.SocietyCity.Introduction.main;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.material.MaterialData;

import java.util.ArrayList;
import java.util.List;

/**
* Created by lukas on 03.12.2016.
*/
public class checkPlayerDrugInventory implements Listener {

    ItemStack isKk = new ItemStack(inventoryClass.createItem(Material.GOLD_BARDING, 1, 0, "§7Kokain"));
    ItemStack isE = new ItemStack(inventoryClass.createItem(Material.IRON_BARDING, 1, 0, "§5Ecstasy"));
    ItemStack isB = new ItemStack(inventoryClass.createItem(Material.DIAMOND_BARDING, 1, 0, "§9Blue Meth"));

    @EventHandler
    public void onClickDrugCheck(PlayerInteractEvent e) {
        int count = 0;

        Player p = e.getPlayer();
        Player otherpl = (Player) main.checkDrugs.get(p);

        if (e.getAction() == Action.LEFT_CLICK_AIR || e.getAction() == Action.LEFT_CLICK_BLOCK) {
            if (p.getInventory().getItemInMainHand().getItemMeta().getDisplayName().equalsIgnoreCase("§cDrogen-Check")) {
//Bei if(p.getInventore.getItemInHand.getItemMeta.getDisplayName.eqauls) ist es das selbe
                RemoveItem.removeDrugs(otherpl, Material.GOLD_INGOT);
                otherpl.sendMessage("§3Test");
                {
                    RemoveItem.removeDrugs(otherpl, Material.GOLD_INGOT);
                    otherpl.sendMessage("§4Test");
                }
                RemoveItem.removeDrugs(otherpl, Material.GOLD_INGOT);
                otherpl.sendMessage("§5Test");


            } else if (p.getItemInHand().getItemMeta().getDisplayName().equals("§6Cancel")) {
                p.getInventory().setItem(0, new ItemStack(Material.AIR));
                p.getInventory().setItem(1, new ItemStack(Material.AIR));
                p.getInventory().setItem(3, new ItemStack(Material.AIR));
                p.getInventory().setItem(4, new ItemStack(Material.AIR));
                p.getInventory().setItem(5, new ItemStack(Material.AIR));
                p.getInventory().setItem(8, new ItemStack(Material.AIR));
                main.checkDrugs.remove(p, p);
                main.checkDrugs.remove(otherpl, otherpl);
                policeInventory.policeInventory(p);
            }
        }
    }
}

und die Methode ich habe sie genau übernommen ich wüsste jetzt nicht was daran nicht korrekt wäre sollte ich da was ergänzen müssen berichtigt mich bitte.

Code:
    public static int removeDrugs(Player player, Material material) {
        PlayerInventory inventar = player.getInventory();
        ItemStack[] items = inventar.getContents();

        //Inventar ohne die "Drogen"
        List<ItemStack> clearedInventory = new ArrayList<>();


        int anzahl = 0;
        for (ItemStack item : items) {
            if (item.getType() == material) {
                anzahl += item.getAmount();
                continue;
            }
            //Nur wenn das Item kein Goldbarren ist, wird es in das 'neue' Inventar gelegt.
            clearedInventory.add(item);
        }

        inventar.setContents(clearedInventory.toArray(new ItemStack[clearedInventory.size()]));
        return anzahl;
    }
}
 

BlackHole

Workaholic
Registriert
1 Juli 2012
Beiträge
752
Diamanten
0
Minecraft
BlackHole
Und bei removeDrugs() fehlt auch noch eine null-Prüfung. Wenn du diese Methode z.B. so abänderst bleibt die Reihenfolge der Gegenstände nach dem Entfernen auch gleich:
Code:
    public static int removeDrugs(Player player, Material material) {
        PlayerInventory inventar = player.getInventory();
        ItemStack[] items = inventar.getContents();

        int anzahl = 0;
        for (int index = 0; index < items.length; index++) {
            ItemStack item = items[index];
            if (item != null && item.getType() == material) {
                anzahl += item.getAmount();
                items[index] = null;
            }
        }

        inventar.setContents(items);
        return anzahl;
    }

Du solltest aber dringend lernen, diese Exceptions zu lesen. Im oberen Beispiel sagt "at de.SCDev.SocietyCity.Helper.RemoveItem.removeDrugs(RemoveItem.java:58)" dir also, dass du in der Datei RemoveItem.java in Zeile 58 überlegen solltest, welcher Wert null sein könnte.
 
Oben