Initial commit
This commit is contained in:
commit
ab4bb73cc1
|
@ -0,0 +1,2 @@
|
||||||
|
# Project exclude paths
|
||||||
|
/target/
|
|
@ -0,0 +1,24 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>1.8</maven.compiler.source>
|
||||||
|
<maven.compiler.target>1.8</maven.compiler.target>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<groupId>nl.iobyte</groupId>
|
||||||
|
<artifactId>menuapi</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.spigotmc</groupId>
|
||||||
|
<artifactId>spigot-api</artifactId>
|
||||||
|
<version>1.12.2-R0.1-SNAPSHOT</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
|
@ -0,0 +1,56 @@
|
||||||
|
package nl.iobyte.menuapi;
|
||||||
|
|
||||||
|
import nl.iobyte.menuapi.interfaces.IActionHandler;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
public class MenuAPI {
|
||||||
|
|
||||||
|
private static boolean registered = false;
|
||||||
|
private static final HashMap<String, IActionHandler> actionHandlers = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add ActionHandler
|
||||||
|
* @param handler IActionHandler
|
||||||
|
*/
|
||||||
|
public static void addActionHandler(IActionHandler handler) {
|
||||||
|
actionHandlers.put(handler.getID(), handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get IActionHandler by ID
|
||||||
|
* @param id String
|
||||||
|
* @return IActionHandler
|
||||||
|
*/
|
||||||
|
public static IActionHandler getActionHandler(String id) {
|
||||||
|
return actionHandlers.get(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Has IActionHandler with specific ID
|
||||||
|
* @param id String
|
||||||
|
* @return Boolean
|
||||||
|
*/
|
||||||
|
public static boolean hasActionHandler(String id) {
|
||||||
|
return actionHandlers.containsKey(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove IActionHandler by ID
|
||||||
|
* @param id String
|
||||||
|
* @return IActionHandler
|
||||||
|
*/
|
||||||
|
public static IActionHandler removeActionHandler(String id) {
|
||||||
|
return actionHandlers.remove(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void register(Plugin plugin) {
|
||||||
|
if(registered || plugin == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Bukkit.getPluginManager().registerEvents(new MenuListener(), plugin);
|
||||||
|
registered = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,100 @@
|
||||||
|
package nl.iobyte.menuapi;
|
||||||
|
|
||||||
|
import nl.iobyte.menuapi.interfaces.IMenu;
|
||||||
|
import nl.iobyte.menuapi.action.InteractAction;
|
||||||
|
import nl.iobyte.menuapi.multi.MenuPage;
|
||||||
|
import nl.iobyte.menuapi.multi.MultiMenu;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.inventory.*;
|
||||||
|
import org.bukkit.inventory.Inventory;
|
||||||
|
|
||||||
|
public class MenuListener implements Listener {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onClick(InventoryClickEvent e) {
|
||||||
|
if(e.getClickedInventory() == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Inventory inventory = e.getClickedInventory();
|
||||||
|
if(!(inventory.getHolder() instanceof IMenu))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(e.isCancelled())
|
||||||
|
return;
|
||||||
|
|
||||||
|
Player player = (Player) e.getWhoClicked();
|
||||||
|
int slot = e.getRawSlot();
|
||||||
|
ClickType type = e.getClick();
|
||||||
|
|
||||||
|
IMenu menu = (IMenu) inventory.getHolder();
|
||||||
|
e.setCancelled(menu.execute(player, slot, type));
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onOpen(InventoryOpenEvent e) {
|
||||||
|
Player player = (Player) e.getPlayer();
|
||||||
|
Inventory inventory = e.getInventory();
|
||||||
|
if(!(inventory.getHolder() instanceof IMenu))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(!(inventory.getHolder() instanceof MenuPage)) {
|
||||||
|
IMenu menu = (IMenu) inventory.getHolder();
|
||||||
|
InteractAction open = menu.getOpenAction();
|
||||||
|
if (open == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
open.execute(player);
|
||||||
|
e.setCancelled(open.doCancel());
|
||||||
|
} else {
|
||||||
|
MenuPage page = (MenuPage) inventory.getHolder();
|
||||||
|
MultiMenu menu = page.getParent();
|
||||||
|
if(!menu.isActivePage(player.getUniqueId(), page))
|
||||||
|
return;
|
||||||
|
|
||||||
|
InteractAction open = menu.getOpenAction();
|
||||||
|
if (open == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
open.execute(player);
|
||||||
|
e.setCancelled(open.doCancel());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onClose(InventoryCloseEvent e) {
|
||||||
|
Player player = (Player) e.getPlayer();
|
||||||
|
Inventory inventory = e.getInventory();
|
||||||
|
if(!(inventory.getHolder() instanceof IMenu))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(!(inventory.getHolder() instanceof MenuPage)) {
|
||||||
|
IMenu menu = (IMenu) inventory.getHolder();
|
||||||
|
InteractAction close = menu.getCloseAction();
|
||||||
|
if(close == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
close.execute(player);
|
||||||
|
if(close.doCancel())
|
||||||
|
menu.open(player);
|
||||||
|
} else {
|
||||||
|
MenuPage page = (MenuPage) inventory.getHolder();
|
||||||
|
MultiMenu menu = page.getParent();
|
||||||
|
if(!menu.isActivePage(player.getUniqueId(), page))
|
||||||
|
return;
|
||||||
|
|
||||||
|
InteractAction close = menu.getCloseAction();
|
||||||
|
if (close == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
close.execute(player);
|
||||||
|
if(close.doCancel()) {
|
||||||
|
page.open(player);
|
||||||
|
} else {
|
||||||
|
menu.close(player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package nl.iobyte.menuapi.action;
|
||||||
|
|
||||||
|
import nl.iobyte.menuapi.MenuAPI;
|
||||||
|
import nl.iobyte.menuapi.interfaces.IActionHandler;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
public class HandlerAction extends MenuAction {
|
||||||
|
|
||||||
|
private final String handler;
|
||||||
|
|
||||||
|
public HandlerAction(String handler) {
|
||||||
|
this.handler = handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void execute(Player player) {
|
||||||
|
IActionHandler handler = MenuAPI.getActionHandler(this.handler);
|
||||||
|
if(handler == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
handler.execute(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package nl.iobyte.menuapi.action;
|
||||||
|
|
||||||
|
public abstract class InteractAction extends MenuAction {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set if should cancel
|
||||||
|
* @param cancel boolean
|
||||||
|
* @return InteractAction
|
||||||
|
*/
|
||||||
|
public abstract InteractAction setCancel(boolean cancel);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if should cancel
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public abstract boolean doCancel();
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
package nl.iobyte.menuapi.action;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
public abstract class MenuAction {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute Action for Player
|
||||||
|
* @param player Player instance
|
||||||
|
*/
|
||||||
|
public abstract void execute(Player player);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,274 @@
|
||||||
|
package nl.iobyte.menuapi.basic;
|
||||||
|
|
||||||
|
import nl.iobyte.menuapi.action.InteractAction;
|
||||||
|
import nl.iobyte.menuapi.action.MenuAction;
|
||||||
|
import nl.iobyte.menuapi.interfaces.IMenu;
|
||||||
|
import nl.iobyte.menuapi.item.Color;
|
||||||
|
import nl.iobyte.menuapi.item.MenuItem;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.inventory.ClickType;
|
||||||
|
import org.bukkit.inventory.Inventory;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class Menu implements IMenu {
|
||||||
|
|
||||||
|
private String title;
|
||||||
|
private int size;
|
||||||
|
private final HashMap<Integer, MenuItem> items = new HashMap<>();
|
||||||
|
private InteractAction open, close;
|
||||||
|
private Inventory inventory;
|
||||||
|
private boolean locked = true;
|
||||||
|
|
||||||
|
public Menu(String title, int size) {
|
||||||
|
this.title = title;
|
||||||
|
this.size = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Menu(String title, int size, boolean locked) {
|
||||||
|
this.title = title;
|
||||||
|
this.size = size;
|
||||||
|
this.locked = locked;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return inventory size
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public int getSize() {
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set size
|
||||||
|
* @param size int
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public IMenu setSize(int size) {
|
||||||
|
this.size = size;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get item
|
||||||
|
* @param slot int
|
||||||
|
* @return MenuItem
|
||||||
|
*/
|
||||||
|
public MenuItem getItem(int slot) {
|
||||||
|
if(!items.containsKey(slot))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return items.get(slot);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get menu items
|
||||||
|
* @return MenuItem
|
||||||
|
*/
|
||||||
|
public HashMap<Integer, MenuItem> getItems() {
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set item to slot
|
||||||
|
* @param slot int
|
||||||
|
* @param item MenuItem
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public IMenu setItem(int slot, MenuItem item) {
|
||||||
|
if(slot < 0 || slot >= size)
|
||||||
|
return this;
|
||||||
|
|
||||||
|
items.put(slot, item);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set item to slot
|
||||||
|
* @param slot int
|
||||||
|
* @param item ItemStack
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public IMenu setItem(int slot, ItemStack item) {
|
||||||
|
MenuItem mi = getItem(slot);
|
||||||
|
if(mi == null)
|
||||||
|
return this;
|
||||||
|
|
||||||
|
mi.setItem(item);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IMenu setItems(HashMap<Integer, MenuItem> items) {
|
||||||
|
items.replaceAll((k, v) -> v.clone());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update item
|
||||||
|
* @param slot int
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public IMenu updateItem(int slot) {
|
||||||
|
MenuItem item = getItem(slot);
|
||||||
|
if(item == null)
|
||||||
|
return this;
|
||||||
|
|
||||||
|
inventory.setItem(slot, item.getItem());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get action on open
|
||||||
|
* @return InteractAction
|
||||||
|
*/
|
||||||
|
public InteractAction getOpenAction() {
|
||||||
|
return open;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set action on open
|
||||||
|
* @param action InteractAction
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public IMenu setOpenAction(InteractAction action) {
|
||||||
|
open = action;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get action on close
|
||||||
|
* @return InteractAction
|
||||||
|
*/
|
||||||
|
public InteractAction getCloseAction() {
|
||||||
|
return close;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set action on close
|
||||||
|
* @param action InteractAction
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public IMenu setCloseAction(InteractAction action) {
|
||||||
|
close = action;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get menu title
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set menu title
|
||||||
|
* @param title String
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public IMenu setTitle(String title) {
|
||||||
|
this.title = title;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get if Menu is locked
|
||||||
|
* @return Boolean
|
||||||
|
*/
|
||||||
|
public boolean isLocked() {
|
||||||
|
return locked;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set if menu is locked
|
||||||
|
* @param locked Boolean
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public IMenu setLocked(boolean locked) {
|
||||||
|
this.locked = locked;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build Menu
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public IMenu build() {
|
||||||
|
inventory = Bukkit.createInventory(this, toSize(size, 9), Color.parse(title));
|
||||||
|
for(Map.Entry<Integer, MenuItem> entrySet : items.entrySet())
|
||||||
|
if(entrySet.getKey() < size)
|
||||||
|
inventory.setItem(entrySet.getKey(), entrySet.getValue().getItem());
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number to size
|
||||||
|
* @param i int
|
||||||
|
* @param size int
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
protected static int toSize(int i, int size) {
|
||||||
|
int r = i % size;
|
||||||
|
if(r > 0)
|
||||||
|
i += size - r;
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get inventory
|
||||||
|
* @return Inventory
|
||||||
|
*/
|
||||||
|
public Inventory getInventory() {
|
||||||
|
return inventory;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute Click
|
||||||
|
* @param player Player
|
||||||
|
* @param slot int
|
||||||
|
* @param type ClickType
|
||||||
|
* @return cancel
|
||||||
|
*/
|
||||||
|
public boolean execute(Player player, int slot, ClickType type) {
|
||||||
|
if(player == null || type == null)
|
||||||
|
return locked;
|
||||||
|
|
||||||
|
if(slot < 0 || slot >= size)
|
||||||
|
return locked;
|
||||||
|
|
||||||
|
MenuItem item = getItem(slot);
|
||||||
|
if(item == null)
|
||||||
|
return locked;
|
||||||
|
|
||||||
|
ArrayList<MenuAction> actions = item.getActions(type);
|
||||||
|
if(actions != null && !actions.isEmpty())
|
||||||
|
for(MenuAction action : actions)
|
||||||
|
action.execute(player);
|
||||||
|
|
||||||
|
return item.doCancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open menu for player
|
||||||
|
* @param player Player
|
||||||
|
*/
|
||||||
|
public void open(Player player) {
|
||||||
|
if(inventory == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
player.openInventory(inventory);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Menu clone() {
|
||||||
|
Menu menu = new Menu(title, size);
|
||||||
|
menu.setItems(items);
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
package nl.iobyte.menuapi.enums;
|
||||||
|
|
||||||
|
import org.bukkit.event.inventory.ClickType;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public enum Types {
|
||||||
|
|
||||||
|
LEFT(ClickType.LEFT, ClickType.SHIFT_LEFT),
|
||||||
|
RIGHT(ClickType.RIGHT, ClickType.SHIFT_RIGHT),
|
||||||
|
NORMAL(ClickType.LEFT, ClickType.RIGHT),
|
||||||
|
SHIFT(ClickType.SHIFT_LEFT, ClickType.SHIFT_RIGHT),
|
||||||
|
WINDOW_BORDER(ClickType.WINDOW_BORDER_LEFT, ClickType.WINDOW_BORDER_RIGHT);
|
||||||
|
|
||||||
|
private final ClickType[] types;
|
||||||
|
Types(ClickType... types) {
|
||||||
|
this.types = types;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ClickType[] getTypes() {
|
||||||
|
return types;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ClickType> getTypesList() {
|
||||||
|
return Arrays.asList(types);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
package nl.iobyte.menuapi.interfaces;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.inventory.ClickType;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface IActionHandler {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get ID of the handler
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
String getID();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get ClickType's of handler
|
||||||
|
* @return List<ClickType>
|
||||||
|
*/
|
||||||
|
List<ClickType> getClickTypes();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Action to perform on click
|
||||||
|
* @param player Player
|
||||||
|
*/
|
||||||
|
void execute(Player player);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,130 @@
|
||||||
|
package nl.iobyte.menuapi.interfaces;
|
||||||
|
|
||||||
|
import nl.iobyte.menuapi.action.InteractAction;
|
||||||
|
import nl.iobyte.menuapi.item.MenuItem;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.inventory.ClickType;
|
||||||
|
import org.bukkit.inventory.Inventory;
|
||||||
|
import org.bukkit.inventory.InventoryHolder;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
public interface IMenu extends InventoryHolder {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get item
|
||||||
|
* @param slot int
|
||||||
|
* @return MenuItem
|
||||||
|
*/
|
||||||
|
MenuItem getItem(int slot);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get menu items
|
||||||
|
* @return MenuItem
|
||||||
|
*/
|
||||||
|
HashMap<Integer, MenuItem> getItems();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set item to slot
|
||||||
|
* @param slot int
|
||||||
|
* @param item MenuItem
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
IMenu setItem(int slot, MenuItem item);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set item to slot
|
||||||
|
* @param slot int
|
||||||
|
* @param item ItemStack
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
IMenu setItem(int slot, ItemStack item);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set menu items
|
||||||
|
* @param items MenuItems
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
IMenu setItems(HashMap<Integer, MenuItem> items);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update item
|
||||||
|
* @param slot int
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
IMenu updateItem(int slot);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get action on open
|
||||||
|
* @return InteractAction
|
||||||
|
*/
|
||||||
|
InteractAction getOpenAction();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set action on open
|
||||||
|
* @param action InteractAction
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
IMenu setOpenAction(InteractAction action);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get action on close
|
||||||
|
* @return InteractAction
|
||||||
|
*/
|
||||||
|
InteractAction getCloseAction();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set action on close
|
||||||
|
* @param action InteractAction
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
IMenu setCloseAction(InteractAction action);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get menu title
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
String getTitle();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set menu title
|
||||||
|
* @param title String
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
IMenu setTitle(String title);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build Menu
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
IMenu build();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get inventory
|
||||||
|
* @return Inventory
|
||||||
|
*/
|
||||||
|
Inventory getInventory();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute Click
|
||||||
|
* @param player Player
|
||||||
|
* @param slot int
|
||||||
|
* @param type ClickType
|
||||||
|
* @return cancel
|
||||||
|
*/
|
||||||
|
boolean execute(Player player, int slot, ClickType type);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open menu for player
|
||||||
|
* @param player Player
|
||||||
|
*/
|
||||||
|
void open(Player player);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clone Menu
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
IMenu clone();
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
package nl.iobyte.menuapi.interfaces;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
public interface LoadAction {
|
||||||
|
|
||||||
|
void run(IMenu menu, Player player);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package nl.iobyte.menuapi.item;
|
||||||
|
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
|
||||||
|
public class Color {
|
||||||
|
|
||||||
|
public static String parse(String str) {
|
||||||
|
if(str == null || str.isEmpty())
|
||||||
|
return str;
|
||||||
|
|
||||||
|
return ChatColor.translateAlternateColorCodes('&', str);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,138 @@
|
||||||
|
package nl.iobyte.menuapi.item;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.enchantments.Enchantment;
|
||||||
|
import org.bukkit.inventory.ItemFlag;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
|
||||||
|
public class ItemBuilder {
|
||||||
|
|
||||||
|
private final ItemStack item;
|
||||||
|
|
||||||
|
public ItemBuilder(ItemStack item) {
|
||||||
|
this.item = item;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemBuilder(Material material) {
|
||||||
|
item = new ItemStack(material, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemBuilder(Material material, int amount) {
|
||||||
|
item = new ItemStack(material, amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemBuilder(Material material, int amount, short data) {
|
||||||
|
item = new ItemStack(material, amount, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStack getItem() {
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemBuilder setType(Material material) {
|
||||||
|
if(material == null)
|
||||||
|
return this;
|
||||||
|
|
||||||
|
item.setType(material);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemBuilder setUnbreakable(boolean b) {
|
||||||
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
meta.setUnbreakable(b);
|
||||||
|
item.setItemMeta(meta);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemBuilder setName(String name) {
|
||||||
|
if(name == null)
|
||||||
|
return this;
|
||||||
|
|
||||||
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
meta.setDisplayName(Color.parse(name));
|
||||||
|
this.item.setItemMeta(meta);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemBuilder setLore(List<String> lore) {
|
||||||
|
if(lore == null)
|
||||||
|
return this;
|
||||||
|
|
||||||
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
for(String string : lore)
|
||||||
|
lore.set(lore.indexOf(string), Color.parse(string));
|
||||||
|
|
||||||
|
meta.setLore(lore);
|
||||||
|
item.setItemMeta(meta);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemBuilder setLore(String lore) {
|
||||||
|
List<String> list = new ArrayList<>();
|
||||||
|
list.add(lore);
|
||||||
|
setLore(list);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemBuilder addLore(String lore) {
|
||||||
|
List<String> list = item.getItemMeta().getLore();
|
||||||
|
list.add(lore);
|
||||||
|
setLore(list);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemBuilder setEnchantment(HashMap<Enchantment, Integer> enchantments) {
|
||||||
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
if(!meta.getEnchants().isEmpty())
|
||||||
|
meta.getEnchants().clear();
|
||||||
|
|
||||||
|
for(Map.Entry<Enchantment, Integer> entry : enchantments.entrySet())
|
||||||
|
meta.addEnchant(entry.getKey(), entry.getValue(), true);
|
||||||
|
|
||||||
|
item.setItemMeta(meta);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemBuilder setEnchantment(Enchantment enchantment, int i) {
|
||||||
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
if (!meta.getEnchants().isEmpty())
|
||||||
|
meta.getEnchants().clear();
|
||||||
|
|
||||||
|
meta.addEnchant(enchantment, i, true);
|
||||||
|
item.setItemMeta(meta);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemBuilder addEnchantment(Enchantment enchantment, int i) {
|
||||||
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
meta.addEnchant(enchantment, i, true);
|
||||||
|
item.setItemMeta(meta);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemBuilder addFlag(ItemFlag flag) {
|
||||||
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
meta.addItemFlags(flag);
|
||||||
|
item.setItemMeta(meta);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemBuilder addFlags(ItemFlag... flags) {
|
||||||
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
meta.addItemFlags(flags);
|
||||||
|
item.setItemMeta(meta);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemBuilder clone() {
|
||||||
|
return new ItemBuilder(item.clone());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,150 @@
|
||||||
|
package nl.iobyte.menuapi.item;
|
||||||
|
|
||||||
|
import nl.iobyte.menuapi.action.HandlerAction;
|
||||||
|
import nl.iobyte.menuapi.interfaces.IActionHandler;
|
||||||
|
import nl.iobyte.menuapi.action.MenuAction;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.inventory.ClickType;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class MenuItem {
|
||||||
|
|
||||||
|
private ItemStack item;
|
||||||
|
private boolean cancel;
|
||||||
|
private HashMap<ClickType, ArrayList<MenuAction>> actions = new HashMap<>();
|
||||||
|
|
||||||
|
public MenuItem(ItemStack item, boolean cancel) {
|
||||||
|
this.item = item;
|
||||||
|
this.cancel = cancel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get item
|
||||||
|
* @return ItemStack instance
|
||||||
|
*/
|
||||||
|
public ItemStack getItem() {
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set item
|
||||||
|
* @param item ItemStack instance
|
||||||
|
* @return MenuItem instance
|
||||||
|
*/
|
||||||
|
public MenuItem setItem(ItemStack item) {
|
||||||
|
this.item = item;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Actions for ClickType
|
||||||
|
* @param type Type of Click
|
||||||
|
* @return Array of MenuActions
|
||||||
|
*/
|
||||||
|
public ArrayList<MenuAction> getActions(ClickType type) {
|
||||||
|
if(type == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
if(!actions.containsKey(type))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return actions.get(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add actions to MenuItem
|
||||||
|
* @param type ClickType
|
||||||
|
* @param actions Array of MenuActions
|
||||||
|
* @return MenuItem Instance
|
||||||
|
*/
|
||||||
|
public MenuItem addActions(ClickType type, MenuAction... actions) {
|
||||||
|
if(type == null || actions == null)
|
||||||
|
return this;
|
||||||
|
|
||||||
|
ArrayList<MenuAction> array = new ArrayList<>();
|
||||||
|
if(this.actions.containsKey(type)) {
|
||||||
|
array = this.actions.get(type);
|
||||||
|
} else {
|
||||||
|
this.actions.put(type, array);
|
||||||
|
}
|
||||||
|
|
||||||
|
array.addAll(Arrays.asList(actions));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add actions to MenuItem
|
||||||
|
* @param types List of ClickType
|
||||||
|
* @param actions Array of MenuActions
|
||||||
|
* @return MenuItem Instance
|
||||||
|
*/
|
||||||
|
public MenuItem addActions(List<ClickType> types, MenuAction... actions) {
|
||||||
|
for(ClickType type : types)
|
||||||
|
addActions(type, actions);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add actions to MenuItem for any type of Click
|
||||||
|
* @param actions Array of MenuActions
|
||||||
|
* @return MenuItem Instance
|
||||||
|
*/
|
||||||
|
public MenuItem addActions(MenuAction... actions) {
|
||||||
|
for(ClickType type : ClickType.values()) {
|
||||||
|
addActions(type, actions);
|
||||||
|
addActions(type, actions);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add actions to MenuItem
|
||||||
|
* @param handlers IActionHandler[]
|
||||||
|
* @return MenuItem Instance
|
||||||
|
*/
|
||||||
|
public MenuItem addActions(IActionHandler... handlers) {
|
||||||
|
for(IActionHandler handler : handlers)
|
||||||
|
addActions(handler.getClickTypes(), new MenuAction() {
|
||||||
|
public void execute(Player player) {
|
||||||
|
handler.execute(player);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get if should do cancel
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public boolean doCancel() {
|
||||||
|
return cancel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set if should do cancel
|
||||||
|
* @param cancel boolean
|
||||||
|
* @return MenuItem Instance
|
||||||
|
*/
|
||||||
|
public MenuItem setCancel(boolean cancel) {
|
||||||
|
this.cancel = cancel;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clone menu item
|
||||||
|
* @return MenuItem
|
||||||
|
*/
|
||||||
|
public MenuItem clone() {
|
||||||
|
MenuItem mi = new MenuItem(item.clone(), cancel);
|
||||||
|
mi.actions = actions;
|
||||||
|
return mi;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,96 @@
|
||||||
|
package nl.iobyte.menuapi.map;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
public class WeakConcurrentHashMap<K, V> extends ConcurrentHashMap<K, V> {
|
||||||
|
|
||||||
|
private Map<K, Long> timeMap = new ConcurrentHashMap<>();
|
||||||
|
private long expiryInMillis;
|
||||||
|
private boolean mapAlive = true;
|
||||||
|
|
||||||
|
public WeakConcurrentHashMap() {
|
||||||
|
this.expiryInMillis = 10 * 1000;
|
||||||
|
initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
public WeakConcurrentHashMap(long expiryInMillis) {
|
||||||
|
this.expiryInMillis = expiryInMillis;
|
||||||
|
initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
void initialize() {
|
||||||
|
new CleanerThread().start();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public V put(K key, V value) {
|
||||||
|
if (!mapAlive)
|
||||||
|
throw new IllegalStateException("WeakConcurrent Hashmap is no more alive.. Try creating a new one.");
|
||||||
|
|
||||||
|
Date date = new Date();
|
||||||
|
timeMap.put(key, date.getTime());
|
||||||
|
return super.put(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public V get(Object key) {
|
||||||
|
if (!mapAlive)
|
||||||
|
throw new IllegalStateException("WeakConcurrent Hashmap is no more alive.. Try creating a new one.");
|
||||||
|
|
||||||
|
Date date = new Date();
|
||||||
|
timeMap.put((K) key, date.getTime());
|
||||||
|
return super.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void putAll(Map<? extends K, ? extends V> m) {
|
||||||
|
if (!mapAlive)
|
||||||
|
throw new IllegalStateException("WeakConcurrent Hashmap is no more alive.. Try creating a new one.");
|
||||||
|
|
||||||
|
for (K key : m.keySet())
|
||||||
|
put(key, m.get(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public V putIfAbsent(K key, V value) {
|
||||||
|
if (!mapAlive)
|
||||||
|
throw new IllegalStateException("WeakConcurrent Hashmap is no more alive.. Try creating a new one.");
|
||||||
|
|
||||||
|
return !containsKey(key) ? put(key, value) : get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void quitMap() {
|
||||||
|
mapAlive = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isAlive() {
|
||||||
|
return mapAlive;
|
||||||
|
}
|
||||||
|
|
||||||
|
class CleanerThread extends Thread {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
while (mapAlive) {
|
||||||
|
cleanMap();
|
||||||
|
try {
|
||||||
|
Thread.sleep(expiryInMillis / 2);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void cleanMap() {
|
||||||
|
long currentTime = new Date().getTime();
|
||||||
|
for (K key : timeMap.keySet())
|
||||||
|
if (currentTime > (timeMap.get(key) + expiryInMillis))
|
||||||
|
timeMap.remove(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package nl.iobyte.menuapi.multi;
|
||||||
|
|
||||||
|
import nl.iobyte.menuapi.basic.Menu;
|
||||||
|
|
||||||
|
public class MenuPage extends Menu {
|
||||||
|
|
||||||
|
private final MultiMenu menu;
|
||||||
|
|
||||||
|
public MenuPage(String title, int size, MultiMenu menu) {
|
||||||
|
super(title, size);
|
||||||
|
this.menu = menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MenuPage(String title, int size, boolean locked, MultiMenu menu) {
|
||||||
|
super(title, size, locked);
|
||||||
|
this.menu = menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MultiMenu getParent() {
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,467 @@
|
||||||
|
package nl.iobyte.menuapi.multi;
|
||||||
|
|
||||||
|
import nl.iobyte.menuapi.action.InteractAction;
|
||||||
|
import nl.iobyte.menuapi.interfaces.IMenu;
|
||||||
|
import nl.iobyte.menuapi.item.MenuItem;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.inventory.ClickType;
|
||||||
|
import org.bukkit.inventory.Inventory;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class MultiMenu implements IMenu {
|
||||||
|
|
||||||
|
private String title;
|
||||||
|
private ArrayList<Integer> page_sizes;
|
||||||
|
private InteractAction open, close;
|
||||||
|
private boolean locked = true;
|
||||||
|
|
||||||
|
private final HashMap<Integer, MenuPage> pages = new HashMap<>();
|
||||||
|
private final HashMap<UUID, MenuPage> page_data = new HashMap<>();
|
||||||
|
|
||||||
|
public MultiMenu(String title, ArrayList<Integer> page_sizes) {
|
||||||
|
this.title = title;
|
||||||
|
this.page_sizes = page_sizes;
|
||||||
|
buildPages();
|
||||||
|
}
|
||||||
|
|
||||||
|
public MultiMenu(String title, ArrayList<Integer> page_sizes, boolean locked) {
|
||||||
|
this.title = title;
|
||||||
|
this.page_sizes = page_sizes;
|
||||||
|
this.locked = locked;
|
||||||
|
buildPages();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return inventory sizes
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public ArrayList<Integer> getPageSizes() {
|
||||||
|
return page_sizes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set sizes
|
||||||
|
* @param page_sizes int
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public IMenu setPageSizes(ArrayList<Integer> page_sizes) {
|
||||||
|
this.page_sizes = page_sizes;
|
||||||
|
buildPages();
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get item of first page
|
||||||
|
* @param slot int
|
||||||
|
* @return MenuItem
|
||||||
|
*/
|
||||||
|
public MenuItem getItem(int slot) {
|
||||||
|
int[] data = getSlot(slot);
|
||||||
|
if(data == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return getItem(data[0], data[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get item on page
|
||||||
|
* @param page int
|
||||||
|
* @param slot int
|
||||||
|
* @return MenuItem
|
||||||
|
*/
|
||||||
|
public MenuItem getItem(int page, int slot) {
|
||||||
|
MenuPage mp = getPage(page);
|
||||||
|
if(mp == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return mp.getItem(slot);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get items of first page
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public HashMap<Integer, MenuItem> getItems() {
|
||||||
|
return getItems(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get items of MenuPage
|
||||||
|
* @param page int
|
||||||
|
* @return HashMap
|
||||||
|
*/
|
||||||
|
public HashMap<Integer, MenuItem> getItems(int page) {
|
||||||
|
if(page < 1)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
MenuPage mp = pages.get(page);
|
||||||
|
if(mp == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return mp.getItems();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set item to slot on first page
|
||||||
|
* @param slot int
|
||||||
|
* @param item MenuItem
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public IMenu setItem(int slot, MenuItem item) {
|
||||||
|
int[] data = getSlot(slot);
|
||||||
|
if(data == null)
|
||||||
|
return this;
|
||||||
|
|
||||||
|
return setItem(data[0], data[1], item);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set item to slot on page
|
||||||
|
* @param page int
|
||||||
|
* @param slot int
|
||||||
|
* @param item MenuItem
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public IMenu setItem(int page, int slot, MenuItem item) {
|
||||||
|
MenuPage mp = getPage(page);
|
||||||
|
if(mp == null)
|
||||||
|
return this;
|
||||||
|
|
||||||
|
return mp.setItem(slot, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set item to slot on first page
|
||||||
|
* @param slot int
|
||||||
|
* @param item ItemStack
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public IMenu setItem(int slot, ItemStack item) {
|
||||||
|
int[] data = getSlot(slot);
|
||||||
|
if(data == null)
|
||||||
|
return this;
|
||||||
|
|
||||||
|
return setItem(data[0], data[1], item);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set item to slot on page
|
||||||
|
* @param page int
|
||||||
|
* @param slot int
|
||||||
|
* @param item ItemStack
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public IMenu setItem(int page, int slot, ItemStack item) {
|
||||||
|
MenuPage mp = getPage(page);
|
||||||
|
if(mp == null)
|
||||||
|
return this;
|
||||||
|
|
||||||
|
mp.setItem(slot, item);
|
||||||
|
return mp.setItem(slot, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set items for first page
|
||||||
|
* @param items MenuItems
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public MultiMenu setItems(HashMap<Integer, MenuItem> items) {
|
||||||
|
return setItems(1, items);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set items for MenuPage
|
||||||
|
* @param page int
|
||||||
|
* @param items HashMap
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public MultiMenu setItems(int page, HashMap<Integer, MenuItem> items) {
|
||||||
|
if(page < 1)
|
||||||
|
return this;
|
||||||
|
|
||||||
|
MenuPage mp = pages.get(page);
|
||||||
|
if(mp == null)
|
||||||
|
return this;
|
||||||
|
|
||||||
|
mp.setItems(items);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update item on first page
|
||||||
|
* @param slot int
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public IMenu updateItem(int slot) {
|
||||||
|
int[] data = getSlot(slot);
|
||||||
|
if(data == null)
|
||||||
|
return this;
|
||||||
|
|
||||||
|
return updateItem(data[0], data[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update item on page
|
||||||
|
* @param page int
|
||||||
|
* @param slot int
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public IMenu updateItem(int page, int slot) {
|
||||||
|
MenuPage mp = getPage(page);
|
||||||
|
if(mp == null)
|
||||||
|
return this;
|
||||||
|
|
||||||
|
mp.updateItem(slot);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get page from slot
|
||||||
|
* @param slot int
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public int[] getSlot(int slot) {
|
||||||
|
int page = 1;
|
||||||
|
int temp = slot;
|
||||||
|
for(int size : page_sizes) {
|
||||||
|
temp -= size;
|
||||||
|
if(temp < 0) {
|
||||||
|
temp += size;
|
||||||
|
return new int[]{
|
||||||
|
page, temp
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
page++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get MenuPage
|
||||||
|
* @param page int
|
||||||
|
* @return MenuPage
|
||||||
|
*/
|
||||||
|
public MenuPage getPage(int page) {
|
||||||
|
if(!pages.containsKey(page))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return pages.get(page);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get MenuPages
|
||||||
|
* @return HashMap
|
||||||
|
*/
|
||||||
|
public HashMap<Integer, MenuPage> getPages() {
|
||||||
|
return pages;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get action on open
|
||||||
|
* @return InteractAction
|
||||||
|
*/
|
||||||
|
public InteractAction getOpenAction() {
|
||||||
|
return open;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set action on open
|
||||||
|
* @param action InteractAction
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public IMenu setOpenAction(InteractAction action) {
|
||||||
|
open = action;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get action on close
|
||||||
|
* @return InteractAction
|
||||||
|
*/
|
||||||
|
public InteractAction getCloseAction() {
|
||||||
|
return close;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set action on close
|
||||||
|
* @param action InteractAction
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public IMenu setCloseAction(InteractAction action) {
|
||||||
|
close = action;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get menu title
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set menu title
|
||||||
|
* @param title String
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public IMenu setTitle(String title) {
|
||||||
|
this.title = title;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get if menu is locked
|
||||||
|
* @return Boolean
|
||||||
|
*/
|
||||||
|
public boolean isLocked() {
|
||||||
|
return locked;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set if menu is locked
|
||||||
|
* @param locked Boolean
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public IMenu setLocked(boolean locked) {
|
||||||
|
this.locked = locked;
|
||||||
|
for(MenuPage page : page_data.values())
|
||||||
|
page.setLocked(locked);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build Menu
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public IMenu build() {
|
||||||
|
for(MenuPage page : pages.values())
|
||||||
|
page.build();
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get menu pages
|
||||||
|
* @return IMenu
|
||||||
|
*/
|
||||||
|
public IMenu buildPages() {
|
||||||
|
int i = 1;
|
||||||
|
for(int size : page_sizes) {
|
||||||
|
MenuPage page = getPage(i);
|
||||||
|
if(page == null) {
|
||||||
|
page = new MenuPage(title, size, locked,this);
|
||||||
|
} else{
|
||||||
|
page.setSize(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
pages.put(i, page);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
int difference = pages.size() - page_sizes.size();
|
||||||
|
if(difference > 0)
|
||||||
|
for(int j = 0; j < difference; j++)
|
||||||
|
pages.remove(page_sizes.size() + j);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return null
|
||||||
|
* @return Inventory
|
||||||
|
*/
|
||||||
|
public Inventory getInventory() {
|
||||||
|
MenuPage mp = pages.get(1);
|
||||||
|
if(mp == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return mp.getInventory();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute non existing Click
|
||||||
|
* @param player Player
|
||||||
|
* @param slot int
|
||||||
|
* @param type ClickType
|
||||||
|
* @return cancel
|
||||||
|
*/
|
||||||
|
public boolean execute(Player player, int slot, ClickType type) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See if MenuPage is open for User
|
||||||
|
* @param uuid UUID
|
||||||
|
* @param page MenuPage
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public boolean isActivePage(UUID uuid, MenuPage page) {
|
||||||
|
if(uuid == null || page == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(!page_data.containsKey(uuid))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
MenuPage mp = page_data.get(uuid);
|
||||||
|
return mp == page;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open first page of inventory
|
||||||
|
* @param player Player
|
||||||
|
*/
|
||||||
|
public void open(Player player) {
|
||||||
|
open(player, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open page of invetory
|
||||||
|
* @param player Player
|
||||||
|
* @param page int
|
||||||
|
*/
|
||||||
|
public void open(Player player, int page) {
|
||||||
|
if(player == null || page < 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(!pages.containsKey(page))
|
||||||
|
return;
|
||||||
|
|
||||||
|
MenuPage mp = pages.get(page);
|
||||||
|
page_data.put(player.getUniqueId(), mp);
|
||||||
|
mp.open(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close inventory of Player
|
||||||
|
* @param player Player
|
||||||
|
*/
|
||||||
|
public void close(Player player) {
|
||||||
|
if(player == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
page_data.remove(player.getUniqueId());
|
||||||
|
player.closeInventory();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clone Menu
|
||||||
|
* @return MultiMenu
|
||||||
|
*/
|
||||||
|
public MultiMenu clone() {
|
||||||
|
MultiMenu menu = new MultiMenu(title, page_sizes);
|
||||||
|
for(Map.Entry<Integer, MenuPage> entrySet : pages.entrySet())
|
||||||
|
menu.setItems(entrySet.getKey(), entrySet.getValue().getItems());
|
||||||
|
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue