3
0
Fork 0
This repository has been archived on 2024-11-14. You can view files and clone it, but cannot push or open issues or pull requests.
ThemePark/src/main/java/nl/iobyte/themepark/menu/AttractionMenu.java
2020-06-16 18:30:29 +02:00

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;
}
}