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

Сменить location но оставить Direction

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

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

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

    Баллы:
    76
    Всем привет, как сменить стартовый location, но так чтобы потом можно было проитерировать Direction от него, те чтобы смок падал в прицел игрока?
    direction.png upload_2019-2-28_23-47-12.png
     
  2. AbstractCoder

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

    Баллы:
    76
    Имя в Minecraft:
    AbstractCoder
    Норм тебе каждый раз в цикле получать вектор взгляда?)
    Ты оч глупо оформил свой вопрос, насколько я понял тебе нужно чтобы линия из частичек была от точки выше точки взгляда на блок и заканчивалась блоком на который смотрит игрок, тогда тебе нужно не по вектору взгляда игрока двигать локацию, а по вектору от этой точки до того самого блока. Берешь разность векторов, вектор с координатами блока, куда смотрит игрок минус вектор точки над его головой.
     
  3. alexandrage

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

    Баллы:
    173
    .getLocation().add(vector)
     
  4. Автор темы
    ilya50

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

    Баллы:
    76
    А можно поподробнее какое location и какой вектор ? Мне нужно сменить скажем так точку взгляда игрока чтобы дым падал не от глаз игрока, а например от уровня рук. Всё что я пока придумал
    upload_2019-3-2_17-30-41.png
    [\SPOILER]
     
  5. AbstractCoder

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

    Баллы:
    76
    Имя в Minecraft:
    AbstractCoder
    Убери свой getViewLocation (он у тебя даже неправильно написан и некорректно будет работать) и используй player#getTargetBlock.
    Ну и у Location есть методы add/substract, бред придумал с этими offset-ами.
     
  6. Автор темы
    ilya50

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

    Баллы:
    76
    Мне нужно смок заспавнить как на фото, но чтобы он спавнился не из моих глаз, а из другого места, но и прилетал точно в прицел. getTargetBlock возвращает координаты блока, а мне нужна точная точка
     
  7. AbstractCoder

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

    Баллы:
    76
    Имя в Minecraft:
    AbstractCoder
    Тогда двигай от этой начальной точки по 0.1 блока к примеру, пока не будет столкновения с чем-то, и запоминай последнюю локацию. После вычти вектор локации откуда хочешь запустить и получишь вектор по которому нужно двигаться.
     
  8. Автор темы
    ilya50

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

    Баллы:
    76
    Так я ведь скинул код сверху который это делает -_-
     
  9. AbstractCoder

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

    Баллы:
    76
    Имя в Minecraft:
    AbstractCoder
    Нет, твой код двигается по вектору энтити, очевидно это не будет работать корректно, тебе надо нормализовать и умножать его на 0.1 или еще какое-то значение в зависимости от точности необходимого тебе.
    + не нужно каждый раз брать блок и проверять, проверяй только если изменились целочисленные координаты.

    Если у тебя расстояния в пределах 100 блоков, то будет эффективней получать player#getTargetBlock и уже расчитать в какой именно точке вектор взгляда игрока попадает в этот блок.
     
  10. alexandrage

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

    Баллы:
    173
    Примерно так. getLocation локация ног. Поднимаем на 1 повыше.
    player.getLocation().add(new Vector(0,1,0));
    getDirection получаем направление взгляда. multiply(m) двигаемся вперед по направлению взгляда.
     
  11. Автор темы
    ilya50

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

    Баллы:
    76
    Я уже оставлю то что я скидывал сверху, ибо оно работает, а вот этот вот вариант не особо
    Безымянный.png
     
  12. alexandrage

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

    Баллы:
    173
    Вот на демку.
    Код:
    public class SpawnParticle extends BukkitRunnable {
        Player player;
        Location location;
        int i = 0;
    
        SpawnParticle(Player player) {
            this.player = player;
            this.location = player.getLocation().clone().add(new Vector(0,1.5,0));
        }
    
        @Override
        public void run() {
            i++;
            for(int x = 0;x<5;x++) {
                sp(player, location.add(location.getDirection().multiply(1)));
            }
            if(i==30)  {
                this.cancel();
            }
        }
       
        public void sp(Player player, Location location) {
            player.spawnParticle(Particle.LAVA, location, 1, 1, 1, 1, 1);
        }
    }
     
  13. AbstractCoder

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

    Баллы:
    76
    Имя в Minecraft:
    AbstractCoder
    Ну ты мб нерабочий код кинешь, чтобы тебе сказали, что не так?) То, что ты скидывал неточно, почти тоже самое, что и корды блока брать считай
     

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