Mikyc
Участник
- Баллы
- 31
Всем привет, есть такой вот код:
Где создаётся инвентарь и в него помещаются предметы с названием из конфига. Проблема такова, что когда место кончается, то выдаёт ошибку. Поэтому я принял решение ловить её и создавать список с теми элементами, которым не хватило места(Можно ли как-то иначе это реализовать?). Так вот максимальное кол-во предметов в нём это 28 и "страница" под номером 2 открывается, но дальше не идёт т.к список начинается сначала тут я подумал добавить переменную которая будет хранить те имена, которые в данный момент уже показаны. Я попытался удалить значения данного списка(inmenu) из списка "all"(Дабы начинать список со следующей "страницы") при помощи
в методе "nextpage" - т.е когда нажат изумрудный блок, но так почему-то не сработало и из-за моих не очень больших знаний в Java я отправился в гугл, но не найдя там ничего решил написать сюда за помощью в чём может быть причина такого исхода?
Вроде бы всё написал что нужно (Если код кривой, то можете дать совет?)
Код:
package mlk.plug.inventories;
import mlk.plug.DungeonCore;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.*********ventory.Inventory;
import org.*********ventory.InventoryHolder;
import org.*********ventory.ItemStack;
import org.*********ventory.meta.ItemMeta;
import java.util.*;
public class RegionsMenu implements InventoryHolder {
Inventory inv;
private YamlConfiguration regions = YamlConfiguration.loadConfiguration(DungeonCore.instance().regions); //Кастомный конфиг
LinkedHashSet<String> all = new LinkedHashSet<>(); //Все элементы списка которые не вошли в меню
LinkedHashSet<String> inmenu = new LinkedHashSet<>(); //Все элементы списка которые в меню
public RegionsMenu() {
init();
reg();
}
public void reg () {
regions = YamlConfiguration.loadConfiguration(DungeonCore.instance().regions);
}
public void init () { //Начало
LinkedHashSet<String> reg = new LinkedHashSet<>(regions.getKeys(false));
handler(reg);
}
public void nextpage () { //Когда нажат изумрудный блок
handler(all);
}
private void handler (LinkedHashSet<String> array) {
inv = Bukkit.createInventory(this, 54, "§cRegions"); //Объявление инвентаря (каждая страница свой)
ItemStack item;
//top and footer
for (int i = 0; i < 9; i++) {
item = createItem("§a§lDungeonCore", Material.GRAY_STAINED_GLASS_PANE, null);
inv.setItem(i, item);
//footer
for (int j = 45; j < 54; j++) {
inv.setItem(j, item);
}
}
//left and right
for (int i = 0; i < 54; i += 9) {
item = createItem("§a§lDungeonCore", Material.GRAY_STAINED_GLASS_PANE, null);
inv.setItem(i, item);
//right
for (int j = 8; j < 54; j += 9) {
inv.setItem(j, item);
}
}
item = createItem("§a§lNext", Material.EMERALD_BLOCK, null);
inv.setItem(50, item);
//regions
for (String key : array) {
ConfigurationSection section = regions.getConfigurationSection(key); //Каждый новый конфиг(предмет) для добавления
if (section == null) continue;
item = createItem("§e§l" + section.getName(), Material.END_PORTAL_FRAME, null); //Создание предмета
try {
inv.setItem(inv.firstEmpty(), item); //Добавляем предмет в меню
inmenu.add(section.getCurrentPath()); //Все элементы списка которые находятся в меню
}catch(IndexOutOfBoundsException e) {
all.add(section.getCurrentPath()); //Все элементы списка которые не вошли в меню
}
} //Имена для End_Portal_Frame добавляются из конфига для каждой новой записи своя рамка
}
private ItemStack createItem(String name, Material mat, List<String> lore) { //Collections.singletonList("§4Hey how are you?")
ItemStack item = new ItemStack(mat, 1);
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(name);
meta.setLore(lore);
item.setItemMeta(meta);
return item;
}
@Override
public Inventory getInventory() {
return inv;
}
}
Где создаётся инвентарь и в него помещаются предметы с названием из конфига. Проблема такова, что когда место кончается, то выдаёт ошибку. Поэтому я принял решение ловить её и создавать список с теми элементами, которым не хватило места(Можно ли как-то иначе это реализовать?). Так вот максимальное кол-во предметов в нём это 28 и "страница" под номером 2 открывается, но дальше не идёт т.к список начинается сначала тут я подумал добавить переменную которая будет хранить те имена, которые в данный момент уже показаны. Я попытался удалить значения данного списка(inmenu) из списка "all"(Дабы начинать список со следующей "страницы") при помощи
Код:
all.removeAll(inmenu);
Вроде бы всё написал что нужно (Если код кривой, то можете дать совет?)