Датчик движения

Статус
В этой теме нельзя размещать новые ответы.
Версия Minecraft
1.12.2
5,018
47
783
Привет! Собственно, вопрос содержится в заглавии. Необходимо сделать датчик движения, который на определенное количество блоков перед собой проверяет на наличие энтити.
Я знаю моды, где это реализовано с помощью TileEntity, но я хочу попробовать сделать оптимизированней(на самом деле я просто не умею в тайлы, а в чужом коде разбираться не хочу), основываясь на entityCollidedWithBlock. Основная проблема в том, что какую бы коллизию я не пытался сделать(два блока, четыре), срабатывало только при непосредственно залазе в сам блок. Можно ли как то раздвинуть границы реальности коллизии блока в длину(речь идет о именно самой изначальной коллизии, а не о добавлении новых боксов через addCollisionBoxList). Если надо хукать, будем хукать. Просто я не нашел, собственно, где именно эта коллизия происходит..
 

Eifel

Модератор
1,623
78
608
Без тайлов ты теряешь массу возможностей. Тем более, что тебе там достаточно вроде как просто переопределить метод обновления тайла и чекать энтити вокруг. Зарегать тайл и указать его в блоке...
 
1,038
57
229
В моде хранишь HashMap<UniqueID, Vector3>. Делаешь хук на PlayerTickEvent, в нём получаешь текущие координаты и сравниваешь с теми что в HashMap (если их там нет, то добавляешь).
Если координаты не совпадают - игрок движется. Если нужен не только игрок, то соответственно делаешь хук не PlayerTickEvent, а LivingUpdateEvent.
И ВЫЗЫВАЕШЬ свой собственный метод MoveEntity(EntityLiving entity) в который передаешь EntityLivingBase или просто EntityLiving
И уже в нём делаешь проверку на координаты твоего блока. И сравниваешь растояние по радиусу, в виде кода это
Vector3 vec = new Vector3( Mathf.abs(x1-x2), Mathf.abs(y1-y2), Mathf.abs(y3-y3) );
и у вектора есть такой параметр как length.
Ах да, все блоки что у тебя на карте, в момент создания или постановки в мир должны вызывать метод из мода (чтобы ты знал где они есть и в общем то тебе нужны только координаты). Их можно хранить списком или разбить на чанки, это уж от фантазии и оптимизации алгоритма.
Также у Entity (и вроде в world тоже) есть такой метод can i seek или что-то такое, который позволяет проверить виден ли блок или сущность из глаз сущности. Этот метод есть у Эндермена.
 
Последнее редактирование:
1,038
57
229
4,045
63
645
Так а чё?
Каков вопрос, таков ответ.
Максик же сказал, хочу сделать как, но не хочу при этом ничего знать...
Это самое "оптимизированое" решене :)

А вообще, готовый код можно посмотреть в AI приручения моба. Он там как раз проверяет, не сдвинулся ли игрок.
 

Icosider

Kotliner
Администратор
3,603
99
664
Можно ли как то раздвинуть границы реальности коллизии блока в длину(речь идет о именно самой изначальной коллизии, а не о добавлении новых боксов через addCollisionBoxList)
1579288155939.png
Собсна по вопросу, уже всё ответили конечно, но всё же на счёт расширения. В AxisAlignedBB(тип того) есть метод expand, вот с ним и мути своё "расширение"
 
5,018
47
783
В моде хранишь HashMap<UniqueID, Vector3>. Делаешь хук на PlayerTickEvent, в нём получаешь текущие координаты и сравниваешь с теми что в HashMap (если их там нет, то добавляешь).
Если координаты не совпадают - игрок движется. Если нужен не только игрок, то соответственно делаешь хук не PlayerTickEvent, а LivingUpdateEvent.
И ВЫЗЫВАЕШЬ свой собственный метод MoveEntity(EntityLiving entity) в который передаешь EntityLivingBase или просто EntityLiving
И уже в нём делаешь проверку на координаты твоего блока. И сравниваешь растояние по радиусу, в виде кода это
Vector3 vec = new Vector3( Mathf.abs(x1-x2), Mathf.abs(y1-y2), Mathf.abs(y3-y3) );
и у вектора есть такой параметр как length.
Ах да, все блоки что у тебя на карте, в момент создания или постановки в мир должны вызывать метод из мода (чтобы ты знал где они есть и в общем то тебе нужны только координаты). Их можно хранить списком или разбить на чанки, это уж от фантазии и оптимизации алгоритма.
Также у Entity (и вроде в world тоже) есть такой метод can i seek или что-то такое, который позволяет проверить виден ли блок или сущность из глаз сущности. Этот метод есть у Эндермена.
по правде говоря, китайский код какой то получается
 
5,018
47
783
Посмотреть вложение 7370
Собсна по вопросу, уже всё ответили конечно, но всё же на счёт расширения. В AxisAlignedBB(тип того) есть метод expand, вот с ним и мути своё "расширение"
Идея была хорошая, но видимо блок есть блок, и другие блоки, уже не этот блок...
Расширил, собсно, а оно не работает)
 
4,045
63
645
expand тупо расширяет геометрические границы, но это не значит, что в этих границах он будет вызываться...
Если ты стоишь в соседнем блоке, то вызываться будет его метод, а не твой расширенный...
Это логично, вроде как.
 

Icosider

Kotliner
Администратор
3,603
99
664
Идея была хорошая, но видимо блок есть блок, и другие блоки, уже не этот блок...
Расширил, собсно, а оно не работает)
А проверять то дальше расширенной зоны кто будет? Ты можешь взять этот aabb и просто проверить находятся ли сущности в нём или нет, но без тайла это гиблое дело
 

Icosider

Kotliner
Администратор
3,603
99
664
expand тупо расширяет геометрические границы, но это не значит, что в этих границах он будет вызываться...
Если ты стоишь в соседнем блоке, то вызываться будет его метод, а не твой расширенный...
Это логично, вроде как.
Он хотел расширить, а я сказал как это можно сделать, всё остальное он должен сам сделать))
 
5,018
47
783
Ты можешь взять этот aabb и просто проверить находятся ли сущности в нём или нет, но без тайла это гиблое дело
Я нашел метод который получает всех сущностей, находящихся в коробке блока!)
Ща затестим
List <? extends Entity > list = worldIn.getEntitiesWithinAABBExcludingEntity((Entity)null, iblockstate.getBoundingBox(worldIn, pos).offset(pos));
 
5,018
47
783
Только почему у тебя там null? Ты можешь задать класс сущности: EntityHorse или т.п. и получить список с объектами данного класса, а в данному случаи хрень получается.
это паста из веревки с крюками(которая типо натягиевается)
 

Icosider

Kotliner
Администратор
3,603
99
664
Там не класс задается, а конкретная ссылка на энтити, который не будет включаться в список.
Да, действительно, не обратил внимания на название метода, но всё равно передавать null, такое себе...
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху