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

Помогите восстановление мира, выгрузка и загрузка

Тема в разделе "Разработка плагинов для новичков", создана пользователем tiu, 14 фев 2021.

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

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

    Баллы:
    61
    Имя в Minecraft:
    tiu
    В попытке сделать сваю +- нормальную мини игру у меня вот появился костыль с минусами которого уже не помиришься.
    (если шо когда я начал это делать у меня было 0 жопыта работа с жабой и я делал это с нуля без сторонних апишек)
    Так вот в конце мини игры мне нужно восстанавливать мир.
    Точно не помню где, но я стриндил вот это

    Код:
    public class rallback {
        static Logger log = Logger.getLogger("Minecraft");
        
        public static void unloadMap(String mapname) {
            if(Bukkit.getServer().unloadWorld(Bukkit.getServer().getWorld(mapname), false)) {
                Logger.getLogger("Minecraft").info("Successfully unloaded " + mapname);
            } else {
                Logger.getLogger("Minecraft").severe("COULD NOT UNLOAD " + mapname);
            }
        }
        public static void loadMap(String mapname) {
            Bukkit.createWorld(new WorldCreator(mapname));
        }
        public static void rollback(String mapname) {
            unloadMap(mapname);
            loadMap(mapname);
        }
    под ету штуку есть 2 мира

    Код:
        public static void loadworlds() {
            Bukkit.createWorld(new WorldCreator("rollback"));
            Bukkit.createWorld(new WorldCreator("arena"));
        }
    когда мне нужно откатить мир я тепаю всех игроков с него

    Код:
        public static void tpout(Player p) {
            p.teleport(new Location(Bukkit.getWorld("rollback"), 0.5, 5, 0.5, 0, 0));
        }
    оно вреде работало но мягка скажем очень очень плохо

    тепал в основной мир я аот так

    Код:
        public static void tpafter1tick(Player p, Location loc) {
            new BukkitRunnable() {
                @Override
                public void run() {
                    p.teleport(loc);
                }
            }.runTaskLater(main.plugin, 1);
        }
    иначе игроки после телепортации не могли видеть друг друга

    и мосле каждой игры мне приходилось релоадать сервер иначе игроки также после метода на откат и телепортации обратно в этот мир так же не могли видеть друг друга

    но самое важное в этом вём то то если 1 из игроков в спектатор моде то начинает очень весёлый ****ец

    https://imgur.com/gallery/zfJDtMn

    все скирины кароч тут ^

    когда игрок попадает в поле зрение спектатора начинается вот такое
    есть ли какой то другой способ откатывать мир?

    мириться с выше перечисленными недостатками этого мне не очень хочется
    Я конечно рассматриваю вариант что я тупой и сделал всё плохо
    я не до конца понимаю как загружаются миры и как может быть такое что игроки не видят друг друга
    Из других способов отката в головы приходить только полное выстраивание мара заново по схематике так как это сделать?

    Помогите пожалуйста
     
  2. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    1. Телепортируй всех игроков в другой мир. Если метод телепортации возвращает false - значит игрока не телепортировало из-за отмены PlayerTeleportEvent в одном из плагинов
    2. Подожди 1 секунду
    3. Отгрузи все чанки. Если метод отгрузки возвращает false - значит чанк не отгрузило из-за отмены ChunkUnloadEvent в одном из плагинов
    4. Подожди 1 секунду
    5. Отгрузи баккитом мир
    6. Подожди 1 секунду
    7. Удали файлы старого мира, загрузи новые
    8. Загрузи баккитом мир заново

    Возможно, задержку в 1 секунду можно сократить до 1 тика. Возможно, где-то она не нужна вовсе. Но тут я уже не уверен. Тестируй
     
Статус темы:
Закрыта.

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