package Sdf1_login; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import java.lang.reflect.Method; import java.util.*; public class PointsManager { private final Main plugin; private Object cyInstance = null; private Method cyActivationMethod = null; private Method cyGetShopItemsMethod = null; private final List> cyItems = new ArrayList<>(); public PointsManager(Main plugin) { this.plugin = plugin; discoverCY(); } private void discoverCY() { try { org.bukkit.plugin.Plugin p = Bukkit .getPluginManager() .getPlugin("CY_beibao"); if (p != null && p.isEnabled()) { cyInstance = p; cyGetShopItemsMethod = p.getClass() .getMethod("onSdf1GetShopItems"); cyActivationMethod = p.getClass() .getMethod("onSdf1Activation", String.class, int.class, int.class); plugin.getLogger().info( "[Sdf1_login] CY_beibao 联控已连接"); } } catch (Exception ignored) {} } // ===== CY 商品拉取 ===== private void refreshCYItems() { cyItems.clear(); if (cyInstance == null || cyGetShopItemsMethod == null) return; try { Object result = cyGetShopItemsMethod.invoke(cyInstance); if (result == null) return; String data = result.toString(); if (data.isEmpty()) return; String[] items = data.split(";"); for (String itemStr : items) { String[] p = itemStr.split("\\|"); if (p.length < 8) continue; Map item = new LinkedHashMap<>(); item.put("id", p[0]); item.put("name", p[1]); item.put("days", Integer.parseInt(p[2])); item.put("slots", Integer.parseInt(p[3])); item.put("price", Integer.parseInt(p[4])); item.put("stock", Integer.parseInt(p[5])); item.put("icon", p[6]); item.put("lifetime", "1".equals(p[7])); cyItems.add(item); } } catch (Exception e) { plugin.getLogger().warning( "[Sdf1_login] 拉取CY商品失败: " + e.getMessage()); } } private void activateCY(String name, int slots, int days) { try { if (cyInstance == null || cyActivationMethod == null) return; cyActivationMethod.invoke( cyInstance, name, slots, days); } catch (Exception e) { plugin.getLogger().warning( "[Sdf1_login] CY激活失败: " + e.getMessage()); } } // ===== 积分查询 ===== public int getPoints(String name) { return ((Number) plugin.getDb() .getField(name, "points")).intValue(); } // ===== 主面板 ===== public Inventory createShopGUI(Player p) { int points = getPoints(p.getName()); Inventory inv = Bukkit.createInventory( null, 54, "§d§l积分商城 | 当前积分: " + points); fillBg(inv); inv.setItem(10, mkItem(Material.EMERALD, "§a游戏币充值", "§7消耗积分兑换游戏币", "§7100积分 = $1000", "", "§e点击兑换")); inv.setItem(12, mkItem(Material.ENDER_CHEST, "§b背包空间", "§7消耗积分兑换背包格子", "§750积分 = 9格永久空间", "", "§e点击兑换")); inv.setItem(14, mkItem(Material.EXPERIENCE_BOTTLE, "§e经验瓶", "§7消耗积分兑换经验", "§720积分 = 10级经验", "", "§e点击兑换")); if (cyInstance != null) { inv.setItem(31, mkItem(Material.CHEST, "§6背包商城", "§7来自CY_beibao的商品", "", "§e点击查看")); } inv.setItem(49, mkItem(Material.ARROW, "§7返回")); return inv; } // ===== CY 商品面板 ===== public Inventory createCYShopGUI(Player p) { refreshCYItems(); int points = getPoints(p.getName()); int size = Math.max(54, ((cyItems.size() / 9) + 1) * 9); if (size > 54) size = 54; Inventory inv = Bukkit.createInventory( null, size, "§d§lCY背包商城 | 当前积分: " + points); fillBg(inv); for (int i = 0; i < cyItems.size() && i < 45; i++) { Map item = cyItems.get(i); String name = (String) item.get("name"); int price = ((Number) item.get("price")) .intValue(); int stock = ((Number) item.get("stock")) .intValue(); int days = ((Number) item.get("days")) .intValue(); int slots = ((Number) item.get("slots")) .intValue(); boolean lifetime = (boolean) item .get("lifetime"); List lore = new ArrayList<>(); lore.add("§7价格: §e" + price + " 积分"); if (lifetime) { lore.add("§7格子: §e终身 +" + slots); } else { lore.add("§7格子: §e+" + slots); lore.add("§7时间: §e" + days + "天"); } if (stock == 0) { lore.add("§7库存: §a无限"); } else if (stock == -1) { lore.add("§7库存: §c已下架"); } else { lore.add("§7库存: §e" + stock); } lore.add(""); if (points >= price && stock != -1) { lore.add("§e点击购买"); } else if (stock == -1) { lore.add("§c已下架"); } else { lore.add("§c积分不足"); } inv.setItem(i, mkItem(Material.CHEST, "§a" + name, lore.toArray(new String[0]))); } inv.setItem(size - 1, mkItem(Material.ARROW, "§7返回")); return inv; } // ===== 主面板点击 ===== public void handleClick(Player p, int slot) { int points = getPoints(p.getName()); switch (slot) { case 10: if (points >= 100) { plugin.getDb().deductPoints( p.getName(), 100); if (plugin.getEconomy() != null) { plugin.getEconomy() .depositPlayer(p, 1000); } p.sendMessage(plugin.getConfig2().msg( "points_purchase_success", "count", "100")); } else { p.sendMessage(plugin.getConfig2().msg( "points_insufficient", "points", String.valueOf(points))); } break; case 12: if (points >= 50) { plugin.getDb().deductPoints( p.getName(), 50); activateCY(p.getName(), 9, 0); p.sendMessage(plugin.getConfig2().msg( "points_purchase_success", "count", "50")); } else { p.sendMessage(plugin.getConfig2().msg( "points_insufficient", "points", String.valueOf(points))); } break; case 14: if (points >= 20) { plugin.getDb().deductPoints( p.getName(), 20); p.setLevel(p.getLevel() + 10); p.sendMessage(plugin.getConfig2().msg( "points_purchase_success", "count", "20")); } else { p.sendMessage(plugin.getConfig2().msg( "points_insufficient", "points", String.valueOf(points))); } break; case 31: if (cyInstance != null) { p.openInventory( createCYShopGUI(p)); } break; } } // ===== CY 商品面板点击 ===== public void handleCYClick(Player p, int slot) { if (slot < 0 || slot >= cyItems.size() || slot >= 45) return; Map item = cyItems.get(slot); int price = ((Number) item.get("price")) .intValue(); int stock = ((Number) item.get("stock")) .intValue(); int days = ((Number) item.get("days")) .intValue(); int slots = ((Number) item.get("slots")) .intValue(); boolean lifetime = (boolean) item .get("lifetime"); if (stock == -1) { p.sendMessage( "§c[Sdf1_login] §f该商品已下架"); return; } int points = getPoints(p.getName()); if (points < price) { p.sendMessage(plugin.getConfig2().msg( "points_insufficient", "points", String.valueOf(points))); return; } plugin.getDb().deductPoints(p.getName(), price); int actDays = lifetime ? 0 : days; activateCY(p.getName(), slots, actDays); String tl = lifetime ? "终身" : (days + "天"); p.sendMessage("§a[Sdf1_login] §f购买成功!获得 " + tl + " +" + slots + "格 背包空间"); } // ===== 工具 ===== private void fillBg(Inventory inv) { ItemStack gl = mkItem( Material.GRAY_STAINED_GLASS_PANE, " "); for (int i = 0; i < inv.getSize(); i++) inv.setItem(i, gl); } private ItemStack mkItem(Material mat, String name, String... lore) { ItemStack it = new ItemStack(mat); ItemMeta im = it.getItemMeta(); if (im != null) { im.setDisplayName(name); if (lore.length > 0) im.setLore(Arrays.asList(lore)); it.setItemMeta(im); } return it; } }