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

Spigot Rüstung abfragen dann effekt geben

Xenoshi

Kuhfänger
Registriert
22 November 2015
Beiträge
77
Diamanten
300
Minecraft
godlessFloof
Hey leute.
ich schreibe grade ein Plugin wo zum beispiel eine FlyArmor mir fliegen geben soll.
Leider weiß ich nicht wie ich dem Spieler sagen soll wenn er sie angezogen hat das er fliegen kann und wenn die rüstung nicht ist das er es nicht mehr kann.
Es gibt leider kein ArmorCheckEvent oder sowas deswegen weiß ich nicht ob bzw wie das geht.

Bitte um Hilfe
Yasuo c:
 

UnityGaming

Workaholic
Registriert
25 Oktober 2015
Beiträge
527
Alter
26
Diamanten
312
Minecraft
FastFelix771
Das InventoryMoveItemEvent könnte dir weiterhelfen.
Du kannst beim PlayerInventory die Armor Slots abfragen und dann entsprechend prüfen ob dein jeweiliges Rüstungsobjekt an- oder ausgezogen wurde.

Wobei ich mir nicht mehr 100% sicher bin ob sich das InventoryMoveItemEvent auf Items im Inventory oder zwischen mehreren Inventories bezog.
Dazu müsstest du selbst ein bisschen forschen.

Was du machen willst, lässt sich aber definitiv mit den vorhandenen Inventory Events machen.

EDIT: InventoryDragEvent & InventoryClickEvent bringen dich vermutlich eher ans Ziel.
 

Xenoshi

Kuhfänger
Registriert
22 November 2015
Beiträge
77
Diamanten
300
Minecraft
godlessFloof
Das InventoryMoveItemEvent könnte dir weiterhelfen.
Du kannst beim PlayerInventory die Armor Slots abfragen und dann entsprechend prüfen ob dein jeweiliges Rüstungsobjekt an- oder ausgezogen wurde.

Wobei ich mir nicht mehr 100% sicher bin ob sich das InventoryMoveItemEvent auf Items im Inventory oder zwischen mehreren Inventories bezog.
Dazu müsstest du selbst ein bisschen forschen.

Was du machen willst, lässt sich aber definitiv mit den vorhandenen Inventory Events machen.

