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

  • Автор темы Автор темы CoolBoy
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

CoolBoy

Активный участник
Пользователь
Баллы
96
Имя в Minecraft
Xezard
Доброго времени суток, уважаемые форумчане.

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

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

На практике:
Имею код:
Java:
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 если есть методы реализации того, что я хочу, проще - предлагайте, я буду только рад.
 
Не используй этот метод в onEnable.
Bukkit.unloadWorld(world_name, true);

Увы, при выгрузке мира ваниль сохраняет мир в любом случае походу.
 
Не используй этот метод в onEnable.
Bukkit.unloadWorld(world_name, true);

Увы, при выгрузке мира ваниль сохраняет мир в любом случае походу.
Ок, так что мне делать? Мне мир нужно выгрузить и заменить в любом случае.
 
Интересно, почему Ission удалил свой пост. Ну да ладно.
Ок, так что мне делать? Мне мир нужно выгрузить и заменить в любом случае.
Главное чтобы он не был основным миром. иначе грустно будет.
А можешь поступить хитрее - не удалять session.lock и копировать только папку region.
 
Интересно, почему Ission удалил свой пост. Ну да ладно.
Главное чтобы он не был основным миром. иначе грустно будет.
А можешь поступить хитрее - не удалять session.lock и копировать только папку region.
Ух ты. Сложно для меня. Есть готовые примеры реализации? Потому что удалить директорию можно в один метод, а по файлово - для меня сложно :)
Алсо, на сервере этот мир и используется как "основной".
Енда нет, ада тоже.
Миниигра же :)
 
а по файлово - для меня сложно
Берёшь и чистишь папку region, после копируешь своё содержимое в неё.
на сервере этот мир и используется как "основной".
А это грустно. Потому что сервер не может выгрузить единственный мир.
В таком случае лучше написать bash скрипт, который будет удалять использованный мир и копировать чистый.
 
1. Запускаешь скрипт
2. Останавливаешь сервер
3. Меняешь миры скриптом
4. Запускаешь сервер
Кажется меня опередили...
 
1. Запускаешь скрипт
2. Останавливаешь сервер
3. Меняешь миры скриптом
4. Запускаешь сервер
Кажется меня опередили...
Дело в том, что создавать отдельный скрипт для каждого сервера - плохая идея.
Плюс, в других минииграх же как-то мир меняют.
Такая простая, на первый взгляд, задача оказалась практически не выполнимой для меня.
 
Дело в том, что создавать отдельный скрипт для каждого сервера - плохая идея.
Плюс, в других минииграх же как-то мир меняют.
Такая простая, на первый взгляд, задача оказалась практически не выполнимой для меня.
Идея не такая уж плохая. И я точно не уверен, но сервера миниигр останавливают по окончании матча.
 
Идея не такая уж плохая. И я точно не уверен, но сервера миниигр останавливают по окончании матча.
Останавливают конечно. А при новом запуске, плагин на любую миниигру обычно удаляет старый мир, заменяя его новым.
 
Останавливают конечно. А при новом запуске, плагин на любую миниигру обычно удаляет старый мир, заменяя его новым.
Ну раз тут люди говорят, что основной мир проблемно отгружать, то у вас только 2 варианта:
1. Сделать скриптом
2. Создать доп. мир для миниигры и работать с ним
 
Ну раз тут люди говорят, что основной мир проблемно отгружать, то у вас только 2 варианта:
1. Сделать скриптом
2. Создать доп. мир для миниигры и работать с ним
2) Бесполезно. Уже попробовал.
 
Почему же бесполезно? Вы сначала создайте новый мир при первой загрузке плагина, а потом замените его.
Я уже делал это, написал же. Бесполезно. И это не мой вариант - у меня 1 карта, на 1 сервер.
На данный момент решил проблему в 200 с лишним строк. Без понятия - костыль это, или не костыль. Оставлю тему открытой, вдруг у кого есть способ проще.
 
Дело в том, что создавать отдельный скрипт для каждого сервера - плохая идея.
Вообще то нет. Ты просто запускаешь сервер с этим скриптом. После того, как сервер останавливается, скрипт удаляет старый мир и копирует новый. Так на серверах с минииграми сделано (тот же хайпиксель и прочие).
Плюс, в других минииграх же как-то мир меняют.
Там подгружается либо другой мир, либо при завершении игры мир откатывается.
Такая простая, на первый взгляд, задача оказалась практически не выполнимой для меня.
Мысли шире. Любую задачу можно реализовать как минимум двумя способами.
 
Вообще то нет. Ты просто запускаешь сервер с этим скриптом. После того, как сервер останавливается, скрипт удаляет старый мир и копирует новый. Так на серверах с минииграми сделано (тот же хайпиксель и прочие).

Там подгружается либо другой мир, либо при завершении игры мир откатывается.
Мысли шире. Любую задачу можно реализовать как минимум двумя способами.
Знаю. Но уже решил так как хотел. Собственно, при запуске, в onLoad() вызываю свой метод, который полностью удаляет директорию старого мира. После удаления, заходит в директорию плагина и побайтово копирует дерикторию нового мира в путь сервера. Потом этот мир просто сам загружается сервером.

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

В дополнение скажу напишу, что, например, на MinePlex, сервера вообще не перезагружаются.
 
В дополнение скажу, что, например, на MinePlex, сервера вообще не перезагружаются.
Да смотря какие. Если игровые, то как раз перезапускаются. Просто их там много и один заменяет другой.
 
Да смотря какие. Если игровые, то как раз перезапускаются. Просто их там много и один заменяет другой.
Увы, но боюсь ты не прав. У них какая-то своя система, которая восстанавливает карту не перезагружая сервер. (Игровой сервер)
Просматривая конфиги парочки миниигр, вроде BedWarsRel и SkyWarsRel, можно увидеть выбор, каким образом восстанавливать карту.
И там будет что-то типа:
restore world how at mineplex.
При выборе этого метода карта восстанавливается не перезагружая сервер. Жаль, что когда я использовал паблик плагины на миниигры, я не умел кодить. А как стало нужно - так нигде нет.

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