1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Туториал Работа с YAML. Храним настройки в файле

Тема в разделе "Руководства, инструкции, утилиты", создана пользователем DmitriyMX, 10 июл 2012.

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

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

    Баллы:
    153
    Skype:
    dmn550
    И сново здрасте. Я продолжаю обновлять статьи и сегодня коснёмся темы конфигов плагина. Здесь, как и в системе эвентов произошли некоторые изменения. Но всё по порядку. Начнем, пожалуй, с краткого экскурса по YAML-формату.

    Коротко о YAML формате

    По своей сути, YAML – это обычный текстовый файл, с древовидной разметкой для хранения данных. Вложенность веток “регулируется” некоторым количеством пробелов перед наименованием параметра или данными(если они не умещаются в одну строку).

    Что бы стало понятнее, разберем следующий пример:
    Код:
    # Это комментарий. Он вообще игнорируется и нужен лишь человеку, а не машине))
    Item-1:
      Sub-Item-1: "обычная строка/текст"
      Sub-Item-2: #массив
          - array-item-1
          - array-item-2
    Item-2:
      Sub-Item-1:
          Sub-sub-Item-1: false
      Sub-Item-2: 5678
    Item-3:
      Sub-Item-1: true
      Sub-Item-2: |
          Много
                строчный
          текст
      Sub-Item-3: [array-item-1, array-item-2, array-item-3] #массив
    Item-4: Hello world
    Item-5: Free public
    Как можно заметить, в этом примере приведены следующие типы данных: строка(String), массив(Array), число(Integer) и логическое значение(Boolean). Этого вполне достаточно для любого плагина. Если интересует больше, то читаем ссылки: [1], [2], [3]. Каждый новый подпункт должен иметь перед собой хотя бы на 1 пробел больше, чем у предыдущего пункта(принято ставить 2-4 пробела).

    Тут нет ничего сложного. Разобраться сможет даже пятиклассник. Дополнительно поясню только массивы и многострочные тексты. Массивы, как видно, можно записывать двумя способами: по пунктам или через запятую. Разницы никакой нет. Вы сами выбираете, какой вариант удобнее. Многострочный текст объявляется вертикальной чертой “|” и записывается как новая ветка, с пробелами в начале. Как пробелы будут учитываться, увидите на примере.

    Чтение настроек

    Приступим к коду. Делаем заготовочку и в метод onEnable() записываем такое:
    Код:
    FileConfiguration conf = getConfig();
    _log.info("Item-4: " + conf.getString("Item-4"));
    _log.info("ITEM-5: " + conf.getString("ITEM-5"));
    _log.info("Item-9: " + conf.getString("Item-9", "no data =("));
    _log.info("Item-3/Sub-Item-2: " + conf.getString("Item-3.Sub-Item-2"));
    [​IMG]

    В первой строчке мы читаем файл настроек, который находится в <имя_папки_плагина>\config.yml, а дальше читаем от туда значения параметров. Обратите внимание, что хоть параметр Item-5 существует, при неверном учете регистра, значение найдено не будет, т.к. для YAML параметры “item” и “ItEm” – разные вещи. Именно по этому принято все параметры в Bukkit писать в нижнем регистре.

    Если параметр не был найден, то возвращается пустое значение(null). В таких случаях можно задать значение по-умолчанию, что в коде показано на примере Item-9.

    Всё конечно хорошо, но что если нам потребуется прочесть конфиги не из config.yml, а из другого файла? Шаманствовать много не придется, достаточно в нашем коде первую строчку заменить на это:
    Код:
    FileConfiguration conf = YamlConfiguration.loadConfiguration(new File(getDataFolder(), "customConfig.yml"));
    Исходники в этот раз приводить не стану, т.к. весь код умещается в 25 строчек:
    Код:
    package ru.dmitriymx.bukkit.tutorial;
     
    import java.io.File;
    import java.util.logging.Logger;
     
    import org.bukkit.configuration.file.FileConfiguration;
    import org.bukkit.configuration.file.YamlConfiguration;
    import org.bukkit.event.Listener;
    import org.bukkit.plugin.java.JavaPlugin;
     
    public class DmxConfigReader extends JavaPlugin implements Listener {
      public static final Logger _log  = Logger.getLogger("Minecraft");
     
      @Override
      public void onEnable() {
          // FileConfiguration conf = YamlConfiguration.loadConfiguration(new File(getDataFolder(), "customConfig.yml"));
          FileConfiguration conf = getConfig();
          _log.info("Item-4: " + conf.getString("Item-4"));
          _log.info("ITEM-5: " + conf.getString("ITEM-5"));
          _log.info("Item-9: " + conf.getString("Item-9", "no data =("));
          _log.info("Item-3/Sub-Item-2: " + conf.getString("Item-3.Sub-Item-2"));       
      }
     
    }

    Ссылки

    Следующая статья:
    Документация:
    Полезное:
    ________________________________________​
     
    slavik123123123, BleaZzZ, FirePoint и 2 другим нравится это.
  2. second_vynder

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

    Баллы:
    153
    Skype:
    my.nik.vynder
    Я некропостер :D.

    Перенес бы ту статью на RB :(
     
    RVXman нравится это.
  3. Автор темы
    DmitriyMX

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

    Баллы:
    153
    Skype:
    dmn550
    какую "ту"?
     
    ПриветОтЛайки нравится это.
  4. almohax

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

    Баллы:
    68
    Имя в Minecraft:
    almohax
    а если файла нет то что будет ошибка на сервере
     
  5. saharin94

    saharin94 Старожил Пользователь Заблокирован

    Баллы:
    173
    Тогда вылетит синий экран.
     
  6. almohax

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

    Баллы:
    68
    Имя в Minecraft:
    almohax
    я новичок можешь проконсультировать чуток
    если я буду писать так
    try {
    FileConfiguration conf = YamlConfiguration.loadConfiguration(new File(getDataFolder(), "customConfig.yml"));
    }
    ошибка не выскочит

    и еще getDataFolder() - что это такое (мне просто совсем другую папку указать надо)

    и еще conf.getString("Item-4") - что это значит (это значение в "Item-4" )

    а если в yml типо такое DeathTime:0.0

    я получу значения 0.0
    и для чего publicstaticfinal Logger _log = Logger.getLogger("Minecraft");
     
  7. Автор темы
    DmitriyMX

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

    Баллы:
    153
    Skype:
    dmn550
    не обязательно.

    Первым делом научись пользоваться тегами CODE

    getDataFolder() - возвращает объект File, который ссылается на папку плагина (пример: C:\MCServer\plugins\AuthMe\)

    conf.getString("Item-4") - возвращает строковое значение, которое хранится в параметре Item-4. Для DeathTime:0.0 вы получите значение "0.0" типа String. Если нужно получить значение типа Double, то пишем примерно так: conf.getDouble("DeathTime")

    public static final Logger _log = Logger.getLogger("Minecraft");
    Ныне устаревшая конструкция. Современная её реализация: Bukkit.getLogger()
    Предоставляет собой инструмент для вывода сообщений прямо в консоль сервера.
    Пример: Bukkit.getLogger().info("Hello, RuBukkit!");
     
    Последнее редактирование: 29 окт 2014
  8. almohax

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

    Баллы:
    68
    Имя в Minecraft:
    almohax
    спасибо ну вот почемуто при значение в файле DeathTime:0.0
    try {
    FileConfiguration conf = YamlConfiguration.loadConfiguration("customConfig.yml"));

    conf.getString("DeathTime") = null а не 0.0
    }


    я так то к чужому конфигу присасываюсь может чето не так делаю
     
  9. Автор темы
    DmitriyMX

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

    Баллы:
    153
    Skype:
    dmn550
    А вы уверены, что точно файл подхватили?
    Код:
    File configFile = new File(getDataFolder(), "..\AuthMe\config.yml"); // не уверен в корректности данной конструкции, но мне сейчас лень вспоминать правильную
    
    if (configFile.exists()) {
        Bukkit.getLogger().info("Ура! У меня получилось!");
    } else {
      Bukkit.getLogger().info("Блин, опять на РуБукките строчить вопросы...");
    }
    
    FileConfiguration conf = YamlConfiguration.loadConfiguration(configFile); 
     
  10. almohax

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

    Баллы:
    68
    Имя в Minecraft:
    almohax
    попробую вечером , а так я по другому сделал но хочу чтоб было правильно , я обычным Scaner прочел файл и взял от туда эту строчку , ну спасибо я еще поэксперементирую.
    еще вопросики
    1)а как сделать типо таймер, чтобы допустим раз в час делать какое то действие
    2) как заспавмить моба в определенных координатах
    3) как узнать сколько игроков на сервере

    4) очень важное . ты знаешь какой то плагин типо если игрок не играет больше 14 дней то удаляется все его блоки и приваты
     
  11. Автор темы
    DmitriyMX

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

    Баллы:
    153
    Skype:
    dmn550
    Эти вопросы уже в другую тему задавай ^_^
     
  12. alexandrage

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

    Баллы:
    173
    yml уже прошлий век. Юзайте json, работать с ним намного легче.
     
  13. Автор темы
    DmitriyMX

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

    Баллы:
    153
    Skype:
    dmn550
    Для кого прошлый, а для кого еще практика (Bukkit всё еще на yml)
     
  14. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Разницы нету, при желании можно хранить настройки в plugins/Плагин/config.json :)
     
  15. almohax

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

    Баллы:
    68
    Имя в Minecraft:
    almohax
    а можно побольше про массивы
    кому интересно вот пример чтения id и методатыдаты из конфига YML в виде массива
    ----config.yml
    privat: true
    block:
    - 1, 0
    - 2, 1
    - 3, 0
    ---------------

    FileConfiguration scn = YamlConfiguration.loadConfiguration(new File("plugins/YmlTest/config.yml")) ;
    Boolean privat =scn.getBoolean("privat");
    if (privat){

    getLogger().info("yes block");
    List<String> blockList = new ArrayList();
    blockList = (List<String>) scn.getList("block");
    for (String i : blockList)
    {
    String[] segmente = i.split(Pattern.quote(", "));
    int blockID = Integer.parseInt(segmente[0]);
    int blockData = Integer.parseInt(segmente[1]);

    getLogger().info("Block config - "
    +Integer.toString(blockID)+":"
    +Integer.toString(blockData));
    }

    если просто массив числовых значений то так

    FileConfiguration scn = YamlConfiguration.loadConfiguration(new File("plugins/YmlTest/config.yml")) ;
    Boolean privat =scn.getBoolean("privat");
    if (privat){

    List<Integer> blockList = new ArrayList();
    blockList = (List<Integer>) scn.getIntegerList("block");
    for (Integer i : blockList)
    {
    getLogger().info("Block config - "+Integer.toString(i));
    }
    }
     
  16. almohax

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

    Баллы:
    68
    Имя в Minecraft:
    almohax
    ну тема то про
    Работа с YAML

    тема то про yaml , просто вдруг кому надо я дописал
     
  17. InterVi

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

    Баллы:
    173
    @DmitriyMX, вот конфиг лежит в jar, как его оттуда вытащить? У тебя был урок как делать из него поток и записывать в файл, а потом ты зачем-то превратил свой блог в клоаку. Гугл на все вопросы издевается, нашел только про распаковку jar как архива но это не совсем то. Выложи сюда те несколько строк кода.
     
  18. Автор темы
    DmitriyMX

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

    Баллы:
    153
    Skype:
    dmn550
    1. как же там говорят.... Ах да: не нравится - не ходите. Хотите чтобы там были темы, которые интересны вам? См. п.2.
    2. Вот здесь я уже предложил людям "голосовать" за продолжение тематики "уроки по ведру". И я вижу там "лес рук". Итог: это никому уже не интересно.
    3. Подождите 10 минут, потом переходите по этой ссылке.

    как именно? заставлю его обрабатывать запросы к моему блогу как надо
     
  19. InterVi

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

    Баллы:
    173
    Вот! Спасибо что восстановил статью.
     
  20. Elereman

    Elereman Ньюби Пользователь

    Баллы:
    1
    Имя в Minecraft:
    MisterHitlar
    Помогите! Надо такой модуль запихать в плагин что бы он записывал в файл координаты и ник того кто ввел команду!
     

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