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

Помогите Клетки в миниигре

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

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

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

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Пишу свой скайварс, и встал вопрос как сделать клетки. Порылся в UltraSkyWars и понял, что там через WorldEdit, впрочем это наверное самый разумный вариант. Проблема в следующем: я храню все эдитсессии игроков, чтобы при нужде взять клетку игрока и удалить её, но иногда бывает такое, что клетка попросту не удаляется, особенно это актуально, когда игрок изначально заходит, я ставлю обычную клетку, после беру данные из бд и уже на место этой клетки ставлю его, но иногда его клетка удаляется, а так что была изначально, обычная, остаётся. Какие ваши идеи на счёт этого?
    На всякий случай прикреплю код:

    Код:
        public static HashMap<Player, Cage> cageHashMap = new HashMap<>();
    
        private final String cage;
        private Player player;
        private final List<EditSession> editSessions = new ArrayList<>();
    
        public Cage(String cage) {
            this.cage = cage;
        }
    
        public void create(Player player, Location location) {
    
            this.player = player;
    
           EditSession editSession = WorldEdit.getInstance().getEditSessionFactory().getEditSession(new BukkitWorld(location.getWorld()), -1);
    
            File file = new File(Paths.get("/home/SkyWarsUlits/Cages").toUri().getPath(), this.cage);
    
            try {
                CuboidClipboard cc = CuboidClipboard.loadSchematic(file);
                try {
                    cc.paste(editSession, new Vector().setX(location.getX()).setY(location.getY()).setZ(location.getZ()), true);
                    this.editSessions.add(editSession);
                    cageHashMap.put(player, this);
                } catch (MaxChangedBlocksException e) {
                    e.printStackTrace();
                }
            } catch (DataException | IOException e) {
                e.printStackTrace();
            }
    
        }
    
        public void remove() {
    
            this.editSessions.forEach(editSession -> {
                editSession.undo(editSession);
            });
    
            cageHashMap.remove(player);
    
        }
     
  2. SenQ

    SenQ Новичок

    Баллы:
    6
    Имя в Minecraft:
    SenQ
    Клетка не ставится, а весь остальной метод при этом выполняется? Поставь проверку чтобы точно знать
     
  3. Автор темы
    OJIEKCAHDP

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

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Клетка как раз таки ставится, но когда я её убираю, есть шанс что она не уберётся.
     
  4. alexandrage

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

    Баллы:
    173
    Сессия очищается когда игрок выходит с сервера.
     
  5. Автор темы
    OJIEKCAHDP

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

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Тут же не привязана к игроку сессия, да даже если и так, все игроки на месте, но у кого-то может не убраться клетка, а то и у некоторых
     
  6. SenQ

    SenQ Новичок

    Баллы:
    6
    Имя в Minecraft:
    SenQ
    попробуй player.getDisplayName(), потому что просто player не всегда срабатывает. Также нужно прочекать точно ли удаляется player из cageHashMap
     
  7. Автор темы
    OJIEKCAHDP

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

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Прикол в том, что в хашмапе есть все клетки, но попросту их не убирает WE. По хашмапе прохожусь foreach`ем
     
  8. swat1x

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

    Баллы:
    76
    Имя в Minecraft:
    swat1x
    Когда игрок с сервера выходит, он из хешмапа удаляется, если юзаьб ключ как Player. Лучше используй String, но при этом в PlayerQuitEvent удаляй клетку
     
  9. mirrerror

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

    Баллы:
    76
    Имя в Minecraft:
    mirrerror
    Лучше уж тогда юзать UUID
     
  10. swat1x

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

    Баллы:
    76
    Имя в Minecraft:
    swat1x
    *Тот самый умник которые вставит свои 3 копейки*
     
  11. mirrerror

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

    Баллы:
    76
    Имя в Minecraft:
    mirrerror
    Этот вариант лучше использовать. Видимо, у тебя сегодня был плохой день, раз ты так злобно реагируешь на это, но выплескивание негатива на форуме по Майнкрафту это не решит, бро. Я понимаю, что тебя кинул тот челик, но я то тебе ничего плохого не сделал.
     
  12. swat1x

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

    Баллы:
    76
    Имя в Minecraft:
    swat1x
    Интересно, в чём проблема получать ник игрока и записывать его, вместо того чтобы на кой то чёрт получать uuid
     
  13. mirrerror

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

    Баллы:
    76
    Имя в Minecraft:
    mirrerror
    Если онлайн мод включен, то могут возникнуть проблемы, к примеру, если челик сменит ник
     
  14. MurlikMurlik

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

    Баллы:
    96
    Глобальная сессия очищается через некоторое время, поэтому ее нет смысла хранить где то.
    Лучшее решение, это при удалении клетки, явно ее удалять. То есть, если это полый куб, то создай такую операцию и выполни ее, так же как ты это делаешь при создании клетки.
     
  15. Автор темы
    OJIEKCAHDP

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

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Вопрос довольно просто решается, нужно было создать сессию отдельно для игрока, всем спасибо за помощь!
     
Статус темы:
Закрыта.

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