Помогите Поле зрения игрока.

FAQCoder

Активный участник
Пользователь
Баллы
61
Здравствуйте, недавно у меня возник вопрос как получить всех энтитей в поле зрения игрока. Пробовал .getLineOfSight(null, 50); но особо ничего не выходило. Можно ли получить энтитей включая невидимые и видимые армор стенды в поле зрения игрока, или просто как получить название энтити на которого игрок смотрит?
 
Получаешь лист блоков, находящихся на прицеле игрока.

По вопросу же.. Как вариант - циклом парсить всех сущностей в мире; считать квадратное расстояние между игроком и сущностью; проверять не превышает ли требуемое; считать горизонтальный угол между ними; проверять его; считать вертикальный угол между ними; проверять его; добавить в лист.
Однако, полагаю, это будет довольно ресурсоёмко, особенно если такой игрок будет не один. К тому же для всех игроков будет просчет одного и того же поля зрения, например, на 90гр., когда как у них может стоять там какой-нибудь quake-pro.
Может есть и иной вариант.
 
Получаешь лист блоков, находящихся на прицеле игрока.

По вопросу же.. Как вариант - циклом парсить всех сущностей в мире; считать квадратное расстояние между игроком и сущностью; проверять не превышает ли требуемое; считать горизонтальный угол между ними; проверять его; считать вертикальный угол между ними; проверять его; добавить в лист.
Однако, полагаю, это будет довольно ресурсоёмко, особенно если такой игрок будет не один. К тому же для всех игроков будет просчет одного и того же поля зрения, например, на 90гр., когда как у них может стоять там какой-нибудь quake-pro.
Может есть и иной вариант.
Возможно ли получить ентити на которого смотрит игрок, не используя поле зрения? Возможно ли получить невидимый или видимый арморстенд на который смотрит игрок? Если, да то как?
 
Возможно ли получить ентити на которого смотрит игрок, не используя поле зрения? Возможно ли получить невидимый или видимый арморстенд на который смотрит игрок? Если, да то как?
В интернетах есть такой вариант. Полагаю, в какой-то мере он подойдет и для поиска сущностей в поле зрения.
 
Я использовал в своих задачах это. Вполне удобная вещь, можно под свои нужды модифицирвоать также.
 
Дарю.
Использование: 1 метод это игрок, а радиус это дальность действия метода. Вернет ближайшего ентити на прицеле игрока, но не дальше радиуса.
PHP:
    public static Entity getNearestEntityInSight(Player player, int range) {
        ArrayList<Entity> entities = (ArrayList<Entity>) player.getNearbyEntities(range, range, range);
        ArrayList<Block> sightBlock = (ArrayList<Block>) player.getLineOfSight( (Set<Material>) null, range);
        ArrayList<Location> sight = new ArrayList<Location>();
        for (int i = 0; i < sightBlock.size(); i++)
            sight.add(sightBlock.get(i).getLocation());
        for (int i = 0; i < sight.size(); i++) {
            for (int k = 0; k < entities.size(); k++) {
                if (Math.abs(entities.get(k).getLocation().getX() - sight.get(i).getX()) < 1.3) {
                    if (Math.abs(entities.get(k).getLocation().getY() - sight.get(i).getY()) < 1.5) {
                        if (Math.abs(entities.get(k).getLocation().getZ() - sight.get(i).getZ()) < 1.3) {
                            if(entities.get(k) instanceof Player) {
                                return entities.get(k);
                            } else {
                                return null;
                            }
                        }
                    }
                }
            }
        }
        return null;
    }
 
Дарю.
Использование: 1 метод это игрок, а радиус это дальность действия метода. Вернет ближайшего ентити на прицеле игрока, но не дальше радиуса.
PHP:
    public static Entity getNearestEntityInSight(Player player, int range) {
        ArrayList<Entity> entities = (ArrayList<Entity>) player.getNearbyEntities(range, range, range);
        ArrayList<Block> sightBlock = (ArrayList<Block>) player.getLineOfSight( (Set<Material>) null, range);
        ArrayList<Location> sight = new ArrayList<Location>();
        for (int i = 0; i < sightBlock.size(); i++)
            sight.add(sightBlock.get(i).getLocation());
        for (int i = 0; i < sight.size(); i++) {
            for (int k = 0; k < entities.size(); k++) {
                if (Math.abs(entities.get(k).getLocation().getX() - sight.get(i).getX()) < 1.3) {
                    if (Math.abs(entities.get(k).getLocation().getY() - sight.get(i).getY()) < 1.5) {
                        if (Math.abs(entities.get(k).getLocation().getZ() - sight.get(i).getZ()) < 1.3) {
                            if(entities.get(k) instanceof Player) {
                                return entities.get(k);
                            } else {
                                return null;
                            }
                        }
                    }
                }
            }
        }
        return null;
    }
Версия 1.12.2 как получить невидимый армор стенд, пробовал изменить instanceof Player на ArmorStand, видимые арморстенды он получает, невидимые игнорирует.
 
Версия 1.12.2 как получить невидимый армор стенд, пробовал изменить instanceof Player на ArmorStand, видимые арморстенды он получает, невидимые игнорирует.
Значит они фейковые на пакетах онли.
 
Версия 1.12.2 как получить невидимый армор стенд, пробовал изменить instanceof Player на ArmorStand, видимые арморстенды он получает, невидимые игнорирует.
Никак, если он фейковый.
 
Назад
Верх