Лёгкая и удобная утилитная библиотека для создания современных плагинов под Paper / Spigot
Установка • Возможности • Примеры • Лицензия
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.github.g4vrk</groupId>
<artifactId>FunctionalLib</artifactId>
<version>ПОСЛЕДНЯЯ_ВЕРСИЯ</version>
<scope>provided</scope>
</dependency>
</dependencies>plugin.yml:
depend: [FunctionalLib]- 🎨 Гибкое форматирование текста
(TextFormatter)— MiniMessage / Legacy / Mixed - 📋 Красивые цветные логи с поддержкой Adventure Component (PluginLogger)
- 🛍 Мощный билдер предметов + загрузка из конфига (ItemBuilder)
- 🗄 Простое подключение к MySQL / SQLite с пулом соединений
- ⚙ Удобное управление несколькими yaml-конфигами (YamlConfigManager)
- 🎬 Система действий из конфига (ActionExecutor) — message, title, sound, console, actionbar и др.
- 🖥 Умные команды с субкомандами, требованиями, асинхронностью (SmartCommand)
Форматировка текста:
publicclassExample {
privateTextFormattertextFormatter = TextFormatter.builder()
.cache(true) // кешировать ли строки или нет?
.type(TextFormatType.MIXED) //Форматы: MIXED, MINI_MESSAGE, LEGACY
.build();
publicvoidexample(Stringtext) {
// форматирует по выбранному формату, возвращает ComponenttextFormatter.format(text); // форматирует по выбранному формату + переводит в String с форматами legacytextFormatter.legacy(text); // полностью убирает все форматирование текстаtextFormatter.plain(text); }
}Логирование:
publicclassExample {
// поддерживает цветное логирование с помощью Component privatePluginLoggerlogger = PluginLoggerFactory.getLogger("<название>");
publicvoidexample() {
// пример логирования с цветамиlogger.info(Component.text("Логирование зеленым!").color(NamedTextColor.GREEN));
// пример логирования обычной строки, есть поддержка {} как у slf4j Logger logger.info("пример обычного сообщения");
}
}Билдер предметов:
publicclassExample {
publicvoidexample() {
// ItemBuilder.fromConfiguration(ConfigurationSection);// возвращает предмет сделанный по отправленной секции// простой пример // Действий есть на много больше, я использовал их для примераnewItemBuilder("DIRT")
.customModelData(1)
.allFlags(true)
.glow(true)
.hideEnchantments(true)
.name("предмет")
.lore(List.of("описание предмета"))
.itemStack();
}
}Получение соединений с базами данных:
publicclassExample {
publicvoidexample() {
// создание конфигурации базы данных, используя ваши секцииDatabaseConfigconfig = DatabaseConfigLoader.load(yourConfigurationSection, yourSqliteFile);
// создание фабрики подключенийDatabaseConnectionFactoryconnectionFactory = switch (DatabaseType.valueOf(youDatabaseType)) {
caseMYSQL -> newMySQLConnectionFactory(config);
caseSQLITE -> newSQLiteConnectionFactory(config);
};
// создание сервиса для подключения в выбранную базу данныхDatabaseServicedatabaseService = newDatabaseService(connectionFactory);
try (Connectionconnection = databaseService.connect("yourPoolName")) {
// ваша логика с подключением!
} catch (SQLExceptionignored) {
// по хорошему нужно логировать любые ошибки
}
}
}Работа с конфигурациями:
publicclassYourPluginextendsJavaPlugin {
privateYamlConfigManagerconfigManager;
publicvoidexample() {
// в конструктор нужно передать JavaPluginconfigManager = newYamlConfigManager(this);
// получение конфига по имениConfigurationconfig = configManager.getConfig("main-config.yml");
// перезагрузка конфига по имениconfigManager.reload("main-config.yml");
// перезагрузка всех конфигурацийconfigManager.reloadAll();
}
}Работа с Actions:
publicclassYourPluginextendsJavaPlugin {
privateActionExecutoractionExecutor;
publicvoidexample() {
actionExecutor = newActionExecutor();
// регистрация действийactionExecutor.registerAction(newAction() {
@Overridepublicvoidexecute(ActionContextcontext, Stringargs) {
context.player().sendMessage("пример действия");
}
@OverridepublicStringgetActionKey() {
return"example";
}
});
actionExecutor.runActions(yourPlayer, List.of("[message] тест", "[actionbar] проверка"));
// стандартные действия:// [actionbar] сообщение// [message] сообщение// [close-menu]// [update-inventory]// [console] команда// [title] верхний_текст;нижний_текст(необязателен)// [sound] айди;громкость;высота
}
}Регистрация комманд:
publicclassExample {
publicvoidexample() {
// Билдер SmartCommandSmartCommandsmartAbstractCommand = SmartCommand.builder()
.name()
// Требования, можете создавать свои
.requirement(newCommandRequirement() {
@Overridepublicbooleantest(CommandSendersender, String[] args) {
returnsender.hasPermission("example.perm");
}
@OverridepublicvoidonFail(CommandSendersender, String[] args) {
sender.sendMessage("ты ахуел");
}
})
// алиасы
.alias("example")
// выполнять ли асинхронно
.runAsync(false)
// субкомманды
.argument(newSubCommand() {
@OverridepublicStringgetName() {
return"reload";
}
@OverridepublicList<String> getAliases() {
returnList.of("reboot");
}
@OverridepublicCollection<CommandRequirement> getRequirements() {
returnList.of(newCommandRequirement() {
@Overridepublicbooleantest(CommandSendersender, String[] args) {
returnsender.hasPermission("reload");
}
@OverridepublicvoidonFail(CommandSendersender, String[] args) {
sender.sendMessage("no perms");
}
});
}
@Overridepublicvoidexecute(CommandSendersender, String[] args) {
reloadLogic();
}
@OverridepublicList<String> tabComplete(CommandSendersender, String[] args) {
returnList.of();
}
});
}
}