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

Помогите автонаводка стрелы

Тема в разделе "Разработка плагинов для новичков", создана пользователем KomapuK, 25 фев 2022.

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

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

    Баллы:
    76
    Имя в Minecraft:
    KOMAP
    При стрельбе из лука, стрела должна лететь в ближайшего моба или игрока, даже если тот кто выстрелил - промахнулся. Как реализовать?
     
  2. MurlikMurlik

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

    Баллы:
    96
    Как вариант. При выстреле запомнить где то, например в хешмапе объект стрелы, а затем в шедулере, менять траекторию до ближайшего моба.
    Но в таком случае тебе придется полностью скопировать логику полета стрелы из самой игры, ради простого изменения траектории до ближайшего моба.
     
  3. Автор темы
    KomapuK

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

    Баллы:
    76
    Имя в Minecraft:
    KOMAP
    То-есть реализовать это практически нереально по той схеме, которой я хочу? Обычный полёт стрелы по направлению в моба или игрока?
     
  4. Автор темы
    KomapuK

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

    Баллы:
    76
    Имя в Minecraft:
    KOMAP
    Вот то, что я хочу. Именно это и нужно мне, как это реализовать? СЫЛЛКА
     
  5. Bezobrazie

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

    Баллы:
    46
    Имя в Minecraft:
    MySoulIsCry
    Это очень легко!
    При выстреле получаешь координаты стрелы и координаты сущности в которую хочешь попасть.
    Далее путем вычитания координат стрелы из координат сущности получаешь вектор который будет направлен от стрелы до сущности. Далее его можно нормализовать и умножить для придания стреле определенной скорости и просто установить этот вектор движения для стрелы.
    Также нужно учитывать что позиция моба находится у его ног чтобы стрела летела туда куда нужно следует перед получением позиции моба добавить к ее y координате 1.7f (примерный рост всех мобов). Тогда стрела будет лететь точному него а не в его ноги.
    Также если ты хочешь чтобы стрела следовала за мообом как ракета с самонаведением то следует закинуть все выше сказаные действия в цыкличный поток и если стрела попала в моба то завершать поток.
     
  6. Автор темы
    KomapuK

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

    Баллы:
    76
    Имя в Minecraft:
    KOMAP
    блин, труднааа)
    Можешь чуть подробнее кодом помочь пожалуйста? Вычитание координат, как их вычитать? Не догнал чегото я)
     
  7. Bezobrazie

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

    Баллы:
    46
    Имя в Minecraft:
    MySoulIsCry
    Почитай про векторную математику и вектора в целом https://habr.com/ru/post/131931/
     
  8. Автор темы
    KomapuK

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

    Баллы:
    76
    Имя в Minecraft:
    KOMAP
    так, а как получить ближайшего моба? nearbyEntities?
     
  9. Bezobrazie

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

    Баллы:
    46
    Имя в Minecraft:
    MySoulIsCry
    Да можно так а потом сортировать список по дистанции. Только не забудь убрать из списка самого игрока А то сам по себе стрелять будешь
     
  10. Автор темы
    KomapuK

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

    Баллы:
    76
    Имя в Minecraft:
    KOMAP
    Вот дважды перечитал темку твою с векторами, но так ничего и не понял, потестил методы различные с векторами, ничего не вышло. Можешь помочь пожалуйста кодом?
     
  11. Bezobrazie

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

    Баллы:
    46
    Имя в Minecraft:
    MySoulIsCry
    С кодом а данный момент не могу. Не дома я.
    В общем, чтобы рассчитать направление для стрелы (вектор) нужно вычесть из координат сущности(далее "e") координаты стрелы (Далее "a")
    То есть
    new Vector(e.x - a.x, e.y - a.y, e.z - a.z).
    Таким образом мы получим вектор который будет направлен от стрелы на сущность.
    Далее нам нужно присвоить этот вектор стреле чтобы она двигалась по нему
    У стрелы должен быть метод setDirection(Vector);
    Таким образом мы говорим стреле куда лететь и с какой скоростью.
    Также чтобы можно было регулировать скорость стрелы можно нормализовать вектор перед тем как устанавливать его стреле.
    (Нормализация вектора это приведение всех его координат к числу не более единицы)
    У вектора есть метод normalizate или как То так. Который нормализует вектор.
    Далее чтобы увеличить скорость стрелы мы можем умножить этот вектор на число, это тоже можно сделать при помощи встроенных методов
    Vector# multiple() при умножение вектора на число увеличивается его длина и тем самым скорость и дальность полета стрелы (но будь осторожен в майнкрафте урон от стрелы полностью зависит от ее скорости. То есть если скорость очень большая то стрела просто ваншотнет сущность)
     
  12. Автор темы
    KomapuK

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

    Баллы:
    76
    Имя в Minecraft:
    KOMAP
    то?
    PHP:
    @EventHandler
        
    public void onEvent(ProjectileLaunchEvent e) {
            
    Player p = (Playere.getEntity().getShooter();
          
            
    Location a e.getLocation();
            
    Location v = (Locationp.getNearbyEntities(151515);
          
          
          
            
    Vector vec = new Vector(v.getX()-a.getX(), v.getY()-a.getY(), v.getZ()-a.getZ());
            
    v.setDirection(vec);

        }
     
  13. Bezobrazie

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

    Баллы:
    46
    Имя в Minecraft:
    MySoulIsCry
    Нет. Я домой приеду напишу тебе нормальный метод.
     
  14. alexandrage

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

    Баллы:
    173
    Дирекшен вот так устанавливается. targetLocation.setDirection(targetLocation.toVector().subtract(location.toVector()));
    и getNearbyEntities возвращает лист ентити.
     
  15. Bezobrazie

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

    Баллы:
    46
    Имя в Minecraft:
    MySoulIsCry
    Вот накидал по быстрому.
    Будет стрелять по ближайшему мобу к курсору;
    PHP:
    @EventHandler
    public void onAimShoot(EntityShootBowEvent e){
        
    int aimRadius 30//радиус действия аим бота
        
    float arrowSpeed 3// дальность и скорость полета стрелы


        // если стрелок не игрок тогда ничего не делаем
        // Мы же не хотим чтобы скелеты бегали тоже с аимом
        
    if(!(e.getEntity() instanceof Player)) return;

        
    //получение всех сущностей в радиусе действия аимбота
        
    ArrayList<LivingEntitynearEntities = (ArrayList<LivingEntity>) e.getProjectile().getLocation().getNearbyLivingEntities(aimRadius);

        
    //если в списке есть игрок который стрелял то убираем его чтобы сам себя не застрелил.
        
    if(nearEntities.contains(e.getEntity())) nearEntities.remove(e.getEntity());

        
    //если список пуст то есть рядом нет ни 1 моба то мы ничего не делаем.
        
    if(nearEntities.size() == 0) return;

        
    //сортировка списка по скалярному произведению. тоесть будет выстрел по моду который ближе всего к прицелу.
        //про скалярное произведение векторов почитай сам.
        
    Collections.sort(nearEntities, (e1e2) ->{
            
    double dot1 e.getEntity().getLocation().getDirection().dot(setDirection(e.getEntity().getLocation(), e1.getLocation()));
            
    double dot2 e.getEntity().getLocation().getDirection().dot(setDirection(e.getEntity().getLocation(), e2.getLocation()));
            if(
    dot1 dot2) return -1;
            else return 
    1;
        });
       
        
    //получение самого ближайшего моба к прицелу.
        
    LivingEntity aimEntity nearEntities.get(0);
       
        
    //получение локации от куда ведется выстрел
        
    Location shootLocation e.getEntity().getLocation();
       
        
    //установка направления и скорости стреле
        
    e.getProjectile().setVelocity(setDirection(shootLocationaimEntity.getLocation()).multiply(arrowSpeed));
    }

    //метод который вернет нам вектор с углами от 1 позиции до другой
    private Vector setDirection(Location point1Location point2){
        return 
    point2.clone().subtract(point1.clone()).toVector().normalize();
    }
    Почитай комментарии и попробуй разобраться.

    Хз мне удобнее вычесть из 1 позиции вычесть другую. Так понятнее что происходит.
     
  16. Автор темы
    KomapuK

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

    Баллы:
    76
    Имя в Minecraft:
    KOMAP


    PHP:
      ArrayList<LivingEntitynearEntities = (ArrayList<LivingEntity>)
     
    e.getProjectile().getLocation().getNearbyLivingEntities(aimRadius);
    просит создать объект, но после его создания просит сделать тоже самое.
     
  17. Bezobrazie

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

    Баллы:
    46
    Имя в Minecraft:
    MySoulIsCry
    Скинь скриншотом на что ругается. У меня этот кусок кода нормально работает.
     
  18. Автор темы
    KomapuK

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

    Баллы:
    76
    Имя в Minecraft:
    KOMAP
    [​IMG]
     
  19. Bezobrazie

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

    Баллы:
    46
    Имя в Minecraft:
    MySoulIsCry
    Какое ядро и версия?
     
  20. Автор темы
    KomapuK

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

    Баллы:
    76
    Имя в Minecraft:
    KOMAP
    кран 1.16.1
     

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