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

Помогите Работа с кастомными конфигами

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

Статус темы:
Закрыта.
  1. Автор темы
    Alex555333222

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

    Баллы:
    66
    Всем привет друзья, такой вопрос создал кастомный конфиг, назвал например players.yml. В самом плагине внес туда информацию, не получается при создании этого файла выводить туда дэфолтные значения, которые в самом коде в файле написал. Так же появился вопрос, например файл был изменен в ручную пользователем:
    Файл player.yml
    Groups:
    __Players:
    __- lolka
    __- karat
    __Mobs:
    __- animal
    __- zombie

    Можно ли в коде получить значения Players and Mobs при, том что разработчик точно не знает как называются группы (то есть вместо Players, можно было написать Users или что то другое и чтобы все так же хорошо работало). Короче получить значения можно через точку, например "Groups.Players" - это понятно, но если не знает разработчик какие значения будут после точки, как их можно получить и загнать в какую то переменную. Если кто знает подскажите пожалуйста, желательно самым простым языком, заранее спасибо. (В место нижних подчеркиваний стоят должны стоять пробелы, для справки).
     
  2. alexandrage

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

    Баллы:
    173
    В цыкле выведи и все.
     
  3. Автор темы
    Alex555333222

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

    Баллы:
    66
    Я не понимаю как найти один параметр, а ты предлагаешь все вывести
     
  4. alexandrage

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

    Баллы:
    173
    Код:
        public static void regursion(ConfigurationSection cections, String start) {
            for (String cection : cections.getKeys(false)) {
                Object tmp = cections.get(cection);
                if (tmp instanceof MemorySection) {
                    regursion((ConfigurationSection) tmp, start + "." + cection);
                } else {
                    System.out.println((start + "." + cection + "." + tmp).substring(1));
                }
            }
        }
    
     
  5. Автор темы
    Alex555333222

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

    Баллы:
    66
    Все круто работает, спасибо большое, не совсем понятно как это конечно работает, но работает. И не совсем понятно зачем нужна работа со строкой substring(1).
     
  6. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Да просто код Г, вот и всё. Он тебе сделал рекурсивный вывод всех данных с неограниченным количеством вложений.

    Любой объект конфига, хранящий другие объекты, является ConfigurationSection.
    Секции можно вкладывать друг в друга неограниченное количество раз.

    При помощи section.getKeys(false) можно получить все вложенные ключи секции.
    false - получить ключи только 1-го уровня вложенности. Если нужно всё до самых глубоких глубин - можешь использовать true. Исходя из твоей задачи, у тебя лишь один уровень вложения, поэтому false.

    section.getConfigurationSection("Название") позволяет получить из указанной секции вложенную секцию с указанным названием (ключом).
    А section.getStringList("Название"), соответственно, вернёт список строк по указанному ключу.

    Ниже пример реализации конкретно твоей задачи.
    Заодно познаешь потенциал функционального апи - можно хоть в мапу собрать, хоть в консоль все вывести.

    PHP:
        public static void printListsToConsole(ConfigurationSection baseSectionString listsSectionName) {
            
    processLists(baseSectionlistsSectionName, (listNamelistLines) -> System.out.println(listName " > " listLines.toString()));
        }

        public static 
    Map<String, List<String>> loadListsToMap(ConfigurationSection baseSectionString listsSectionName) {
            
    Map<String, List<String>> result = new HashMap<>();
            
    processLists(baseSectionlistsSectionNameresult::put);
            return 
    result;
        }

        public static 
    void processLists(ConfigurationSection baseSectionString listsSectionNameBiConsumer<String, List<String>> processor) {
            if (
    listsSectionName != null)
                
    baseSection baseSection.getConfigurationSection(listsSectionName);
            
            if (
    baseSection == null)
                throw new 
    IllegalArgumentException("Lists section not found");
            
            for (
    String listName baseSection.getKeys(false)) {
                List<
    StringlistLines baseSection.getStringList(listName);
                
    processor.accept(listNamelistLines);
            }
        }
     
  7. alexandrage

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

    Баллы:
    173
    Код нормальный, это твои глаза Г. А код делает то что было задумано мною.
     
  8. Автор темы
    Alex555333222

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

    Баллы:
    66
    Спасибо, стало понятнее как с этим всем работать
     
  9. Автор темы
    Alex555333222

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

    Баллы:
    66
    А самое главное, как кастомный конфиг загрузить в папку плагина (при ее создании), не пустой, а наполненный так же как заполнен в коде плагина. Ну то есть:
    для config.yml - это getConfig().options().copyDefaults(true); saveDefaultConfig();
    а для например player.yml - это ???
     
  10. MemoryRAVE

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

    Баллы:
    66
    Имя в Minecraft:
    xR4V3
    Код:
    File playersFile = new File (plugin.getDataFolder(), "players.yml");
            FileConfiguration players = YamlConfiguration.loadConfiguration(playersFile);
            if(!playersFile.exists())
             {
             players.options().copyDefaults(true);
             }
     
    Последнее редактирование: 20 окт 2019
  11. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    plugin.saveResource("lang.yml", false);
    true перезапишет файл, если он уже существует
     
  12. Автор темы
    Alex555333222

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

    Баллы:
    66
    Спасибо, закрываю тему
     
Статус темы:
Закрыта.

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