Помогите Как получить игрока, который находится под прицелом

_MCMaster_

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
DragOn4ik
Вопрос в названии. Заранее спасибо)
 
Так вот как всякие VoxelSniper'ы вычисляют блок на который смотрит игрок...
(нет, ну реально рофлишь)
На блок есть готовый метод player.getTargetBlock. Так к слову.
И потом цель не озвучена, если для пушек, мой вариант подходит.
Если нет. Предложу варик с BlockIterator+getNearbyEntities.
 
Последнее редактирование:
На блок есть готовый метод player.getTargetBlock. Так к слову.
И потом цель не озвучена, если для пушек, мой вариант подходит.
Если нет. Предложу варик с BlockIterator+getNearbyEntities.
Запускать Projectile для пушек, гениально.
 
Запускать Projectile для пушек, гениально.
Ты видимо не о тех пушках подумал.
472977.jpg
 
Оффтоп.
Хотел сделать турель, которая при активации стреляет во всех игроков, находящихся в неком радиусе(указывается в конфиге). Как я понимаю, здесь надо использовать getNearbyEntities() ?
 
Ну если получить игроков в радиусе то да, но там же не учтено, могут ли они быть на линии наблюдения.
 
Ну если получить игроков в радиусе то да, но там же не учтено, могут ли они быть на линии наблюдения.
Ищешь ближайшего игрока и наводишь кодом ниже.

Код:
    public static Location setDirection(Location loc, Location lookat) {
        loc = loc.clone();
        double dx = lookat.getX() - loc.getX();
        double dy = lookat.getY() - loc.getY();
        double dz = lookat.getZ() - loc.getZ();
        if (dx != 0) {
            if (dx < 0) {
                loc.setYaw((float) (1.5 * Math.PI));
            } else {
                loc.setYaw((float) (0.5 * Math.PI));
            }
            loc.setYaw((float) loc.getYaw() - (float) Math.atan(dz / dx));
        } else if (dz < 0) {
            loc.setYaw((float) Math.PI);
        }
        double dxz = Math.sqrt(Math.pow(dx, 2) + Math.pow(dz, 2));
        loc.setPitch((float) -Math.atan(dy / dxz));
        loc.setYaw(-loc.getYaw() * 180f / (float) Math.PI);
        loc.setPitch(loc.getPitch() * 180f / (float) Math.PI);
        return loc;
    }
Поиск препятствий? Ну придется подрочить блокитератор или еще что.
 
Ищешь ближайшего игрока и наводишь кодом ниже.

Код:
    public static Location setDirection(Location loc, Location lookat) {
        loc = loc.clone();
        double dx = lookat.getX() - loc.getX();
        double dy = lookat.getY() - loc.getY();
        double dz = lookat.getZ() - loc.getZ();
        if (dx != 0) {
            if (dx < 0) {
                loc.setYaw((float) (1.5 * Math.PI));
            } else {
                loc.setYaw((float) (0.5 * Math.PI));
            }
            loc.setYaw((float) loc.getYaw() - (float) Math.atan(dz / dx));
        } else if (dz < 0) {
            loc.setYaw((float) Math.PI);
        }
        double dxz = Math.sqrt(Math.pow(dx, 2) + Math.pow(dz, 2));
        loc.setPitch((float) -Math.atan(dy / dxz));
        loc.setYaw(-loc.getYaw() * 180f / (float) Math.PI);
        loc.setPitch(loc.getPitch() * 180f / (float) Math.PI);
        return loc;
    }
Поиск препятствий? Ну придется подрочить блокитератор или еще что.
Ору, ничего, что можно просто засетать Direction вектором?
PHP:
final Location location = startLocation.clone();
location.setDirection(endLocation.toVector().substract(startLocation.toVector()));
 
Ору, ничего, что можно просто засетать Direction вектором?
PHP:
final Location location = startLocation.clone();
location.setDirection(endLocation.toVector().substract(startLocation.toVector()));
Было бы круто, еслиб оно работало как должно. Намучился с этим в свое время.
 