EDIT: InventoryDragEvent & InventoryClickEvent bringen dich vermutlich eher ans Ziel.
Abfragen z. B. mit if(p.getInventory().getHelmet().equals("gewünschtes ItemStack"){p.setAllowFlight(true);}
oder wie?
 

Luki_xx

Schafhirte
Registriert
12 Juni 2019
Beiträge
107
Diamanten
378
Minecraft
Luki_xx
Ansich sollte es so funktionieren, musst halt alle 4 Teile mit einem && verknüpfen wenn es eine ganze Rüstung sein soll.
Allerdings bin ich mir gerade nicht sicher ob du damit Erfolg haben wirst, den der ItemStack wird bei einem Item das Schaden hat anders sein als eins ohne(vermutlich). Würde das daher über den Typ und die Meta machen.

Was du auch beachten musst ist das die Rüstung zerstört werden könnte, weiß allerdings nicht welches Event das auslöst.

Edit: Vermutlich geht das über PlayerItemBreakEvent.
 

Xenoshi

Kuhfänger
Registriert
22 November 2015
Beiträge
77
Diamanten
300
Minecraft
godlessFloof
Ansich sollte es so funktionieren, musst halt alle 4 Teile mit einem && verknüpfen wenn es eine ganze Rüstung sein soll.
Allerdings bin ich mir gerade nicht sicher ob du damit Erfolg haben wirst, den der ItemStack wird bei einem Item das Schaden hat anders sein als eins ohne(vermutlich). Würde das daher über den Typ und die Meta machen.

Was du auch beachten musst ist das die Rüstung zerstört werden könnte, weiß allerdings nicht welches Event das auslöst.

Edit: Vermutlich geht das über PlayerItemBreakEvent.
Wenn die Rüstung bei mir angezogen wird dann bekomme ich ja den Effekt aber wenn ich dann diese wieder ablege habe ich ihn immer noch.

Grundsätzlich weiß ich das mit dem Breake deshalb sind diese rüstungen auch unkaputtbar c: aber okay ich denke ich habe ungefair verstanden wie ich das machen muss, sollte es funktionieren dann melde ich mich wenn es nicht funkt dann melde ich mich auch noch mal :D
 

Xenoshi

Kuhfänger
Registriert
22 November 2015
Beiträge
77
Diamanten
300
Minecraft
godlessFloof
Das InventoryMoveItemEvent könnte dir weiterhelfen.
Du kannst beim PlayerInventory die Armor Slots abfragen und dann entsprechend prüfen ob dein jeweiliges Rüstungsobjekt an- oder ausgezogen wurde.

Wobei ich mir nicht mehr 100% sicher bin ob sich das InventoryMoveItemEvent auf Items im Inventory oder zwischen mehreren Inventories bezog.
Dazu müsstest du selbst ein bisschen forschen.

Was du machen willst, lässt sich aber definitiv mit den vorhandenen Inventory Events machen.

EDIT: InventoryDragEvent & InventoryClickEvent bringen dich vermutlich eher ans Ziel.
Das Funktioniert so irgendwie nicht. Habe jetzt 30 Minuten getestet aber es hat nichts gefunkt
 

Xenoshi

Kuhfänger
Registriert
22 November 2015
Beiträge
77
Diamanten
300
Minecraft
godlessFloof
Kannst du deinen Code mal hier rein schreiben? Hast du Fehlermeldungen?
Code:
    public void ArmorRecipe() {
        ItemStack i1 = new ItemStack(Material.GOLDEN_BOOTS);
        ItemMeta m1 = i1.getItemMeta();
        m1.setDisplayName("§3§lFly Armor Boots");
        m1.setUnbreakable(true);
        i1.setItemMeta(m1);
        
        ItemStack i2 = new ItemStack(Material.GOLDEN_LEGGINGS);
        ItemMeta m2 = i2.getItemMeta();
        m2.setDisplayName("§3§lFly Armor Leggings");
        m2.setUnbreakable(true);
        i2.setItemMeta(m2);
        
        ItemStack i3 = new ItemStack(Material.GOLDEN_CHESTPLATE);
        ItemMeta m3 = i3.getItemMeta();
        m3.setDisplayName("§3§lFly Armor Chestplate");
        m3.setUnbreakable(true);
        i3.setItemMeta(m3);
        
        ItemStack i4 = new ItemStack(Material.GOLDEN_HELMET);
        ItemMeta m4 = i4.getItemMeta();
        m4.setDisplayName("§3§lFly Armor Helmet");
        m4.setUnbreakable(true);
        i4.setItemMeta(m4);
        
        ShapelessRecipe r1 = new ShapelessRecipe(i1);
        r1.addIngredient(Material.GOLDEN_BOOTS, 1);
        r1.addIngredient(Material.NETHER_STAR, 1);
        r1.addIngredient(Material.FEATHER, 5);
        
        ShapelessRecipe r2 = new ShapelessRecipe(i2);
        r2.addIngredient(Material.GOLDEN_LEGGINGS, 1);
        r2.addIngredient(Material.NETHER_STAR, 1);
        r2.addIngredient(Material.FEATHER, 5);
        
        ShapelessRecipe r3 = new ShapelessRecipe(i3);
        r3.addIngredient(Material.GOLDEN_CHESTPLATE, 1);
        r3.addIngredient(Material.NETHER_STAR, 1);
        r3.addIngredient(Material.FEATHER, 5);
        
        ShapelessRecipe r4 = new ShapelessRecipe(i4);
        r4.addIngredient(Material.GOLDEN_HELMET, 1);
        r4.addIngredient(Material.NETHER_STAR, 1);
        r4.addIngredient(Material.FEATHER, 5);
        
        Bukkit.addRecipe(r1);
        Bukkit.addRecipe(r2);
        Bukkit.addRecipe(r3);
        Bukkit.addRecipe(r4);
    }
    
    @EventHandler
    public static void FlyArmorCheck(InventoryClickEvent e) {
        Player p = (Player) e.getWhoClicked();
        
        ItemStack i1 = new ItemStack(Material.GOLDEN_BOOTS);
        ItemMeta m1 = i1.getItemMeta();
        m1.setDisplayName("§3§lFly Armor Boots");
        m1.setUnbreakable(true);
        i1.setItemMeta(m1);
        
        ItemStack i2 = new ItemStack(Material.GOLDEN_LEGGINGS);
        ItemMeta m2 = i2.getItemMeta();
        m2.setDisplayName("§3§lFly Armor Leggings");
        m2.setUnbreakable(true);
        i2.setItemMeta(m2);
        
        ItemStack i3 = new ItemStack(Material.GOLDEN_CHESTPLATE);
        ItemMeta m3 = i3.getItemMeta();
        m3.setDisplayName("§3§lFly Armor Chestplate");
        m3.setUnbreakable(true);
        i3.setItemMeta(m3);
        
        ItemStack i4 = new ItemStack(Material.GOLDEN_HELMET);
        ItemMeta m4 = i4.getItemMeta();
        m4.setDisplayName("§3§lFly Armor Helmet");
        m4.setUnbreakable(true);
        i4.setItemMeta(m4);
        
        if(p.getInventory().getHelmet().equals(i4) && p.getInventory().getChestplate().equals(i3) && p.getInventory().getLeggings().equals(i2) && p.getInventory().getBoots().equals(i1)) {
            p.setAllowFlight(true);
        }else {
            p.setAllowFlight(false);
        }
    }
 

Avankziar

Schafhirte
Registriert
12 Februar 2018
Beiträge
135
Alter
33
Diamanten
324
Minecraft
Avankziar
Um mal dazwischen zu funken, ich glaube nicht, dass du so einfach ItemStacks per equals() abgleichen kannst, bzw. bei einem meiner Plugins ginge das auch net...
Ich habe es damals per ItemMeta String vergleich gemacht:
Code:
public boolean isSameItem(Material mat, ItemMeta meta, ItemStack other)
    {
        if(other==null)
        {
            return false;
        }
        if(mat!=other.getType())
        {
            return false;
        }
        if(!meta.toString().equals(other.getItemMeta().toString()))
        {
            return false;
        }
        return true;
    }
dabei ist mat und meta von dem einen ItemStack und other ist das Abzufragende ItemStack...
 

Xenoshi

Kuhfänger
Registriert
22 November 2015
Beiträge
77
Diamanten
300
Minecraft
godlessFloof
Um mal dazwischen zu funken, ich glaube nicht, dass du so einfach ItemStacks per equals() abgleichen kannst, bzw. bei einem meiner Plugins ginge das auch net...
Ich habe es damals per ItemMeta String vergleich gemacht:
Code:
public boolean isSameItem(Material mat, ItemMeta meta, ItemStack other)
    {
        if(other==null)
        {
            return false;
        }
        if(mat!=other.getType())
        {
            return false;
        }
        if(!meta.toString().equals(other.getItemMeta().toString()))
        {
            return false;
        }
        return true;
    }
dabei ist mat und meta von dem einen ItemStack und other ist das Abzufragende ItemStack...
Ne frage um es auszuprobieren? Wie soll ich das bei mir am besten anwenden?
 

Avankziar

Schafhirte
Registriert
12 Februar 2018
Beiträge
135
Alter
33
Diamanten
324
Minecraft
Avankziar
Na so ungefähr:
Code:
@EventHandler
    public void FlyArmorCheck(InventoryClickEvent e) {
        Player p = (Player) e.getWhoClicked();
        
        ItemStack i1 = new ItemStack(Material.GOLDEN_BOOTS);
        ItemMeta m1 = i1.getItemMeta();
        m1.setDisplayName("§3§lFly Armor Boots");
        m1.setUnbreakable(true);
        i1.setItemMeta(m1);
        
        ItemStack i2 = new ItemStack(Material.GOLDEN_LEGGINGS);
        ItemMeta m2 = i2.getItemMeta();
        m2.setDisplayName("§3§lFly Armor Leggings");
        m2.setUnbreakable(true);
        i2.setItemMeta(m2);
        
        ItemStack i3 = new ItemStack(Material.GOLDEN_CHESTPLATE);
        ItemMeta m3 = i3.getItemMeta();
        m3.setDisplayName("§3§lFly Armor Chestplate");
        m3.setUnbreakable(true);
        i3.setItemMeta(m3);
        
        ItemStack i4 = new ItemStack(Material.GOLDEN_HELMET);
        ItemMeta m4 = i4.getItemMeta();
        m4.setDisplayName("§3§lFly Armor Helmet");
        m4.setUnbreakable(true);
        i4.setItemMeta(m4);
        
        ItemStack helmet = p.getInventory().getHelmet();
        ItemStack chestplate = p.getInventory().getChestplate();
        ItemStack leggins = p.getInventory().getLeggings();
        ItemStack boots = p.getInventory().getBoots();
        
        if(isSameItem(i1.getType(),i1.getItemMeta(), boots)
                &&isSameItem(i2.getType(),i2.getItemMeta(), leggins)
                &&isSameItem(i3.getType(),i3.getItemMeta(), chestplate)
                &&isSameItem(i4.getType(),i4.getItemMeta(), helmet))
        {
            p.setAllowFlight(true);
        } else
        {
            p.setAllowFlight(false);
        }
    }
    
    public boolean isSameItem(Material mat, ItemMeta meta, ItemStack other)
    {
        if(other==null)
        {
            return false;
        }
        if(mat!=other.getType())
        {
            return false;
        }
        if(!meta.toString().equals(other.getItemMeta().toString()))
        {
            return false;
        }
        return true;
    }
 

JOO200

Braumeister
Registriert
18 Dezember 2016
Beiträge
442
Diamanten
228
ItemStack#isSimilar sollte hier helfen. Oder das normale ItemStack#equals. Macht hier keinen unterschied, wenn auf eine Rüstung geprüft werden soll, von der man für gewöhnlich nur eine auf einmal anziehen kann.

So wie du das gemacht hast, sollte es fast funktionieren. Das einzige Problem könnte sein, dass wenn der Spieler keine Rüstung anhat, dann wirft deine lange if-Abfrage einen NPE.
 

Luki_xx

Schafhirte
Registriert
12 Juni 2019
Beiträge
107
Diamanten
378
Minecraft
Luki_xx
Also ich hab mich jetzt auch kurz hingesetzt und überlegt wie man das am einfachsten macht. Denke das die Material Abfrage nicht notwendig ist, wird die Rüstung vermutlich ja nur einmal geben. Ich gehe mal davon aus das das so am einfachsten ist da nicht extra der ItemStack für jedes Item angelegt werden muss. Kann nicht versprechen das es funktioniert.

Natürlich muss das Event noch registriert werden.

Java:
    @EventHandler
    public void FlyArmorCheck(InventoryClickEvent e) {
        Player p = (Player) e.getWhoClicked();
        if(sameMeta(p.getInventory().getHelmet(),"§3§lFly Armor Helmet")&&
            sameMeta(p.getInventory().getChestplate(),"§3§lFly Armor Chestplate")&&
            sameMeta(p.getInventory().getLeggings(),"§3§lFly Armor Leggings")&&
            sameMeta(p.getInventory().getBoots(),"§3§lFly Armor Boots")){
            p.setAllowFlight(true);
        }else{
            p.setAllowFlight(false);
        }
    }
    public boolean sameMeta(ItemStack item, String name) {
        if(item==null) return false;
        else if(item.getItemMeta().getDisplayName().equals(name)) return true;
        else return false;
    }
 
Oben