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

getTitle Minecraft Plugin

SchnellfeuerXD

Kuhfänger
Registriert
8 Februar 2020
Beiträge
56
Diamanten
300
Hallo ich programmiere in der 1.15.2 ein Bann gui doch es gibt ein Problem. Da .getTitle nicht mehr gefunden wird. Ich habe es über einen anderen Weg versucht doch dann geht es nicht mehr. Code und Feheler seht ihr bei den Bildern.
 

Anhänge

  • SharedScreenshot.jpg
    SharedScreenshot.jpg
    148,5 KB · Aufrufe: 226
  • SharedScreenshot2.jpg
    SharedScreenshot2.jpg
    150,3 KB · Aufrufe: 226
  • SharedScreenshot3.jpg
    SharedScreenshot3.jpg
    259,3 KB · Aufrufe: 225

Malfrador

Threadripper
Registriert
16 Juni 2013
Beiträge
1.473
Diamanten
396
Minecraft
Malfrador
Ein Inventory ist ein Inventar. Wenn du eine (virtuelle) Kiste öffnest, siehst du zwei Inventare. Diese zwei Inventare zusammen werden als InventoryView bezeichnet. Du solltest also den Titel der Inventory-View nutzen, nicht den des Inventars. event.getInventory().getView().getTitle()

Eine eventuell einfachere Methode ist es, in deiner GUI-Klasse InventoryHandler zu implementieren. Dann erstellst du das Inventar mit der Klasse als Holder/Owner und kannst einfach schauen ob event.getInventory().getHolder() deine Klasse ist. Dabei ist es dann völlig egal welchen Titel das Inventar hat. Das hat den weiteren Vorteil, das es mehrere Inventare mit dem gleichen Titel geben kann (womit Spieler auch nicht einfach eine Kiste mit dem Inventar-Titel erstellen können, und sich das Inventar ercheaten)

Beispiel für InventoryHolder:
public class GUI implements Listener, InventoryHolder {
    Inventory gui;

    public GUI() {
        gui = Bukkit.createInventory(this, 27, "Blabla");
        Bukkit.getPluginManager().registerEvents(this, plugin);
    }
    public void open(Player p) {
        // Fülle dein Inventar
        p.openInventory(gui);
    }
    @EventHandler
    public void onClick(InventoryClickEvent event) {
        if (event.getInventory().getHolder() != this) {
            return;
        }
        // Was auch immer
       HandlerList.unregisterAll(this); // Wenn komplett fertig natürlich.
    }
    @Override
    public Inventory getInventory() {
        return gui;
    }
 

SchnellfeuerXD

Kuhfänger
Registriert
8 Februar 2020
Beiträge
56
Diamanten
300
Ein Inventory ist ein Inventar. Wenn du eine (virtuelle) Kiste öffnest, siehst du zwei Inventare. Diese zwei Inventare zusammen werden als InventoryView bezeichnet. Du solltest also den Titel der Inventory-View nutzen, nicht den des Inventars. event.getInventory().getView().getTitle()

Eine eventuell einfachere Methode ist es, in deiner GUI-Klasse InventoryHandler zu implementieren. Dann erstellst du das Inventar mit der Klasse als Holder/Owner und kannst einfach schauen ob event.getInventory().getHolder() deine Klasse ist. Dabei ist es dann völlig egal welchen Titel das Inventar hat. Das hat den weiteren Vorteil, das es mehrere Inventare mit dem gleichen Titel geben kann (womit Spieler auch nicht einfach eine Kiste mit dem Inventar-Titel erstellen können, und sich das Inventar ercheaten)

Beispiel für InventoryHolder:
public class GUI implements Listener, InventoryHolder {
    Inventory gui;

    public GUI() {
        gui = Bukkit.createInventory(this, 27, "Blabla");
        Bukkit.getPluginManager().registerEvents(this, plugin);
    }
    public void open(Player p) {
        // Fülle dein Inventar
        p.openInventory(gui);
    }
    @EventHandler
    public void onClick(InventoryClickEvent event) {
        if (event.getInventory().getHolder() != this) {
            return;
        }
        // Was auch immer
       HandlerList.unregisterAll(this); // Wenn komplett fertig natürlich.
    }
    @Override
    public Inventory getInventory() {
        return gui;
    }


Danke aber ich habe die Item Stacks in ner anderen klasse ist das schilmm?
 

Xenoshi

Kuhfänger
Registriert
22 November 2015
Beiträge
77
Diamanten
300
Minecraft
godlessFloof
ich persönlich benutze ein ItemBuilder.... im Endeffekt hast du dann indirekt alle ItemStacks wo anders... hier zum ItemBuilder:
ItemBuilder:
public class ItemBuilder {
    private final ItemStack itemStack;

