All source projects

MrUltimateLibrary Source

Standalone source project / 68 files

MrUltimateLibrary is the backbone of all my plugins; it offers features that facilitate plugin creation, maintenance, and updates.

java

MrUltimateLibrary/src/main/java/eu/mrneznamy/mrultimatelibrary/guide/MrLibGuideManager.java

JAVA · Read-only source

package eu.mrneznamy.mrultimatelibrary.guide;

import eu.mrneznamy.mrultimatelibrary.MrLibVersionDetector;
import eu.mrneznamy.mrultimatelibrary.gui.MrLibGUI;
import eu.mrneznamy.mrultimatelibrary.utils.MrLibColors;
import eu.mrneznamy.mrultimatelibrary.utils.MrLibConsoleSayer;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class MrLibGuideManager {
    
    private static MrLibGuideManager instance;
    private final Map<String, GuideCategory> pluginCategories = new HashMap<>();
    
    private MrLibGuideManager() {}
    
    public static MrLibGuideManager getInstance() {
        if (instance == null) {
            instance = new MrLibGuideManager();
        }
        return instance;
    }
    
    public void registerPluginCategory(String pluginName, GuideCategory category) {
        pluginCategories.put(pluginName, category);
    }

    public void unregisterPluginCategory(String pluginName) {
        pluginCategories.remove(pluginName);
    }
    
    public void openGuide(Player player) {
        if (!MrLibVersionDetector.isAtLeast(21)) { 
             
            MrLibConsoleSayer.MrSay_Warning("Old Server - Some functions cant be enabled.");
            player.sendMessage(MrLibColors.colorize("&cThis feature requires Minecraft 1.21 or newer."));
            return;
        }
        
        openCategory(player, null);
    }
    
    public void openCategory(Player player, GuideCategory category) {
        openCategory(player, category, 0);
    }

    public void openCategory(Player player, GuideCategory category, int page) {
        String title = category == null ? "&8MrUltimateLibrary - Guide" : category.getTitle();
        MrLibGUI gui = new MrLibGUI(MrLibColors.colorize(title), 6);
        
        
        ItemStack border = new ItemStack(Material.GRAY_STAINED_GLASS_PANE);
        ItemMeta borderMeta = border.getItemMeta();
        if (borderMeta != null) {
            borderMeta.setDisplayName(" ");
            border.setItemMeta(borderMeta);
        }
        gui.fillBorder(border);
        
        
        ItemStack helpBook = new ItemStack(Material.BOOK);
        ItemMeta helpMeta = helpBook.getItemMeta();
        if (helpMeta != null) {
            helpMeta.setDisplayName(MrLibColors.colorize("&b&lGuide Info"));
            helpMeta.setLore(Arrays.asList(
                MrLibColors.colorize("&7Left-Click: &fGive 1 item"),
                MrLibColors.colorize("&7Right-Click: &fGive 64 items")
            ));
            helpBook.setItemMeta(helpMeta);
        }
        gui.setItem(4, helpBook);
        
        int slot = 10;
        
        if (category == null) {
            
            for (Map.Entry<String, GuideCategory> entry : pluginCategories.entrySet()) {
                if (slot > 43) break; 
                GuideCategory pluginCategory = entry.getValue();
                ItemStack icon = pluginCategory.getIcon().clone();
                ItemMeta meta = icon.getItemMeta();
                if (meta != null) {
                    String gradientTitle = "{#8B5CF6>}" + pluginCategory.getTitle() + "{#3B82F6<}";
                    meta.setDisplayName(MrLibColors.colorize(gradientTitle));
                    icon.setItemMeta(meta);
                }
                
                gui.setItem(slot, icon, event -> {
                    openCategory(player, pluginCategory);
                });
                
                slot++;
                if (slot % 9 == 8) slot += 2; 
            }
        } else {
            
            java.util.List<Object> allItems = new java.util.ArrayList<>();
            allItems.addAll(category.getSubCategories());
            allItems.addAll(category.getItems());
            
            int itemsPerPage = 28; 
            int totalPages = (int) Math.ceil((double) allItems.size() / itemsPerPage);
            
            
            if (page < 0) page = 0;
            if (page >= totalPages && totalPages > 0) page = totalPages - 1;
            
            int startIndex = page * itemsPerPage;
            int endIndex = Math.min(startIndex + itemsPerPage, allItems.size());
            
            for (int i = startIndex; i < endIndex; i++) {
                Object obj = allItems.get(i);
                
                if (obj instanceof GuideCategory) {
                    GuideCategory sub = (GuideCategory) obj;
                    ItemStack icon = sub.getIcon().clone();
                    ItemMeta meta = icon.getItemMeta();
                    if (meta != null) {
                        String gradientTitle = "{#8B5CF6>}" + sub.getTitle() + "{#3B82F6<}";
                        meta.setDisplayName(MrLibColors.colorize(gradientTitle));
                        icon.setItemMeta(meta);
                    }
                    
                    gui.setItem(slot, icon, event -> {
                        openCategory(player, sub);
                    });
                } else if (obj instanceof GuideItem) {
                    GuideItem item = (GuideItem) obj;
                    ItemStack displayItem = item.getItem().clone();
                    
                    gui.setItem(slot, displayItem, event -> {
                        if (event.isLeftClick()) {
                            ItemStack toGive = item.getItem().clone();
                            toGive.setAmount(1);
                            player.getInventory().addItem(toGive);
                        } else if (event.isRightClick()) {
                            ItemStack toGive = item.getItem().clone();
                            toGive.setAmount(64);
                            player.getInventory().addItem(toGive);
                        }
                    });
                }
                
                slot++;
                if (slot % 9 == 8) slot += 2;
            }
            
            
            if (page > 0) {
                ItemStack prevPage = new ItemStack(Material.ARROW);
                ItemMeta meta = prevPage.getItemMeta();
                if (meta != null) {
                    meta.setDisplayName(MrLibColors.colorize("&ePrevious Page"));
                    prevPage.setItemMeta(meta);
                }
                int finalPage = page;
                gui.setItem(48, prevPage, event -> openCategory(player, category, finalPage - 1));
            }
            
            if (page < totalPages - 1) {
                ItemStack nextPage = new ItemStack(Material.ARROW);
                ItemMeta meta = nextPage.getItemMeta();
                if (meta != null) {
                    meta.setDisplayName(MrLibColors.colorize("&eNext Page"));
                    nextPage.setItemMeta(meta);
                }
                int finalPage = page;
                gui.setItem(50, nextPage, event -> openCategory(player, category, finalPage + 1));
            }
            
            
            if (category.getParent() != null || category != null) {
                ItemStack back = new ItemStack(Material.BARRIER);
                ItemMeta meta = back.getItemMeta();
                if (meta != null) {
                    meta.setDisplayName(MrLibColors.colorize("&cBack"));
                    back.setItemMeta(meta);
                }
                gui.setItem(49, back, event -> {
                    openCategory(player, category.getParent());
                });
            }
        }
        
        gui.open(player);
    }
}
194 linesGNU GENERAL PUBLIC LICENSE · Version 3, 29 June 2007 · UTF-8 · Read only