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

Erstellen eines ItemStacks anhand von Konfigurationen

Pappi

Schafhirte
Gesperrt
Registriert
28 Oktober 2012
Beiträge
141
Alter
41
Diamanten
0
Minecraft
Pappi / PapaHarni
Hallo,

da ich mir für meinen Server ein kleines Plugin welches PvP gewonnene und verlorene Kämpfe auflisten soll und gleichzeitig ein wenig Geld sowie ggf Items ausspucken soll, bin ich nun auf ein Problem gestoßen.

Und zwar möchte ich eine YAML Liste wie zB.

Code:
  items:
    list:
    - 276 1 name:RewardSword
    - 276 1 name:RewSword sharpness:3
    - 403 1 protection:2
    - 403 1 unbreaking:3
    - 403 1 power:3

in der Konfiguration angeben und dann beim Laden schonmal die passenden ItemStacks erstellen.

Doch wie mach ich das nun?


Versuch 1 ( Failed ) :
Code:
            final ConfigurationSection section = config.getConfigurationSection("pvprewards.item.list");
            final ConfigurationSection newSection = new MemoryConfiguration();
            for (String kitItem : section.getKeys(false))
            {
                ItemStack items = section.getConfigurationSection(kitItem).getItemStack(kitItem);
                if(items != null) {
                    this.reward_items.add(items);
                } else {
                    PvPRewards.debug("Fehler im String \"" + kitItem + "\".");
                }
            }


Versuch 2 ( Failed ) :
Code:
        List<String> myItems = config.getStringList("pvprewards.item.list");
        for (String kitItem : myItems)
        {
            ItemStack items = config.getItemStack(kitItem);
            if(items != null) {
                this.reward_items.add(items);
            } else {
                PvPRewards.debug("Fehler im String \"" + kitItem + "\".");
            }
        }


Versuch 3 ( Failed ) :
Code:
        List<String> myItems = config.getStringList("pvprewards.item.list");
        for (String kitItem : myItems)
        {
            ItemStack items = config.getConfigurationSection(kitItem).getItemStack(kitItem);
            if(items != null) {
                this.reward_items.add(items);
            } else {
                PvPRewards.debug("Fehler im String \"" + kitItem + "\".");
            }
        }


Versuch 4 ( Failed ) :
Code:
        List<String> myItems = config.getStringList("pvprewards.item.list");
        for (String kitItem : myItems)
        {
            ItemStack items = config.createSection(kitItem).getItemStack(kitItem);
            if(items != null) {
                this.reward_items.add(items);
            } else {
                PvPRewards.debug("Fehler im String \"" + kitItem + "\".");
            }
        }
 
G

games6471

Guest
Code:
"pvprewards.item.list"

Code:
  item[COLOR="#FF0000"]s[/COLOR]:
    list:
    - 276 1 name:RewardSword
    - 276 1 name:RewSword sharpness:3
    - 403 1 protection:2
    - 403 1 unbreaking:3
    - 403 1 power:3

Manchmal sind es die kleinen Dinge.
 
Zuletzt bearbeitet von einem Moderator:

Pappi

Schafhirte
Gesperrt
Registriert
28 Oktober 2012
Beiträge
141
Alter
41
Diamanten
0
Minecraft
Pappi / PapaHarni
Code:
"pvprewards.item.list"

Code:
  item[COLOR="#FF0000"]s[/COLOR]:
    list:
    - 276 1 name:RewardSword
    - 276 1 name:RewSword sharpness:3
    - 403 1 protection:2
    - 403 1 unbreaking:3
    - 403 1 power:3

Manchmal sind es die kleinen Dinge.

hehe stimmt hier war es wirklich falsch , aber in meiner Config ist es richtig. Da heisst es auch nur "item".


Das problem hab ich nun anders behoben. Etwas Komplizierter aber es geht.

[EDIT] BEHOBEN :

Neues problem :
Wie setze ich einen Enchant auf ein Item?

