Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

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:

Спасибо за то, что дочитали до конца, еще больше буду благодарен за дельный совет и ли ссылку.
 
Последнее редактирование:
Id = I.gettypeid().
Name = I.getitemmeta().getdisplayname()
Lore = I.getitemmeta().getlore().tostring()
 
Id = I.gettypeid().
Name = I.getitemmeta().getdisplayname()
Lore = I.getitemmeta().getlore().tostring()

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


Java:
        Material itemID;
        String itemName;
        String itemLore;

        itemID = event.getCursor().getType();
        itemName = event.getCursor().getItemMeta().getDisplayName().toString();
        itemLore = event.getCursor().getItemMeta().getLore().toString();


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

Java:
        itemName = event.getCursor().getItemMeta().getDisplayName().toString();

я новичок в программировании в целом и в Java в частности, но попробовал такую конструкцию:

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;

ничего не изменилось, ругается на строку
Java:
        if (event.getCursor().getItemMeta().hasDisplayName())

Как эту проверку правильно организовать?
 
Последнее редактирование:
if(event.getCursor().getItemMeta().getDisplayName() != null && event.getCursor().getItemMeta().getLore() != null){
//...
}
 
if(event.getCursor().getItemMeta().getDisplayName() != null && event.getCursor().getItemMeta().getLore() != null){
//...
}
к сожалению это тоже приводит к ошибке:
sed by: java.lang.NullPointerException
но я понял, что эта ошибка появляется тогда, когда ПКМ или ЛКМ пустым курсором по предмету в инвентаре (то есть когда берется итем в курсор) а когда предмет из курсора ложится в любую ячейку инвентаря, то в переменную передаются все данные предмета без проблем. то есть нужно как то определить клик пустым курсором и отделить его. Пробовал такой вариант:
Java:
        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;
      
        }
не помогает, как еще можно это определить?
 
Последнее редактирование:
к сожалению это тоже приводит к ошибке:

но я понял, что эта ошибка появляется тогда, когда ПКМ или ЛКМ пустым курсором по предмету в инвентаре (то есть когда берется итем в курсор) а когда предмет из курсора ложится в любую ячейку инвентаря, то в переменную передаются все данные предмета без проблем. то есть нужно как то определить клик пустым курсором и отделить его. Пробовал такой вариант:
Код:
        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;
      
        }
не помогает, как еще можно это определить?
Код:
if (event.getCursor.hasItemMeta){
if (event.getCursot.getItemMeta.hasLore){
//...
}
}
 
Java:
if (event.getCursor.hasItemMeta){
if (event.getCursot.getItemMeta.hasLore){
//...
}
}
Спасибо, помогло, сделал такой вариант:
Java:
        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-х кликов, первого (пустого) и второго, с предметом в курсоре (в данном случае кликаю по стреле):
[01:18:52 INFO]: [CheckItemCreative] item.Type = AIR @ null @ null
[01:18:55 INFO]: [CheckItemCreative] item.Type = ARROW @ null @ null
а если первую строку в коде сделать такого типа:
Java:
    if (event.getCursor().getType() != Material.AIR) {
то в консоль выводит данные только второго клика, когда предмет из курсора ложится в ячейку инвентаря (сейчас клик по специально созданному предмету):
[01:18:37 INFO]: [CheckItemCreative] item.Type = BLAZE_ROD @ §cКарающий Жезл @ [Индивидуальный артефакт (Магический)]

Еще очень бы хотелось совета/помощи по первому вопросу:

Мне нужны советы или ссылки на разные мануалы/туториалы по 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.
 
Последнее редактирование:
спасибо, к сожалению это я уже видел ((( здесь описано как создать файл конфигурации, как перезагрузить его, как загрузить из плагина конфиг по умолчанию. как передать в него данные, как сохранить эти данные.
Но, здесь я не нашел информации как считывать данные из конфига в переменные, особенно, если похожих данных много и их нужно считывать и проверять циклично, по блокам :
Код:
[SIZE=6]JAML[/SIZE][/B]]
item:
  ID: DIAMOND_SWORD
  Name: Крутой меч
  Lore: меч принадлежащий герою
item:
  ID: STONE
  Name: null
  Lore: null
item:
  ID: EMERALD
  Name: Фамильные драгоценности
  Lore: null
#и так дальше
 
Но, здесь я не нашел информации как считывать данные из конфига в переменные

Getting Values[edit]
Reading values from the configuration involves invoking one of the many getter methods. A complete list of getters can be found here. Every getter method takes a configuration path detailed above. Some of the commonly used getter methods are as follows

  • getBoolean(String)
  • getInt(String)
  • getString(String)
  • getList(String)
  • getStringList(String)
 
спасибо, к сожалению это я уже видел ((( здесь описано как создать файл конфигурации, как перезагрузить его, как загрузить из плагина конфиг по умолчанию. как передать в него данные, как сохранить эти данные.
Но, здесь я не нашел информации как считывать данные из конфига в переменные, особенно, если похожих данных много и их нужно считывать и проверять циклично, по блокам :
Код:
[SIZE=6]JAML[/SIZE][/B]]
item:
  ID: DIAMOND_SWORD
  Name: Крутой меч
  Lore: меч принадлежащий герою
item:
  ID: STONE
  Name: null
  Lore: null
item:
  ID: EMERALD
  Name: Фамильные драгоценности
  Lore: null
#и так дальше
JavaScript:
config.set("item1", e.getCursor());
ItemStack item = config.getItemStack("item1");
Самый по моему оптимальный вариант
 
JavaScript:
config.set("item1", e.getCursor());
ItemStack item = config.getItemStack("item1");
Самый по моему оптимальный вариант
Спасибо, буду экспериментировать, осталось придумать как запустить цикличную проверку конфига.
осталось придумать как запустить цикличную проверку конфига.
мне кажется или HashMap это именно то, что в данном случае мне нужно? Где то можно подсмотреть код для конфига с использованием HashMap?
 
Спасибо, буду экспериментировать, осталось придумать как запустить цикличную проверку конфига.

мне кажется или HashMap это именно то, что в данном случае мне нужно? Где то можно подсмотреть код для конфига с использованием HashMap?
Кладем 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));
}
 
Кладем 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));
}
Спасибо, это я видел здесь: http://wiki.bukkit.org/Configuration_API_Reference
Хотелось бы увидеть какую то практическую реализацию, с образцом конфига который обрабатывается таким образом.
 
Берёшь плагины и декомпилируешь.
вообще то я просил совета у кого то опытного, кто умеет писать плагины, а не у:
.png
 

http://joxi.ru/8AnX79xFq1JbmO
http://ptnkjke.net/plugins

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

Я понимаю, что у тебя проблемы с поиском информации, но никогда не поздо перестать быть дурачком и искать её лучше и правильнее.
 
Последнее редактирование:
http://joxi.ru/8AnX79xFq1JbmO
http://ptnkjke.net/plugins

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

Я понимаю, что у тебя проблемы с поиском информации, но никогда не поздо перестать быть дурачком и искать её лучше и правильнее.
Ну, раз так, то я прошу прощения, меня ввело в заблуждение отсутствие тем с плагинами здесь. Хотя Ваша просвещенность меня ни на шаг не приблизила к решению проблемы, поэтому, если не желаете помогать, прошу не флудить.
Так, я понял как мне это реализовать, только прошу еще одну подсказку, какое условие нужно включить в оператор "for ()", чтобы он прерывался когда достигнут конец конфига?
 
for(Тип_Переменной название_переменной : массив){
название_переменной.blabla();
}
 

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

Назад
Верх