Untitled

 avatar
unknown
plain_text
6 months ago
16 kB
4
Indexable
package org.ogfactions.coinshop;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;

import net.md_5.bungee.api.ChatColor;

public class Main extends JavaPlugin implements Listener {
    private Logger logger = Bukkit.getLogger();

    @Override
    public void onEnable() {
        saveDefaultConfig();
        Bukkit.getServer().getPluginManager().registerEvents(this, this);
        logger.info("CoinShop enabled.");
    }

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        logger.info("Received command: " + label + " with args: " + String.join(", ", args));
        if (command.getName().equalsIgnoreCase("coinshop")) {
            if (args.length == 0) {
                if (sender instanceof Player) {
                    Player player = (Player) sender;
                    openCoinShopGUI(player);
                    logger.info("Opened CoinShop GUI for " + player.getName());
                } else {
                    sender.sendMessage("This command can only be used by players.");
                }
                return true;
            }

            if (args.length >= 1) {
                switch (args[0].toLowerCase()) {
                    case "reload":
                        if (sender.isOp()) {
                            reloadConfig();
                            sender.sendMessage("CoinShop configuration reloaded.");
                            logger.info("CoinShop configuration reloaded by " + sender.getName());
                        } else {
                            sender.sendMessage("You do not have permission to perform this command.");
                        }
                        return true;

                    case "check":
                        if (args.length == 2) {
                            Player target = Bukkit.getPlayer(args[1]);
                            if (target != null) {
                                int coins = getConfig().getInt("coins." + target.getUniqueId());
                                sender.sendMessage(target.getName() + " has " + coins + " coins.");
                                logger.info("Checked coins for " + target.getName());
                            } else {
                                sender.sendMessage("Player not found.");
                                logger.warning("Player not found for checking coins.");
                            }
                        } else {
                            sender.sendMessage("Usage: /coinshop check <player>");
                        }
                        return true;

                    case "give":
                        if (args.length == 3) {
                            Player target = Bukkit.getPlayer(args[1]);
                            if (target != null) {
                                int amount = Integer.parseInt(args[2]);
                                int currentCoins = getConfig().getInt("coins." + target.getUniqueId());
                                getConfig().set("coins." + target.getUniqueId(), currentCoins + amount);
                                saveConfig();
                                sender.sendMessage("Given " + amount + " coins to " + target.getName() + ".");
                                target.sendMessage("You have received " + amount + " coins.");
                                logger.info("Gave " + amount + " coins to " + target.getName());
                            } else {
                                sender.sendMessage("Player not found.");
                                logger.warning("Player not found for giving coins.");
                            }
                        } else {
                            sender.sendMessage("Usage: /coinshop give <player> <amount>");
                        }
                        return true;

                    case "remove":
                        if (args.length == 3) {
                            Player target = Bukkit.getPlayer(args[1]);
                            if (target != null) {
                                int amount = Integer.parseInt(args[2]);
                                int currentCoins = getConfig().getInt("coins." + target.getUniqueId());
                                if (amount > currentCoins) {
                                    sender.sendMessage("Cannot remove more coins than the player has.");
                                    logger.info("Attempted to remove more coins than available for " + target.getName());
                                } else {
                                    getConfig().set("coins." + target.getUniqueId(), currentCoins - amount);
                                    saveConfig();
                                    sender.sendMessage("Removed " + amount + " coins from " + target.getName() + ".");
                                    target.sendMessage("You have had " + amount + " coins removed.");
                                    logger.info("Removed " + amount + " coins from " + target.getName());
                                }
                            } else {
                                sender.sendMessage("Player not found.");
                                logger.warning("Player not found for removing coins.");
                            }
                        } else {
                            sender.sendMessage("Usage: /coinshop remove <player> <amount>");
                        }
                        return true;
                }
            }

            sender.sendMessage("Invalid or insufficient arguments provided. Usage: /coinshop [check|give|remove|reload] <player> [amount]");
            logger.warning("Invalid or insufficient arguments provided for coinshop command.");
            return false;
        }
        return false;
    }


    private void openCoinShopGUI(Player player) {
        Inventory gui = Bukkit.createInventory(null, getConfig().getInt("CoinShopGUI.size"),
                ChatColor.translateAlternateColorCodes('&', getConfig().getString("CoinShopGUI.name")));
        ItemStack filler = createItem(Material.BLACK_STAINED_GLASS_PANE, " ");

        for (int i = 0; i < gui.getSize(); i++) {
            gui.setItem(i, filler);
        }

        List<Map<?, ?>> categories = getConfig().getMapList("CoinShopGUI.categories");
        for (Map<?, ?> category : categories) {
            ItemStack item = createItem(Material.valueOf((String) category.get("display_item")),
                    ChatColor.translateAlternateColorCodes('&', (String) category.get("name")));
            gui.setItem((Integer) category.get("slot"), item);
        }

        player.openInventory(gui);
        logger.info("CoinShop GUI opened for " + player.getName());
    }

    private ItemStack createItem(Material material, String name) {
        ItemStack item = new ItemStack(material);
        ItemMeta meta = item.getItemMeta();
        meta.setDisplayName(name);
        item.setItemMeta(meta);
        return item;
    }

    @EventHandler
    public void onInventoryClick(InventoryClickEvent event) {
        if (event.getWhoClicked() instanceof Player) {
            Player player = (Player) event.getWhoClicked();
            String title = event.getView().getTitle();

            // Main CoinShop GUI check
            if (title.equals(ChatColor.translateAlternateColorCodes('&', getConfig().getString("CoinShopGUI.name")))) {
                event.setCancelled(true); // Cancel item movement
                ItemStack clickedItem = event.getCurrentItem();

                if (clickedItem != null && clickedItem.getType() != Material.AIR && clickedItem.hasItemMeta() && clickedItem.getItemMeta().hasDisplayName()) {
                    handleItemPurchase(player, clickedItem, event.getInventory());
                }
            }

            // Check for category GUIs (like Rare Items, Common Items)
            List<Map<?, ?>> categories = getConfig().getMapList("CoinShopGUI.categories");
            for (Map<?, ?> category : categories) {
                String categoryName = ChatColor.translateAlternateColorCodes('&', (String) category.get("name"));
                if (title.equals(categoryName)) {
                    event.setCancelled(true); // Cancel item movement in category GUI
                    ItemStack clickedItem = event.getCurrentItem();

                    if (clickedItem != null && clickedItem.getType() != Material.AIR && clickedItem.hasItemMeta() && clickedItem.getItemMeta().hasDisplayName()) {
                        handleItemPurchase(player, clickedItem, event.getInventory());
                    }
                }
            }
        }
    }


    private void handleItemPurchase(Player player, ItemStack clickedItem, Inventory inventory) {
        if (clickedItem == null || !clickedItem.hasItemMeta() || clickedItem.getItemMeta().getDisplayName() == null) {
            player.sendMessage(ChatColor.RED + "Invalid item clicked.");
            return;
        }

        // Strip color codes from the clicked item's display name for comparison
        String displayName = ChatColor.stripColor(clickedItem.getItemMeta().getDisplayName());
        logger.info("Player clicked item with stripped display name: " + displayName);

        List<Map<?, ?>> categories = getConfig().getMapList("CoinShopGUI.categories");
        boolean foundMatch = false;

        for (Map<?, ?> category : categories) {
            // Translate color codes and strip them for comparison
            String rawCategoryName = ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', (String) category.get("name")));
            logger.info("Checking against stripped category name: " + rawCategoryName);

            // Check if the clicked item matches a category name
            if (rawCategoryName.equals(displayName)) {
                openCategoryGUI(player, category);
                logger.info("Category GUI opened for player " + player.getName() + " for category " + rawCategoryName);
                foundMatch = true;
                break;
            }

            // Proceed to check items within the category
            List<Map<?, ?>> items = (List<Map<?, ?>>) category.get("items");
            if (items != null) {
                for (Map<?, ?> item : items) {
                    // Translate color codes and strip for comparison
                    String rawItemName = ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', (String) item.get("display_name")));
                    logger.info("Checking against stripped item name: " + rawItemName);

                    if (rawItemName.equals(displayName)) {
                        int cost = (int) item.get("cost");
                        int playerCoins = getConfig().getInt("coins." + player.getUniqueId().toString());

                        if (playerCoins >= cost) {
                            getConfig().set("coins." + player.getUniqueId().toString(), playerCoins - cost);
                            saveConfig();
                            executePurchaseCommands(player, (List<String>) item.get("commands_on_purchase"));
                            player.sendMessage(ChatColor.GREEN + "Purchase successful!");
                            foundMatch = true;
                        } else {
                            player.sendMessage(ChatColor.RED + "Not enough coins!");
                        }
                        logger.info("Handled item purchase in GUI for " + player.getName() + " for item " + rawItemName);
                        break;
                    }
                }
            }

            if (foundMatch) {
                break;
            }
        }
    }


    private void openCategoryGUI(Player player, Map<?, ?> category) {
        String categoryName = ChatColor.translateAlternateColorCodes('&', (String) category.get("name"));
        Inventory categoryGUI = Bukkit.createInventory(null, 27, categoryName);

        // Create and add the filler item to all empty slots
        ItemStack filler = createItem(Material.BLACK_STAINED_GLASS_PANE, " ");
        for (int i = 0; i < categoryGUI.getSize(); i++) {
            categoryGUI.setItem(i, filler);
        }

        List<Map<?, ?>> items = (List<Map<?, ?>>) category.get("items");
        if (items != null) {
            for (Map<?, ?> item : items) {
                String displayName = (String) item.get("display_name");
                String displayItemType = (String) item.get("display_item");
                Integer itemSlot = (Integer) item.get("slot");
                Integer cost = (Integer) item.get("cost");
                List<String> lore = (List<String>) item.get("lore"); // Retrieve lore from config

                if (displayName != null && displayItemType != null && itemSlot != null && cost != null) {
                    Material material = Material.matchMaterial(displayItemType);
                    if (material != null) {
                        ItemStack itemStack = createItemWithLore(material, ChatColor.translateAlternateColorCodes('&', displayName), cost, lore);
                        categoryGUI.setItem(itemSlot, itemStack);
                    }
                }
            }
        }

        player.openInventory(categoryGUI);
    }
    
    private ItemStack createItemWithLore(Material material, String name, int cost, List<String> lore) {
        ItemStack item = new ItemStack(material);
        ItemMeta meta = item.getItemMeta();
        meta.setDisplayName(name);

        // Add cost to lore
        List<String> finalLore = new ArrayList<>();
        if (lore != null) {
            for (String loreLine : lore) {
                finalLore.add(ChatColor.translateAlternateColorCodes('&', loreLine));
            }
        }
        finalLore.add(ChatColor.GRAY + "Cost: " + ChatColor.GOLD + cost + " coins");
        meta.setLore(finalLore);

        item.setItemMeta(meta);
        return item;
    }


    private ItemStack createItem(Material material, String name, int cost) {
        ItemStack item = new ItemStack(material);
        ItemMeta meta = item.getItemMeta();
        meta.setDisplayName(name);
        List<String> lore = new ArrayList<>();
        lore.add(ChatColor.GRAY + "Cost: " + ChatColor.GOLD + cost + " coins");
        meta.setLore(lore);
        item.setItemMeta(meta);
        return item;
    }

    private void executePurchaseCommands(Player player, List<String> commands) {
        for (String command : commands) {
            this.getServer().dispatchCommand(this.getServer().getConsoleSender(), command.replace("%player%", player.getName()));
        }
    }
}
Editor is loading...
Leave a Comment