Ich habe in letzter Zeit einen seltsamen Bug in meinem Spigot / Bukkit-Plugin erlebt, was völlig sinnlos ist. Bitte beachten Sie, dass diese Frage aufgrund der Tatsache, dass das Projekt, an dem ich gerade arbeite, ziemlich umfangreich ist, und da der Quellcode Klassen enthält, die hier nicht enthalten sind, werde ich mein Bestes geben, um mein Problem zu beschreiben / p>
In Minecraft können Sie mithilfe der Bukkit-API grafische Menüs (GUI) erstellen, in denen Sie Elemente in bestimmten Slots platzieren können. Wenn Sie darauf klicken, können Sie Ihre Funktionalität anpassen.
In meinem Fall habe ich die Basisklasse Menu
erstellt, die grundlegende Methoden für die Erstellung eines solchen Menüs enthält. Dann wird das PurchaseMenu
, das die Menu-Klasse erweitert, verwendet, um Funktionen an bestimmten Positionen auszulösen, um eine Transaktion für ein Produkt zu simulieren, die aus dem Menü angeklickt werden kann.
Im Detail enthält das Menü, das ich enthalten werde, "Kit" -Anzeigen (wie Spielklassen), wenn ein Linksklick das Display ist, das der Spieler kaufen kann, oder wenn er bereits gekauft wurde, Der Spieler wird nur dieses Kit zur Verwendung auswählen. Wenn ein Rechtsklick auf dem Display angezeigt wird, kann der Spieler das Set um bis zu 3 erhöhen.
In beiden Fällen muss ein Transaktionsmenü aufgerufen werden, um das angeklickte Kit zu kaufen oder aufzurüsten. Mein Entwurf ist wirklich geradlinig, indem ich das angeklickte Kit aus dem Konstruktor für jede PurchaseMenu
-Klasse übergebe.
Das Problem bei all dem oben ist, dass das Kit korrekt vom Konstruktor übergeben wird, aber das Kit, das gerade gekauft oder auf den neuesten Stand gebracht wird, ist ein zufälliges (offensichtlich nicht, aber hat noch keine Beweise gefunden) und das passiert normalerweise nach einigen Versuchen.
Mein Design:
InventoryClick
wird aufgerufen, wenn auf eine Menüanzeige geklickt (interagiert) wird. InventoryConstruct
wird aufgerufen, wenn ein Menü erstellt (geöffnet) wird. PurchaseProduct
wird aufgerufen, wenn eine Anzeige erfolgreich gekauft wurde. PrePaymentChecks
ist notwendig checks die vor dem Kauf ausgeführt werden müssen. Meine Fragen:
Jede Form von Hilfe ist willkommen, ich hoffe, ich habe mein Problem im Detail beschrieben, wenn Sie weiteren Quellcode benötigen, schreiben Sie bitte einen Kommentar unten.
Da die Frage mehr als 30k Zeichen umfasst, habe ich das gesamte Projekt in ein Git-Repository hochgeladen.
Menu.java : Ссылка
PurchaseMenu.java : Ссылка
BattleOptionsMenu.java : Ссылка
PurchaseMenuKit.java : Ссылка
Versuchen Sie PurchaseMenu.object zu final zu ändern und sehen Sie, was die Ausgabe ist. Auch System.out.println()
ist dein Freund.
Ich schlage nicht vor, dass Sie Object für Ihr Kit verwenden, da es möglicherweise das Objekt ändert, wenn Sie object
auf sellableKit
setzen. Machen Sie eine Schnittstelle mit dem Namen Sellable<T>
, so dass Sie den Typ (genannt Strong Typing) mit:
Diese Felder auch als endgültig festzulegen, ist eine gute Übung, da es nicht so aussieht, dass Sie diese Felder nach der Objekterstellung festlegen und jemand sofort wissen lässt, dass sich diese Objekte niemals ändern werden. Es sollte auch die Situation aufklären, da ein endgültiges Objekt nicht geändert werden kann.
Sie sollten das private Kit kit;
-Feld von BuyKitOwnershipMenu
entfernen, da Sie gerade eine Kopie des Objekts erstellt haben. Ihre PurchaseProduct()
-Methode kann in
Seit Kit ist jetzt geschützt und in der Superklasse.