Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

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

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

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

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

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

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
  4. 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/
    Так что придется придумывать другие методы[DOUBLEPOST=1382881234,1382880989][/DOUBLEPOST]Предлагаю варианты:
    1) Вручную высчитывать траекторию (как по яблочкам) и постоянно толкать дракона к ближайшему пойнту. По достижении пойнта - удалять его. В принципе я так делал со свинками, скелетами и т.д. - работает. С драконами не пытался.

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

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

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

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

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

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

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    DragonTravel, но его код я не понял...
    Можно пример небольшой? А то опять наделаю всякую херню..
     
  8. 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, на его место встает следующий чекпойнт из списка.
    Когда список опустел - мы завершили полет.[DOUBLEPOST=1382885154,1382884682][/DOUBLEPOST]
    @fromgate,
    Ты его скорее всего знаешь под именем LinkedList
    Я не стал говорить что можно использовать его, потому что:
    LinkedList - двусторонняя очередь
    Queue - интерфейс односторонней очереди
    и если использовать LinkedList - то можно запутаться, т.к. он может вести себя как Stack и как Queue одновременно.
     
  9. Автор темы
    Den_Abr

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    [​IMG]
    Что это за упоротась... я уже не знаю, что с ним делать...
     
  19. BeYkeR

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

    Баллы:
    173
    Может использовать Navigation ?
     
  20. DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Еще могу подсказать:
    был плагин MobDisguise, позволял превратиться игроку в любого моба.
    С драконом была та же беда, он летал задом наперед.
    Позже вышел плагин DisguiseCraft, у него тот же функционал, но дракона они поправили.
    Вот исходники второго: https://gitorious.org/disguisecraft
     
  21. Автор темы
    Den_Abr

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

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Сенкьюверимач. С трудом, но нашёл код, где меняется Yaw прям под дракона. Будут пробовать[DOUBLEPOST=1383052209,1383052178][/DOUBLEPOST]
    если есть возможность не лезть в nms, надо этим пользоваться
     

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