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

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

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

  1. alexandrage

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

    Баллы:
    173
    На блок есть готовый метод player.getTargetBlock. Так к слову.
    И потом цель не озвучена, если для пушек, мой вариант подходит.
    Если нет. Предложу варик с BlockIterator+getNearbyEntities.
     
    Последнее редактирование: 27 авг 2018
  2. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Там ограничение в 100 блоков (и то от настроек сервера зависит). В WE, например, свой метод для получения блока.
     
  3. AbstractCoder

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

    Баллы:
    76
    Имя в Minecraft:
    AbstractCoder
    Запускать Projectile для пушек, гениально.
     
  4. alexandrage

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

    Баллы:
    173
    Ты видимо не о тех пушках подумал.
    [​IMG]
     
  5. AbstractCoder

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

    Баллы:
    76
    Имя в Minecraft:
    AbstractCoder
    Я подумал об огнестрельных.
     
  6. Автор темы
    _MCMaster_

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

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Макс.расстояние - 30 блоков
     
  7. Автор темы
    _MCMaster_

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

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Угадал)
     
  8. Автор темы
    _MCMaster_

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

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Оффтоп.
    Хотел сделать турель, которая при активации стреляет во всех игроков, находящихся в неком радиусе(указывается в конфиге). Как я понимаю, здесь надо использовать getNearbyEntities() ?
     
  9. Exception_Prototype

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

    Баллы:
    96
    Ну если получить игроков в радиусе то да, но там же не учтено, могут ли они быть на линии наблюдения.
     
  10. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Угу, и там разварочивать турель в сторона игрока.
     
  11. alexandrage

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

    Баллы:
    173
    Ищешь ближайшего игрока и наводишь кодом ниже.

    Код:
        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;
        }
    Поиск препятствий? Ну придется подрочить блокитератор или еще что.
     
  12. AbstractCoder

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

    Баллы:
    76
    Имя в Minecraft:
    AbstractCoder
    Ору, ничего, что можно просто засетать Direction вектором?
    PHP:
    final Location location startLocation.clone();
    location.setDirection(endLocation.toVector().substract(startLocation.toVector()));
     
  13. alexandrage

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

    Баллы:
    173
    Было бы круто, еслиб оно работало как должно. Намучился с этим в свое время.
     
  14. AbstractCoder

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

    Баллы:
    76
    Имя в Minecraft:
    AbstractCoder
    Ну во первых все нормально работает, во вторых тут и сетать direction не нужно, можно самому двигать снаряд по вектору.
     
  15. alexandrage

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

    Баллы:
    173
    хз не робило у меня. Всегда как то криво было.
     
  16. AbstractCoder

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

    Баллы:
    76
    Имя в Minecraft:
    AbstractCoder
    Значит что-то не так делал.
     
  17. Grazy

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

    Баллы:
    76
    Имя в Minecraft:
    Prost
    Пользуюсь одним методом (откопал где-то в глубинах гугла). Этот код ищет сущность в направлении взгляда игрока.
    Код:
      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
    }
    
     
  18. AbstractCoder

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

    Баллы:
    76
    Имя в Minecraft:
    AbstractCoder
    Говно какое-то откопал, если че в баките уже есть готовый метод getNearbyEntities, к тому же для игрока уже написан лучший способ - перебирать всех игроков и по векторам быстренько проверить.
     
  19. Grazy

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

    Баллы:
    76
    Имя в Minecraft:
    Prost
    Почему это говно? Скорее альтернатива твоему методу так же перебирает сущности как метод getNearbyEntities.
     
  20. the3dester

    the3dester Новичок Пользователь

    Баллы:
    6
    Ну так, зачем этот метод, если есть getNearbyEntities, да и в любом случаи твой метод вернет только одну сущность.
     

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