ConfigSection или многоэтажные конфиги

Discussion in 'Разработка плагинов' started by fromgate, 27/4/16.

  1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.
Dismiss Notice
We welcome you on our site. This site is devoted to the Nukkit project and all that is connected with him. Here you can communicate, download plugins, also many other things get acquainted! Register the account right now :3
  1. fromgate

    fromgate Administrator

    Messages:
    664
    Likes Received:
    186
    Сегодня я сделал с классом конфиг в Nukkit'е то, что давно хотел.

    Во-первых, был создан отдельный класс ConfigSection - он основа на LinkedHashMap (раньше весь конфиг был построен именно на нём), который является основой для построения всего конфигуратора.

    Во-вторых, в Config были добавлены конструкторы и методы, позволяющие использовать его без привязки к конкретному файлу. Раньше, чтобы обращаться к конфигурации сохранённой в виде ресурса в jar-файл, приходилось всё равно использовать файл, который создавался автоматические вне зависимости от того нужен он Вам или нет.

    Ну и важно: обеспечена полная совместимость с предыдущей версией классов Config и SimpleConfig. Т.е. Ваши плагины продолжат работу без изменений.

    Ну а главное для чего это делалось — это значительное упрощение работы с конфигами, которые не имеют однозначно определяемого набора ключей (к примеру, в качестве ключа выступает имя игрока или имя региона и т.п.).

    Допустим, что у Вас в config.yml хранятся данные вида:

    Code:
    players:
    fromgate:
    mana: 100
    bob:
    mana: 10
    john:
    mana: 30
    Т.е. элементом конфигурации players является секция с неопределённым набором ключей - "players.<имяИгрока>.mana".
    Когда имя игрока известно - проблем получить значение не возникнет. А если нужно просто получить список всех значений?

    Вот варианты:
    Code:
     public void readPlayersMana(){
    ConfigSection section = this.getConfig().getSections("players");
    
    [pre][code]    //Имена всех игроков можно будет получить так:
        Set&lt;String&gt; names = section.getKeys(false); // имена всех игроков
    
        // Можно теперь использовать их, чтобы перебирать в цикле.
        names.forEach(player -&gt;{
            int mana = ((ConfigSection) section.get(player)).getInt("mana");
            this.getLogger().info(player+"'s mana is "+mana);
        });
    
        // А можно поступить ещё проще
    
        section.entrySet().forEach(entry -&gt;{
            int mana = ((ConfigSection) entry.getValue()).getInt("mana");
            this.getLogger().info(entry.getKey()+"'s mana is "+mana);
        });
    }
    [/code][/pre]
    Собственно, пример говорит сам за себя.
     
    Tee7even and M4Gn1T like this.

Share This Page