package me.tanluc.betterlottery; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Set; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.Chest; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; public class GuiHelper { public static final String MESSAGE_PREFIX = "[§aBetterLottery§f] "; public static final String TITLE_PREFIX = " §4BetterLottery-"; public static final String MENU_TITLE = " §4BetterLottery-奖池菜单"; public static final String SELECT_POOL_TITLE = " §4BetterLottery-选择操作"; public static final String SETTING_TITLE = " §4BetterLottery-更改设置"; public static final HashMap SETTING_ODDS_OPS = new HashMap(); public static final HashMap SETTING_OPS = new HashMap(); public static final HashMap CREATING_OPS = new HashMap(); public static final HashMap SELECT_POOL_OPS = new HashMap(); private static void showGui(Player player, Inventory inventory) { player.closeInventory(); player.openInventory(inventory); } private static ItemStack getItemStack(Material material, String name, String... lore) { ItemStack itemStack = new ItemStack(material); ItemMeta itemMeta = itemStack.getItemMeta(); itemMeta.setDisplayName(name); List loreList = new ArrayList(); for(int i = 0; i < lore.length; ++i) { loreList.add(lore[i]); } itemMeta.setLore(loreList); itemStack.setItemMeta(itemMeta); return itemStack; } public static void menuGui(Player player) { Inventory inventory = Bukkit.createInventory(player, 9, " §4BetterLottery-奖池菜单"); for(int i = 0; i < 9; ++i) { inventory.setItem(i, getItemStack(Material.THIN_GLASS, "§8永远被封印的结界")); } inventory.setItem(3, getItemStack(Material.ANVIL, "§a创建抽奖池", "§c创建操作: §e左键单击")); inventory.setItem(5, getItemStack(Material.SIGN, "§a抽奖池设置", "§c设置操作: §e左键单击")); showGui(player, inventory); } public static void playerClickedGui(InventoryClickEvent event) { Inventory inventory = event.getInventory(); String title = inventory.getTitle(); Player player = (Player)event.getWhoClicked(); int rawSlot = event.getRawSlot(); switch(title.hashCode()) { case 966875076: if (title.equals(" §4BetterLottery-奖池菜单")) { event.setCancelled(true); menuClicked(player, rawSlot); } break; case 1069040758: if (title.equals(" §4BetterLottery-更改设置")) { if (rawSlot < 54 || event.isShiftClick() || event.getClick() == ClickType.DOUBLE_CLICK) { event.setCancelled(true); } settingClicked(event); } break; case 1381462448: if (title.equals(" §4BetterLottery-选择操作")) { event.setCancelled(true); selectPoolClicked(event); } } } public static void menuClicked(Player player, int rawSlot) { if (rawSlot == 3) { player.sendMessage("[§aBetterLottery§f] §e第一步>>>请在聊天框中输入奖池名称§c(颜色符&,名称可以重复)"); CREATING_OPS.put(player.getName(), (Object)null); player.closeInventory(); } else if (rawSlot == 5) { SELECT_POOL_OPS.put(player.getName(), 0); selectPoolGui(player); } } public static void createPool(Player player, String message) { message = message.replaceAll("&", "§"); String playerName = player.getName(); String opMessage = (String)CREATING_OPS.get(playerName); if (opMessage == null) { CREATING_OPS.put(playerName, message); player.sendMessage("[§aBetterLottery§f] §e奖池名称设置为:§f" + message); player.sendMessage(""); player.sendMessage("[§aBetterLottery§f] §e第二步>>>请在聊天框中输入抽奖券名称§c(颜色符&,名称不可以重复)"); } else { message = "&f" + message; player.sendMessage("[§aBetterLottery§f] §e抽奖券名称设置为:§f" + message); player.sendMessage(""); FileConfiguration config = Config.load("BetterLottery"); if (config.contains(message.replaceAll("§", "&"))) { player.sendMessage("[§aBetterLottery§f] §c" + message + "§e>>>创建失败,抽奖券名称已经被占用,请重新点击创建按钮进行创建"); } else { player.sendMessage("[§aBetterLottery§f] §c" + opMessage + "§e>>>创建完成,请点击抽奖池设置按钮进行配置"); player.sendMessage(""); config.set(message.replaceAll("§", "&") + ".title", opMessage.replaceAll("§", "&")); config.set(message.replaceAll("§", "&") + ".enable", false); Config.save(config, "BetterLottery"); } CREATING_OPS.remove(playerName); } } public static void selectPoolClicked(InventoryClickEvent event) { Player player = (Player)event.getWhoClicked(); int rawSlot = event.getRawSlot(); FileConfiguration config = Config.load("BetterLottery"); Set keys = config.getKeys(false); int startValue = (Integer)SELECT_POOL_OPS.get(player.getName()) * 36; String[] strings = new String[keys.size()]; keys.toArray(strings); String key; if (event.isLeftClick()) { if (!event.isShiftClick()) { if (rawSlot < 36 && startValue + rawSlot < strings.length) { key = strings[startValue + rawSlot]; settingGui(player, key); } else if (rawSlot == 48) { if (startValue > 0) { SELECT_POOL_OPS.put(player.getName(), (Integer)SELECT_POOL_OPS.get(player.getName()) - 1); selectPoolGui(player); } } else if (rawSlot == 49) { menuGui(player); } else if (rawSlot == 50 && strings.length - (startValue + 36) > 0) { SELECT_POOL_OPS.put(player.getName(), (Integer)SELECT_POOL_OPS.get(player.getName()) + 1); selectPoolGui(player); } } else if (startValue + rawSlot < strings.length) { key = strings[startValue + rawSlot]; ItemStack itemStack = player.getItemInHand(); if (itemStack != null && !itemStack.getType().equals(Material.AIR)) { ItemMeta itemMeta = itemStack.getItemMeta(); itemMeta.setDisplayName(key.replaceAll("&", "§")); itemStack.setItemMeta(itemMeta); player.sendMessage("[§aBetterLottery§f] §c拓印完成>>>手持右键即可食用"); } else { player.sendMessage("[§aBetterLottery§f] §c拓印失败>>>手持物品不能为空"); } } } else if (event.isRightClick() && event.isShiftClick() && startValue + rawSlot < strings.length) { key = strings[startValue + rawSlot]; config.set(key, (Object)null); Config.save(config, "BetterLottery"); selectPoolGui(player); } } public static void selectPoolGui(Player player) { FileConfiguration config = Config.load("BetterLottery"); Set keys = config.getKeys(false); Inventory inventory = Bukkit.createInventory(player, 54, " §4BetterLottery-选择操作"); int id; for(id = 0; id < 36; ++id) { inventory.setItem(id, getItemStack(Material.STAINED_GLASS_PANE, "§7暂时被封印的结界")); } for(id = 36; id < 54; ++id) { inventory.setItem(id, getItemStack(Material.THIN_GLASS, "§8永远被封印的结界")); } id = 0; String[] strings = new String[keys.size()]; keys.toArray(strings); int startValue = (Integer)SELECT_POOL_OPS.get(player.getName()) * 36; for(int i = startValue; i < startValue + 36 && i < strings.length; ++i) { String title = "§a奖池名称: §e" + config.getString(strings[i] + ".title").replaceAll("&", "§"); boolean enable = config.getBoolean(strings[i] + ".enable"); String state = "§a当前状态: §e" + (enable ? "开启" : "关闭"); ItemStack itemStack = getItemStack(Material.WOOL, title, "§a奖券名称: §e" + strings[i].replaceAll("&", "§"), state, "§c更改设置: §e左键单击", "§c拓印奖券: §e手持需要拓印的物品 Shift+左键单击", "§c删除奖池: §eShift+右键单击"); itemStack.setDurability((short)(enable ? 5 : 14)); inventory.setItem(id++, itemStack); } boolean hasNext = strings.length - (startValue + 36) > 0; inventory.setItem(48, getItemStack(Material.LEATHER_CHESTPLATE, (startValue > 0 ? "§a" : "§7") + "上一页", "§c翻页操作: §e左键单击")); inventory.setItem(49, getItemStack(Material.ENDER_PEARL, "§a返回上层", "§c返回操作: §e左键单击")); inventory.setItem(50, getItemStack(Material.LEATHER_LEGGINGS, (hasNext ? "§a" : "§7") + "下一页", "§c翻页操作: §e左键单击")); showGui(player, inventory); } public static void settingGui(Player player, String key) { FileConfiguration config = Config.load("BetterLottery"); Inventory inventory = Bukkit.createInventory(player, 54, " §4BetterLottery-更改设置"); int i; for(i = 0; i < 36; ++i) { inventory.setItem(i, getItemStack(Material.STAINED_GLASS_PANE, "§7暂时被封印的结界")); } for(i = 36; i < 54; ++i) { inventory.setItem(i, getItemStack(Material.THIN_GLASS, "§8永远被封印的结界")); } if (config.contains(key + ".chest")) { String string = config.getString(key + ".chest"); String[] chestInfo = string.split(" "); int x = Integer.parseInt(chestInfo[0]); int y = Integer.parseInt(chestInfo[1]); int z = Integer.parseInt(chestInfo[2]); Inventory buttonInventory = ((Chest)getChestWorld().getBlockAt(x, y, z).getState()).getInventory(); List odds = config.getIntegerList(key + ".odds"); List notice = config.getIntegerList(key + ".notice"); int maxOdds = 0; Iterator var14 = odds.iterator(); while(var14.hasNext()) { Integer i = (Integer)var14.next(); if (i > 0) { maxOdds += i; } } for(int i = 0; i < 27; ++i) { ItemStack tempItemStack = buttonInventory.getItem(i); if (tempItemStack != null) { tempItemStack = tempItemStack.clone(); ItemMeta itemMeta = tempItemStack.getItemMeta(); List lore = itemMeta.hasLore() ? itemMeta.getLore() : new ArrayList(); if (itemMeta.hasLore()) { ((List)lore).add("§f--------------------"); } ((List)lore).add("§a中奖几率: §e" + ((Integer)odds.get(i) == -1 ? "未设置" : odds.get(i) + "/" + maxOdds)); ((List)lore).add("§a全服公告: §e" + ((Integer)notice.get(i) == 0 ? "关闭" : "开启")); ((List)lore).add("§c设置几率: §e左键单击"); ((List)lore).add("§c" + ((Integer)notice.get(i) == 0 ? "开启" : "关闭") + "公告: §eShift+左键单击"); ((List)lore).add("§c移除奖品: §eShift+右键单击"); itemMeta.setLore((List)lore); tempItemStack.setItemMeta(itemMeta); inventory.setItem(i, tempItemStack); } } Block block = getChestWorld().getBlockAt(x, y + 1, z); if (block.getType().equals(Material.CHEST)) { Inventory topInventory = ((Chest)block.getState()).getInventory(); for(int i = 0; i < 27; ++i) { ItemStack tempItemStack = topInventory.getItem(i); if (tempItemStack != null) { tempItemStack = tempItemStack.clone(); ItemMeta itemMeta = tempItemStack.getItemMeta(); List lore = itemMeta.hasLore() ? itemMeta.getLore() : new ArrayList(); if (itemMeta.hasLore()) { ((List)lore).add("§f--------------------"); } ((List)lore).add("§a中奖几率: §e" + ((Integer)odds.get(i + 27) == -1 ? "未设置" : odds.get(i + 27) + "/" + maxOdds)); ((List)lore).add("§a全服公告: §e" + ((Integer)notice.get(i + 27) == 0 ? "关闭" : "开启")); ((List)lore).add("§c设置几率: §e左键单击"); ((List)lore).add("§c" + ((Integer)notice.get(i + 27) == 0 ? "开启" : "关闭") + "公告: §eShift+左键单击"); ((List)lore).add("§c移除奖品: §eShift+右键单击"); itemMeta.setLore((List)lore); tempItemStack.setItemMeta(itemMeta); inventory.setItem(i + 27, tempItemStack); } } } } inventory.setItem(48, getItemStack(Material.HOPPER, "§a添加奖品", "§c添加操作: §e拖拽物品到此处左键单击")); inventory.setItem(49, getItemStack(Material.ENDER_PEARL, "§a返回上层", "§c返回操作: §e左键单击")); boolean enable = config.getBoolean(key + ".enable"); inventory.setItem(50, getItemStack(enable ? Material.WATER_BUCKET : Material.BUCKET, "§a" + (enable ? "关闭" : "开启") + "奖池", "§c" + (enable ? "关闭" : "开启") + "操作: §e左键单击")); SETTING_OPS.put(player.getName(), new InventoryInfo(key, inventory)); showGui(player, inventory); } public static void settingClicked(InventoryClickEvent event) { Player player = (Player)event.getWhoClicked(); int rawSlot = event.getRawSlot(); FileConfiguration config = Config.load("BetterLottery"); InventoryInfo inventoryInfo = (InventoryInfo)SETTING_OPS.get(player.getName()); String key = inventoryInfo.getKey(); boolean isOpened = config.getBoolean(key + ".enable"); ItemStack itemStack; int i; String string; int i; if (event.isLeftClick()) { int j; Inventory buttonInventory; List odds; String[] chestInfo; int maxOdds; int i; if (!event.isShiftClick()) { int maxOdds; if (rawSlot == 48) { if (!isOpened) { itemStack = player.getItemOnCursor(); maxOdds = itemStack.getTypeId(); if (maxOdds > 0) { Inventory chestInventory = null; boolean isTopInventory = false; if (config.contains(key + ".chest")) { String string = config.getString(key + ".chest"); chestInfo = string.split(" "); maxOdds = Integer.parseInt(chestInfo[0]); i = Integer.parseInt(chestInfo[1]); j = Integer.parseInt(chestInfo[2]); buttonInventory = ((Chest)getChestWorld().getBlockAt(maxOdds, i, j).getState()).getInventory(); boolean isFull = true; for(int i = 0; i < 27; ++i) { if (buttonInventory.getItem(i) == null) { isFull = false; break; } } if (isFull) { Block block = getChestWorld().getBlockAt(maxOdds, i + 1, j); if (block.getType().equals(Material.AIR)) { block.setType(Material.CHEST); } chestInventory = ((Chest)block.getState()).getInventory(); isTopInventory = true; } else { chestInventory = buttonInventory; } } else { i = 0; while(true) { Block block = getChestWorld().getBlockAt(i, 4, 0); if (block.getType().equals(Material.AIR)) { block.setType(Material.CHEST); chestInventory = ((Chest)block.getState()).getInventory(); config.set(key + ".chest", block.getX() + " " + block.getY() + " " + block.getZ()); List odds = new ArrayList(); List notice = new ArrayList(); for(j = 0; j < 36; ++j) { odds.add(-1); notice.add(0); } config.set(key + ".odds", odds); config.set(key + ".notice", notice); Config.save(config, "BetterLottery"); break; } i += 2; } } for(i = 0; i < (isTopInventory ? 9 : 27); ++i) { if (chestInventory.getItem(i) == null) { chestInventory.setItem(i, itemStack); break; } } List odds = config.getIntegerList(key + ".odds"); List notice = config.getIntegerList(key + ".notice"); maxOdds = 0; Iterator var39 = odds.iterator(); while(var39.hasNext()) { Integer i = (Integer)var39.next(); if (i > 0) { maxOdds += i; } } for(i = 0; i < 36; ++i) { ItemStack tempItemStack = inventoryInfo.getInventory().getItem(i); if (tempItemStack.getType().equals(Material.STAINED_GLASS_PANE) && tempItemStack.getItemMeta().getDisplayName().equals("§7暂时被封印的结界")) { itemStack = itemStack.clone(); ItemMeta itemMeta = itemStack.getItemMeta(); List lore = itemMeta.hasLore() ? itemMeta.getLore() : new ArrayList(); if (itemMeta.hasLore()) { ((List)lore).add("§f--------------------"); } ((List)lore).add("§a中奖几率: §e" + ((Integer)odds.get(i) == -1 ? "未设置" : odds.get(i) + "/" + maxOdds)); ((List)lore).add("§a全服公告: §e" + ((Integer)notice.get(i) == 0 ? "关闭" : "开启")); ((List)lore).add("§c设置几率: §e左键单击"); ((List)lore).add("§c" + ((Integer)notice.get(i) == 0 ? "开启" : "关闭") + "公告: §eShift+左键单击"); ((List)lore).add("§c移除奖品: §eShift+右键单击"); itemMeta.setLore((List)lore); itemStack.setItemMeta(itemMeta); inventoryInfo.getInventory().setItem(i, itemStack); break; } if (i == 35) { player.sendMessage("[§aBetterLottery§f] §c添加失败§e>>>奖池已满,无法继续添加"); } } } } else { player.sendMessage("[§aBetterLottery§f] §c添加失败§e>>>必须先关闭奖池才能进行操作"); } } else if (rawSlot == 49) { selectPoolGui(player); } else if (rawSlot == 50) { if (config.getBoolean(key + ".enable")) { config.set(key + ".enable", false); Config.save(config, "BetterLottery"); settingGui(player, key); } else { boolean allowOpen = true; maxOdds = 0; if (config.contains(key + ".odds")) { odds = config.getIntegerList(key + ".odds"); for(i = 0; i < 36; ++i) { ItemStack tempItemStack = inventoryInfo.getInventory().getItem(i); if (!tempItemStack.getType().equals(Material.STAINED_GLASS_PANE) || !tempItemStack.getItemMeta().getDisplayName().equals("§7暂时被封印的结界")) { if ((Integer)odds.get(i) == -1) { allowOpen = false; break; } maxOdds += (Integer)odds.get(i); } } } if (!allowOpen) { player.sendMessage("[§aBetterLottery§f] §c开启失败>>>必须为所有奖品设置几率"); } else if (maxOdds == 0) { player.sendMessage("[§aBetterLottery§f] §c开启失败>>>必须有一个几率大于0的奖品"); } else { config.set(key + ".enable", true); Config.save(config, "BetterLottery"); settingGui(player, key); player.sendMessage("[§aBetterLottery§f] §c开启完毕>>>获取奖券之后手持奖券右键即可进行抽奖"); } } } else if (rawSlot < 36) { if (!isOpened) { itemStack = inventoryInfo.getInventory().getItem(rawSlot); if (!itemStack.getType().equals(Material.STAINED_GLASS_PANE) || !itemStack.getItemMeta().getDisplayName().equals("§7暂时被封印的结界")) { player.closeInventory(); SETTING_ODDS_OPS.put(player.getName(), rawSlot); player.sendMessage("[§aBetterLottery§f] §e设置几率>>>请在聊天框中输入该奖品的几率§c(必须为正整数,可以是0)"); } } else { player.sendMessage("[§aBetterLottery§f] §c设置失败§e>>>必须先关闭奖池才能进行操作"); } } } else if (rawSlot < 36) { if (!isOpened) { itemStack = inventoryInfo.getInventory().getItem(rawSlot); if (!itemStack.getType().equals(Material.STAINED_GLASS_PANE) || !itemStack.getItemMeta().getDisplayName().equals("§7暂时被封印的结界")) { string = config.getString(key + ".chest"); odds = config.getIntegerList(key + ".odds"); List notice = config.getIntegerList(key + ".notice"); notice.set(rawSlot, (Integer)notice.get(rawSlot) == 0 ? 1 : 0); config.set(key + ".notice", notice); Config.save(config, "BetterLottery"); i = 0; Iterator var34 = odds.iterator(); while(var34.hasNext()) { Integer i = (Integer)var34.next(); if (i > 0) { i += i; } } chestInfo = string.split(" "); maxOdds = Integer.parseInt(chestInfo[0]); i = Integer.parseInt(chestInfo[1]); j = Integer.parseInt(chestInfo[2]); buttonInventory = ((Chest)getChestWorld().getBlockAt(maxOdds, rawSlot < 27 ? i : i + 1, j).getState()).getInventory(); ItemStack itemStack = buttonInventory.getItem(rawSlot % 27).clone(); ItemMeta itemMeta = itemStack.getItemMeta(); List lore = itemMeta.hasLore() ? itemMeta.getLore() : new ArrayList(); if (itemMeta.hasLore()) { ((List)lore).add("§f--------------------"); } ((List)lore).add("§a中奖几率: §e" + ((Integer)odds.get(rawSlot) == -1 ? "未设置" : odds.get(rawSlot) + "/" + i)); ((List)lore).add("§a全服公告: §e" + ((Integer)notice.get(rawSlot) == 0 ? "关闭" : "开启")); ((List)lore).add("§c设置几率: §e左键单击"); ((List)lore).add("§c" + ((Integer)notice.get(rawSlot) == 0 ? "开启" : "关闭") + "公告: §eShift+左键单击"); ((List)lore).add("§c移除奖品: §eShift+右键单击"); itemMeta.setLore((List)lore); itemStack.setItemMeta(itemMeta); inventoryInfo.getInventory().setItem(rawSlot, itemStack); } } else { player.sendMessage("[§aBetterLottery§f] §c设置失败§e>>>必须先关闭奖池才能进行操作"); } } } else if (event.isShiftClick() && event.isRightClick() && rawSlot < 36) { if (!isOpened) { itemStack = inventoryInfo.getInventory().getItem(rawSlot); if (!itemStack.getType().equals(Material.STAINED_GLASS_PANE) || !itemStack.getItemMeta().getDisplayName().equals("§7暂时被封印的结界")) { string = config.getString(key + ".chest"); String[] chestInfo = string.split(" "); i = Integer.parseInt(chestInfo[0]); i = Integer.parseInt(chestInfo[1]); int z = Integer.parseInt(chestInfo[2]); Inventory inventory = ((Chest)getChestWorld().getBlockAt(i, rawSlot < 27 ? i : i + 1, z).getState()).getInventory(); inventory.setItem(rawSlot < 27 ? rawSlot : rawSlot % 27, (ItemStack)null); List odds = config.getIntegerList(key + ".odds"); List notice = config.getIntegerList(key + ".notice"); odds.set(rawSlot, -1); notice.set(rawSlot, 0); config.set(key + ".odds", odds); config.set(key + ".notice", notice); Config.save(config, "BetterLottery"); settingGui(player, key); } } else { player.sendMessage("[§aBetterLottery§f] §c移除失败§e>>>必须先关闭奖池才能进行操作"); } } } public static void setOdds(Player player, String message) { String playerName = player.getName(); int rawSlot = (Integer)SETTING_ODDS_OPS.get(playerName); FileConfiguration config = Config.load("BetterLottery"); String key = ((InventoryInfo)SETTING_OPS.get(player.getName())).getKey(); try { int odds = Integer.parseInt(message); if (odds < 0) { throw new Exception(); } List oddsList = config.getIntegerList(key + ".odds"); oddsList.set(rawSlot, odds); config.set(key + ".odds", oddsList); Config.save(config, "BetterLottery"); player.sendMessage("[§aBetterLottery§f] §e奖品几率设置为:§f" + message); } catch (Exception var8) { player.sendMessage("[§aBetterLottery§f] §c设置失败,必须输入正整数,可以是0"); } player.sendMessage(""); SETTING_ODDS_OPS.remove(playerName); settingGui(player, key); } public static World getChestWorld() { return Bukkit.getWorld("BetterLotteryChest"); } }