ServerPlugin Erstellen eines ItemStacks anhand von Konfigurationen

Dieses Thema im Forum "Programmierung" wurde erstellt von Pappi, 2. Dezember 2013.

  1. Pappi
    Offline

    Pappi Gesperrt

    Registriert seit:
    28. Oktober 2012
    Beiträge:
    141
    Ort:
    H.a.S/NRW/Germany
    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 (Text):
    1.   items:
    2.     list:
    3.     - 276 1 name:RewardSword
    4.     - 276 1 name:RewSword sharpness:3
    5.     - 403 1 protection:2
    6.     - 403 1 unbreaking:3
    7.     - 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 (Text):
    1.             final ConfigurationSection section = config.getConfigurationSection("pvprewards.item.list");
    2.             final ConfigurationSection newSection = new MemoryConfiguration();
    3.             for (String kitItem : section.getKeys(false))
    4.             {
    5.                 ItemStack items = section.getConfigurationSection(kitItem).getItemStack(kitItem);
    6.                 if(items != null) {
    7.                     this.reward_items.add(items);
    8.                 } else {
    9.                     PvPRewards.debug("Fehler im String \"" + kitItem + "\".");
    10.                 }
    11.             }

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

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

    Versuch 4 ( Failed ) :
    Code (Text):
    1.         List<String> myItems = config.getStringList("pvprewards.item.list");
    2.         for (String kitItem : myItems)
    3.         {
    4.             ItemStack items = config.createSection(kitItem).getItemStack(kitItem);
    5.             if(items != null) {
    6.                 this.reward_items.add(items);
    7.             } else {
    8.                 PvPRewards.debug("Fehler im String \"" + kitItem + "\".");
    9.             }
    10.         }
     
    #1
  2. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    #2
  3. games6471
    Offline

    games6471

    Code (Text):
    1. "pvprewards.item.list"
    Code (Text):
    1.   item[COLOR="#FF0000"]s[/COLOR]:
    2.     list:
    3.     - 276 1 name:RewardSword
    4.     - 276 1 name:RewSword sharpness:3
    5.     - 403 1 protection:2
    6.     - 403 1 unbreaking:3
    7.     - 403 1 power:3
    Manchmal sind es die kleinen Dinge.
     
    #3
  4. Pappi
    Offline

    Pappi Gesperrt

    Registriert seit:
    28. Oktober 2012
    Beiträge:
    141
    Ort:
    H.a.S/NRW/Germany
    Minecraft:
    Pappi / PapaHarni
    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 (Text):
    1.         _enchantments.put("PROTECTION", "PROTECTION_ENVIRONMENTAL");
    2.         _enchantments.put("FIRE_PROTECTION", "PROTECTION_FIRE");
    3.         _enchantments.put("FEATHER_FALLING", "PROTECTION_FALL");
    4.         _enchantments.put("BLAST_PROTECTION", "PROTECTION_EXPLOSIONS");
    5.         _enchantments.put("PROJECTILE_PROTECTION", "PROTECTION_PROJECTILE");
    6.         _enchantments.put("RESPIRATION", "OXYGEN");
    7.         _enchantments.put("AQUA_AFFINITY", "WATER_WORKER");
    8.         _enchantments.put("THORNS", "THORNS");
    9.         _enchantments.put("SHARPNESS", "DAMAGE_ALL");
    10.         _enchantments.put("SMITE", "DAMAGE_UNDEAD");
    11.         _enchantments.put("BANE_OF_ARTHROPODS", "DAMAGE_ARTHROPODS");
    12.         _enchantments.put("KNOCKBACK", "KNOCKBACK");
    13.         _enchantments.put("FIRE_ASPECT", "FIRE_ASPECT");
    14.         _enchantments.put("LOOTING", "LOOT_BONUS_MOBS");
    15.         _enchantments.put("EFFICIENCY", "DIG_SPEED");
    16.         _enchantments.put("SILK_TOUCH", "SILK_TOUCH");
    17.         _enchantments.put("UNBREAKING", "DURABILITY");
    18.         _enchantments.put("FORTUNE", "LOOT_BONUS_BLOCKS");
    19.         _enchantments.put("POWER", "ARROW_DAMAGE");
    20.         _enchantments.put("PUNCH", "ARROW_KNOCKBACK");
    21.         _enchantments.put("FLAME", "ARROW_FIRE");
    22.         _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 (Text):
    1. case "enchant":
    2.         if(pathb.length >= 3) {
    3.                 for(int b = 1;b < pathb.length; b += 2) {
    4.                         pathb[b] = pathb[b].trim().toUpperCase();
    5.                         PvPRewards.debug("Pruefe ob " + pathb[b] + " ein Enchant ist.");
    6.                         if(_enchantments.containsKey(pathb[b])) {
    7.                                 PvPRewards.debug(pathb[b] + " ist ein Enchant. Erzeuge Enchantment");
    8.                                 Enchantment ench = _enchantments.get(pathb[b].toUpperCase());
    9.                                 if(ench != null && ench.canEnchantItem(item)) {
    10.                                         PvPRewards.debug("Enchantment erfolgreich erzeugt. Pruefe Enchant Level.");
    11.                                         int enchLv = Integer.parseInt(pathb[(b+1)]);
    12.                                         if(enchLv < 1) { enchLv = 1; }
    13.                                         if(enchLv > ench.getMaxLevel()) { enchLv = ench.getMaxLevel(); }
    14.                                         PvPRewards.debug("Enchant Level geprueft. Setzte nun Enchant mit Level auf Item.");
    15.                                         item.addEnchantment(ench, enchLv);
    16.                                 }
    17.                         }
    18.                 }
    19.         }
    20.         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. ;-)
     
    #4
  5. Pappi
    Offline

    Pappi Gesperrt

    Registriert seit:
    28. Oktober 2012
    Beiträge:
    141
    Ort:
    H.a.S/NRW/Germany
    Minecraft:
    Pappi / PapaHarni
    Noch ein Versuch der VZ Bücher ohne erfolg :

    Code (Text):
    1. case "enchant":
    2.   if(pathb.length >= 3) {
    3.     for(int b = 1;b < pathb.length; b += 2) {
    4.       pathb[b] = pathb[b].trim().toUpperCase();
    5.       PvPRewards.debug("Pruefe ob " + pathb[b] + " ein Enchant ist.");
    6.       if(_enchantments.containsKey(pathb[b])) {
    7.         PvPRewards.debug(pathb[b] + " ist ein Enchant. Erzeuge Enchantment");
    8.         Enchantment ench = _enchantments.get(pathb[b].toUpperCase());
    9.         PvPRewards.debug("Enchantment erfolgreich erzeugt. Pruefe Enchant Level.");
    10.         int enchLv = Integer.parseInt(pathb[(b+1)]);
    11.         if(enchLv < 1) { enchLv = 1; }
    12.         if(enchLv > ench.getMaxLevel()) { enchLv = ench.getMaxLevel(); }
    13.         PvPRewards.debug("Enchant Level geprueft. Setzte nun Enchant mit Level auf Item.");
    14.         if(ench != null && ench.canEnchantItem(item)) {
    15.           PvPRewards.debug("Kann normal enchanted werden.");
    16.           item.getItemMeta().addEnchant(ench, enchLv, false);
    17.           //item.addEnchantment(ench, enchLv);
    18.         } else if(item.getType() == Material.ENCHANTED_BOOK || item.getType() == Material.BOOK || item.getType() == Material.WRITTEN_BOOK) {
    19.           PvPRewards.debug("Enchante ein Buch.");
    20.                                                                
    21.           BookMeta book = (BookMeta)item.getItemMeta();
    22.           book.addEnchant(ench, enchLv, true);
    23.           item.setItemMeta(book);
    24.         } else {
    25.           PvPRewards.debug("Enchant Item " + item.getItemMeta().getDisplayName() + " wird derzeit nicht im Enchant bereich unterstuetzt.");
    26.         }
    27.       }
    28.     }
    29.   }
    30.   break;
     
    #5
  6. MrFlieder
    Offline

    MrFlieder

    Registriert seit:
    30. Dezember 2011
    Beiträge:
    333
    Ort:
    Österreich
    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 (Text):
    1. getConfig().setItemStack("path", ItemStack());
    2. ItemStack item = getConfig().getItemStack("path");
     
    #6
  7. Pappi
    Offline

    Pappi Gesperrt

    Registriert seit:
    28. Oktober 2012
    Beiträge:
    141
    Ort:
    H.a.S/NRW/Germany
    Minecraft:
    Pappi / PapaHarni
    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.


    Die neue NullPointerException kommt nun aus dem replaceAll am Schluss.
    Weiss dort jemand Rat?
     
    #7