Перейти к основному содержимому
Версия: 2.1.0

📋 Регістр

У JGuiWrapper існує регістр для обробників предметів та їх лоадерів даних. Він слугує для упорядкування елементів у системах графічних інтерфейсів.

примечание

Використання регістру є доречним виключно для AdvancedGui


🔑 Навіщо потрібен реєстр?

  • ✅ Дозволяє зареєструвати власні типи предметів.
  • ✅ Дає змогу додавати кастомні обробники кліків та поведінки.
  • ✅ Забезпечує зручне завантаження даних для GUI-елементів.
  • ✅ Сприяє розширюваності — інші плагіни чи модулі можуть підключати свої елементи.

🧩 Приклад реєстрації

Спочатку отримаємо головний регістр

GlobalRegistry registry = GuiApi.get().getRegistry();

Для того, щоб зареєструвати якийсь з елементів (лоадер чи обробник), спочатку потрібно зробити ідентифікаційний ключ (бібліотека використовує Adventure Key)

// jguiwrapper - namespace
// test - id
public static final Key TEST_LOADER_KEY = Key.key("jguiwrapper", "test"); // лоадер
public static final Key TEST_HANDLER_KEY = Key.key("jguiwrapper", "test"); // обробник

Створимо невеликий лоадер для зберігання кількості кліків та відкриттів меню

TestGuiLoader.java
public class TestGuiLoader implements GuiDataLoader {

private final PlaceholderEngine placeholderEngine = PlaceholderEngine.of();

private int openCount;
private int clickCount;

public TestGuiLoader() {
// реєстрація заповнювачів
placeholderEngine.register("%open_count%", (player) -> String.valueOf(openCount));
placeholderEngine.register("%click_count%", (player) -> {
if (clickCount >= 100) return ">= 100";

return String.valueOf(clickCount);
});
}

@Override
public void load(AdvancedGui gui, HumanEntity player) {
openCount++;

// присвоєння заповнювачів для усіх предметів
for (GuiItemController controller : gui.getControllers()) {
controller.updateItems(itemWrapper -> {
if (itemWrapper.placeholderEngine() == null) {
itemWrapper.placeholderEngine(placeholderEngine);
} else {
itemWrapper.placeholderEngine().addAll(placeholderEngine);
}
});
}
}

public void click() {
clickCount++;
}

public int getOpenCount() {
return openCount;
}
}

Метод load викликатиметься кожного разу, коли визвано метод AdvancedGui#loadData

Зареєструємо наш лоадер в регістр

registry.registerLoader(TEST_LOADER_KEY, new TestGuiLoader());

Перейдемо до створення обробника предметів

TestItemHandler
public class TestItemHandler implements ItemHandler<TestGuiLoader> {

@Override
public void load(@NotNull TestGuiLoader loader, @NotNull GuiItemController controller, @NotNull HandlerContext context) {
// назначення обробника кліків при завантаженні обробника
controller.defaultClickHandler((e, c) -> {
e.setCancelled(true);

loader.click(); // збільшення кількість кліків

// оновлення всіх предметів контроллера
c.updateItems(itemWrapper -> itemWrapper.update(e.getWhoClicked()));
});

// змінення даних контролера при завантаженні обробника
controller.updateItems(wrapper -> wrapper.lore("&cPlayer: &6%player_name%", "&cOpen count: &6%open_count%", "&cClick count: &6%click_count%"),
(OfflinePlayer) context.player());
}
}
к сведению

Наш обробник імплементує інтерфейс ItemHandler з типізацією нашого лоадера TestGuiLoader, щоб діставати з нього потрібну інформацію

Метод load викликатиметься кожного разу, коли визвано метод GuiItemController#loadItemHandler

Зареєструємо обробник в регістр

registry.registerHandler(TEST_HANDLER_KEY, new TestItemHandler());

Після того, як ми зареєстрували обробник та лоадер, використаємо їх на практиці. Всередині gui зареєструємо лоадер

TestAdvancedGui
public TestAdvancedGui() {
super("&cAdvanced gui");

registerLoader(TEST_LOADER_KEY);

// інший код
}

Назначимо обробник для предмету handled

TestAdvancedGui
registerItem("handled", builder -> builder.slots(52)
.defaultItem(ItemWrapper.builder(Material.DIAMOND_BLOCK).build())
.itemHandler(TEST_HANDLER_KEY));

Завантажимо дані та обробники при відкритті

onOpen(event -> {
HumanEntity player = event.getPlayer();

// завантаження TestGuiLoader
loadData(player);

// завантаження TestItemHandler
for (GuiItemController controller : getControllers()) {
controller.loadItemHandler(LoadType.ON_OPEN, player);
}
});