173 lines
5.8 KiB
Java
173 lines
5.8 KiB
Java
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<String, Integer> reg_slots = new HashMap<>();
|
|
private static HashMap<String, Integer> att_slots = new HashMap<>();
|
|
|
|
public static void load() {
|
|
LinkedHashMap<Integer, Region> regions = new LinkedHashMap<>();
|
|
LinkedHashMap<Integer, List<Attraction>> attractions = new LinkedHashMap<>();
|
|
for(Region region : API.getRegions().values()) {
|
|
if(region.getAttractions().isEmpty()) {
|
|
regions.put(regions.size(), region);
|
|
continue;
|
|
}
|
|
|
|
Iterable<List<Attraction>> iterable = Iterables.partition(region.getAttractions().values(), 8);
|
|
for(List<Attraction> 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<Attraction> 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<Integer> 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;
|
|
}
|
|
|
|
}
|