本帖最后由 丶米饭 于 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,我也不用这么麻烦了(
脑袋:懂了 手:你懂个屁