[Java] crafted items amount

10/03/2013 16:56 ananus#1
Hallo epvp,

und zwar geht es um ein bukkit problem. Ich habe schon in diversen anderen Foren gefragt leider konnte mir da keiner so wirklich helfen, deswegenn hoffe ich um eine Hilfe hier :p

Ich möchte gerne, wenn jemand etwas Crafted die Anzahl der gecrafteten gegenstände in einer Variable gespeichert haben. Ich habe es schon mit

Code:
 onCraftItemEvent(CraftItemEvent ev)
int iAmount = ev.getInventory().getResult().getAmount();
versucht, aber das gibt mir nur aus wie viele Gegenstände es sind wenn ich nur Materialen für einen Craftvorgang reinlege. D.h. auch wenn ich jeweils 4 Holzbretter untereinander gelegt habe ist iAmount = 4 weil nach einem Craftvorgang 4 Sticks entstehen. (Für meine vorhaben sollte iAmount = 16 sein weil genug Mats da sind für 16 Sticks)

Ich hoffe ihr versteht was ich meine und könnt mir helfen MfG
10/03/2013 18:55 ComputerBaer#2
Minecraft unterstützt beim Craften nur ein Item pro Slot. Es ist also nicht vorgesehen, dass mehr als eine Portion gleichzeitigt hergestellt wird.

Um dein Problem zu lösen musst du dir das Rezept und den Inhalt des Craftingsfelds holen und selber ausrechnen wieviele Portionen damit hergestellt werden können.
10/03/2013 20:51 ananus#3
D.h. bei einem CraftItemEvent überprüfen ob auf das Item shift+klick gemacht wurde und dann die Anzahl der Items im craftingfeld mit dem recipe abgleichen?
10/03/2013 22:14 ComputerBaer#4
Bei Shift+Klick stellt er solange Items her, bis die Zutaten nicht mehr ausreichen um weiter zu machen.
Er müsste ungefähr so vorgehen: Item herstellen -> immernoch selbes Rezept? -> Item herstellen -> immernoch sel...

Ob das Event jetzt jedesmal neu aufgerufen wird weiß ich nicht, aber ich würde erstmal davon ausgehen. (Wenn du willst kann ich das testen, oder du machst es einfach selber)
10/04/2013 13:33 ananus#5
Ok, danke für die Antwort. Wenn wir beide vom selben reden (CraftItemEvent) dann ruft er dies nur einmal auf. Daher bin ich auch etwas ratlos wie ich das ganze angehen soll. Ich werde einfach mal versuchen die 9 Craftingfelder mit dem Rezept abzugleichen. Ansonsten sind weiter Lösungsvorschläge erwünscht
10/04/2013 14:32 ComputerBaer#6
Ich habe es jetzt auch mal ausprobiert und es scheint wirklich nicht so einfach zu sein.

Dann habe ich einfach mal Google geschäftigt und dabei diese beiden Threads mit verschiedenen Lösungen gefunden:
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]

Ich hoffe das hilft dir weiter, auf den ersten Blick scheinen die gut zu funktionieren.

Oder du versuchst meine Idee mit dem Rezept, da gibt es aber noch eine Schwachstelle. Du müsstest auch beachten das das Inventar voll sein kann und nur einige oder garkeine Items hergestellt wurden.
10/04/2013 18:47 ananus#7
Also, ich habe jetzt eine eigene Funktion fürs Berechnen der gecrafteten Items geschrieben. Vielen Dank an ComputerBaer's Idee und Links als Gedankenstütze.

Die fertige Funktion sieht jetzt so aus:
PHP Code:
public int CountCraftedItems(CraftItemEvent cie){
    
int iMaxCrafts=64;
    
int iAmount=0;
    for (
ItemStack isStack cie.getInventory().getMatrix()){
        if (
isStack == null) continue;
        if (
isStack.getAmount() < 1) continue;
        if (
isStack.getAmount() < iMaxCraftsiMaxCrafts isStack.getAmount();
    }
if (
cie.getClick().isShiftClick()){
    
iAmount=iMaxCrafts*cie.getCurrentItem().getAmount();
    
int MaxInventoryPlace GetMaxInventoryPlaceForItem(cie,iAmount);
    if (
iAmount>MaxInventoryPlaceiAmount MaxInventoryPlace;
}
else
{
    
iAmount cie.getCurrentItem().getAmount();
}
return 
iAmount;
}
public 
int GetMaxInventoryPlaceForItem(CraftItemEvent cie_countint ItemAmount){
    
int MaxPlace 0;
    
int MaxStackSize cie_count.getCurrentItem().getMaxStackSize();
    
PlayerInventory piPlayerInventory cie_count.getWhoClicked().getInventory();
    for (
ItemStack isStack piPlayerInventory){
        if (
isStack == null){
            
MaxPlace MaxPlace+MaxStackSize;
            continue;
        }
        if (
isStack.getType()!=cie_count.getCurrentItem().getType()) continue;    
        if (
isStack.getType() == cie_count.getCurrentItem().getType()) MaxPlace MaxPlace+MaxStackSize-isStack.getAmount();
    }
    return 
MaxPlace;

Einfach an die Funktion "CountCraftedItems" das CarftItemEvent übergeben und der Rückgabewert wird die Anzahl der gecrafteten Items sein :)

€dit: Klammer zu viel entfernt
10/04/2013 19:53 ComputerBaer#8
Ich habe es nur kurz ausprobiert und es hat gut funktioniert. Vielen Danke für den Quellcode, wer weiß wann ich den mal brauchen werde.

Du hast am Ende noch eine "}" zuviel (Vermutlich die von der Klasse).