Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите [Решено] Прошу совета по поводу config.yml

Тема в разделе "Разработка плагинов для новичков", создана пользователем Korvinius, 23 окт 2014.

  1. Автор темы
    Korvinius

    Korvinius Активный участник Пользователь

    Баллы:
    88
    Здравствуйте, или я плохо искал, или я не умею этого найти. Мне нужны советы или ссылки на разные мануалы/туториалы по Configuration API.

    Я конечно понимаю, что те, кто добился в чем то успеха, никогда не будет писать мануалы о том, как он этого добился. В большинстве случаев, разные советы, мануалы, туториалы пишут именно те, кто стремится добиться успеха именно благодаря этому. Возможно поэтому в интернете столько разного мусора, некачественного копипаста, а найти что то стоящее не так просто.

    Но все же надеюсь, что кто то опытный сможет мне дать совет.

    Итак, что я хочу сотворить:

    файл конфигурации (config.yml) будет иметь примерно такую структуру:

    Код:
    item:
      ID: DIAMOND_SWORD
      Name: Крутой меч
      Lore: меч принадлежащий герою
    item:
      ID: STONE
      Name: null
      Lore: null
    item:
      ID: EMERALD
      Name: Фамильные драгоценности
      Lore: null
    
    //и так дальше
    //*****
    //*****
    Генерировать автоматически этот config.yml или добавлять новые itemы командой я не планирую пока, все будет добавляться вручную.

    Мне нужно, чтобы плагин считывал этот конфиг и сравнивал с переменными, если находил совпадение по всем пунктам, тогда условие true. Чтобы каждый предмет проверялся именно по 3-м пунктам


    Ну и наберусь наглости, может паралельно и подскажете, как передать эти:
    в переменные, из getCursor() :oops:

    Спасибо за то, что дочитали до конца, еще больше буду благодарен за дельный совет и ли ссылку.
     
    Последнее редактирование: 24 окт 2014
  2. Хостинг MineCraft
    <
  3. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    Id = I.gettypeid().
    Name = I.getitemmeta().getdisplayname()
    Lore = I.getitemmeta().getlore().tostring()
     
  4. Автор темы
    Korvinius

    Korvinius Активный участник Пользователь

    Баллы:
    88
    Спасибо, опираясь на ваш совет, реализовал таким способом:


    Код:
            Material itemID;
            String itemName;
            String itemLore;
    
            itemID = event.getCursor().getType();
            itemName = event.getCursor().getItemMeta().getDisplayName().toString();
            itemLore = event.getCursor().getItemMeta().getLore().toString();
    

    Но, это тоже не идеально, то есть, если предмет имеет DisplayName и Lore, то все работает отлично, а если попадается предмет стандартного типа, в консоль выдает ошибку:
    ругается на строку:

    Код:
            itemName = event.getCursor().getItemMeta().getDisplayName().toString();
    я новичок в программировании в целом и в Java в частности, но попробовал такую конструкцию:

    Код:
            itemID = event.getCursor().getType();
            if (event.getCursor().getItemMeta().hasDisplayName()) {
                itemName = event.getCursor().getItemMeta().getDisplayName().toString();
            } else itemName = null;
            if (event.getCursor().getItemMeta().hasLore()) {
                itemLore = event.getCursor().getItemMeta().getLore().toString();
            } else itemLore = null;
    ничего не изменилось, ругается на строку
    Код:
            if (event.getCursor().getItemMeta().hasDisplayName())
    Как эту проверку правильно организовать?
     
    Последнее редактирование: 25 окт 2014
  5. Hilgert

    Hilgert Старожил Пользователь

    Баллы:
    123
    Skype:
    mixa2258
    Имя в Minecraft:
    Hilgert
    if(event.getCursor().getItemMeta().getDisplayName() != null && event.getCursor().getItemMeta().getLore() != null){
    //...
    }
     
  6. Автор темы
    Korvinius

    Korvinius Активный участник Пользователь

    Баллы:
    88
    к сожалению это тоже приводит к ошибке:
    но я понял, что эта ошибка появляется тогда, когда ПКМ или ЛКМ пустым курсором по предмету в инвентаре (то есть когда берется итем в курсор) а когда предмет из курсора ложится в любую ячейку инвентаря, то в переменную передаются все данные предмета без проблем. то есть нужно как то определить клик пустым курсором и отделить его. Пробовал такой вариант:
    Код:
            if (event.getCursor() != null) {
    
            itemID = event.getCursor().getType();
            if (event.getCursor().getItemMeta().getDisplayName() != null) {
                itemName = event.getCursor().getItemMeta().getDisplayName().toString();
            } else itemName = null;
            if (event.getCursor().getItemMeta().getLore() != null) {
                itemLore = event.getCursor().getItemMeta().getLore().toString();
            } else itemLore = null;
          
            }
    не помогает, как еще можно это определить?
     
    Последнее редактирование: 25 окт 2014
  7. CraftCoder

    CraftCoder Старожил Пользователь

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Код:
    if (event.getCursor.hasItemMeta){
    if (event.getCursot.getItemMeta.hasLore){
    //...
    }
    }
    
     
  8. Hilgert

    Hilgert Старожил Пользователь

    Баллы:
    123
    Skype:
    mixa2258
    Имя в Minecraft:
    Hilgert
    try{}catch(NullPointerException ex){}
     
  9. Автор темы
    Korvinius

    Korvinius Активный участник Пользователь

    Баллы:
    88
    Спасибо, помогло, сделал такой вариант:
    Код:
            if (event.getAction() != null) {
                itemID = event.getCursor().getType();
                if (event.getCursor().hasItemMeta()) {
                    if (event.getCursor().getItemMeta().hasDisplayName()) {
                        itemName = event.getCursor().getItemMeta().getDisplayName().toString();
                    } else itemName = null;
    
                    if (event.getCursor().getItemMeta().hasLore()) {
                        itemLore = event.getCursor().getItemMeta().getLore().toString();
                    } else itemLore = null;
                }
                getLogger().info("item.Type = " + itemID + " @ " + itemName + " @ " + itemLore);
            }
    
                itemID = null;
                itemName = null;
                itemLore = null;
    
    если такой код, то в консоль выводятся данные 2-х кликов, первого (пустого) и второго, с предметом в курсоре (в данном случае кликаю по стреле):
    а если первую строку в коде сделать такого типа:
    Код:
        if (event.getCursor().getType() != Material.AIR) {
    то в консоль выводит данные только второго клика, когда предмет из курсора ложится в ячейку инвентаря (сейчас клик по специально созданному предмету):
    [DOUBLEPOST=1414187649,1414186802][/DOUBLEPOST]Еще очень бы хотелось совета/помощи по первому вопросу:

    Мне нужны советы или ссылки на разные мануалы/туториалы по Configuration API.

    файл конфигурации (config.yml) будет иметь примерно такую структуру:

    Код:
    [SIZE=6]JAML[/SIZE][/B]]
    item:
      ID: DIAMOND_SWORD
      Name: Крутой меч
      Lore: меч принадлежащий герою
    item:
      ID: STONE
      Name: null
      Lore: null
    item:
      ID: EMERALD
      Name: Фамильные драгоценности
      Lore: null
    #и так дальше
    
    Генерировать автоматически этот config.yml или добавлять новые item'ы командой я не планирую, сейчас, все будет добавляться вручную.

    Мне нужно, чтобы плагин считывал этот конфиг и сравнивал переменные с данными конфига:
    itemID+itemName+itemLore (= ≠) ID+Name+Lore
    если находил совпадение по всем пунктам, тогда условие true.
     
    Последнее редактирование: 25 окт 2014
  10. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
  11. Автор темы
    Korvinius

    Korvinius Активный участник Пользователь

    Баллы:
    88
    спасибо, к сожалению это я уже видел ((( здесь описано как создать файл конфигурации, как перезагрузить его, как загрузить из плагина конфиг по умолчанию. как передать в него данные, как сохранить эти данные.
    Но, здесь я не нашел информации как считывать данные из конфига в переменные, особенно, если похожих данных много и их нужно считывать и проверять циклично, по блокам :
    Код:
    [SIZE=6]JAML[/SIZE][/B]]
    item:
      ID: DIAMOND_SWORD
      Name: Крутой меч
      Lore: меч принадлежащий герою
    item:
      ID: STONE
      Name: null
      Lore: null
    item:
      ID: EMERALD
      Name: Фамильные драгоценности
      Lore: null
    #и так дальше
    
     
  12. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
     
  13. Hilgert

    Hilgert Старожил Пользователь

    Баллы:
    123
    Skype:
    mixa2258
    Имя в Minecraft:
    Hilgert
    Код:
    config.set("item1", e.getCursor());
    ItemStack item = config.getItemStack("item1");
    Самый по моему оптимальный вариант
     
  14. Автор темы
    Korvinius

    Korvinius Активный участник Пользователь

    Баллы:
    88
    Спасибо, буду экспериментировать, осталось придумать как запустить цикличную проверку конфига.[DOUBLEPOST=1414312847,1414257473][/DOUBLEPOST]
    мне кажется или HashMap это именно то, что в данном случае мне нужно? Где то можно подсмотреть код для конфига с использованием HashMap?
     
  15. CraftCoder

    CraftCoder Старожил Пользователь

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Кладем hashMap в конфиг:
    Код:
    config.
    createSection(String path, Map< String, Object > map)
    
    Считывание из конфига:
    Код:
    Configuration section = config.
    .getConfigurationSection("path.to.map");
    for (String key : section.getKeys(false)){
       map.put(key, section.getObject(key));
    }
    
     
  16. Автор темы
    Korvinius

    Korvinius Активный участник Пользователь

    Баллы:
    88
    Спасибо, это я видел здесь: http://wiki.bukkit.org/Configuration_API_Reference
    Хотелось бы увидеть какую то практическую реализацию, с образцом конфига который обрабатывается таким образом.
     
  17. ptnk

    ptnk Старожил Пользователь

    Баллы:
    173
    Берёшь плагины и декомпилируешь.
     
  18. Автор темы
    Korvinius

    Korvinius Активный участник Пользователь

    Баллы:
    88
    вообще то я просил совета у кого то опытного, кто умеет писать плагины, а не у:
    [​IMG]
     
  19. ptnk

    ptnk Старожил Пользователь

    Баллы:
    173
    http://joxi.ru/8AnX79xFq1JbmO
    http://ptnkjke.net/plugins

    Как бы количество различных заказов на тематику "плагины" у меня давно перевалило за пару сотен.
    Самые интересные игровые режимы собственного производства: PaintballWarface (luckyverse), Annihilation(luckyverse), SurvivalGame(luckyverse), SuperCraftBrothers(borodacraft).

    Я понимаю, что у тебя проблемы с поиском информации, но никогда не поздо перестать быть дурачком и искать её лучше и правильнее.
     
    Последнее редактирование: 26 окт 2014
  20. Автор темы
    Korvinius

    Korvinius Активный участник Пользователь

    Баллы:
    88
    Ну, раз так, то я прошу прощения, меня ввело в заблуждение отсутствие тем с плагинами здесь. Хотя Ваша просвещенность меня ни на шаг не приблизила к решению проблемы, поэтому, если не желаете помогать, прошу не флудить.[DOUBLEPOST=1414328729,1414322516][/DOUBLEPOST]Так, я понял как мне это реализовать, только прошу еще одну подсказку, какое условие нужно включить в оператор "for ()", чтобы он прерывался когда достигнут конец конфига?
     
  21. Hilgert

    Hilgert Старожил Пользователь

    Баллы:
    123
    Skype:
    mixa2258
    Имя в Minecraft:
    Hilgert
    for(Тип_Переменной название_переменной : массив){
    название_переменной.blabla();
    }
     

Поделиться этой страницей