Было бы круто, еслиб оно работало как должно. Намучился с этим в свое время.
Ну во первых все нормально работает, во вторых тут и сетать direction не нужно, можно самому двигать снаряд по вектору.
 
Пользуюсь одним методом (откопал где-то в глубинах гугла). Этот код ищет сущность в направлении взгляда игрока.
Код:
  public LivingEntity rayTraceEntity(final Player player, final int range) {
      final BlockIterator iterator = new BlockIterator(player.getWorld(), player.getEyeLocation().toVector(), player.getEyeLocation().getDirection(), 0.0, range);
      Chunk chunk = null;
      Entity[] entities = null;
      while (iterator.hasNext()) {
          final Location l = iterator.next().getLocation();
          if (chunk != l.getChunk()) {
              chunk = l.getChunk();
              entities = chunk.getEntities();
          }
          if (entities != null && entities.length > 0) {
              final Entity[] arr$ = entities;
              for (int len$ = entities.length, i$ = 0; i$ < len$; ++i$) {
                  final Entity entity = arr$[i$];
                  if (entity != player && entity instanceof LivingEntity && entity.getType() != EntityType.SQUID && l.getWorld() == entity.getLocation().getWorld() && l.distance(entity.getLocation()) < 1.5) {
                      return (LivingEntity)entity;
                  }
              }
          }
      }
      return null;
  }
Юзать вот так:
Код:
LivingEntity entityTarget = rayTraceEntity(Player, 16);
//И обязательно делать проверку на то не равен ли Entyty null
if(entityTarget == null){
//Если равен ничему, то есть его нет.
}else{
TODO
}
 
Пользуюсь одним методом (откопал где-то в глубинах гугла). Этот код ищет сущность в направлении взгляда игрока.
Код:
  public LivingEntity rayTraceEntity(final Player player, final int range) {
      final BlockIterator iterator = new BlockIterator(player.getWorld(), player.getEyeLocation().toVector(), player.getEyeLocation().getDirection(), 0.0, range);
      Chunk chunk = null;
      Entity[] entities = null;
      while (iterator.hasNext()) {
          final Location l = iterator.next().getLocation();
          if (chunk != l.getChunk()) {
              chunk = l.getChunk();
              entities = chunk.getEntities();
          }
          if (entities != null && entities.length > 0) {
              final Entity[] arr$ = entities;
              for (int len$ = entities.length, i$ = 0; i$ < len$; ++i$) {
                  final Entity entity = arr$[i$];
                  if (entity != player && entity instanceof LivingEntity && entity.getType() != EntityType.SQUID && l.getWorld() == entity.getLocation().getWorld() && l.distance(entity.getLocation()) < 1.5) {
                      return (LivingEntity)entity;
                  }
              }
          }
      }
      return null;
  }
Юзать вот так:
Код:
LivingEntity entityTarget = rayTraceEntity(Player, 16);
//И обязательно делать проверку на то не равен ли Entyty null
if(entityTarget == null){
//Если равен ничему, то есть его нет.
}else{
TODO
}
Говно какое-то откопал, если че в баките уже есть готовый метод getNearbyEntities, к тому же для игрока уже написан лучший способ - перебирать всех игроков и по векторам быстренько проверить.
 
Говно какое-то откопал, если че в баките уже есть готовый метод getNearbyEntities, к тому же для игрока уже написан лучший способ - перебирать всех игроков и по векторам быстренько проверить.
Почему это говно? Скорее альтернатива твоему методу так же перебирает сущности как метод getNearbyEntities.
 
Скорее альтернатива твоему методу так же перебирает сущности как метод getNearbyEntities.
Ну так, зачем этот метод, если есть getNearbyEntities, да и в любом случаи твой метод вернет только одну сущность.
 
Назад
Верх