Плагин Minecraft bukkit spigot, телепортирующийся в другой мир, вызывает сбой: исключение в цикле переключения сервера

#java #plugins #server #minecraft #bukkit

#java #Плагины #сервер #Minecraft #bukkit

Вопрос:

Я создаю плагин для своего сервера Minecraft, цель которого состоит в том, чтобы иметь возможность выдавать команду для телепортации в другой творческий сверхплоский мир. Проблема в том, что когда игрок телепортируется, сервер выходит из строя. Вот мой код внутри плагина:

 // 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) [?:?]
  

Прямо перед сбоем сервера я вижу, что я был телепортирован в другое место, но все еще в том же мире, что и раньше. При запуске резервного копирования и повторном входе в систему я вижу, что меня телепортировали в другое место в том же мире, что и раньше.

Редактировать: Я попытался добавить так, чтобы сервер создавал новый мир и телепортировался в точку возрождения, но сервер все равно вылетает, и время ожидания игры истекает.

Как я могу это решить. Спасибо!

Комментарии:

1. world_ntischool Это существующий мир или вы пытаетесь сгенерировать его перед отправкой плеера?

2. Я пробовал оба, но в основном это существующий мир.

3. Если он уже существует, попробуйте использовать getWorld для newWorld переменной вместо WorldCreator

4. Спасибо, но когда я пытаюсь, getWorld возвращает null