https://github.com/kamikototkach/refreshmenu
Menu library for minecraft plugin development
https://github.com/kamikototkach/refreshmenu
bukkit bukkit-api bukkit-library bukkit-plugin bukkitdev bukkitplugin java minecraft minecraft-plugin paper-plugin papermc papermc-api papermc-library papermc-plugin
Last synced: about 1 month ago
JSON representation
Menu library for minecraft plugin development
- Host: GitHub
- URL: https://github.com/kamikototkach/refreshmenu
- Owner: KamikotoTkach
- License: agpl-3.0
- Created: 2023-02-14T18:48:49.000Z (over 3 years ago)
- Default Branch: master
- Last Pushed: 2025-06-05T14:46:16.000Z (12 months ago)
- Last Synced: 2025-06-06T08:07:23.092Z (12 months ago)
- Topics: bukkit, bukkit-api, bukkit-library, bukkit-plugin, bukkitdev, bukkitplugin, java, minecraft, minecraft-plugin, paper-plugin, papermc, papermc-api, papermc-library, papermc-plugin
- Language: Java
- Homepage:
- Size: 331 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
README
# RefreshMenu 1.7.4
#### Библиотека на меню для Paper
Подключение:
```xml
ru.cwcode.tkach.refreshmenu
RefreshMenu
1.7.4
provided
```
Настройка конфигов [тут](docs/readme.md)
**Кратко:**
**Menu**
Используется как контейнер для ```View```
**View**
Связывает отображение ```InventoryShape``` и поведение
**InventoryShape**
Хранит схему отображения ```Ingredient```-ов
**Ingredient**
Интерфейс, реализующий метод ```getItem```, возвращающий ```ItemStack``` (представление ингридиента в меню)
**Применение**
1. Создаём своё ```Menu```:
```java
public class TestMenu extends Menu {
public TestMenu() {
setView("default", new TestView()); //Устанавливаем в качестве дефолтного View - наш TestView
}
}
```
2. Создаём свой ```View```:
```java
public class TestView extends View {
public TestView() {
new ShapeBuilder()
.name("MiniMessage title") //название меню
.chest(27) //тип меню - сундук и размер 27 (можно указать другой тип меню через .type(InventoryType.HOPPER))
.shape( //схема отображения меню
"---------",
"-A-----B-",
"---------"
)
.ingredient('A', Ingredient.builder()
.name("Some text: ")
.type(Material.SPECTRAL_ARROW)
.customModelData(1)
.description("line 1",
"line 2")
.build()) //Так к элементу схемы A привязывается Ingredient
.ingredient('B', Ingredient.of(new ItemStack(Material.GOLD_BLOCK))) //Ingredient может быть задан готовым ItemStack
.build(this); //Устанавливаем InventoryShape для нашего View
getPlaceholders().add("placeholder", "foo"); //добавляем плейсхолдер, который будет резолвится во всех ингридиентах и названии меню (Кроме ингридиентов, созданных из ItemStack напрямую)
getBehavior().bind('A', ClickType.LEFT, (e) -> { //Указываем элементу схемы A действие по нажатию ЛКМ
e.getWhoClicked().closeInventory();
//or getMenu().openView((Player)e.getWhoClicked(), "anotherView");
});
}
}
```
3. Done

**PagedView**
Это реализация ```View```, созданная для отображения динамических данных (Например: предметы в магазине, онлайн игроки)
**Применение**:
1. Аналогично с обычным ```View``` указываем его как ```default``` в какой-либо ```Menu```
2. Создаём экземпляр:
```java
public class TestPagedView extends PagedView {
{
InventoryShape.builder()
.name("Paged menu")
.chest(27)
.shape("#########", //# по дефолту является "динамическим" символом, в ингридиентах он не определяется
"#########",
"0000000<>")
.ingredient('<', Ingredient.builder() //дефолтный символ для действия "на прошлую страницу"
.type(Material.ARROW)
.name("На страницу")
.description("/")
.build())
.ingredient('>', Ingredient.builder() //дефолтный символ для действия "на следующую страницу"
.type(Material.ARROW)
.name("На страницу")
.description("/")
.build())
.ingredient('0', Ingredient.builder()
.type(Material.GRAY_STAINED_GLASS_PANE)
.name("")
.build())
.build(this);
}
public TestPagedView() {
setDynamic(Arrays.stream(Material.values()) //Получаем горючие материалы и создаём из них ингридиенты
.filter(Material::isFuel)
.map(x -> new ItemIngredient(new ItemStack(x)))
.collect(Collectors.toList())
);
getBehavior().bind(getDynamicChar(), ClickType.LEFT, (e) -> { //по нажатию ЛКМ на любой динамический слот
getDynamic(e.getSlot()).ifPresent(ingredient -> {//получаем ингридиент, и если в этом слоте он есть
//выполняем какое-то действие
});
});
}
}
```
3. Done

PagedView автоматически предоставляет плейсхолдеры ```maxPage``` ```page``` ```nextPage``` ```prevPage``` и методы ```updatePlaceholders```, ```updateDynamicContent```
Как показать меню игроку:
1. Получить экземпляр MenuManager и сохранить куда-то:
```java
var menuManager = RefreshMenu.getManager(YourPlugin.getInstance());
```
2. Открыть меню
```java
menuManager.open(new YourMenu(), (Player) viewer);
```