首页 > 解决方案 > Minecraft bukkit spigot 插件传送到另一个世界导致崩溃:服务器滴答循环中的异常

问题描述

我正在为我的我的世界服务器创建一个插件,目的是能够发出命令传送到另一个创造性的超平坦世界。问题是当玩家被传送时,服务器崩溃了。这是我在插件中的代码:

// go world commands
        if (cmd.getName().equals("goworld")) {
            if (args.length == 0){
                sender.sendMessage(ChatColor.DARK_RED + "World not specified");
            } else {
                // calculate closest player
                double closest = Double.MAX_VALUE;
                Player closestp = null;
                for(Player i : Bukkit.getOnlinePlayers()){
                    double dist = i.getLocation().distance(blockLoc);
                    if (closest == Double.MAX_VALUE || dist < closest){
                        closest = dist;
                        closestp = i;
                    }
                }
                if (closestp == null){
                    //No players found
                }
                else{
                    //the closest player is closestp
                    closestp.sendMessage(ChatColor.BLUE + "Taking you to " + worldToGo);
                    try {
                        JSONObject worldPref = (JSONObject) readJsonSimple(worldToGo + "\\startpos.json");
                        System.out.println(worldPref.toJSONString());
                        System.out.println(worldPref.get("x"));
                        System.out.println(worldPref.get("y"));
                        System.out.println(worldPref.get("z"));
                        System.out.println(worldPref.get("pitch"));
                        System.out.println(worldPref.get("yaw"));
                        System.out.println(worldPref.get("world"));
                        List<World> worlds = Bukkit.getWorlds();
                        for (World world : worlds) {
                            System.out.println("#########");
                            System.out.println(world.getName());
                        }
                        System.out.println("--------------");
                        System.out.println(worldPref.get("world").toString());
                        World newWorld = new WorldCreator(worldToGo).createWorld();
                        System.out.println(newWorld);
                        updateLastPos(closestp);
                        closestp.teleport(
                                new Location(
                                        newWorld,
                                        (long)worldPref.get("x"),
                                        (long)worldPref.get("y"),
                                        (long)worldPref.get("z")
                                )
                        );
                        closestp.sendMessage(ChatColor.GREEN + "You have entered " + worldToGo);
                    } catch (Exception e) {
                        e.printStackTrace();
                        closestp.sendMessage(ChatColor.RED + "Something went wrong");
                    }
                }
            }
        }

这是服务器创建的错误:

[18:51:54] [Worker-Main-12/INFO]: Preparing spawn area: 96%
[18:51:54] [Server thread/INFO]: Time elapsed: 6911 ms
[18:51:54] [Server thread/INFO]: [WorldGuard] (world_ntischool) TNT ignition is PERMITTED.
[18:51:54] [Server thread/INFO]: [WorldGuard] (world_ntischool) Lighters are PERMITTED.
[18:51:54] [Server thread/INFO]: [WorldGuard] (world_ntischool) Lava fire is PERMITTED.
[18:51:54] [Server thread/INFO]: [WorldGuard] (world_ntischool) Fire spread is UNRESTRICTED.
[18:51:54] [Server thread/INFO]: [WorldGuard] Loaded configuration for world 'world_ntischool'
[18:51:54] [Server thread/INFO]: CraftWorld{name=world_ntischool}

[18:51:54] [Server thread/ERROR]: Encountered an unexpected exception
java.util.ConcurrentModificationException: null
    at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:758) ~[?:?]
    at java.util.LinkedHashMap$LinkedValueIterator.next(LinkedHashMap.java:785) ~[?:?]
    at net.minecraft.server.v1_16_R2.MinecraftServer.b(MinecraftServer.java:1087) ~[spigot-1.16.2.jar:git-Spigot-d65430a-bad55db]
    at net.minecraft.server.v1_16_R2.DedicatedServer.b(DedicatedServer.java:352) ~[spigot-1.16.2.jar:git-Spigot-d65430a-bad55db]
    at net.minecraft.server.v1_16_R2.MinecraftServer.a(MinecraftServer.java:1007) ~[spigot-1.16.2.jar:git-Spigot-d65430a-bad55db]
    at net.minecraft.server.v1_16_R2.MinecraftServer.w(MinecraftServer.java:846) ~[spigot-1.16.2.jar:git-Spigot-d65430a-bad55db]
    at net.minecraft.server.v1_16_R2.MinecraftServer.lambda$0(MinecraftServer.java:164) ~[spigot-1.16.2.jar:git-Spigot-d65430a-bad55db]
    at java.lang.Thread.run(Thread.java:832) [?:?]

就在服务器崩溃之前,我可以看到我已经被传送到另一个位置,但仍然和以前一样在同一个世界上。重新启动并重新登录时,我可以看到我已被传送到与以前相同的世界上的另一个位置。

编辑:我尝试添加以便服务器创建一个新世界并传送到生成点,但服务器仍然崩溃并且游戏超时。

我该如何解决这个问题。谢谢!

标签: javapluginsserverminecraftbukkit

解决方案


推荐阅读