Mein Aktueller weg klappt leider nicht.

Übersetzung der Englischen Begriffe in Bukkit"isch":
Code:
        _enchantments.put("PROTECTION", "PROTECTION_ENVIRONMENTAL");
        _enchantments.put("FIRE_PROTECTION", "PROTECTION_FIRE");
        _enchantments.put("FEATHER_FALLING", "PROTECTION_FALL");
        _enchantments.put("BLAST_PROTECTION", "PROTECTION_EXPLOSIONS");
        _enchantments.put("PROJECTILE_PROTECTION", "PROTECTION_PROJECTILE");
        _enchantments.put("RESPIRATION", "OXYGEN");
        _enchantments.put("AQUA_AFFINITY", "WATER_WORKER");
        _enchantments.put("THORNS", "THORNS");
        _enchantments.put("SHARPNESS", "DAMAGE_ALL");
        _enchantments.put("SMITE", "DAMAGE_UNDEAD");
        _enchantments.put("BANE_OF_ARTHROPODS", "DAMAGE_ARTHROPODS");
        _enchantments.put("KNOCKBACK", "KNOCKBACK");
        _enchantments.put("FIRE_ASPECT", "FIRE_ASPECT");
        _enchantments.put("LOOTING", "LOOT_BONUS_MOBS");
        _enchantments.put("EFFICIENCY", "DIG_SPEED");
        _enchantments.put("SILK_TOUCH", "SILK_TOUCH");
        _enchantments.put("UNBREAKING", "DURABILITY");
        _enchantments.put("FORTUNE", "LOOT_BONUS_BLOCKS");
        _enchantments.put("POWER", "ARROW_DAMAGE");
        _enchantments.put("PUNCH", "ARROW_KNOCKBACK");
        _enchantments.put("FLAME", "ARROW_FIRE");
        _enchantments.put("INFINITY", "ARROW_INFINITE");


Dann das ganze so abfangen und umsetzten auf das Item ( pathb[0] ist der Englische Enchant Name und pathb[1] ist das Level ):
Code:
case "enchant":
        if(pathb.length >= 3) {
                for(int b = 1;b < pathb.length; b += 2) {
                        pathb[b] = pathb[b].trim().toUpperCase();
                        PvPRewards.debug("Pruefe ob " + pathb[b] + " ein Enchant ist.");
                        if(_enchantments.containsKey(pathb[b])) {
                                PvPRewards.debug(pathb[b] + " ist ein Enchant. Erzeuge Enchantment");
                                Enchantment ench = _enchantments.get(pathb[b].toUpperCase());
                                if(ench != null && ench.canEnchantItem(item)) {
                                        PvPRewards.debug("Enchantment erfolgreich erzeugt. Pruefe Enchant Level.");
                                        int enchLv = Integer.parseInt(pathb[(b+1)]);
                                        if(enchLv < 1) { enchLv = 1; }
                                        if(enchLv > ench.getMaxLevel()) { enchLv = ench.getMaxLevel(); }
                                        PvPRewards.debug("Enchant Level geprueft. Setzte nun Enchant mit Level auf Item.");
                                        item.addEnchantment(ench, enchLv);
                                }
                        }
                }
        }
        break;
Der Code hängt allerdings schon direkt zu anfang. Wobei ich nicht verstehe wieso es schon am containsKey() hackt. Kann mir jemand weiterhelfen? Hab wohl schon zu lange nichts mehr in Java gemacht und bin etwas eingerostet nun. ;-)
 
Zuletzt bearbeitet:

Pappi

Schafhirte
Gesperrt
Registriert
28 Oktober 2012
Beiträge
141
Alter
41
Diamanten
0
Minecraft
Pappi / PapaHarni
Noch ein Versuch der VZ Bücher ohne erfolg :

