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

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

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

Статус темы:
Закрыта.
  1. Автор темы
    CoolBoy

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

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

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

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

    На практике:
    Имею код:
    Код:
    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 Старожил

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

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

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

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

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

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

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

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

    Dereku Старожил

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

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

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

    Dereku Старожил

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Dereku Старожил

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

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

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

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

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

    Dereku Старожил

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

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

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

    Насчёт Bash скриптов - быть может и было бы удобно, но для меня реализация метода в плагине проще.
     
Статус темы:
Закрыта.

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