丶米饭
本帖最后由 丶米饭 于 2020-9-28 15:08 编辑



众所周知,bukkit的api是不推荐异步甚至不能异步访问的...但是连接io数据库却推荐用异步
这个时候,如图的骚操作就来了......异步中查询数据库获取数据,然后同步里进行打开gui...

如果觉得上面套娃操作太骚了,下面还有种方法,使用CompletableFuture来骚操作


来自群组: Server CT

结城希亚
  1.     static Set<Player> open = new HashSet<Player>();

  2.     public static void List(Player player, int page) {
  3.         Inventory gui = Bukkit.createInventory(null, 54, "§4悬赏榜单第§c" + page + "§4页");
  4.         open.add(player);
  5.         new Thread(new Runnable() {

  6.             @Override
  7.             public void run() {

  8.                 if (Other.data.getConfigurationSection("Info").getKeys(false).size() < (page - 1) * 45 + 1) {
  9.                     if (page > 1) {
  10.                         player.closeInventory();
  11.                         Interface.List(player, page - 1);
  12.                         return;
  13.                     }
  14.                 }

  15.                 ItemStack frame = BasicLibrary.stainedglass.get(14);
  16.                 ItemStack last = BasicLibrary.stainedglass.get(11);
  17.                 ItemStack next = BasicLibrary.stainedglass.get(1);
  18.                 ItemMeta framemeta = frame.getItemMeta();
  19.                 ItemMeta lastmeta = frame.getItemMeta();
  20.                 ItemMeta nextmeta = frame.getItemMeta();

  21.                 framemeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', Other.message.getString("Frame")));
  22.                 lastmeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', Other.message.getString("Last")));
  23.                 nextmeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', Other.message.getString("Next")));

  24.                 ArrayList<String> lores = new ArrayList<String>();
  25.                 lores.add("§c这里显示了所有正在被§4悬赏§c玩家的列表");
  26.                 lores.add("§c点击头像即可进行§4追杀");
  27.                 lores.add("§c配合§4无视权限攻击§c,可以让目标措手不及!");
  28.                 framemeta.setLore(lores);

  29.                 frame.setItemMeta(framemeta);
  30.                 last.setItemMeta(lastmeta);
  31.                 next.setItemMeta(nextmeta);

  32.                 if (page > 1) {
  33.                     gui.setItem(45, last);
  34.                 } else {
  35.                     gui.setItem(45, frame);
  36.                 }
  37.                 for (int i = 46; i <= 52; i++) {
  38.                     gui.setItem(i, frame);
  39.                 }
  40.                 if (Other.data.getConfigurationSection("Info").getKeys(false).size() > 45 + (page - 1) * 45) {
  41.                     gui.setItem(53, next);
  42.                 } else {
  43.                     gui.setItem(53, frame);
  44.                 }

  45.                 ArrayList<String> list = new ArrayList<String>(Other.data.getConfigurationSection("Info").getKeys(false));

  46.                 int index = (page - 1) * 45;
  47.                 int location = 0;
  48.                 int size = list.size() - 1;
  49.                 while (index <= size && index <= 44 + (page - 1) * 45) {
  50.                     String s = list.get(index);
  51.                     ItemStack skull;
  52.                     try {
  53.                         skull = new ItemStack(Material.valueOf("SKULL_ITEM"), 1, (short) 3);
  54.                     } catch (Exception a) {
  55.                         skull = new ItemStack(Material.valueOf("LEGACY_SKULL_ITEM"), 1, (short) 3);
  56.                     }
  57.                     SkullMeta skullmeta = (SkullMeta) skull.getItemMeta();

  58.                     skullmeta.setDisplayName("§4" + s);
  59.                     if (Other.config.getBoolean("SkullSkine")) {
  60.                         skullmeta.setOwner(s);
  61.                     }
  62.                     ArrayList<String> lore = new ArrayList<String>();
  63.                     lore.add("§a发起§4悬赏§a者: " + Other.data.getString("Info." + s + ".Initiator"));
  64.                     lore.add("§6赏金§a: §e" + Other.data.getInt("Info." + s + ".Money") + "§6游戏币");
  65.                     if (Other.data.getBoolean("Info." + s + ".All")) {
  66.                         lore.add("§a是否全服§4悬赏§a: §2是");
  67.                     } else {
  68.                         lore.add("§a是否全服§4悬赏§a: §c否");
  69.                     }
  70.                     lore.add("§4悬赏§5总时长§a: §d" + Other.data.getInt("Info." + s + ".Time") + "§a分钟");
  71.                     if (Other.data.getInt("Info." + s + ".CurrentTime") / Other.data.getInt("Info." + s + ".Time") >= 0.8) {
  72.                         lore.add("§4悬赏§a剩余持续时长: " + Other.data.getInt("Info." + s + ".CurrentTime") + "§a分钟");
  73.                     } else if (Other.data.getInt("Info." + s + ".CurrentTime") / Other.data.getInt("Info." + s + ".Time") >= 0.6) {
  74.                         lore.add("§4悬赏§a剩余持续时长: §e" + Other.data.getInt("Info." + s + ".CurrentTime") + "§a分钟");
  75.                     } else if (Other.data.getInt("Info." + s + ".CurrentTime") / Other.data.getInt("Info." + s + ".Time") >= 0.4) {
  76.                         lore.add("§4悬赏§a剩余持续时长: §4" + Other.data.getInt("Info." + s + ".CurrentTime") + "§a分钟");
  77.                     } else {
  78.                         lore.add("§4悬赏§a剩余持续时长: §7" + Other.data.getInt("Info." + s + ".CurrentTime") + "§a分钟");
  79.                     }
  80.                     lore.add("§4悬赏§a理由: §f" + ChatColor.translateAlternateColorCodes('&', Other.data.getString("Info." + s + ".Reason")));
  81.                     if (Other.config.getBoolean("KillPlayerMessage")) {
  82.                         lore.add("");
  83.                         lore.add("§4点击追杀至其身旁");
  84.                     }
  85.                     skullmeta.setLore(lore);
  86.                     skull.setItemMeta(skullmeta);

  87.                     gui.setItem(location, skull);

  88.                     location++;
  89.                     index++;
  90.                 }
  91.                 open.remove(player);
  92.             }

  93.         }).start();
  94.         new BukkitRunnable() {

  95.             @Override
  96.             public void run() {
  97.                 if (open.contains(player)) {
  98.                     return;
  99.                 }
  100.                 player.openInventory(gui);
  101.                 this.cancel();
  102.             }

  103.         }.runTaskTimer(Main.plugin, 1, 5);
  104.     }
复制代码


异步打开gui,我是直接异步设置头颅
然后同步循环等待打开gui


要不是破spigot不支持异步openInventory,我也不用这么麻烦了(

slyz
脑袋:懂了 手:你懂个屁

第一页 上一页 下一页 最后一页