diff --git a/src/minecraft/core/zocker/pro/inventory/browser/InventoryBrowser.java b/src/minecraft/core/zocker/pro/inventory/browser/InventoryBrowser.java new file mode 100644 index 0000000..0cba1ee --- /dev/null +++ b/src/minecraft/core/zocker/pro/inventory/browser/InventoryBrowser.java @@ -0,0 +1,170 @@ +package minecraft.core.zocker.pro.inventory.browser; + +import minecraft.core.zocker.pro.Zocker; +import minecraft.core.zocker.pro.compatibility.CompatibleMaterial; +import minecraft.core.zocker.pro.inventory.InventoryEntry; +import minecraft.core.zocker.pro.inventory.InventoryZocker; +import minecraft.core.zocker.pro.inventory.builder.InventoryEntryBuilder; +import minecraft.core.zocker.pro.inventory.util.ItemBuilder; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public final class InventoryBrowser { + + private final List availableSlots = Arrays.stream(IntStream.range(0, 53).toArray()).boxed().collect(Collectors.toList()); + + private final ItemStack border = new ItemBuilder(CompatibleMaterial.BLACK_STAINED_GLASS_PANE.getItem()) + .setDisplayName("ยง7") + .toItemStack(); + + private final ConcurrentMap> inventoryTabs = new ConcurrentHashMap<>(); + private final InventoryTab initialTab; + + private final String title; + + @SafeVarargs + public InventoryBrowser(String title, InventoryTab... pages) { + this.title = title; + this.initialTab = pages[0]; + + for (InventoryTab page : pages) { + page.setBrowser(this); + inventoryTabs.put(page.getTabSlot(), page); + } + + final List borderSlots = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 17, 18, 26, 27, 35, 36, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53); + availableSlots.removeAll(borderSlots); + } + + public void open(T zocker) { + open(zocker, initialTab); + } + + protected void open(T zocker, int key) { + open(zocker, inventoryTabs.get(key)); + } + + private void open(T zocker, InventoryTab tab) { + final BrowserSession session = new BrowserSession<>(zocker, title, this::supplyMenu, border, tab); + + session.getInventory().open(zocker); + } + + private List supplyMenu(BrowserSession session) { + return inventoryTabs.values() + .stream() + .map(tab -> { + final ItemBuilder builder = tab.getTabSlotItem(); + + if (tab == session.actualTab) { + builder.addEnchantment(Enchantment.DURABILITY, 1); + builder.addItemFlag(ItemFlag.HIDE_ENCHANTS); + } + + return new InventoryEntryBuilder() + .setSlot(tab.getTabSlot()) + .setItem(builder.toItemStack()) + .onClick(e -> { + if (e.getSlot() != session.actualTab.getTabSlot()) { + final InventoryTab otherTab = inventoryTabs.get(e.getSlot()); + if (otherTab != null) { + session.setActualTab(otherTab); + supplyMenu(session); + + session.show(); + } + } + }).build(); + }).collect(Collectors.toList()); + } + + public List getAvailableSlots() { + return availableSlots; + } + + private static final class BrowserSession { + private final T zocker; + + private final String title; + private final Function, Collection> itemConsumer; + + private final ItemStack border; + + private InventoryTab actualTab; + + public BrowserSession(T zocker, String title, Function, Collection> itemConsumer, ItemStack border, InventoryTab actualTab) { + this.zocker = zocker; + this.title = title; + this.itemConsumer = itemConsumer; + this.border = border; + this.actualTab = actualTab; + } + + public void show(){ + getInventory().open(zocker); + } + + public void setActualTab(InventoryTab actualTab) { + this.actualTab = actualTab; + } + + public InventoryZocker getInventory() { + final BrowserSession session = this; + return new InventoryZocker() { + @Override + public String getTitle() { + return title; + } + + @Override + public InventoryType getInventoryType() { + return InventoryType.CHEST; + } + + @Override + public Integer getSize() { + return 6 * 9; + } + + @Override + public ItemStack getBorder() { + return border; + } + + @Override + public InventoryEntry getInfoSign() { + final InventoryTab tab = session.actualTab; + final InventoryEntry item = tab.getInfoItem(session.zocker); + + return item != null + ? item + : new InventoryEntryBuilder().setItem(border).build(); + } + + @Override + public void setupInventory() { + fillBorders(); + + actualTab.setupTab(zocker); + for (InventoryEntry entry : actualTab.getEntryList()) { + addItem(entry); + } + + Collection entries = itemConsumer.apply(session); + entries.forEach(this::addItem); + } + }; + } + } +} \ No newline at end of file diff --git a/src/minecraft/core/zocker/pro/inventory/browser/InventoryTab.java b/src/minecraft/core/zocker/pro/inventory/browser/InventoryTab.java new file mode 100644 index 0000000..3173917 --- /dev/null +++ b/src/minecraft/core/zocker/pro/inventory/browser/InventoryTab.java @@ -0,0 +1,63 @@ +package minecraft.core.zocker.pro.inventory.browser; + +import minecraft.core.zocker.pro.Zocker; +import minecraft.core.zocker.pro.inventory.InventoryEntry; +import minecraft.core.zocker.pro.inventory.util.ItemBuilder; +import org.bukkit.ChatColor; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public abstract class InventoryTab { + private final List availableSlots = Arrays.stream(IntStream.range(0, 53).toArray()).boxed().collect(Collectors.toList()); + + private final List entryList = new ArrayList<>(); + + private InventoryBrowser browser; + + public InventoryTab() { + final List borderSlots = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 17, 18, 26, 27, 35, 36, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53); + availableSlots.removeAll(borderSlots); + } + + protected final void addItem(InventoryEntry item) { + entryList.add(item); + } + + protected final void reload(T zocker) { + openTab(zocker, getTabSlot()); + } + + protected final void openTab(T zocker, int key) { + browser.open(zocker, key); + } + + public abstract int getTabSlot(); + + public abstract ItemBuilder getTabSlotItem(); + + public abstract void setupTab(T zocker); + + public InventoryEntry getInfoItem(T zocker) { + return null; + } + + protected final String color(String text) { + return ChatColor.translateAlternateColorCodes('&', text); + } + + public InventoryBrowser getBrowser() { + return browser; + } + + public void setBrowser(InventoryBrowser browser) { + this.browser = browser; + } + + public List getEntryList() { + return entryList; + } +} \ No newline at end of file