    private ItemMeta itemMeta;

    public ItemStack getItemStack() {
        return this.itemStack;
    }

    public ItemMeta getItemMeta() {
        return this.itemMeta;
    }

    public ItemBuilder(ItemStack itemStack) {
        this.itemStack = itemStack;
        this.itemMeta = this.itemStack.getItemMeta();
    }

    public ItemBuilder(Material material) {
        this.itemStack = new ItemStack(material);
        this.itemMeta = this.itemStack.getItemMeta();
    }

    public ItemBuilder(Material material, int amount) {
        this.itemStack = new ItemStack(material, 1, (short) 0);
        this.itemMeta = this.itemStack.getItemMeta();
        setAmount(Integer.valueOf(amount));
    }

    public ItemBuilder(Material material, short itemData) {
        this.itemStack = new ItemStack(material, 1, itemData);
        this.itemMeta = this.itemStack.getItemMeta();
    }

    public ItemBuilder(Material material, int amount, short itemData) {
        this.itemStack = new ItemStack(material, 1, itemData);
        this.itemMeta = this.itemStack.getItemMeta();
    }

    public ItemBuilder setDisplayName(String displayName) {
        this.itemMeta.setDisplayName(displayName);
        return this;
    }

    public ItemBuilder setAmount(Integer amount) {
        this.itemStack.setAmount(amount.intValue());
        return this;
    }

    public ItemBuilder setLore(String... lore) {
        this.itemMeta.setLore(Arrays.asList(lore));
        return this;
    }

    public ItemBuilder setLore(List<String> lore) {
        this.itemMeta.setLore(lore);
        return this;
    }

    public ItemBuilder setEnchantment(Enchantment enchantment, Integer level) {
        this.itemMeta.addEnchant(enchantment, level.intValue(), true);
        return this;
    }

    public ItemBuilder addEnchantments(Map<Enchantment, Integer> enchantments) {
        this.itemStack.addUnsafeEnchantments(enchantments);
        return this;
    }

    public ItemBuilder setItemFlag(ItemFlag itemFlag) {
        this.itemMeta.addItemFlags(new ItemFlag[] { itemFlag });
        return this;
    }
    
    public ItemBuilder setDurability(Short amount) {
        this.itemStack.setDurability(amount);
        return this;
    }
    
    public ItemBuilder setColor(Color color) {
        LeatherArmorMeta meta = (LeatherArmorMeta) this.itemMeta;
        meta.setColor(color);
        return this;
    }

    public ItemStack build() {
        this.itemStack.setItemMeta(this.itemMeta);
        return this.itemStack;
    }
}

Aufrufen kannst du den dann mit (Beispiel) inv.setItem(s, new ItemBuilder(Material.STAINED_GLASS_PANE, 1, (short) 15).build());
 

petomka

Redstoneengineer
Registriert
8 Oktober 2012
Beiträge
41
Alter
26
Diamanten
322
Hallo,

deine ItemBuilder-Klasse ist leider für die Version 1.15 völlig veraltet da sie noch auf Items mit Durability-Werten basiert. Klar kann man das einfach nicht benutzen, diese Methoden bzw. Konstruktoren wurden aber bereits seit längerem als Deprecated markiert. OP hat auch geschrieben, dass er die 1.15 verwendet.

Des Weiteren sind in dieser Klasse noch andere Fehler enthalten, beispielsweise haben deine Methoden an mehreren Stellen sog. Wrapper-Klassen von primitiven Datentypen als Parameter, anstatt den primitiven Datentypen direkt zu verwenden. Beispiel:
public ItemBuilder setAmount(Integer amount) wäre korrekt public ItemBuilder setAmount(int amount).
Hierzu etwas aus der Java-Dokumentation: https://docs.oracle.com/javase/8/docs/technotes/guides/language/autoboxing.html
Auch so Zeilen wie setAmount(Integer.valueOf(amount)); in denen unnötige Aufrufe stattfinden (amount ist ja bereits int...) lassen mich stark davon abraten, diese Klasse zu verwenden.

Abgesehen davon erschließt sich mir nicht, wie diese Klasse dem Threadersteller helfen sollte. Er hat die Items ja bereits in einer anderen Klasse definiert und kann sie von dort aus immer wieder verwenden. Die Aussage
im Endeffekt hast du dann indirekt alle ItemStacks wo anders
verstehe ich leider nicht. Abgesehen davon wird der ItemBuilder dann jedes mal erneut bemüht, den ItemStack zu erstellen, wenn das Inventar geöffnet wird, wenn man ihn so verwendet, wie du es vorgeschlagen hast.

Gruß,
petomka
 
Oben