Repository navigation
Core API
Эта страница описывает классы, с которых стоит начинать. Полный перечень публичных классов находится в каталоге API.
Класс Colors понимает несколько форматов:
| Формат | Пример |
|---|---|
| Legacy |
&aГотово, &lЖирный
|
| HEX с амперсандом | 7ff55Текст |
| HEX в скобках | {#55ff55}Текст |
| Mojang HEX | &x&5&5&f&f&5&5 |
| Градиент | {#ff5500>}Текст{#aa00ff<} |
package com.example.plugin;
import net.dehasher.hlib.Colors;
import net.kyori.adventure.text.Component;
public final class Messages {
public static Component ready() {
return Colors.setComponent("{#55ff55>}HLib готов{#00aaff<}");
}
}Основные методы:
-
Colors.set(String)возвращает строку с Minecraft-кодами§. -
Colors.setComponent(String)возвращает AdventureComponent. -
Colors.clear(Object)удаляет цвета и оформление. -
Colors.plain(Component)извлекает простой текст. -
Colors.cleanEquals*сравнивает текст без оформления. -
Colors.get(String)возвращает стандартный или произвольный HEX-цвет.
Не передавайте null. Для градиента используйте непустой текст без вложенной {.
Informer выбирает реализацию по текущей платформе.
Informer.send(player, Informer.component("&aОперация завершена"));
Informer.sendTitle(player, "&6Заголовок\n&fПодзаголовок", 10, 60, 10);
Informer.sendActionBar(player, "&eПодсказка");
Informer.broadcast("&bОбъявление");Пять аргументов sendTitle означают player, message, fadeIn, stay, fadeOut. Время задаётся в тиках. Передача только части времён не поддерживается.
Informer.send(source, Informer.component("&aОперация завершена"));
Informer.sendTitle(player, "&6Заголовок\n&fПодзаголовок", 10, 60, 10);
Informer.sendActionBar(player, "&eПодсказка");Для игрока Velocity всегда используйте Component. Строка отправляется через backend plugin message, а готового обработчика и регистрации канала в HLib нет.
org.bukkit.boss.BossBar bar = Informer.BossBar.createBukkit(
Colors.set("&aЗагрузка"),
Informer.BossBar.Color.GREEN,
Informer.BossBar.Style.SOLID,
0.5D
);Progress должен находиться в диапазоне 0.0–1.0.
Informer.url(...) и Informer.head(...) выполняют синхронный сетевой запрос. Не вызывайте их в main thread сервера. При ошибке методы возвращают пустую строку или null и печатают stack trace; статус ответа отдельным объектом не предоставляется.
Общий facade Scheduler предоставляет async-задачи. Delay и period задаются в Minecraft-тиках; на Velocity один тик преобразуется в 50 миллисекунд.
Scheduler.doAsyncLater(() -> Informer.send("Прошла одна секунда"), 20L);
int taskId = Scheduler.doAsyncRepeatWithId(
() -> Informer.send("Периодическая задача"),
0L,
20L
);
Scheduler.stop(taskId);Для Bukkit доступны sync-методы:
Scheduler.Bukkit.doSync(() -> player.teleport(location));
Scheduler.Bukkit.doSyncLater(() -> player.sendMessage("Готово"), 20L);Правила потоков:
- Bukkit API, мир, сущности и инвентари меняйте в main thread.
- SQL, HTTP и файловые операции выполняйте вне main thread.
- Общего
Scheduler.doSyncдля Velocity нет. - Завершившиеся id автоматически не удаляются из внутреннего реестра; отменяйте долгоживущие задачи явно.
Cooldowner хранит время окончания в памяти. Некоторые встроенные типы помечены как strict и дополнительно требуют MySQL; COMMAND работает без базы.
String key = Cooldowner.key("example", player.getUniqueId().toString());
if (Cooldowner.inCooldown(key, Cooldowner.Type.COMMAND)) {
long seconds = Cooldowner.getTimeLeft(key, Cooldowner.Type.COMMAND);
Informer.send(player, Informer.component("&cПодождите " + seconds + " сек."));
return;
}
Cooldowner.start(key, Cooldowner.Type.COMMAND, 10L);Типы cooldown зафиксированы в enum и расширить их без изменения HLib нельзя. Всегда добавляйте namespace своего плагина в ключ, чтобы избежать коллизий.
ItemBuilder — Bukkit-only API.
ItemStack item = new ItemBuilder()
.setMaterial(Material.DIAMOND)
.setName("&bРедкий алмаз")
.setLore(List.of("&7Создан через HLib"))
.setAmount(1)
.setGlowing(true)
.addNBT("example-item", true)
.build(player);Доступные операции:
- Bukkit
Materialили строковый material id. - Имя, lore, количество и unsafe enchantments.
- Unbreakable, glow и item flags.
- Pattern для banner и shield.
- Custom model data и item model для 1.21.
- Строковые и boolean NBT-значения внутри compound
hlib. - Разрешение namespace-предметов ItemsAdder и Nexo при наличии соответствующего плагина.
Не переиспользуйте один builder после смены material между potion, armor, banner и shield: внутренние type-флаги не сбрасываются. Не передавайте null в setAmount.
String text = DateTimeFormatter.format(3_661L);
Long millis = DateTimeFormatter.getMillisFromCustomString("15m");Поддерживаются суффиксы s, m, h, d, w, y. Месяц в форматтере считается как 30 дней, год — 365 дней. Форматирование ориентировано на русские строки из info.yml.
String value = ShortNumbersFormatter.format(1_250_000L);Суффиксы настраиваются в short-numbers-suffixes файла info.yml из data directory HLib. На Paper/Bukkit типичный путь — plugins/HLib/info.yml. Деление целочисленное: дробная часть отбрасывается.
Tools.parseInt, parseLong, parseDouble и похожие методы возвращают 0 при любой ошибке. Используйте их только там, где нулевое значение допустимо; для валидации пользовательского ввода лучше применить обычный parser с обработкой исключения.
Эти API работают только на Bukkit/Paper:
| Класс | Назначение |
|---|---|
Locationer |
центр блока, направления, 2D-дистанция и повороты BlockFace
|
Experience |
total experience и расчёт опыта уровня |
Vector3D |
неизменяемые операции сложения, вычитания, умножения и деления |
Tools |
ближайшие блоки/игроки/сущности, damager, target player, UUID и skin data |
Проверяйте null, совпадение миров и правильный поток. Tools.getNearbyBlocks возвращает куб, а не сферу.
Translator асинхронно скачивает vanilla locale-файлы и устанавливает Adventure TranslationRegistry.
Translator.init();
String materialName = Translator.getMaterialName(Material.DIAMOND, player);Готовность не возвращается через Future или callback. До завершения загрузки метод может вернуть translation key. Используйте этот класс только на Bukkit/Paper.
HCommandBukkit, HCommandVelocity и HCommandAnimatedBukkit не являются универсальным command framework:
- Создание объекта не регистрирует команду в платформе.
- Право должно существовать в жёстко заданном enum
Permission, иначе выполнение завершитсяIllegalArgumentException. - Bukkit-конструктор изменяет список aliases, поэтому
List.of(...)использовать нельзя. - Lifetime-limit автоматически не сбрасывается.
Для нового независимого плагина предпочтительнее штатный command API Paper или Velocity. Legacy-классы HLib подходят прежде всего проектам, чьи permission nodes уже добавлены в Permission.
| Класс | Когда использовать |
|---|---|
Reflections |
загрузка собственного versioned NMS bridge |
Requestor |
временные запросы; корректно используйте только TimeUnit.SECONDS
|
Performance |
метрики через Redis и Spark |
Variables |
переменные из MySQL |
StringRepairer |
удаление bidi и RTL-диапазонов; не для multilingual chat |
Console |
упрощённый Bukkit sender с безусловными правами, не полная консоль |
Подробные ограничения этих классов приведены в каталоге API и разделе решения проблем.