{"id":28443495,"url":"https://github.com/kamikototkach/refreshmenu","last_synced_at":"2026-04-28T17:32:04.983Z","repository":{"id":159010135,"uuid":"601755860","full_name":"KamikotoTkach/RefreshMenu","owner":"KamikotoTkach","description":"Menu library for minecraft plugin development","archived":false,"fork":false,"pushed_at":"2025-06-05T14:46:16.000Z","size":339,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-06T08:07:23.092Z","etag":null,"topics":["bukkit","bukkit-api","bukkit-library","bukkit-plugin","bukkitdev","bukkitplugin","java","minecraft","minecraft-plugin","paper-plugin","papermc","papermc-api","papermc-library","papermc-plugin"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/KamikotoTkach.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-02-14T18:48:49.000Z","updated_at":"2025-06-05T14:46:18.000Z","dependencies_parsed_at":null,"dependency_job_id":"62e93fe6-4a55-45b0-86a5-b04f25ee4491","html_url":"https://github.com/KamikotoTkach/RefreshMenu","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/KamikotoTkach/RefreshMenu","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KamikotoTkach%2FRefreshMenu","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KamikotoTkach%2FRefreshMenu/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KamikotoTkach%2FRefreshMenu/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KamikotoTkach%2FRefreshMenu/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KamikotoTkach","download_url":"https://codeload.github.com/KamikotoTkach/RefreshMenu/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KamikotoTkach%2FRefreshMenu/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262593533,"owners_count":23334000,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bukkit","bukkit-api","bukkit-library","bukkit-plugin","bukkitdev","bukkitplugin","java","minecraft","minecraft-plugin","paper-plugin","papermc","papermc-api","papermc-library","papermc-plugin"],"created_at":"2025-06-06T08:07:16.350Z","updated_at":"2026-04-28T17:32:04.977Z","avatar_url":"https://github.com/KamikotoTkach.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# RefreshMenu 1.7.4\n#### Библиотека на меню для Paper\n\n\nПодключение:\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003eru.cwcode.tkach.refreshmenu\u003c/groupId\u003e\n  \u003cartifactId\u003eRefreshMenu\u003c/artifactId\u003e\n  \u003cversion\u003e1.7.4\u003c/version\u003e\n  \u003cscope\u003eprovided\u003c/scope\u003e\n\u003c/dependency\u003e\n```\n\nНастройка конфигов [тут](docs/readme.md)\n\n**Кратко:** \u003cbr\u003e\n\n**Menu** \u003cbr\u003e\nИспользуется как контейнер для ```View```\n\n**View** \u003cbr\u003e\nСвязывает отображение ```InventoryShape``` и поведение\n\n**InventoryShape** \u003cbr\u003e\nХранит схему отображения ```Ingredient```-ов\n\n**Ingredient** \u003cbr\u003e\nИнтерфейс, реализующий метод ```getItem```, возвращающий ```ItemStack``` (представление ингридиента в меню)\n\n**Применение** \u003cbr\u003e\n1. Создаём своё ```Menu```:\n```java\npublic class TestMenu extends Menu {\n  public TestMenu() {\n    setView(\"default\", new TestView()); //Устанавливаем в качестве дефолтного View - наш TestView\n  }\n}\n```\n2. Создаём свой ```View```:\n```java\npublic class TestView extends View {\n  public TestView() {\n    new ShapeBuilder()\n       .name(\"\u003cgold\u003eMiniMessage title\") //название меню\n       .chest(27) //тип меню - сундук и размер 27 (можно указать другой тип меню через .type(InventoryType.HOPPER))\n       .shape( //схема отображения меню\n          \"---------\",\n          \"-A-----B-\",\n          \"---------\"\n       )\n       .ingredient('A', Ingredient.builder()\n                                  .name(\"\u003cgold\u003eSome text: \u003cplaceholder\u003e\") \n                                  .type(Material.SPECTRAL_ARROW)\n                                  .customModelData(1)\n                                  .description(\"line 1\",\n                                               \"line 2\")\n                                  .build()) //Так к элементу схемы A привязывается Ingredient\n       \n       .ingredient('B', Ingredient.of(new ItemStack(Material.GOLD_BLOCK))) //Ingredient может быть задан готовым ItemStack\n       .build(this); //Устанавливаем InventoryShape для нашего View\n    \n    getPlaceholders().add(\"placeholder\", \"\u003cgray\u003efoo\"); //добавляем плейсхолдер, который будет резолвится во всех ингридиентах и названии меню (Кроме ингридиентов, созданных из ItemStack напрямую)\n    \n    getBehavior().bind('A', ClickType.LEFT, (e) -\u003e { //Указываем элементу схемы A действие по нажатию ЛКМ\n      e.getWhoClicked().closeInventory();\n      //or getMenu().openView((Player)e.getWhoClicked(), \"anotherView\");\n    });\n  }\n}\n```\n3. Done\n\n![image](https://github.com/KamikotoTkach/RefreshMenu/assets/110531613/b871eb02-3a04-4fe1-a4a0-b7399e4d4811)\n\n\n**PagedView** \u003cbr\u003e\nЭто реализация ```View```, созданная для отображения динамических данных (Например: предметы в магазине, онлайн игроки) \u003cbr\u003e\n\n**Применение**: \u003cbr\u003e\n1. Аналогично с обычным ```View``` указываем его как ```default``` в какой-либо ```Menu```\n2. Создаём экземпляр:\n```java\npublic class TestPagedView extends PagedView\u003cIngredient /*или любая своя реализация*/\u003e {\n  {\n    InventoryShape.builder()\n                  .name(\"Paged menu\")\n                  .chest(27)\n                  .shape(\"#########\", //# по дефолту является \"динамическим\" символом, в ингридиентах он не определяется\n                         \"#########\",\n                         \"0000000\u003c\u003e\")\n    \n                  .ingredient('\u003c', Ingredient.builder() //дефолтный символ для действия \"на прошлую страницу\"\n                                             .type(Material.ARROW)\n                                             .name(\"На \u003cprevPage\u003e страницу\")\n                                             .description(\"\u003cpage\u003e/\u003cmaxPage\u003e\")\n                                             .build())\n    \n                  .ingredient('\u003e', Ingredient.builder() //дефолтный символ для действия \"на следующую страницу\"\n                                             .type(Material.ARROW)\n                                             .name(\"На \u003cnextPage\u003e страницу\")\n                                             .description(\"\u003cpage\u003e/\u003cmaxPage\u003e\")\n                                             .build())\n    \n                  .ingredient('0', Ingredient.builder()\n                                             .type(Material.GRAY_STAINED_GLASS_PANE)\n                                             .name(\"\")\n                                             .build())\n    \n                  .build(this);\n  }\n  \n  public TestPagedView() {\n    setDynamic(Arrays.stream(Material.values()) //Получаем горючие материалы и создаём из них ингридиенты\n                     .filter(Material::isFuel)\n                     .map(x -\u003e new ItemIngredient(new ItemStack(x))) \n                     .collect(Collectors.toList())\n    );\n    \n    getBehavior().bind(getDynamicChar(), ClickType.LEFT, (e) -\u003e { //по нажатию ЛКМ на любой динамический слот\n      getDynamic(e.getSlot()).ifPresent(ingredient -\u003e {//получаем ингридиент, и если в этом слоте он есть\n        //выполняем какое-то действие\n      });\n    });\n  }\n}\n```\n3. Done\n![image](https://github.com/KamikotoTkach/RefreshMenu/assets/110531613/abd1decf-5119-45be-93de-bddff3660ac5)\n\nPagedView автоматически предоставляет плейсхолдеры ```maxPage``` ```page``` ```nextPage``` ```prevPage``` и методы ```updatePlaceholders```, ```updateDynamicContent```\n\n\nКак показать меню игроку:\n1. Получить экземпляр MenuManager и сохранить куда-то:\n   ```java\n   var menuManager = RefreshMenu.getManager(YourPlugin.getInstance());\n   ```\n   \n2. Открыть меню \n   ```java\n   menuManager.open(new YourMenu(), (Player) viewer);\n   ```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkamikototkach%2Frefreshmenu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkamikototkach%2Frefreshmenu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkamikototkach%2Frefreshmenu/lists"}