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

[Решено]Столкновение с кастомными блоками(.)(dX dY dZ)

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

Статус темы:
Закрыта.
  1. Автор темы
    Stamorey

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

    Баллы:
    76
    Имя в Minecraft:
    Stamorey
    Есть Изменяющиеся координаты точки в трехмерном пространстве, нужна проверка
    наличия блока в этом месте, изначально хотел брать ее "будущие координаты" и проверять блок в этой точке на материал ==AIR

    (сама точка отвечает за траекторию импровизированного снаряда)

    Но все оказалось не так просто, появляются сразу две проблемы:

    1. Траектория может проходить между двумя блоками расположенными по диагонали
    Наверное это не существенно, так как в оригинальной обработке снарядов
    Стрел например или снежков, есть та же проблема) (прострелы)(в новых версиях вроде как пофикшено, ну или только в одиночке ps недавно тестил, прострелов не было)


    2. Снаряд может проходить через "полу-объемные" блоки - ступеньки/заборы/лестницы/таблички и тд.
    Точка, проходящая через "необъемную" часть такого блока должна продолжать двигаться дальше...


    Может посоветует кто-нибудь как это можно не затратно обработать?

    Спустя несколько недель нашел решение для проверки на столкновение снаряда с кастомными блоками (ступеньки, лестницы, полублоки) (да и в целом все блоки, сквозь которые не может проходить игрок)

    cord* - координаты точки в трехмерном пространстве, тип - float/double
    AxisAlignedBB - кубоид , в примере задается двумя парами координат XYZ

    World xWorld = player.getWorld();
    WorldServer Wser =((CraftWorld)xWorld).getHandle();
    AxisAlignedBB bb= AxisAlignedBB.a(cordX, cordY, cordZ, cordX, cordY, cordZ);
    List mega = Wser.a(bb);
    if(!mega.isEmpty()){
    p.sendMessage("Лист не пустой, в данной точке есть какой-то блок!");
    }


    Сделал такую проверку около 10 раз за прохождение снарядом 1 блока.
    Почти тоже самое для мобов.
    Spigot 1.8
     
    Последнее редактирование: 26 дек 2016
  2. Fenix78563

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    Если вам нужно просто что то сделать с точкой когда она все таки столкнется, то projectilehitevent либо EntytiInteractEvent - это более глобально.

    А так вообще не очень понятно что вам надо
     
  3. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Если нужно действие при столкновении - ProjectHitEvent
    Если нужно действие с блоком и продолжение движения снаряда - только проверка будущих координат
     
  4. Автор темы
    Stamorey

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

    Баллы:
    76
    Имя в Minecraft:
    Stamorey
    Евенты не помогут, они для projectile объектов, созданных бакитом напрямую - ну когда например снежок кто-то бросает, а у меня по идее даже самого объекта нет, могу описать весь свой алгоритм, если так не понятно:

    1 При определенных действиях игрока, наприvер пкм с бедроком в руке создается шедулер в который передаются координаты этой точки.
    2. Обработка движения этой точки по заданной функции.
    2.1. Один раз в 1-2 тика обновляется значение X Y Z этой точки.
    И происходит проверка на материал блока == AIR . ( вопрос темы )
    Если проверка провалилась, идет отправка пакетов с соответствующими логике данными (или же вызывается определенное событие на сервере, но это уже не относится к теме)
    2.2 Один раз в 2-4 тика отправляется пакет игрокам с данными движения .(это тоже не по теме...)

    Есть нестандартные блоки, и поэтому моя обработка а ля блок==аир непрокатит,
    Не знаю как это лучше всего обработать с учетом таких блоков, но точно знаю что такая обработка уже есть в самом майнкрафте(для снежков стрел и других projectile) так как они не разбиваются при прохождении через выступы ступенек например или между заборами стоящими по диагонали, и в этой теме хотел бы увидеть ваши советы и рекомендации)))
    Надеюсь теперб все понятно
    Еще раз, сервер не видит и никак не может видеть этот снаряд простая прорисовка частиц ентиты или еще чего, на самом деле анимацией я пока не собирался заниматься
     
  5. Jampire

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

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

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

    Баллы:
    76
    Имя в Minecraft:
    Stamorey
    Копать точно буду дальше:rolleyes: но хотелось бы лишний раз не усложнять код (написанным своими руками обработчиком), тем более как уже написал выше он уже должен быть в чистом майне (не должен а однозначно есть:cry:).
     
  7. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    https://github.com/bergerkiller/BKC...ntroller/EntityControllerCollisionHelper.java
    ответ на твой вопрос находится в пределах этой либы. частично - в пределах этого класса.
     
  8. Автор темы
    Stamorey

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

    Баллы:
    76
    Имя в Minecraft:
    Stamorey
    Спасибо большое) чувствуется в этом классе на самом деле есть этот обработчик, отпишусь когда найду.
    Если не ошибаюсь, этот EntityControllerCollisionHelper возвращает контейнер блоков + мобов которые соприкасаются с заданной сеткой моба, но обработки исключений полу-объемных блоков вроде как там нет...
    Да и к тому же мне бы найти этот метод в моем ядре))) попробую декомпилировать свое ядро, плохая идея, но возможно поможет.
    https://github.com/Attano/Spigot-1.8/tree/master/net/minecraft/server/v1_8_R3
    UP
    Все же нужны другие идеи, нужно проверить наличие блока(ну не блока, не знаю просто, как еще выразиться, по идее надо проверить на пустоту(1) по неточным координатам: ( Double x Double y Double z )
    (1)В смысле если например взять полублок, верхняя его половина предположим и является пустотой... (опять же все это уже реализовано где-то в коде майна, но не уверен что бакит предоставляет методы для такой проверки)

    Единственное что приходит в голову, это обычная проверка блока по целым координатам:
    если блок есть, то проверять на соответствие какому-либо блоку из списка - ступеньки заборы и тд,
    но все это слишком нелепо выглядит, и для каждого блока такую проверку делать слишком затратно,
    ps (в либе от Jampire почти ничего полезного не нашел, скорее всего я слепой, но все равно проблема все еще не решена...)
    Ps может кто-то знает как Entity высчитывают куда им двигаться? они же по идее делают нужную мне проверку,
    например паук может спокойно пройти между двумя плоскостями построенных из полублоков.

    PS проверил, мобы оказались намного глупее, вот скрин двух бедолаг, которые не могут ко мне пройти, хотя на их пути есть пространстов в два блока...
    [​IMG]
     
    Последнее редактирование: 14 дек 2016
  9. alexandrage

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

    Баллы:
    173
    getCollidingBoundingBoxes
    Смотри класс World.
     
  10. Автор темы
    Stamorey

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

    Баллы:
    76
    Имя в Minecraft:
    Stamorey
    getCollidingBoundingBoxes для чего этот класс ? вроде понял, но такого метода в World Нет
     
    Последнее редактирование: 14 дек 2016
  11. alexandrage

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

    Баллы:
    173
    Открой класс Entity, EntityLiving и world. Там все есть. И еще несколько кастомных класов с мобами и игроком.
     
  12. Автор темы
    Stamorey

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

    Баллы:
    76
    Имя в Minecraft:
    Stamorey
    =
    проверил все.. ну нету такого метода, есть только два класса World

    import org.bukkit.World;
    import net.minecraft.server.v1_8_R1.World;

    ни в одном из них нет getCollidingBoundingBoxes
    (тоже самое для ентить и блоков)
    Если не сложно, скинь ссылку на ядро в котором есть эта обертка:rolleyes:

    зато, например в Block есть вот такие методы*
    [​IMG]
    Может мне нужен один из них ?)
    Один из них возвращает AxisAlignedBB, Но по идее для некоторых блоков должно быть несколько таких сеток, например ступеньки
    Up
     
    Последнее редактирование: 14 дек 2016
  13. Fenix78563

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    создай свою точку как объект класса projectile и не праься
     
  14. Автор темы
    Stamorey

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

    Баллы:
    76
    Имя в Minecraft:
    Stamorey
    ну, не совсем подходит, сам снаряд это моб, если сделать projectile, игроку отправится пакет спавна снаряда, после чего будут передаваться пакеты с векторами(тоесть этот снаряд начнет двигаться)
    А с мобами все намного сложнее, им нужно отправлять пакеты с передвижениями EntityMove или как-то так, и таких пакетов отправляется по десятку за блок, для плавного передвижения, в то же время для projecteil на всю траэкторию движения от силы два десятка пакетов
    В начале пытался просто вместо спавна projectile отправлять игроку спавн моба, а потом слать пакеты с его движением, но по той же самой траэктории неполучится его двигать
    все таки думаю забить на эту проверку, и сделать снаряд сталкиваемым с любым блоком, моб же жирный и злой, между полублоками не пролетает)
     
    Последнее редактирование: 15 дек 2016
  15. Fenix78563

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    ОООО господи, сделай его объектам класса living entity, и entityinteractevent если не изменяет память
     
  16. Автор темы
    Stamorey

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

    Баллы:
    76
    Имя в Minecraft:
    Stamorey
    и каким образом в таком случае мне его заспавнить?
    Если так: p.getLocation().getWorld().spawnEntity(p.getLocation(), EntityType.TYPE);
    то сервер создаст свой обработчик искуственного поведения, тоесть моб начнет двигаться в разные стороны, а если так как делал я, просто отправлять пакет спавна моба, то для сервера получается моба вообще не будет существовать, и entityinteractevent да и никакой другой ивент не будут иметь смысла
     
  17. Fenix78563

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    двигай его так же как точку - телепорт каждый тик
     
  18. Автор темы
    Stamorey

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

    Баллы:
    76
    Имя в Minecraft:
    Stamorey
    криво получится скорее всего, да и затратно, тут сервер будет свои обработчики включать, а своим телепортом буду просто препятсвовать этому.. попробую, но думаю уж лучше пакетами
     
  19. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooo
    setAi
     
  20. Автор темы
    Stamorey

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

    Баллы:
    76
    Имя в Minecraft:
    Stamorey
    ядро 1.8 спигот, вроде последнее, нет такого метода ни у Entity ни у LivingEntity
     
Статус темы:
Закрыта.

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