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

Статус
Закрыто для дальнейших ответов.

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
 
Последнее редактирование:
Если вам нужно просто что то сделать с точкой когда она все таки столкнется, то projectilehitevent либо EntytiInteractEvent - это более глобально.

А так вообще не очень понятно что вам надо
 
Если нужно действие при столкновении - ProjectHitEvent
Если нужно действие с блоком и продолжение движения снаряда - только проверка будущих координат
 
Если вам нужно просто что то сделать с точкой когда она все таки столкнется, то projectilehitevent либо EntytiInteractEvent - это более глобально.

А так вообще не очень понятно что вам надо
Евенты не помогут, они для projectile объектов, созданных бакитом напрямую - ну когда например снежок кто-то бросает, а у меня по идее даже самого объекта нет, могу описать весь свой алгоритм, если так не понятно:

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

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

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

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

Еще раз, сервер не видит и никак не может видеть этот снаряд простая прорисовка частиц ентиты или еще чего, на самом деле анимацией я пока не собирался заниматься
задача интересная, с подобной никогда не сталкивался. скажу лишь одно - в API баккита подобной проверки нет, нужно искать в ядре, как происходит определение попадания и реализовывать похожую проверку.
 
задача интересная, с подобной никогда не сталкивался. скажу лишь одно - в API баккита подобной проверки нет, нужно искать в ядре, как происходит определение попадания и реализовывать похожую проверку.
Копать точно буду дальше:rolleyes: но хотелось бы лишний раз не усложнять код (написанным своими руками обработчиком), тем более как уже написал выше он уже должен быть в чистом майне (не должен а однозначно есть:cry:).
 
Копать точно буду дальше:rolleyes: но хотелось бы лишний раз не усложнять код (написанным своими руками обработчиком), тем более как уже написал выше он уже должен быть в чистом майне (не должен а однозначно есть:cry:).
https://github.com/bergerkiller/BKC...ntroller/EntityControllerCollisionHelper.java
ответ на твой вопрос находится в пределах этой либы. частично - в пределах этого класса.
 
Спасибо большое) чувствуется в этом классе на самом деле есть этот обработчик, отпишусь когда найду.
Если не ошибаюсь, этот 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 проверил, мобы оказались намного глупее, вот скрин двух бедолаг, которые не могут ко мне пройти, хотя на их пути есть пространстов в два блока...
 
Последнее редактирование:
getCollidingBoundingBoxes для чего этот класс ? вроде понял, но такого метода в World Нет
 
Последнее редактирование:
=
Открой класс Entity, EntityLiving и world. Там все есть. И еще несколько кастомных класов с мобами и игроком.
проверил все.. ну нету такого метода, есть только два класса World

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

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

зато, например в Block есть вот такие методы*

Может мне нужен один из них ?)
Один из них возвращает AxisAlignedBB, Но по идее для некоторых блоков должно быть несколько таких сеток, например ступеньки
Up
 
Последнее редактирование:
создай свою точку как объект класса projectile и не праься
 
ну, не совсем подходит, сам снаряд это моб, если сделать projectile, игроку отправится пакет спавна снаряда, после чего будут передаваться пакеты с векторами(тоесть этот снаряд начнет двигаться)
А с мобами все намного сложнее, им нужно отправлять пакеты с передвижениями EntityMove или как-то так, и таких пакетов отправляется по десятку за блок, для плавного передвижения, в то же время для projecteil на всю траэкторию движения от силы два десятка пакетов
В начале пытался просто вместо спавна projectile отправлять игроку спавн моба, а потом слать пакеты с его движением, но по той же самой траэктории неполучится его двигать
все таки думаю забить на эту проверку, и сделать снаряд сталкиваемым с любым блоком, моб же жирный и злой, между полублоками не пролетает)
 
Последнее редактирование:
ну, не совсем подходит, сам снаряд это моб, если сделать projectile, игроку отправится пакет спавна снаряда, после чего будут передаваться пакеты с векторами(тоесть этот снаряд начнет двигаться)
А с мобами все намного сложнее, им нужно отправлять пакеты с передвижениями EntityMove или как-то так, и таких пакетов отправляется по десятку за блок, для плавного передвижения, в то же время для projecteil на всю траэкторию движения от силы два десятка пакетов
В начале пытался просто вместо спавна projectile отправлять игроку спавн моба, а потом слать пакеты с его движением, но по той же самой траэктории неполучится его двигать
все таки думаю забить на эту проверку, и сделать снаряд сталкиваемым с любым блоком, моб же жирный и злой, между полублоками не пролетает)
ОООО господи, сделай его объектам класса living entity, и entityinteractevent если не изменяет память
 
ОООО господи, сделай его объектам класса living entity, и entityinteractevent если не изменяет память
и каким образом в таком случае мне его заспавнить?
Если так: p.getLocation().getWorld().spawnEntity(p.getLocation(), EntityType.TYPE);
то сервер создаст свой обработчик искуственного поведения, тоесть моб начнет двигаться в разные стороны, а если так как делал я, просто отправлять пакет спавна моба, то для сервера получается моба вообще не будет существовать, и entityinteractevent да и никакой другой ивент не будут иметь смысла
 
и каким образом в таком случае мне его заспавнить?
Если так: p.getLocation().getWorld().spawnEntity(p.getLocation(), EntityType.TYPE);
то сервер создаст свой обработчик искуственного поведения, тоесть моб начнет двигаться в разные стороны, а если так как делал я, просто отправлять пакет спавна моба, то для сервера получается моба вообще не будет существовать, и entityinteractevent да и никакой другой ивент не будут иметь смысла
двигай его так же как точку - телепорт каждый тик
 
криво получится скорее всего, да и затратно, тут сервер будет свои обработчики включать, а своим телепортом буду просто препятсвовать этому.. попробую, но думаю уж лучше пакетами
 
криво получится скорее всего, да и затратно, тут сервер будет свои обработчики включать, а своим телепортом буду просто препятсвовать этому.. попробую, но думаю уж лучше пакетами
setAi
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх