package nl.iobyte.themepark.menu; import com.google.common.collect.Iterables; import nl.iobyte.menuapi.components.Types; import nl.iobyte.menuapi.item.MenuItem; import nl.iobyte.menuapi.multi.MenuPage; import nl.iobyte.menuapi.multi.MultiMenu; import nl.iobyte.themepark.ThemeParkPlugin; import nl.iobyte.themepark.api.API; import nl.iobyte.themepark.api.attraction.Attraction; import nl.iobyte.themepark.api.attraction.Region; import nl.iobyte.themepark.api.attraction.manager.StatusManager; import nl.iobyte.themepark.api.utils.ItemBuilder; import nl.iobyte.themepark.menu.actions.PageAction; import nl.iobyte.themepark.menu.actions.TPAction; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; public class AttractionMenu { private static MultiMenu menu; private static HashMap reg_slots = new HashMap<>(); private static HashMap att_slots = new HashMap<>(); public static void load() { LinkedHashMap regions = new LinkedHashMap<>(); LinkedHashMap> attractions = new LinkedHashMap<>(); for(Region region : API.getRegions().values()) { if(region.getAttractions().isEmpty()) { regions.put(regions.size(), region); continue; } Iterable> iterable = Iterables.partition(region.getAttractions().values(), 8); for(List list : iterable) { regions.put(regions.size(), region); attractions.put(attractions.size(), list); } } int region_size = regions.size(); loadMenu(region_size); for(int i = 0; i < region_size; i++) { int start_index = i * 9; if(region_size > 6) start_index += (i / 5) * 9; int j = 1; List list = attractions.get(i); Region region = regions.get(i); if(region == null) continue; reg_slots.put(region.getId(), start_index); menu.setItem(start_index, new MenuItem(getRegion(region), true)); if(list == null) continue; for(Attraction attraction : list) { MenuItem item = new MenuItem(getAttraction(attraction), true); item.addActions(Types.NORMAL.getTypesList(), new TPAction(attraction)); int slot = start_index + j; att_slots.put(attraction.getId(), slot); menu.setItem(slot, item); j++; } } if(region_size > 6) { int page_size = menu.getPageSizes().size(); for (int i = 0; i < page_size; i++) { MenuPage page = menu.getPage(i + 1); int size = page.getSize(); if (i > 0) page.setItem(size - 6, getPrevious(i)); if (i < (page_size - 1)) page.setItem(size - 4, getNext(i)); ItemBuilder builder = new ItemBuilder(Material.MINECART); builder.setName("&6Page: &f"+(i + 1)); page.setItem(size - 5, new MenuItem(builder.getItem(), true)); } } menu.build(); } public static void updateRegion(Region region) { if(region == null) return; if(!reg_slots.containsKey(region.getId())) return; int slot = reg_slots.get(region.getId()); menu.setItem(slot, getRegion(region)); menu.updateItem(slot); } public static void updateAttraction(Attraction attraction) { if(attraction == null) return; if(!att_slots.containsKey(attraction.getId())) return; int slot = att_slots.get(attraction.getId()); menu.setItem(slot, getAttraction(attraction)); menu.updateItem(slot); } public static void open(Player player) { open(player, 1); } public static void open(Player player, int page) { menu.open(player, page); } private static void loadMenu(int regions) { ArrayList page_sizes = new ArrayList<>(); if(regions <= 6) { page_sizes.add(regions * 9); } else { int pages = regions / 5; for (int i = 0; i < pages; i++) page_sizes.add(54); pages = regions % 5; if (pages > 0) page_sizes.add(pages * 9 + 9); } menu = new MultiMenu(ThemeParkPlugin.getInstance().getSettings().getConfig().getString("menu-title"), page_sizes); } private static ItemStack getRegion(Region region) { ItemBuilder builder = new ItemBuilder(region.getMaterial(), 1, region.getData()); builder.setName(region.getName()).setLore(region.getLore()); return builder.getItem(); } private static ItemStack getAttraction(Attraction attraction) { ItemBuilder builder = new ItemBuilder(StatusManager.getMaterial(attraction.getStatus()), 1, StatusManager.getData(attraction.getStatus())); builder.setName(attraction.getName()).setLore(StatusManager.getName(attraction.getStatus())); return builder.getItem(); } private static MenuItem getNext(int page) { return getPage("&6&LNext \u23F5", page + 1); } private static MenuItem getPrevious(int page) { return getPage("&6&L\u23F4 Previous", page - 1); } private static MenuItem getPage(String text, int page) { ItemBuilder builder = new ItemBuilder(Material.ARROW); builder.setName(text); MenuItem item = new MenuItem(builder.getItem(), true); item.addActions(new PageAction(page + 1)); return item; } }