1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Ошибки при удалении мира

Тема в разделе "Разработка плагинов для новичков", создана пользователем l_Slime_l, 7 июн 2018.

  1. Автор темы
    l_Slime_l

    l_Slime_l Активный участник Пользователь

    Баллы:
    76
    Для моей мини-игры нужно удалить мир, который был скопирован. Он удаляется, но остаётся папка region и вся консоль захламляется ошибками ( 100+ штук :bad: ). Каждая ошибка однотипная и выглядит примерно так:
    [18:48:53 ERROR]: Couldn't save chunk; already in use by another instance of Minecraft?
    net.minecraft.server.v1_12_R1.ExceptionWorldConflict: Failed to check session lock for world located at .\Beach11, aborting. Stop the server and delete the session.lock in this world to prevent further issues.
    at net.minecraft.server.v1_12_R1.WorldNBTStorage.checkSession(WorldNBTStorage.java:85) ~[spigot.jar:git-Spigot-3d850ec-809c399]
    at net.minecraft.server.v1_12_R1.World.checkSession(World.java:2814) ~[spigot.jar:git-Spigot-3d850ec-809c399]
    at net.minecraft.server.v1_12_R1.ChunkRegionLoader.saveChunk(ChunkRegionLoader.java:127) ~[spigot.jar:git-Spigot-3d850ec-809c399]
    at net.minecraft.server.v1_12_R1.ChunkProviderServer.saveChunk(ChunkProviderServer.java:209) [spigot.jar:git-Spigot-3d850ec-809c399]
    at net.minecraft.server.v1_12_R1.ChunkProviderServer.unloadChunk(ChunkProviderServer.java:316) [spigot.jar:git-Spigot-3d850ec-809c399]
    at net.minecraft.server.v1_12_R1.ChunkProviderServer.unloadChunks(ChunkProviderServer.java:268) [spigot.jar:git-Spigot-3d850ec-809c399]
    at net.minecraft.server.v1_12_R1.WorldServer.doTick(WorldServer.java:294) [spigot.jar:git-Spigot-3d850ec-809c399]
    at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:801) [spigot.jar:git-Spigot-3d850ec-809c399]
    at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [spigot.jar:git-Spigot-3d850ec-809c399]
    at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot.jar:git-Spigot-3d850ec-809c399]
    at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot.jar:git-Spigot-3d850ec-809c399]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_161]
    По идее, виноват файл session.lock..
    Вот как я удаляю мир. (Пробовал оба метода)
    Код:
    public static boolean deleteWorld(String worldName, boolean loaded) {
             if (loaded) {
                 unloadWorld(worldName);
             }
             File path = new File (worldName);
             if (path.exists()) {
                 for (File file : path.listFiles()) {
                     if (file.isDirectory()) {
                         deleteWorld(worldName + "\\" + file.getName(), false);
                     } else {
                         file.delete();
                     }
                 }
             }
             return (path.delete());
         }
    Код:
    public static boolean deleteWorld(File path) {
            if (path.exists()) {
                File files[] = path.listFiles();
                for (int i = 0; i < files.length; i++) {
                    if (files[i].isDirectory()) {
                        deleteWorld(files[i]);
                    } else {
                        files[i].delete();
                    }
                }
            }
            return (path.delete());
        }
     
  2. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Нужно удалить session.lock
     
  3. Автор темы
    l_Slime_l

    l_Slime_l Активный участник Пользователь

    Баллы:
    76
    Оказалось, что даже когда умирает игрок, консоль забивается ошибками, при удалении session.lock тоже эти ошибки.
     
  4. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Мир то выгружал перед удаленимем?
     
  5. Автор темы
    l_Slime_l

    l_Slime_l Активный участник Пользователь

    Баллы:
    76
    +
     
  6. Dereku

    Dereku Старожил Пользователь

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Код:
    public static void removeWorld(String worldName) {
        World world = Bukkit.getWorld(worldName);
        if (world != null) {
            if (!world.getPlayers().isEmpty()) {
                throw new IllegalStateException("The world \"" + worldName + "\" still contains a players. You need " +
                        "to teleport them to the another world before unloading that world.");
            }
            if (!Bukkit.unloadWorld(world, false)) {
                throw new InternalError("Failed to unload world \"" + worldName + "\"");
            }
        }
    
        final File worldDir = Paths.get(".", worldName).toAbsolutePath().normalize().toFile();
    
        if (!org.apache.commons.io.FileUtils.deleteQuietly(worldDir)) {
            //worldDir is not fully deleted.
        }
    }
     
    Последнее редактирование: 7 июн 2018
  7. Автор темы
    l_Slime_l

    l_Slime_l Активный участник Пользователь

    Баллы:
    76
    Как сделать чтобы этот код выполнялся через определенное время? BukkitRunnable не работает.. Мне просто игроков с арены нужно телепортировать.
     
  8. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Так телепортируй и после этого запускай. Сервер однопоточный, все телепортируются.
     
  9. Автор темы
    l_Slime_l

    l_Slime_l Активный участник Пользователь

    Баллы:
    76
    Я понял почему не срабатывает. Пока игрок не нажмет Respawn, он как бы всё ещё в этом мире. Как его быстро отреспавнить без нажатия кнопки?
    UPD. Уже разобрался.
     
  10. Dereku

    Dereku Старожил Пользователь

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    https://bukkit.org/threads/force-respawn-a-player.442719/
     
  11. Автор темы
    l_Slime_l

    l_Slime_l Активный участник Пользователь

    Баллы:
    76
  12. Dereku

    Dereku Старожил Пользователь

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    А она, увы, не удалится. Надо будет копать nms, освобождать File, и принудительно снимать лок с папки.
    А ещё проверять плагины, которые хранят экземпляр World в себе.
     
  13. Автор темы
    l_Slime_l

    l_Slime_l Активный участник Пользователь

    Баллы:
    76
    @Akultist ведь как-то удалил. http://rubukkit.org/threads/udalenie-mira.157938/
     
  14. Dereku

    Dereku Старожил Пользователь

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
  15. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    NMS кэширует доступ к файлам мира, потому даже после выгрузки мира зачастую удалить нельзя. Иногда людям везёт и либо файлов в кэшэ уже нет, либо сервер успел всё сохранить и выгрузить из кэша к моменту начала удаления. Так что в общем и целом безопасно выгруженный мир никак не удалить. Потому люди и используют одноразовые сервера за bungeecord для этого.
     
  16. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    bungeecord рулит ага.
     

Поделиться этой страницей