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

Помогите Направить дракона

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

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

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Пытаюсь заставить дракона двигаться по заданной траектории, но он всё равно летает как хочет. Пробовал через NMS юзать setGoalTarget(), но он всё равно не слушается. Может вы что подскажете?
     
  2. Автор темы
    Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
  3. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Den_Abr,
    советую посмотреть на этот плагин:
    http://dev.bukkit.org/bukkit-plugins/controllable-mobs-api/
    в описании API автор явно указывает, что драконы неподвластны контролю:
    http://dev.bukkit.org/bukkit-plugin...ges/api-tutorials/make-entities-controllable/
    Так что придется придумывать другие методы
    Предлагаю варианты:
    1) Вручную высчитывать траекторию (как по яблочкам) и постоянно толкать дракона к ближайшему пойнту. По достижении пойнта - удалять его. В принципе я так делал со свинками, скелетами и т.д. - работает. С драконами не пытался.

    2) Спавнить гаста или блейза или любого другого моба, кем проще управлять. А игроку сообщать, что это дракон с помощью подмены пакетов. Ни разу не пытался, но это второе, что пришло в голову.
     
  4. Автор темы
    Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    1 не понял немного
    2 пытался сделать, но с пакетами я дуб.
     
    Последнее редактирование: 27 окт 2013
  5. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    1) Создаешь путь в виде Queue<Location>.
    максимальное расстояние между позициями пусть будет 5.
    2) Каждый тик толкаешь дракона к позиции в начале очереди.
    тут могут помочь setVelocity или даже teleport на небольшое расстояние
    3) Как только дракон достигает позиции (оказывается на расстоянии в 1 блок или меньше) - сдвигаем очередь и повторяем пункт 2.
    4) Дракон на месте!
     
  6. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Был же какой-то плагин, который обеспечивает его полёт по чек-поинтам. Не помню как называется, но видео смотрелось очень впечатляюще. Как это делалось не знаю.
     
  7. Автор темы
    Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    DragonTravel, но его код я не понял...
    Можно пример небольшой? А то опять наделаю всякую херню..
     
  8. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    В этом месте мне стало искренне стыдно. Я не подозревал, что существует такой вид коллекции (хотя иногда очень его хотел) и приходилось обходиться List'ами.
    В свое оправдание могу сказать, что в куче исходников разных плагинов, которые я разглядывал я Queue тоже не встречал. Так что не я один об этом не знал.
    Пойду читать документацию ;)
     
  9. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    https://github.com/ellbristow/DragonTravel-Bukkit/blob/master/src/com/xemsdoom/dt/XemDragon.java
    Тут сделано так:
    Некий XemDragon наследуется от EntityEnderDragon и переопределяет его методы таким образом, что дракон движется строго по заданной траектории. Действительно, это самый лучший вариант, менять каждый тик координаты дракона на уровне NMS.
    Но! Сейчас так не получится, ибо потребуется использование рефлексий. А для унаследования от неизвестного класса - еще и проксифицирование интерфейса. Это очень сложно.

    Поэтому предлагаю так: //требуются знания векторной алгебры// и пишу на псевдокоде
    1) Создаешь очередь из чекпойнтов. Получаешь заполненный Queue<Location> waypoints;
    2) Location point = dragon.location;
    Каждый_тик() {
    - 1) if(point==null) { /* путь завершен */; return; }
    - 2) Vector step = вычисляем вектор от dragon.location к point, нормализуем, умножаем на скорость дракона.
    - 3) Location locX = dragon.location+step
    - 4) Через рефлексии изменяем координаты дракона на locX
    - 5) if(locX.distance(point) <= скорость дракона ) point = waypoints.poll();
    }
    Надеюсь понятно.
    в locX каждый раз будет храниться некая приближенная координата, куда дракону нужно переместиться мелким шажком, чтобы приблизиться к point.
    Как только он достигает point, на его место встает следующий чекпойнт из списка.
    Когда список опустел - мы завершили полет.

    @fromgate,
    Ты его скорее всего знаешь под именем LinkedList
    Я не стал говорить что можно использовать его, потому что:
    LinkedList - двусторонняя очередь
    Queue - интерфейс односторонней очереди
    и если использовать LinkedList - то можно запутаться, т.к. он может вести себя как Stack и как Queue одновременно.
     
  10. Автор темы
    Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Векторная математика....
     
  11. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    На самом деле там все просто. Все необходимые методы для рассчета уже есть у Bukkit API.
    За исключением создания вектора на основе двух точек.
    Делаем так: new Vector(x2-x1,y2-y1,z2-z1)
     
  12. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    По логике тогда ещё нужно направление взора просчитывать так, чтобы он на следующую точку смотрел. Чтобы хвостом вперёд не летал.
     
  13. Автор темы
    Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    В общем я бросил эту затею с перемещение дракона и снова обратился к пакетам. Плюс ко всему я выяснил, что слушал не тот пакет. Заспавнил зомбяка, превратил его в дракона - всё прекрасно, никуда не улетает, двигается за мной(правда жопой, а не лицом смотрит на меня). Но так как нужно чтобы он умел ещё и летать, я вместо зомби стал спавнить летучую мышь. Но теперь у меня крашится клиент с ошибкой java.lang.Byte cannot be cast to java.lang.Integer. Вот не могу понять, какой именно байт нужно поменять...
     
  14. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Я бы тоже крашился если бы дракон летал по траектории летучей мыши ;)
     
  15. Автор темы
    Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    В пакете MobSpawn только три байта - yaw, pitch, yaw. Вот дело в каком то из этих
    Более того, мышь тоже не поддаётся контролю. Поэтому я взял иссушителя. Теперь он летает и кидается головами :D
    Но осталось 2 вопроса: как его развернуть на меня и как заставить ломать блоки?
     
  16. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Шаманить с pitch и yaw
    Шаманить уже над эвентами движения, ломая все блоки в радиусе движения.
     
  17. Автор темы
    Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Как всё это ужасно выглядит
     
  18. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    не уверен что есть другой способ
     
  19. Автор темы
    Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Он немного упорото выглядит. Может быть чтобы он поворачивался в противоположную сторону, недостаточно менять yaw и pitch на противоположные?
     
  20. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Лишь предположил, о драконах знаю мало. Но не думаю что они чем-то отличаются.
     

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