- Баллы
- 153
В прошлом уроке мы научились делать плагин, который меняет цвет ника в чате. Это, конечно, хорошо, но что если мы захотим выделить привилегированных пользователей(випы, опы, админы…)? Можно было бы прописать ники прямо в плагине и жить припеваючи, но что если випы у нас меняются каждый день? Постоянно перекомпилировать плагин, заливать на сервер, перезапускать его… Нет, это идиотизм. Мы умные люди и будем поступать по умному. Пусть у нашего плагина будет файл, где будут указаны не только ники особых персон, но и формат вывода их сообщений. Итак, в этом уроке мы будем учится читать данные из yml-файла.
Спецификация YAML формата
Думаю, многие из вас держали свои серверы и, когда настраивали плагины, встречали файлы вида config.yml. По сути, это обычный текстовый файл, но с древовидным синтаксисом: каждая новая ветка – это новая строка с некоторым количеством пробелов в начале. Не понятно? Хорошо, поясню на примере.
Если всё это древо представить в виде системы каталогов (папок), то будет намного понятнее: есть папка “Пункт 1”, которая содержит папки “Подпункт 1” и “Подпункт 2”, и далее по аналогии. Обращаю ваше внимание, что вложенность определяется числом пробелов перед названием пункта. К примеру:
Они имеют следующую иерархию:
Как видно из первого примера, yaml умеет хранить:
Еще один важный момент. Для построения иерархии используются только пробелы, никаких табуляций! Это ошибка 90% новичков, которые редактируют настройки, а потом не могут понять, почему ничего не работает. Вообще, лучше совсем не использовать табуляцию в yml-файлах – все равно в майнкрафте она не отображается.
Дорабатываем плагин
Со спецификацией закончили. Теперь перейдем непосредственно к коду. Пусть наш файл настроек будет такого вида:
Вернемся к нашему предыдущему плагину. В секцию объявления общих переменных(там, где мы объявляли mclog) добавим новую переменную:
В onEnable() напишем код загрузки файла:
Файл “config.yml” будет загружен из папки “plugins/Chat/”.
Затем, измените строку, где мы объявляли переменную-обработчик chatListener:
Переходим в класс DMXChatListener. Объявим 2 переменные:
Первая служит ссылкой на сам плагин, а вторая является списком пользователей, для которых должно применяться особое форматирование чата.
Теперь объявляем свою реализацию конструктора:
И приведем onPlayerChat() к следующему виду:
В первой строке мы берем имя игрока и приводим его к нижнему регистру. Это нужно для того, чтобы несмотря на то, как написан ник (DmitriyMX, Dmitriymx. dmitriyMX) форматирование применялось к нужному человеку. Второй строкой мы задаем формат чата по умолчанию. Далее, в конструкции if(…), мы ищем совпадения в списке с избранными пользователями и, если есть совпадение, записываем новый формат чата. Затем, функцией ConvertFormat() приводим переменную в нужный вид и устанавливаем новоиспеченный формат в системе.
Функция ConvertFormat() должна быть написана в DMXChatListener и выглядеть следующим образом:
В следующем уроке, мы еще доработаем наш плагин, добавив в него реакцию на команды.
Спецификация YAML формата
Думаю, многие из вас держали свои серверы и, когда настраивали плагины, встречали файлы вида config.yml. По сути, это обычный текстовый файл, но с древовидным синтаксисом: каждая новая ветка – это новая строка с некоторым количеством пробелов в начале. Не понятно? Хорошо, поясню на примере.
Код:
Пункт 1:
Подпункт 1: “обычная строка/текст”
Подпункт 2(массив):
- пункт 1
- пункт 2
Пункт 2:
Подпункт 1: 5978
Под-подпункт 1: false
Пункт 3: “тоже текст”
Подпункт 1: true
Подпункт 2: |
Много
строчный
текст
Подпункт 3(массив): [1, 2, 3]
#Комментарий, который игнорируется
Код:
Пункт1
Пункт2
Пункт3
Пункт4
Пункт5
Пункт6
- Пункт1 содержит Пункт2
- Пункт2 содержит Пункт3 и Пункт4
- Пункт5 содержит Пункт6
Как видно из первого примера, yaml умеет хранить:
- однострочный текст
- многострочный текст
- цифры
- массивы (2 вида записи)
- логические значения true и false
Еще один важный момент. Для построения иерархии используются только пробелы, никаких табуляций! Это ошибка 90% новичков, которые редактируют настройки, а потом не могут понять, почему ничего не работает. Вообще, лучше совсем не использовать табуляцию в yml-файлах – все равно в майнкрафте она не отображается.
Дорабатываем плагин
Со спецификацией закончили. Теперь перейдем непосредственно к коду. Пусть наш файл настроек будет такого вида:
Код:
dmitriymx: “#0[#aadmin#0]#f<#b+name#f>: ”
alex: “<#4+name#f>: ”
Код:
public YamlConfiguration config;
Код:
config = LoadConfig(getDataFolder()+File.separator+"config.yml");
Затем, измените строку, где мы объявляли переменную-обработчик chatListener:
Код:
private DMXChatListener chatListener = new DMXChatListener(this);
Код:
private DMXChat plugin;
private Set<String> userList;
Теперь объявляем свою реализацию конструктора:
Код:
public DMXChatListener(DMXChat plg){
this.plugin = plg;
userList = plg.config.getKeys(false);
}
Код:
public void onPlayerChat(PlayerChatEvent event){
String playerName = event.getPlayer().getName().toLowerCase();
String thisFormat = “<#b+name#f>: +message”;
if(userList.containts(playerName)){
thisFormat = plugin.config.getString(playerName) + “+message”;
}
ConvertFormat(thisFormat);
event.setFormat(thisFormat);
}
Функция ConvertFormat() должна быть написана в DMXChatListener и выглядеть следующим образом:
Код:
private void ConvertFormat(String format){
//заменяем псевдо-переменные на те, что воспринимает bukkit
format = format.replace(“+name”, “%1$s”).replace(“+message”, “%2$s”)
//заменим цветовые коды на коды, понятные bukkit’у
format = format.replace("#0", ""+ChatColor.BLACK).replace("#1", ""+ChatColor.DARK_BLUE).replace("#2", ""+ChatColor.DARK_GREEN).replace("#3", ""+ChatColor.DARK_AQUA).replace("#4", ""+ChatColor.DARK_RED).replace("#5", ""+ChatColor.DARK_PURPLE).replace("#6", ""+ChatColor.GOLD).replace("#7", ""+ChatColor.GRAY).replace("#8", ""+ChatColor.DARK_GRAY).replace("#9", ""+ChatColor.BLUE).replace("#a", ""+ChatColor.GREEN).replace("#b", ""+ChatColor.AQUA).replace("#c", ""+ChatColor.RED).replace("#d", ""+ChatColor.LIGHT_PURPLE).replace("#e", ""+ChatColor.YELLOW).replace("#f", ""+ChatColor.WHITE);
//Уважаемые программисты на Java. Если вы знаете как можно упростить или оптимизировать эту кошмарную функцию, напишите в комментариях. Очень вас прошу.
return;
}
_____________________________
источник: dmitriymx.ru: Уроки по Bukkit