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

Java ItemMoveEvent canceln

Blackiiiii

Kuhfänger
Mitglied seit
31 Oktober 2019
Beiträge
54
Diamanten
53
Minecraft
Blackiiiii
Schönen Guten Abend zusammen!

Ich sitze momentan an einem Plugin und stehe vor der Problematik das ich ein Inventory erstellen möchte und das die items da drin nicht entnehmbar oder bewegbar sein sollen...

Laut meinen Recherchen kann man das InventoryMoveEvent canceln. Gibt ja auch Sinn, es gibt mir nur die Frage wenn ich dann eine neue Methode erstelle cancelt er doch alle Inventory Move Events oder? Nicht im Bezug auf genau das eine Inventar was ich erstelle...

Die Spieler sollen ja trotzdem weiter in Ihren eigenen Inventar Items hin und her schieben können...

Danke!

MFG Phil
 

Taminoful

Schafhirte
Mitglied seit
3 August 2012
Beiträge
115
Alter
23
Diamanten
68
Minecraft
Taminoful
Das stimmt, wenn man das Event allgemein cancelled (was ein Wort..) geht gar nichts mehr. Deswegen haben solche Inventare meist spezielle Namen oder Eigenschaften an denen man sie Identifizieren kann. Du kannst also im Event abfragen, ob es sich um das gewollte Inventar handelt und in diesem Fall das Event canceln, so sind die Spielerinventare dann nicht davon betroffen.
 
Zuletzt bearbeitet:

Malfrador

Threadripper
Mitglied seit
16 Juni 2013
Beiträge
1.390
Diamanten
201
Minecraft
Malfrador
Du musst natürlich im Event schauen, ob es sich um das korrekte Inventar handelt. Am einfachsten ist das, wenn deine Inventar-Klasse das Interface InventoryHolder implementiert und du diesen dann als InventoryHolder (=Besitzer) des Inventars angibst. Dann musst du nur noch schauen, ob es sich um diesen Holder handelt.

Eine sehr simple Methode wäre zum Beispiel so:

Java:
public class CoolesMenu implements Listener, InventoryHolder {

    Inventory gui;

    public CoolesMenu() {
        gui = Bukkit.createInventory(this, 27, ChatColor.GOLD + "Titel"); /
        Bukkit.getPluginManager().registerEvents(this, plugin); // plugin sollte natürlich existieren
    }

    public void open(Player player) {
         // Items hinzufügen und so
        player.openInventory(gui);
    }

    @EventHandler
    public void onClick(InventoryClickEvent event) { // geht natürlich auch mit InventoryMoveEvent
        if (event.getInventory().getHolder() != this) {  // Ist es dieser InventoryHolder? - MoveEvent: getInitiator
            return;
        }
        // Dinge mit dem Inventar tun
        HandlerList.unregisterAll(this); // Wenn das Inventar geschlossen wurde, wird der Listener nicht mehr gebraucht.
    }

    @Override
    public Inventory getInventory() {
        return gui; // Benötigte Methode des Interfaces.
    }
}
Das öffnen und füllen des Inventars sollte sich auch im Constructor machen lassen, ich finde es so allerdings ordentlicher. Wichtig ist hier allerdings, das du eine Instanz dieser Klasse auch nur erstellst, wenn du das Inventar tatsächlich öffnest. Sonst hast du unnötig viele Listener, die nicht benötigt werden.
So wird nur ein Listener registriert, solange das Inventar offen ist.
 
Zuletzt bearbeitet:
Oben