本帖最后由 丶米饭 于 2020-9-28 15:08 编辑 
 
 
 
 
众所周知,bukkit的api是不推荐异步甚至不能异步访问的...但是连接io数据库却推荐用异步
这个时候,如图的骚操作就来了......异步中查询数据库获取数据,然后同步里进行打开gui...
如果觉得上面套娃操作太骚了,下面还有种方法,使用CompletableFuture来骚操作
 
 
来自群组: Server CT
 
 
众所周知,bukkit的api是不推荐异步甚至不能异步访问的...但是连接io数据库却推荐用异步
这个时候,如图的骚操作就来了......异步中查询数据库获取数据,然后同步里进行打开gui...
如果觉得上面套娃操作太骚了,下面还有种方法,使用CompletableFuture来骚操作
 
来自群组: Server CT
-     static Set<Player> open = new HashSet<Player>();
 
 
-     public static void List(Player player, int page) {
 
-         Inventory gui = Bukkit.createInventory(null, 54, "§4悬赏榜单第§c" + page + "§4页");
 
-         open.add(player);
 
-         new Thread(new Runnable() {
 
 
-             @Override
 
-             public void run() {
 
 
-                 if (Other.data.getConfigurationSection("Info").getKeys(false).size() < (page - 1) * 45 + 1) {
 
-                     if (page > 1) {
 
-                         player.closeInventory();
 
-                         Interface.List(player, page - 1);
 
-                         return;
 
-                     }
 
-                 }
 
 
-                 ItemStack frame = BasicLibrary.stainedglass.get(14);
 
-                 ItemStack last = BasicLibrary.stainedglass.get(11);
 
-                 ItemStack next = BasicLibrary.stainedglass.get(1);
 
-                 ItemMeta framemeta = frame.getItemMeta();
 
-                 ItemMeta lastmeta = frame.getItemMeta();
 
-                 ItemMeta nextmeta = frame.getItemMeta();
 
 
-                 framemeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', Other.message.getString("Frame")));
 
-                 lastmeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', Other.message.getString("Last")));
 
-                 nextmeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', Other.message.getString("Next")));
 
 
-                 ArrayList<String> lores = new ArrayList<String>();
 
-                 lores.add("§c这里显示了所有正在被§4悬赏§c玩家的列表");
 
-                 lores.add("§c点击头像即可进行§4追杀");
 
-                 lores.add("§c配合§4无视权限攻击§c,可以让目标措手不及!");
 
-                 framemeta.setLore(lores);
 
 
-                 frame.setItemMeta(framemeta);
 
-                 last.setItemMeta(lastmeta);
 
-                 next.setItemMeta(nextmeta);
 
 
-                 if (page > 1) {
 
-                     gui.setItem(45, last);
 
-                 } else {
 
-                     gui.setItem(45, frame);
 
-                 }
 
-                 for (int i = 46; i <= 52; i++) {
 
-                     gui.setItem(i, frame);
 
-                 }
 
-                 if (Other.data.getConfigurationSection("Info").getKeys(false).size() > 45 + (page - 1) * 45) {
 
-                     gui.setItem(53, next);
 
-                 } else {
 
-                     gui.setItem(53, frame);
 
-                 }
 
 
-                 ArrayList<String> list = new ArrayList<String>(Other.data.getConfigurationSection("Info").getKeys(false));
 
 
-                 int index = (page - 1) * 45;
 
-                 int location = 0;
 
-                 int size = list.size() - 1;
 
-                 while (index <= size && index <= 44 + (page - 1) * 45) {
 
-                     String s = list.get(index);
 
-                     ItemStack skull;
 
-                     try {
 
-                         skull = new ItemStack(Material.valueOf("SKULL_ITEM"), 1, (short) 3);
 
-                     } catch (Exception a) {
 
-                         skull = new ItemStack(Material.valueOf("LEGACY_SKULL_ITEM"), 1, (short) 3);
 
-                     }
 
-                     SkullMeta skullmeta = (SkullMeta) skull.getItemMeta();
 
 
-                     skullmeta.setDisplayName("§4" + s);
 
-                     if (Other.config.getBoolean("SkullSkine")) {
 
-                         skullmeta.setOwner(s);
 
-                     }
 
-                     ArrayList<String> lore = new ArrayList<String>();
 
-                     lore.add("§a发起§4悬赏§a者: " + Other.data.getString("Info." + s + ".Initiator"));
 
-                     lore.add("§6赏金§a: §e" + Other.data.getInt("Info." + s + ".Money") + "§6游戏币");
 
-                     if (Other.data.getBoolean("Info." + s + ".All")) {
 
-                         lore.add("§a是否全服§4悬赏§a: §2是");
 
-                     } else {
 
-                         lore.add("§a是否全服§4悬赏§a: §c否");
 
-                     }
 
-                     lore.add("§4悬赏§5总时长§a: §d" + Other.data.getInt("Info." + s + ".Time") + "§a分钟");
 
-                     if (Other.data.getInt("Info." + s + ".CurrentTime") / Other.data.getInt("Info." + s + ".Time") >= 0.8) {
 
-                         lore.add("§4悬赏§a剩余持续时长: " + Other.data.getInt("Info." + s + ".CurrentTime") + "§a分钟");
 
-                     } else if (Other.data.getInt("Info." + s + ".CurrentTime") / Other.data.getInt("Info." + s + ".Time") >= 0.6) {
 
-                         lore.add("§4悬赏§a剩余持续时长: §e" + Other.data.getInt("Info." + s + ".CurrentTime") + "§a分钟");
 
-                     } else if (Other.data.getInt("Info." + s + ".CurrentTime") / Other.data.getInt("Info." + s + ".Time") >= 0.4) {
 
-                         lore.add("§4悬赏§a剩余持续时长: §4" + Other.data.getInt("Info." + s + ".CurrentTime") + "§a分钟");
 
-                     } else {
 
-                         lore.add("§4悬赏§a剩余持续时长: §7" + Other.data.getInt("Info." + s + ".CurrentTime") + "§a分钟");
 
-                     }
 
-                     lore.add("§4悬赏§a理由: §f" + ChatColor.translateAlternateColorCodes('&', Other.data.getString("Info." + s + ".Reason")));
 
-                     if (Other.config.getBoolean("KillPlayerMessage")) {
 
-                         lore.add("");
 
-                         lore.add("§4点击追杀至其身旁");
 
-                     }
 
-                     skullmeta.setLore(lore);
 
-                     skull.setItemMeta(skullmeta);
 
 
-                     gui.setItem(location, skull);
 
 
-                     location++;
 
-                     index++;
 
-                 }
 
-                 open.remove(player);
 
-             }
 
 
-         }).start();
 
-         new BukkitRunnable() {
 
 
-             @Override
 
-             public void run() {
 
-                 if (open.contains(player)) {
 
-                     return;
 
-                 }
 
-                 player.openInventory(gui);
 
-                 this.cancel();
 
-             }
 
 
-         }.runTaskTimer(Main.plugin, 1, 5);
 
- }
异步打开gui,我是直接异步设置头颅
然后同步循环等待打开gui
要不是破spigot不支持异步openInventory,我也不用这么麻烦了(
脑袋:懂了 手:你懂个屁