Хостинг серверов Minecraft playvds.com
  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

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

  1. Автор темы
    Lisenochek

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

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

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

    Как можно респавнить игрока около кровати, если около нее есть пустые блоки? Пробовал перебирать все блоки, но чет не получилось.
     
    Последнее редактирование: 9 окт 2018
  2. Mr Hosting
  3. LuckyZeeRo

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

    Баллы:
    76
    Имя в Minecraft:
    i0xHeX
    Если ты телепортируешь конкретно на координаты, игрок не будет телепортироваться в другое место. В твоем случае локация имеет место не там, где кровать. Я хотел сказать, что возможно проверять все Y от данной точки до 0 в поисках кровати, но не уверен, как работает сохранение локации, если допустим взять, что все 256 блоков включая кровать будут без воздуха. Самый надежный вариант - хранить локацию самому при взаимодействии с кроватью.
     
  4. alexandrage

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

    Баллы:
    173
    Игроку нужно 2 пустых блока в высоту.
     
  5. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Тогда требуется искать это месте около кровати, но чет я не совсем догоняю, как можно перебрать все блоки в округе.
     
  6. alexandrage

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

    Баллы:
    173
    Циклом.
     
  7. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Логично.
     
  8. Klavy

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

    Баллы:
    66
    Держи код:
    Код:
    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 при отсутствии какого либо места
     
  9. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Проблема не в этом, а в том, что я не знаю, как исключить вот эти блоки при проверке.

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

    [​IMG]
     
  10. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Берёшь направление куда смотрит кровать и через getRelative хоба, хоба, и есть.
     
  11. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Хорошо объяснил, ничего не понял. Зачем мне все это, если мне требуется убрать эти блоки?
     
  12. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Да и при том, направление достать у кровати проблематично, я не нашел рабочего метода по определению направления.
     
  13. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Код:
       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);
                }
            }
    Делаю примерно так, получаю это:
    [​IMG]
     
  14. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
  15. LuckyZeeRo

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

    Баллы:
    76
    Имя в Minecraft:
    i0xHeX
    Покажи код, как ты телепортируешь игрока. Выведи координаты перед телепортацией и координаты в слушателе телепортов на monitor приоритете. И отпиши сюда.
     
  16. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Код:
            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());
    Но этот код ищет все блоки вокруг кровати, но мне нужно убрать крайние по углам блоки, чтобы кровать не застраивали в маленькой комнатке и оставляли свободное место как раз в этом крайнем угле.
     

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