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

Item aus Inventar abfragen [SOLVED]

Jakura

Minecrafter
Mitglied seit
11 Oktober 2020
Beiträge
5
Diamanten
50
Ich habe da eine Frage und vielleicht weiß jemand die antwort.

und zwar versuche ich ein plugin zu schreiben welches Items in einem Sack speichert. Meine frage Wie kann ich abfragen wie viele leere slots ein spieler im inventar noch frei hat.

Bislang sieht mein Code noch so aus:

Java:
if(e.getCurrentItem().getType() == Material.COBBLESTONE) {
                 
    int am = im.getItems(p, new ItemStack(Material.COBBLESTONE));
 
    int plus = getAmount(p.getInventory(), new ItemStack(Material.COBBLESTONE));
 
    p.getInventory().addItem(new ItemStack(Material.COBBLESTONE, am));
    im.addItem(p, new ItemStack(Material.COBBLESTONE), 0);
    invTier1Mining.openInvTier1(p);
                 
}

public static int getAmount(Inventory inv, ItemStack item) {
        int amount = 0;
        for(ItemStack contents : inv.getContents()) {
        if(contents == null || contents.getType() == Material.AIR) continue;
        if(contents.isSimilar(item))amount += contents.getAmount();
        }
        return amount;
    }
 
Zuletzt bearbeitet:

Malfrador

Threadripper
Mitglied seit
16 Juni 2013
Beiträge
1.389
Diamanten
201
Minecraft
Malfrador
Mit isSimilar()wirst du Probleme mit bestimmten Items haben. Köpfe verhalten sich zum Beispiel etwas seltsam, so das bei isSimilar() ein true herauskommt, sie sich aber trotzdem nicht stacken lassen. Eventuell zeigen andere Items (Banner? Items mit viel NBT?) ein ähnliches Verhalten. Das ist ein Bug, der meineswissens auch noch in 1.16-Versionen existiert.

Geht es dir denn um leere Slots oder um generellen Platz? Für Slots müsstest du eigentlich nur schauen, wie oft inventory.getContents() null zurückgibt. Alternativ kannst du auch solange Items hinzufügen, bis inventory.getFirstEmpty() -1 zurückgibt - das tut es nämlich, wenn kein Platz mehr ist.

Wenn es dir um einzelne Items und nicht Slots geht, ist das ganze natürlich bisschen komplizierter. Aber auch da sollten ein Loop durch inventory.getContents() dir Abhilfe schaffen.
 

Jakura

Minecrafter
Mitglied seit
11 Oktober 2020
Beiträge
5
Diamanten
50
Mit isSimilar()wirst du Probleme mit bestimmten Items haben. Köpfe verhalten sich zum Beispiel etwas seltsam, so das bei isSimilar() ein true herauskommt, sie sich aber trotzdem nicht stacken lassen. Eventuell zeigen andere Items (Banner? Items mit viel NBT?) ein ähnliches Verhalten. Das ist ein Bug, der meineswissens auch noch in 1.16-Versionen existiert.

Geht es dir denn um leere Slots oder um generellen Platz? Für Slots müsstest du eigentlich nur schauen, wie oft inventory.getContents() null zurückgibt. Alternativ kannst du auch solange Items hinzufügen, bis inventory.getFirstEmpty() -1 zurückgibt - das tut es nämlich, wenn kein Platz mehr ist.

Wenn es dir um einzelne Items und nicht Slots geht, ist das ganze natürlich bisschen komplizierter. Aber auch da sollten ein Loop durch inventory.getContents() dir Abhilfe schaffen.
Das Problem was ich halt habe ist.

Ich habe ein Sack. zb. ein Mining Sack in den kann ich Items Ablegen/Speichern kann das ist alles gar nicht mal das Problem.

Aber wen ich die Item aus dem sack, der neben bei in einer config.yml gespeichert wird. In mein Inventar haben will und ich sag mal wen mein Inventar durch etwas anders fast voll ist und ich sag mal ich habe 640 Cobblestone im sack und habe aber nur noch 3 oder 4 Slots frei im Inventar dann fügt er mir alle hinzu oder nur ein und setzt den Bestand trotz dem auf 0 und ich weiß nicht wie ich fragen kann der Spieler XY hat so viele Freie Plätze und fügt dann nur die menge hinzu die er frei hat und setzt den bestand dann dementsprechend runter und nicht auf 0.

Ich hoffe das sie jetzt wissen was mein Problem ist

MFG. Jakura aka Lukas
 

Jakura

Minecrafter
Mitglied seit
11 Oktober 2020
Beiträge
5
Diamanten
50
Diese Methode habe ich von ein Developer von Cytooxien.de aber auch bei dieser methode sagt er mir nur welcher erste Slot frei ist und nicht viel viel gesamt.

Java:
public static int getEmptySlot(final Inventory inventory) {
        for (int i = 0; i < inventory.getSize(); i++) {
            final ItemStack item = inventory.getItem(i);
            if (item == null || item.getType() == Material.AIR) return i;
        }
        return -1;
    }

Meinen sie dass so?
Java:
    public static int getEmptySlots(Inventory inv) {
        int amount = 0;
     
        if(inv.getContents() == null) {
            amount++;
        }
     
        return amount;
    }
Ich habe es so mal ausprobiert
Java:
public static int getEmptySlots(Inventory inv, ItemStack item) {
        int amount = 0;
        for(ItemStack contents : inv.getContents()) {
            if(contents == null || contents.getType() == Material.AIR) amount++;
          
        }
        return amount;
    }
das Problem nun ist das er ALLE Slots zählt die leer sind auch die Rüstung Slots, aber an sich funktioniert es so wie ich es mir vorgestellt habe
 
Zuletzt bearbeitet:

DayAndNight

Minecrafter
Mitglied seit
21 September 2020
Beiträge
17
Diamanten
53
Ich finde es schön, dass du meine Antwort ignorierst, denn diese würde genau das machen, was du willst.
ABER selbst schuld. Viel Spaß noch.
 

Jakura

Minecrafter
Mitglied seit
11 Oktober 2020
Beiträge
5
Diamanten
50
Ich finde es schön, dass du meine Antwort ignorierst, denn diese würde genau das machen, was du willst.
ABER selbst schuld. Viel Spaß noch.
Tut mir leid ich habe deine Antwort nicht ignoriert ich habe versucht die Methode einzubinden in mein code, ich habe nicht geantwortet weil ich noch dabei bin die Methode zu verstehen, weil die hashmap ein itemstack haben will ich aber nicht weiß wie ich das einbinden, ich steh die letzten tag etwas auf dem Schlauch, tut mir leid noch mal war nicht böse gemeint
 

Jakura

Minecrafter
Mitglied seit
11 Oktober 2020
Beiträge
5
Diamanten
50
Ich habe eine lösung gefunden danke trotzdem an alle die mir geholfen haben.


Java:
public static int getEmptySlots(Player p) {
        int amount = 0;
       
        for(int i = 0; i <= 35; i++) {
            if(p.getInventory().getItem(i) == null) {
                amount++;
            }
        }
        return amount * 64;
    }
 
Oben