package us.tastybento.bskyblock.api.panels; import java.util.Map; import java.util.Optional; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import us.tastybento.bskyblock.api.user.User; import us.tastybento.bskyblock.listeners.PanelListenerManager; import us.tastybento.bskyblock.util.HeadGetter; import us.tastybento.bskyblock.util.HeadRequester; public class Panel implements HeadRequester { private Inventory inventory; private Map items; private PanelListener listener; private User user; private final String name; public Panel(String name, Map items, int size, User user, PanelListener listener) { this.name = name; this.items = items; // If size is undefined (0) then use the number of items if (size == 0) { size = items.keySet().size(); } // Create panel if (size > 0) { // Make sure size is a multiple of 9 size = size + 8; size -= (size % 9); inventory = Bukkit.createInventory(null, size, name); // Fill the inventory and return for (Map.Entry en: items.entrySet()) { //TODO allow multi-paging if (en.getKey() < 54) inventory.setItem(en.getKey(), en.getValue().getItem()); // Get player head async if (en.getValue().isPlayerHead()) { HeadGetter.getHead(en.getValue(), this); } } } else { inventory = Bukkit.createInventory(null, 9, name); } this.listener = listener; // If the listener is defined, then run setup if (listener != null) listener.setup(); // If the user is defined, then open panel immediately this.user = user; if (user != null) this.open(user); } public Inventory getInventory() { return inventory; } public Map getItems() { return items; } /** * @return the listener */ public Optional getListener() { return Optional.ofNullable(listener); } public Optional getUser() { return Optional.ofNullable(user); } public void open(Player... players) { for (Player player : players) { player.openInventory(inventory); PanelListenerManager.getOpenPanels().put(player.getUniqueId(), this); } } /** * Open the inventory panel * @param users - users that should see the panel */ public void open(User... users) { for (User u : users) { u.getPlayer().openInventory(inventory); PanelListenerManager.getOpenPanels().put(u.getUniqueId(), this); } } /** * @param inventory the inventory to set */ public void setInventory(Inventory inventory) { this.inventory = inventory; } /** * @param items the items to set */ public void setItems(Map items) { this.items = items; } /** * @param listener the listener to set */ public void setListener(PanelListener listener) { this.listener = listener; } /** * @param user - the User the user to set */ public void setUser(User user) { this.user = user; } @Override public void setHead(PanelItem item) { // Update the panel item items.values().stream().filter(i -> i.getName().equals(item.getName())).forEach(i -> i = item); for (int i = 0; i < inventory.getSize(); i++) { ItemStack it = inventory.getItem(i); if (it != null && it.getType().equals(Material.SKULL_ITEM)) { ItemMeta meta = it.getItemMeta(); if (item.getName().equals(meta.getLocalizedName())) { inventory.setItem(i, item.getItem()); return; } } } } /** * @return the name */ public String getName() { return name; } }