Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов 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. Хостинг MineCraft
    <
  3. second_vynder

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

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

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

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

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

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

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

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

    Баллы:
    173
    Skype:
    RikkiLooh
    Имя в Minecraft:
    RubukkitDniwe
    Тогда вылетит синий экран.
     
  7. 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[DOUBLEPOST=1414499315,1414498933][/DOUBLEPOST]и для чего publicstaticfinal Logger _log = Logger.getLogger("Minecraft");
     
  8. Автор темы
    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
  9. almohax

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

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

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


    я так то к чужому конфигу присасываюсь может чето не так делаю
     
  10. Автор темы
    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); 
     
  11. almohax

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

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

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

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

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

    alexandrage Администратор

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

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

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

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

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

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

    Баллы:
    68
    Имя в Minecraft:
    almohax
    а можно побольше про массивы[DOUBLEPOST=1417448039,1414867225][/DOUBLEPOST]кому интересно вот пример чтения 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));
    }
    }
     
  17. almohax

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

    Баллы:
    68
    Имя в Minecraft:
    almohax
    ну тема то про
    Работа с YAML
    [DOUBLEPOST=1417452048,1417451172][/DOUBLEPOST]тема то про yaml , просто вдруг кому надо я дописал
     
  18. Автор темы
    DmitriyMX

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

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

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

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

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

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

    Баллы:
    68
    Имя в Minecraft:
    almohax
    Парень используй лучше SQLite для такого. кароче вот пример разберешься там могут только переменные не так в биты но вообще все элементарно
     

    Вложения:

    • sql.txt
      Размер файла:
      2,7 КБ
      Просмотров:
      9
  21. Автор темы
    DmitriyMX

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

    Баллы:
    153
    Skype:
    dmn550
    Либо бери готовое, либо изучай сурсы
    https://bitbucket.org/DmitriyMX/rulog
     

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