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

Статус
Закрыто для дальнейших ответов.

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);

    }
 
Клетка не ставится, а весь остальной метод при этом выполняется? Поставь проверку чтобы точно знать
 
Клетка не ставится, а весь остальной метод при этом выполняется? Поставь проверку чтобы точно знать
Клетка как раз таки ставится, но когда я её убираю, есть шанс что она не уберётся.
 
Сессия очищается когда игрок выходит с сервера.
Тут же не привязана к игроку сессия, да даже если и так, все игроки на месте, но у кого-то может не убраться клетка, а то и у некоторых
 
Тут же не привязана к игроку сессия, да даже если и так, все игроки на месте, но у кого-то может не убраться клетка, а то и у некоторых
попробуй player.getDisplayName(), потому что просто player не всегда срабатывает. Также нужно прочекать точно ли удаляется player из cageHashMap
 
попробуй player.getDisplayName(), потому что просто player не всегда срабатывает. Также нужно прочекать точно ли удаляется player из cageHashMap
Прикол в том, что в хашмапе есть все клетки, но попросту их не убирает WE. По хашмапе прохожусь foreach`ем
 
Когда игрок с сервера выходит, он из хешмапа удаляется, если юзаьб ключ как Player. Лучше используй String, но при этом в PlayerQuitEvent удаляй клетку
 
*Тот самый умник которые вставит свои 3 копейки*
Этот вариант лучше использовать. Видимо, у тебя сегодня был плохой день, раз ты так злобно реагируешь на это, но выплескивание негатива на форуме по Майнкрафту это не решит, бро. Я понимаю, что тебя кинул тот челик, но я то тебе ничего плохого не сделал.
 
Этот вариант лучше использовать. Видимо, у тебя сегодня был плохой день, раз ты так злобно реагируешь на это, но выплескивание негатива на форуме по Майнкрафту это не решит, бро. Я понимаю, что тебя кинул тот челик, но я то тебе ничего плохого не сделал.
Интересно, в чём проблема получать ник игрока и записывать его, вместо того чтобы на кой то чёрт получать uuid
 
Интересно, в чём проблема получать ник игрока и записывать его, вместо того чтобы на кой то чёрт получать uuid
Если онлайн мод включен, то могут возникнуть проблемы, к примеру, если челик сменит ник
 
Пишу свой скайварс, и встал вопрос как сделать клетки. Порылся в 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);

    }
Глобальная сессия очищается через некоторое время, поэтому ее нет смысла хранить где то.
Лучшее решение, это при удалении клетки, явно ее удалять. То есть, если это полый куб, то создай такую операцию и выполни ее, так же как ты это делаешь при создании клетки.
 
Вопрос довольно просто решается, нужно было создать сессию отдельно для игрока, всем спасибо за помощь!
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх