Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Dismiss Notice

[Решено] Выгрузка мира и последующее его удаление

Discussion in 'Разработка плагинов для новичков' started by CoolBoy, Jun 30, 2016.

Thread Status:
Not open for further replies.
  1. Автор темы
    CoolBoy

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

    Trophy Points:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Доброго времени суток, уважаемые форумчане.

    Опять с толкнулся проблемой, которую не могу решить в одиночку. Гуглил порядка 6 часов и прочитал кучу тем на этот счёт, но всё бестолку.

    Кратко:
    В теории:
    Имею мир "world" в папке с сервером. Имею также свой плагин. При загрузке сервера мой плагин должен полностью удалить папку с миром "world", затем зайти в свою директорию (plugins/PluginName/) и скопировать оттуда папку с другим миром, но с тем же названием и поставить её обратно, тоесть в директорию сервера.

    На практике:
    Имею код:
    Code:
    private String world_name;
    
    @Override
    public void onEnable()
    {
        replaceNewWorld();
    }
    
    private void replaceNewWorld()
    {
        world_name = config.getString("World-name");
        Bukkit.unloadWorld(world_name, false);
    
        try {
            File f = new File(Bukkit.getWorldContainer(), world_name);
    
            if (f.exists())
            {
                FileUtils.cleanDirectory(f);
            } else {
                f.mkdir();
            }
        
            FileUtils.copyDirectory(world_name, f);
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        Bukkit.getServer().createWorld(new WorldCreator(world_name));
    }
    
    При инициализации метода происходят следующие ошибки:
    http://pastebin.com/zQ2H79xf

    Прошу помощи :oops:

    P.S если есть методы реализации того, что я хочу, проще - предлагайте, я буду только рад.
     
  2. Хостинг MineCraft
    <
  3. Dereku

    Dereku Старожил

    Trophy Points:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Не используй этот метод в onEnable.
    Bukkit.unloadWorld(world_name, true);

    Увы, при выгрузке мира ваниль сохраняет мир в любом случае походу.
     
  4. Автор темы
    CoolBoy

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

    Trophy Points:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Ок, так что мне делать? Мне мир нужно выгрузить и заменить в любом случае.
     
  5. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Разбери worldreset там такое есть.
     
  6. Автор темы
    CoolBoy

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

    Trophy Points:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Декомпилировал, смотрел, ошибка таже. Я 3 абсолютно разных метода проверял - всё бестолку.
     
  7. Dereku

    Dereku Старожил

    Trophy Points:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Интересно, почему Ission удалил свой пост. Ну да ладно.
    Главное чтобы он не был основным миром. иначе грустно будет.
    А можешь поступить хитрее - не удалять session.lock и копировать только папку region.
     
  8. Автор темы
    CoolBoy

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

    Trophy Points:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Ух ты. Сложно для меня. Есть готовые примеры реализации? Потому что удалить директорию можно в один метод, а по файлово - для меня сложно :)
    Алсо, на сервере этот мир и используется как "основной".
    Енда нет, ада тоже.
    Миниигра же :)
     
  9. Dereku

    Dereku Старожил

    Trophy Points:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Берёшь и чистишь папку region, после копируешь своё содержимое в неё.
    А это грустно. Потому что сервер не может выгрузить единственный мир.
    В таком случае лучше написать bash скрипт, который будет удалять использованный мир и копировать чистый.
     
  10. kirill2011s

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

    Trophy Points:
    103
    1. Запускаешь скрипт
    2. Останавливаешь сервер
    3. Меняешь миры скриптом
    4. Запускаешь сервер[DOUBLEPOST=1467368134,1467368102][/DOUBLEPOST]Кажется меня опередили...
     
  11. Автор темы
    CoolBoy

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

    Trophy Points:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Дело в том, что создавать отдельный скрипт для каждого сервера - плохая идея.
    Плюс, в других минииграх же как-то мир меняют.
    Такая простая, на первый взгляд, задача оказалась практически не выполнимой для меня.
     
  12. kirill2011s

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

    Trophy Points:
    103
    Идея не такая уж плохая. И я точно не уверен, но сервера миниигр останавливают по окончании матча.
     
  13. Автор темы
    CoolBoy

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

    Trophy Points:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Останавливают конечно. А при новом запуске, плагин на любую миниигру обычно удаляет старый мир, заменяя его новым.
     
  14. kirill2011s

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

    Trophy Points:
    103
    Ну раз тут люди говорят, что основной мир проблемно отгружать, то у вас только 2 варианта:
    1. Сделать скриптом
    2. Создать доп. мир для миниигры и работать с ним
     
  15. Автор темы
    CoolBoy

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

    Trophy Points:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    2) Бесполезно. Уже попробовал.
     
  16. _MediaNik_

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

    Trophy Points:
    46
    Skype:
    Medianik5
    Имя в Minecraft:
    _MediaNik_
    Почему же бесполезно? Вы сначала создайте новый мир при первой загрузке плагина, а потом замените его.
     
  17. Автор темы
    CoolBoy

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

    Trophy Points:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Я уже делал это, написал же. Бесполезно. И это не мой вариант - у меня 1 карта, на 1 сервер.
    На данный момент решил проблему в 200 с лишним строк. Без понятия - костыль это, или не костыль. Оставлю тему открытой, вдруг у кого есть способ проще.
     
  18. Dereku

    Dereku Старожил

    Trophy Points:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Вообще то нет. Ты просто запускаешь сервер с этим скриптом. После того, как сервер останавливается, скрипт удаляет старый мир и копирует новый. Так на серверах с минииграми сделано (тот же хайпиксель и прочие).
    Там подгружается либо другой мир, либо при завершении игры мир откатывается.
    Мысли шире. Любую задачу можно реализовать как минимум двумя способами.
     
  19. Автор темы
    CoolBoy

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

    Trophy Points:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Знаю. Но уже решил так как хотел. Собственно, при запуске, в onLoad() вызываю свой метод, который полностью удаляет директорию старого мира. После удаления, заходит в директорию плагина и побайтово копирует дерикторию нового мира в путь сервера. Потом этот мир просто сам загружается сервером.

    Также узнал, что можно отключить сохранение мира и после перезагрузки сервера мир сам "как-бы" откатится. Но протестировать это мне так и не удалось. Быть может, это и есть самый простой способ.

    В дополнение скажу напишу, что, например, на MinePlex, сервера вообще не перезагружаются.
     
  20. Dereku

    Dereku Старожил

    Trophy Points:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Да смотря какие. Если игровые, то как раз перезапускаются. Просто их там много и один заменяет другой.
     
  21. Автор темы
    CoolBoy

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

    Trophy Points:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Увы, но боюсь ты не прав. У них какая-то своя система, которая восстанавливает карту не перезагружая сервер. (Игровой сервер)
    Просматривая конфиги парочки миниигр, вроде BedWarsRel и SkyWarsRel, можно увидеть выбор, каким образом восстанавливать карту.
    И там будет что-то типа:
    restore world how at mineplex.
    При выборе этого метода карта восстанавливается не перезагружая сервер. Жаль, что когда я использовал паблик плагины на миниигры, я не умел кодить. А как стало нужно - так нигде нет.

    Насчёт Bash скриптов - быть может и было бы удобно, но для меня реализация метода в плагине проще.
     
Thread Status:
Not open for further replies.

Share This Page