Code:
case "enchant":
  if(pathb.length >= 3) {
    for(int b = 1;b < pathb.length; b += 2) {
      pathb[b] = pathb[b].trim().toUpperCase();
      PvPRewards.debug("Pruefe ob " + pathb[b] + " ein Enchant ist.");
      if(_enchantments.containsKey(pathb[b])) {
        PvPRewards.debug(pathb[b] + " ist ein Enchant. Erzeuge Enchantment");
        Enchantment ench = _enchantments.get(pathb[b].toUpperCase());
        PvPRewards.debug("Enchantment erfolgreich erzeugt. Pruefe Enchant Level.");
        int enchLv = Integer.parseInt(pathb[(b+1)]);
        if(enchLv < 1) { enchLv = 1; }
        if(enchLv > ench.getMaxLevel()) { enchLv = ench.getMaxLevel(); }
        PvPRewards.debug("Enchant Level geprueft. Setzte nun Enchant mit Level auf Item.");
        if(ench != null && ench.canEnchantItem(item)) {
          PvPRewards.debug("Kann normal enchanted werden.");
          item.getItemMeta().addEnchant(ench, enchLv, false);
          //item.addEnchantment(ench, enchLv);
        } else if(item.getType() == Material.ENCHANTED_BOOK || item.getType() == Material.BOOK || item.getType() == Material.WRITTEN_BOOK) {
          PvPRewards.debug("Enchante ein Buch.");
                                                               
          BookMeta book = (BookMeta)item.getItemMeta(); 
          book.addEnchant(ench, enchLv, true);
          item.setItemMeta(book);
        } else {
          PvPRewards.debug("Enchant Item " + item.getItemMeta().getDisplayName() + " wird derzeit nicht im Enchant bereich unterstuetzt.");
        }
      }
    }
  }
  break;
 
Zuletzt bearbeitet:

MrFlieder

Braumeister
Registriert
30 Dezember 2011
Beiträge
332
Diamanten
0
Minecraft
MrFlieder
Man kann übrigens ganze ItemStacks in die Config speichern und auch wieder auslesen, da brauchst du keine eigenen (komplizierten) Methoden dafür schreiben. Vielleicht kannst du etwas damit anfangen:
Code:
getConfig().setItemStack("path", ItemStack());
ItemStack item = getConfig().getItemStack("path");
 

Pappi

Schafhirte
Gesperrt
Registriert
28 Oktober 2012
Beiträge
141
Alter
41
Diamanten
0
Minecraft
Pappi / PapaHarni
Man kann übrigens ganze ItemStacks in die Config speichern und auch wieder auslesen, da brauchst du keine eigenen (komplizierten) Methoden dafür schreiben. Vielleicht kannst du etwas damit anfangen:
Code:
getConfig().setItemStack("path", ItemStack());
ItemStack item = getConfig().getItemStack("path");

Und wie schaut dann der Path aus? ;-)

Wie komm ich an den DisplayName eines Items? bzw seinen eigentlichen Name?
Mit "myItem.getItemMeta().getDisplayName()" erhalte ich egal ob ein DisplayName gesetzt wurde oder nicht den Fehler NullPointerException.

EDIT :
Inzwischen habe ich die NullPointerException durch folgenden Code abgewandt.
private String firstCharUpperCase(String str) {
return str.substring(0, 1).toUpperCase() + str.substring(1);
}

private String firstCharAllWordsUpperCase(String str) {
String[] stra = str.split("_");
String strn = "";
for(int i = 0;i < (stra.length-1); i++) {
strn += firstCharUpperCase(stra.toLowerCase());
}
return strn;
}

String itemName = myItem.getItemMeta().hasDisplayName()?firstCharAllWordsUpperCase(myItem.getData().getItemType().name()):myItem.getItemMeta().getDisplayName();

rew_message = rew_message.replaceAll("%itemname%", itemName);


Die neue NullPointerException kommt nun aus dem replaceAll am Schluss.
Weiss dort jemand Rat?
 
Zuletzt bearbeitet:
Oben