Помогите Метод teleport работает некорректно.

Lisenochek

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Lisenochek
Всем привет. Требуется телепортировать игрока на кровать. Локация непосредственно кровати есть. Когда я телепортирую игрока на эту локацию, его может тепнуть на самую высокую точку, относительно y. Как я понял, игрок не может телепортироваться туда, где есть твердый блок.

Смотрел исходники спигота и там вроде как не нашел никакого куска кода, который бы отвечал за изменение Y.

Как можно респавнить игрока около кровати, если около нее есть пустые блоки? Пробовал перебирать все блоки, но чет не получилось.
 
Последнее редактирование:
Если ты телепортируешь конкретно на координаты, игрок не будет телепортироваться в другое место. В твоем случае локация имеет место не там, где кровать. Я хотел сказать, что возможно проверять все Y от данной точки до 0 в поисках кровати, но не уверен, как работает сохранение локации, если допустим взять, что все 256 блоков включая кровать будут без воздуха. Самый надежный вариант - хранить локацию самому при взаимодействии с кроватью.
 
Тогда требуется искать это месте около кровати, но чет я не совсем догоняю, как можно перебрать все блоки в округе.
Держи код:
Код:
public Set<Block> getEmptySpace(Block bed, int radius){
        if (radius < 0) {
            return new HashSet<Block>(0);
        }
        int iterations = (radius * 2) + 1;
        Set<Block> blocks = new HashSet<Block>(iterations * iterations * iterations);
        for (int x = -radius; x <= radius; x++)
            for (int y = -radius; y <= radius; y++)
                for (int z = -radius; z <= radius; z++) {
                    Block blockFound = bed.getRelative(x, y, z);
                    if (isVoid(blockFound.getLocation())
                            && isVoid(blockFound.getLocation().add(0, 1, 0)))
                        blocks.add(bed.getRelative(x, y, z));
                }
        return blocks;
    }

    private boolean isVoid(Location location) {
        Block block = location.getBlock();
        return block == null || block.getType() == Material.AIR;
    }

Метод getEmptySpace даст список свободных блоков для телепортации игрока.
Указывается блок кровати и радиус. Вернёт пустой Set при отсутствии какого либо места
 
Проблема не в этом, а в том, что я не знаю, как исключить вот эти блоки при проверке.

Как можно в цикле или после него в другом цикле достать конкретно эти блоки и удалить?

Y4aMrC5Evaj7OafgRypJ8Q3yOdDgCrlBm0H2XNdIUUvn_o-9RpRd_ydp-yUh1lxJLt3XL_912C7DAfLx7JFJTg%3D%3D
 
Проблема не в этом, а в том, что я не знаю, как исключить вот эти блоки при проверке.

Как можно в цикле или после него в другом цикле достать конкретно эти блоки и удалить?

Y4aMrC5Evaj7OafgRypJ8Q3yOdDgCrlBm0H2XNdIUUvn_o-9RpRd_ydp-yUh1lxJLt3XL_912C7DAfLx7JFJTg%3D%3D
Берёшь направление куда смотрит кровать и через getRelative хоба, хоба, и есть.
 
Берёшь направление куда смотрит кровать и через getRelative хоба, хоба, и есть.
Хорошо объяснил, ничего не понял. Зачем мне все это, если мне требуется убрать эти блоки?
 
Да и при том, направление достать у кровати проблематично, я не нашел рабочего метода по определению направления.
 
Код:
   for (int x = -1; x <= 1; x++) {
            for (int z = -1; z <= 1; z++) {
                Location loc = spawnPointClass.getLocation().getBlock().getRelative(x, 0, z).getLocation();
                if (loc.getBlock().getType() == Material.AIR) loc.getBlock().setType(Material.QUARTZ_BLOCK);
            }
        }

Делаю примерно так, получаю это:
Y4aMrC5Evaj7OafgRypJ8U-RuUhBIl_q88Qr4omf_tQIhQV3XxnpXzMKPvTShhYlSthnmnVp6FbksqzqOXAz9w%3D%3D
 
Покажи код, как ты телепортируешь игрока. Выведи координаты перед телепортацией и координаты в слушателе телепортов на monitor приоритете. И отпиши сюда.

Код:
        Location location = null;

        for (int x = -1; x <= 1; x++) {
            for (int z = -1; z <= 1; z++) {
                Location loc = spawnPointClass.getLocation().getBlock().getRelative(x, 0, z).getLocation();
               
                if(loc.getBlock().getType() == Material.AIR && loc.add(0,1,0).getBlock().getType() == Material.AIR) location = loc;
            }
        }

        if (location == null) {
            Utils.sendBarMessage(player, "&7Около точки возрождения &cнет &7свободного места.");
            return;
        }
       
        WorldClass.getWorldClass().teleport(player, location.add(0.5D, 0, 0.5D));
        spawnPointClass.setCooldown(spawnPointClass.getType().getCooldown());

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