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

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

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

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

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

    Баллы:
    66
    Имя в 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. Хостинг MineCraft
    <
  3. Fenix78563

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Единственное что приходит в голову, это обычная проверка блока по целым координатам:
    если блок есть, то проверять на соответствие какому-либо блоку из списка - ступеньки заборы и тд,
    но все это слишком нелепо выглядит, и для каждого блока такую проверку делать слишком затратно,
    ps (в либе от Jampire почти ничего полезного не нашел, скорее всего я слепой, но все равно проблема все еще не решена...)[DOUBLEPOST=1481667226][/DOUBLEPOST]Ps может кто-то знает как Entity высчитывают куда им двигаться? они же по идее делают нужную мне проверку,
    например паук может спокойно пройти между двумя плоскостями построенных из полублоков.[DOUBLEPOST=1481667618][/DOUBLEPOST]
    PS проверил, мобы оказались намного глупее, вот скрин двух бедолаг, которые не могут ко мне пройти, хотя на их пути есть пространстов в два блока...
    [​IMG]
     
    Последнее редактирование: 14 дек 2016
  10. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    getCollidingBoundingBoxes[DOUBLEPOST=1481667848,1481667646][/DOUBLEPOST]Смотри класс World.
     
  11. Автор темы
    Stamorey

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

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

    alexandrage Администратор

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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