Skip to content

KamikotoTkach/RefreshMenu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

RefreshMenu 1.4.0

Библиотека на меню для Paper

Подключение:

<dependency>
  <groupId>ru.cwcode.tkach.refreshmenu</groupId>
  <artifactId>RefreshMenu</artifactId>
  <version>1.4.0</version>
  <scope>provided</scope>
</dependency>

Настройка конфигов тут

Кратко:

Menu
Используется как контейнер для View

View
Связывает отображение InventoryShape и поведение

InventoryShape
Хранит схему отображения Ingredient-ов

Ingredient
Интерфейс, реализующий метод getItem, возвращающий ItemStack (представление ингридиента в меню)

Применение

  1. Создаём своё Menu:
public class TestMenu extends Menu {
  public TestMenu() {
    setView("default", new TestView()); //Устанавливаем в качестве дефолтного View - наш TestView
  }
}
  1. Создаём свой View:
public class TestView extends View {
  public TestView() {
    new ShapeBuilder()
       .name("<gold>MiniMessage title") //название меню
       .chest(27) //тип меню - сундук и размер 27 (можно указать другой тип меню через .type(InventoryType.HOPPER))
       .shape( //схема отображения меню
          "---------",
          "-A-----B-",
          "---------"
       )
       .ingredient('A', Ingredient.builder()
                                  .name("<gold>Some text: <placeholder>") 
                                  .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", "<gray>foo"); //добавляем плейсхолдер, который будет резолвится во всех ингридиентах и названии меню (Кроме ингридиентов, созданных из ItemStack напрямую)
    
    getBehavior().bind('A', ClickType.LEFT, (e) -> { //Указываем элементу схемы A действие по нажатию ЛКМ
      e.getWhoClicked().closeInventory();
      //or getMenu().openView((Player)e.getWhoClicked(), "anotherView");
    });
  }
}
  1. Done

image

PagedView
Это реализация View, созданная для отображения динамических данных (Например: предметы в магазине, онлайн игроки)

Применение:

  1. Аналогично с обычным View указываем его как default в какой-либо Menu
  2. Создаём экземпляр:
public class TestPagedView extends PagedView<Ingredient /*или любая своя реализация*/> {
  {
    InventoryShape.builder()
                  .name("Paged menu")
                  .chest(27)
                  .shape("#########", //# по дефолту является "динамическим" символом, в ингридиентах он не определяется
                         "#########",
                         "0000000<>")
    
                  .ingredient('<', Ingredient.builder() //дефолтный символ для действия "на прошлую страницу"
                                             .type(Material.ARROW)
                                             .name("На <prevPage> страницу")
                                             .description("<page>/<maxPage>")
                                             .build())
    
                  .ingredient('>', Ingredient.builder() //дефолтный символ для действия "на следующую страницу"
                                             .type(Material.ARROW)
                                             .name("На <nextPage> страницу")
                                             .description("<page>/<maxPage>")
                                             .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 -> {//получаем ингридиент, и если в этом слоте он есть
        //выполняем какое-то действие
      });
    });
  }
}
  1. Done image

PagedView автоматически предоставляет плейсхолдеры maxPage page nextPage prevPage и методы updatePlaceholders, updateDynamicContent

Как показать меню игроку:

  1. Получить экземпляр MenuManager и сохранить куда-то:

    var menuManager = RefreshMenu.getManager(YourPlugin.getInstance());
  2. Открыть меню

    menuManager.open(new YourMenu(), (Player) viewer);