Benötige Hilfe beim auslesen einer config.yml

Dieses Thema im Forum "Programmierung" wurde erstellt von M_Johny, 22. September 2014.

  1. M_Johny
    Offline

    M_Johny

    Registriert seit:
    16. Februar 2014
    Beiträge:
    57
    Minecraft:
    M_Johny
    Hy,

    Vorrab, ich bin kompletter Neuling in Plugin schreiben und bin dabei es zu lernen.
    Nun weiß ich nicht mehr weiter und hoffe das ich von euch Hilfe bekomme.

    Ein Befehl:
    Das Inventar wird überprüft ob ein bestimmtes Item vorhanden ist.
    Man bekommt ein bestimmtes item und das überprüfte wird entzogen.

    Das funktioniert bereits. Jetzt möchte ich aber gern die Items nicht mehr im Quellcode stehen haben sondern aus der config.yml auslesen.

    Code (Text):
    1.  
    2. ...
    3.  
    4.   private void configload() {
    5.      this.reloadConfig();
    6.      this.getConfig().options().header("Quest veränderbar");
    7.      this.getConfig().addDefault("options.messages.noitems", "Dir fehlen Items im Inventar");
    8.      this.getConfig().addDefault("options.messages.nopermission", "Du hast keine Rechte");
    9.      this.getConfig().addDefault("options.questlist.questname", "Cobble");
    10.      this.getConfig().addDefault("options.questlist.questname.description", "Benötigte Items: 64 Cobble");
    11.      this.getConfig().addDefault("options.questlist.questname.requiredItems", "COBBLESTONE, 64");
    12.      this.getConfig().addDefault("options.questlist.questname.itemReward", "LEATHER, 3");
    13.      this.getConfig().addDefault("options.questlist.questname.rewardText", "Deine Belohung: 3 Leather");
    14.      
    15.      this.getConfig().options().copyDefaults(true);
    16.      this.saveConfig();
    17.      System.out.println("[SkyQuest] Succefully (re)loaded config.yml");
    18.  
    19. ...
    20.  
    21.      if (cmd.getName().equalsIgnoreCase("quest")) {
    22.  
    23.        if(p != null){
    24.  
    25.          if(p.hasPermission("skyquest.quest")){
    26.            PlayerInventory inventory = p.getInventory();
    27.            ItemStack itemstack = new ItemStack(Material.COBBLESTONE, 64);
    28.            ItemStack itemstack1 = new ItemStack(Material.LEATHER, 3);
    29.            if (inventory.contains(itemstack)) {
    30.              inventory.addItem(itemstack1);
    31.              inventory.removeItem(itemstack);
    32.              p.sendMessage(ChatColor.GREEN + this.getConfig().getString("options.questlist.questname.rewardText"));
    33.              return true;
    34.            } else {
    35.              p.sendMessage(ChatColor.RED + this.getConfig().getString("options.messages.noitems"));
    36.              return true;
    37.            }
    38.          } else {
    39.            p.sendMessage(ChatColor.RED + this.getConfig().getString("options.messages.nopermission"));
    40.            return true;
    41.          }
    42.        } else {
    43.          System.out.println("Dieser Befehl kann nur ein Spieler nutzen.");
    44.          return true;
    45.        }
    46.      }
    47. ...
    48.  
    Ich komme mit google und Co. nicht weiter, da mein Englisch auch nicht gerade das beste ist.

    Vielleicht kann mir das jemand von euch erklären wie ich jetzt weiter vorgehen muss.


    Für eure Hilfe bedanke ich mich schon im Vorraus

    Gruß M_Johny
     
    #1
  2. [Dev] iTzSasukeHDxLP
    Offline

    [Dev] iTzSasukeHDxLP Ehem. Teammitglied

    Registriert seit:
    5. Januar 2014
    Beiträge:
    938
    Ich wuerde mir ohne viel Eleganz einen String mit dem Material bzw. der ItemId in der Config machen. Musst nur aufpassen weil dir ItemIDs glaube ich deprecated waren/sind (je nachdem welche Version du nutzt).

    Dann einfach mit for einmal das Inventar durchloopen und ueberpruefen, ob ein enthaltenes Item, oder mehrere das angeforderte ist.

    Ich mache soetwas gewoehnlich mit ItemMeta, aber ueber Material oder ItemID sollte es auch gehen.
     
    #2
  3. Poca
    Offline

    Poca

    Registriert seit:
    20. Juli 2014
    Beiträge:
    7
    Hey,
    das ganze kannst du auch mit Reflection lösen.
    Einfach einen String mit Materialnamen in der Config anlegen, ich nenn den jetzt mal testweise s.
    Dann kannst du es so lösen:
    http://pastebin.com/83yryB4u

    Ich habe es zwar nicht ausprobiert, müsste aber klappen.
     
    #3
  4. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Oder einfach:
    Code (Text):
    1. Material type = Material.matchMaterial(getConfig().getString("pfad.zum.item"));
    2. if (type != null && p.getInventory().containsAtLeast(new ItemStack(type) {
    3.   //Das Inventar enthält das Material
    4. }
    5.  
    6. else {
    7.   //Das Inventar enthält das Material NICHT bzw. das Material ist falsch konfiguriert
    8. }
    Dazu noch ein Link zu den API-Docs: http://jd.bukkit.org/dev/apidocs/org/bukkit/Material.html#matchMaterial(java.lang.String)
     
    #4
    M_Johny gefällt das.
  5. M_Johny
    Offline

    M_Johny

    Registriert seit:
    16. Februar 2014
    Beiträge:
    57
    Minecraft:
    M_Johny
    Danke für die Tipps und Hilfen. Programmieren tuhe ich aktuell mit der Bukkit 1.7.9, da man ja keine aktuellere Version bekommt. Habe schon daran gedacht die Spigot zu nehmen mit dem neusten Patch, da ich diese auch auf meinem Server laufen habe, aber da hab ich mich noch nicht ran getraut.

    Zum Plugin, ich habe es nun über Schleifen und Strings gelöst:
    Code (Text):
    1.  
    2.  
    3.   void quest (Player p, String quest){
    4.      
    5.      PlayerInventory inventory = p.getInventory(); // Das Inventar des Spielers
    6.            
    7.      // itemstack soll aus config ausgelesen werden          
    8.      String ConfigRequiredItems = this.getConfig().getString("options.questlist." + quest + ".requiredItems");
    9.      String []RequiredItemList = ConfigRequiredItems.split(",");
    10.      
    11.      String ConfigRewardItems = this.getConfig().getString("options.questlist." + quest + ".rewardItems");
    12.      String []RewardItemList = ConfigRewardItems.split(",");
    13.      
    14.      //Itemprüfung
    15.      int i;
    16.      boolean givematerial = true;
    17.      
    18.      for (i = 0; i <= RequiredItemList.length-1; i++) {
    19.        String[]item = RequiredItemList[i].split(":");
    20.        ItemStack RequiredItem = new ItemStack(Material.getMaterial(item[0]),Integer.parseInt(item[1]));
    21.        if (!inventory.contains(RequiredItem)) {
    22.          givematerial = false;    
    23.        }  
    24.      }          
    25.      //Itemausgabe
    26.      if (givematerial == true){
    27.        for (i = 0; i <= RequiredItemList.length-1; i++) { //löschen der geforderten Items
    28.          String[]item = RequiredItemList[i].split(":");
    29.          ItemStack RequiredItem = new ItemStack(Material.getMaterial(item[0]),Integer.parseInt(item[1]));
    30.          inventory.removeItem(RequiredItem);    
    31.        }
    32.        
    33.        for (i = 0; i <= RewardItemList.length-1; i++) { //geben der RewardItems
    34.          String[]item = RewardItemList[i].split(":");
    35.          ItemStack RewardItem = new ItemStack(Material.getMaterial(item[0]),Integer.parseInt(item[1]));
    36.          inventory.addItem(RewardItem);
    37.        }
    38.        p.sendMessage(ChatColor.GREEN + this.getConfig().getString("options.questlist." + quest + ".rewardText"));
    39.      } else {
    40.        p.sendMessage(ChatColor.RED + this.getConfig().getString("options.messages.noitems"));
    41.      }                  
    42.    }
    43.  

    Nun hab ich noch eine Frage. Ich möchte das Plugin langfristig nutzen und die Item IDs sollen ja irgendwann entfernt werden und man greift dann nur noch über den Namen auf die Items


    Geht das weiterhin mit ItemStack und wie greife ich z.B. auf die 17:5 zu? Da ja beim Beispiel LOG alle Arten unter LOG laufen und nicht jede Sorte einen eigenen Namen hat.


    greez M_Johny
     
    #5
  6. _Baum_
    Offline

    _Baum_

    Registriert seit:
    4. August 2013
    Beiträge:
    66
    Minecraft:
    PlueschAffe
    Hi @m_johny,

    Selbst wenn die ID's entfernt werden, werden WE und Essentials über die Datenbank weiterhin IDs unterstützen, obwohl ich bezweifle, dass IDs komplett entfernt werden.

    Die ":5" bezieht sich auf die Haltbarkeit eines Items. Bei Werkzeugen gibt es die Abnutzung an, bei anderen Items (zB. Blume oder Holz) die Art.

    Code:
    Code (Text):
    1. itemStack.setDurability((short)5);
    "short" ist ein primitiver Datentyp, am ehesten vergleichbar mit einem Integer, deshalb das "(short)" und den "int" zu einem "short" zu casten.

    Generell würde ich dir raten, einfach mal die Vervollständigungsvorschläge durchzusehen, wenn du zB. "player." oder "item." in Eclipse schreibst. So erschließen sich kleinere Probleme von selber ;)

    Edit: Zum Thema "spigot nutzen": gar kein Problem, mache ich auch. Die API ist genau die gleiche, es gelten nur leicht veränderte Maßstäbe bei der Threadsicherheit, da spigot dadurch verhindern will, dass man mit schlechtem Code seinen Server schrottet. Sind aber sehr spezielle Dinge und nicht der Rede wert. Es ist sowieso empfehlenswert die Plugins immer mit dem System zu schreiben, das man auch auf dem Server nutzt.

    MfG
    _Baum_
     
    #6
    M_Johny und MiCrJonas gefällt das.
  7. M_Johny
    Offline

    M_Johny

    Registriert seit:
    16. Februar 2014
    Beiträge:
    57
    Minecraft:
    M_Johny
    Danke für die Hilfe, hat wunderbar funktioniert.

    Es sind in den ersten Test noch weitere Fehler, bwz Probleme aufgetaucht, aber die bekommt ich hoffentlich auch noch gelöst. Ansonsten weiß ich ja, wo ich gute Infos bekomme :)
     
    #7
  8. M_Johny
    Offline

    M_Johny

    Registriert seit:
    16. Februar 2014
    Beiträge:
    57
    Minecraft:
    M_Johny
    Ich hab soweit alle Probeme lösen können, außer eins:

    Wenn ich das Plugin starte, kommt manchmal : Default system encoding may have misread config.yml from plugin jar
    und danach geht das ganze Plugin nicht mehr und ich weis echt nicht wo, bwz wie ich diesen Fehler beheben kann.

    Ich hoffe mir kann jemdand helfen, da das Problem mich hindert das Plugin offiziel auf meinem Server zu testen
     
    #8
  9. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Bitte den ganzen Fehler posten.
     
    #9
  10. M_Johny
    Offline

    M_Johny

    Registriert seit:
    16. Februar 2014
    Beiträge:
    57
    Minecraft:
    M_Johny
    Mehr wird beim Start nicht angezeigt:
    Fehler.png
     
    #10
  11. _Baum_
    Offline

    _Baum_

    Registriert seit:
    4. August 2013
    Beiträge:
    66
    Minecraft:
    PlueschAffe
    Hi @m_johny,
    dieser Fehler ist mir zwar an sich unbekannt (die Art und Weise der Meldung ist komisch), aber die in deinem Plugin eingebaute Config scheint nicht geladen werden zu können. Kannst du sie mal posten?
    Eventuelle Fehler könnten sein:
    - Tabs
    - Sonderzeichen (ä ü ö §)

    Bitte als "Code" posten, damit man die Formatierung sehen kann :)

    MfG
    _Baum_
     
    #11
  12. M_Johny
    Offline

    M_Johny

    Registriert seit:
    16. Februar 2014
    Beiträge:
    57
    Minecraft:
    M_Johny
    Code (Text):
    1.  
    2. # Erstelle deine eigenen Quests und lege die einzelnen messages fest, so wie du willst
    3. # Das Inventar passt sich automatisch an die Menge der Quests an
    4. #
    5. #
    6. # Schreibweise bei den requiredItems und rewardItems: ItemID:(Variante:)Menge
    7. #
    8. # Für Beschreibungen hast du jeweils 3 Zeilen
    9. # Nutze lieber mehr Zeilen als alles in eine Zeile zu schreiben, da es im Spiel nicht mehr lesbar sein kann
    10. #
    11. #
    12. # Die IDs der Items kannst du z.B. hier nachlesen: http://www.minecraftinfo.com/IDList.htm
    13. #
    14. options:
    15.   messages:
    16.     headerquestlist: 'Aktuelle Quests'
    17.     noitems: 'Dir fehlen Items im Inventar'
    18.     nopoints: 'Du hast nicht genug QuestPoints'
    19.     nopermission: 'Dir fehlt das Recht Quests zu starten'
    20.     onlyplayer: 'Dieser Befehl kann nur von einem Spieler starten'
    21.     GUIheader: SkyQuest
    22.   questlist:
    23.     Example1:
    24.       displayItem: 4
    25.       description: 'Du brauchst 64 Cobblestone'
    26.       description2: 'und 32 Stein'
    27.       description3: ''
    28.       requiredItems: '4:64,1:32'
    29.       requiredPoints: 1
    30.       removeItems: true
    31.       rewardPoints: 1
    32.       rewardItems: '334:3,35:14:5'
    33.       rewardText: 'Du bekommst 3 Leder und 5 rote Wolle'
    34.       rewardText2: ''
    35.       rewardText3: ''
    36.       permission: skyquest.quest
    37.  
     
    #12
  13. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Ich weiß zwar nicht, was der Fehler ist, aber mir ist aufgefallen, dass du statt einer Liste "description1, description2, ..." benutzt, statt einer einfachen Liste:
    Code (Text):
    1. description:
    2. - 'Du brauchst 64 Cobblestone'
    3. - 'und 32 Stein'
    Dann hast du auch keine Überflüssigen Zeilen in der Beschreibung. Nur mal so am Rande...
     
    #13
  14. M_Johny
    Offline

    M_Johny

    Registriert seit:
    16. Februar 2014
    Beiträge:
    57
    Minecraft:
    M_Johny
    Nach langem Suchen hab ich den Fehler gefunden :)

    Nachdem ich in der config.yml die ausgerauten Zeilen entfernt habe, wurde sie normal geladen. Warum das so ist kann ich mir aber nicht erklären und bin auch nur per Zufall drüber gestolpert.

    Einige haben online geschrieben, dass sie Probleme mit dem configload von Bukkit haben, gerade dann wenn Zeilen vorhanden sind die # sind.
    Die meisten haben sich dann einen eigenen configload geschrieben.

    ich hab erstmal nur die Zeilen entfernt, so funktionierts jetzt auch und ich kann mit dem ersten Testlauf auf meinem Server beginnen.


    @MiCrJonas1997 dein Tipp mit der Liste hab ich auch gleich übernommen, macht auf alle Fälle mehr Sinn, danke schön :)


    Danke nochmal an die Hilfen die ich von euch bekommen habe.

    greez M_Johny
     
    #14