Untitled
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