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

ItemEntfernung

Walfisch

Minecrafter
Registriert
23 Mai 2015
Beiträge
26
Alter
25
Diamanten
250
Minecraft
Walfisch
Ich hab diese kleine Methode geschrieben um eine bestimmte Anzahl an Items aus einem Inventar zu entfernen (für ein ShopSystem). Das funktioniert auch so weit, biss man zwei- (oder mehrmals) den selben Stack im Inventar hat (z.B. 64 + 64 oder 32 + 32 + 32). Dann werden direkt alle gleichen Stacks entfernt, obwohl ich nur einen entfernen will. (-> Amount)

Code:
public static void removeInventoryItems(Inventory inv, Material type, int amount) {
        for (ItemStack is : inv.getContents()) {
            if (is != null && is.getType() == type) {
                int newamount = is.getAmount() - amount;
                if (newamount > 0) {
                    is.setAmount(newamount);
                    break;
                } else {
                    inv.remove(is);
                    amount = -newamount;
                    if (amount == 0)
                        break;
                }
            }
        }
    }

Vielen Dank schon mal im Voraus!
 

JTK222

Threadripper
Registriert
5 September 2013
Beiträge
1.150
Diamanten
323
Minecraft
JTK222
Ah stimmt also:
Code:
                } else {
                    inv.remove(is);
                    amount -= newamount;
                    if (amount == 0)
                        break;
                }
an dieser Stelle ist newamount immer negativ.
Von daher war = -newamount eigentlich richtig sorry dafür ein Denkfehler meiner seits.

Dass einzige was mir jetzt noch einfallen würde ist mit einem Label zu arbeiten.
 

xKev

Minecrafter
Registriert
10 Dezember 2016
Beiträge
3
Diamanten
19
Code:
public static void removeInventoryItems(Inventory inv, Material type, int amount) {
        for (ItemStack is : inv.getContents()) {
            if (is != null && is.getType() == type) {
                int newamount = is.getAmount() - amount;
                if (newamount > 0) {
                    is.setAmount(newamount);
                    break;
                } else {
                    inv.remove(is); <--
                    amount = -newamount;
                    if (amount == 0)
                        break;
                }
            }
        }
    }

Das Problem liegt in der Zeile inv.remove(is);
Aus der Javadoc von Inventory#remove:
Removes all stacks in the inventory matching the given stack.
This will only match a slot if both the type and the amount of the stack match.

Es werden also alle Stacks entfernt mit dieser Methode wenn du mehrmals den gleichen Stack im Inventar hast.

Edit: JTK222 war schneller
 
Zuletzt bearbeitet:

Walfisch

Minecrafter
Registriert
23 Mai 2015
Beiträge
26
Alter
25
Diamanten
250
Minecraft
Walfisch
Ah stimmt also:
Code:
                } else {
                    inv.remove(is);
                    amount -= newamount;
                    if (amount == 0)
                        break;
                }
an dieser Stelle ist newamount immer negativ.
Von daher war = -newamount eigentlich richtig sorry dafür ein Denkfehler meiner seits.

Dass einzige was mir jetzt noch einfallen würde ist mit einem Label zu arbeiten.
Das Problem liegt in der Zeile inv.remove(is);
Aus der Javadoc von Inventory#remove:
Removes all stacks in the inventory matching the given stack.
This will only match a slot if both the type and the amount of the stack match.

Es werden also alle Stacks entfernt mit dieser Methode wenn du mehrmals den gleichen Stack im Inventar hast.

Edit: JTK222 war schneller

Schonmal danke für die Hilfe, wie kann man das ganze denn über Labels lösen (Code)?
Grüße Walfisch
 

JTK222

Threadripper
Registriert
5 September 2013
Beiträge
1.150
Diamanten
323
Minecraft
JTK222
Code:
for(loop1){
   for(loop2){
      break;
   }
}
Durch dass break landest du wieder im 1. Loop
Code:
label1:
for(loop1){
   for(loop2){
      break label1;
   }
}
Mit dem Label brichst du die 1. Schleife ab.

Eigentlich sollte es bei dir kein Problem darstellen, vielleicht entsteht aber ein Compiler Fehler.
Mal schauen wenn dass nichts Hilft bin ich ahnungslos :(
 
Oben