Untitled
unknown
plain_text
a year ago
16 kB
6
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