Регистрирование нажатия ПКМ на определённые области (секторы) в блоке

Версия Minecraft
1.12.2
API
Forge
Добрый день, я создал блок распределительного щита и задумка была в том, чтобы игрок, наводясь прицелом на определенные выключатели, (их всего 9 и они синего цвета, скриншот представлен ниже) мог выключать либо включать их. То есть не все разом, а какие он сам захочет. И тут проблемы сразу две:
1) как заставить игру регистрировать нажатия ПКМ на любые из 9 выключателей;
2) можно ли заставить синий выключатель поменять свое положение после нажатия на него, например, переключатель перейдет из опущенного положения в поднятое или наоборот.
Я пересмотрел множество сайтов, вопросов на форумах, документаций, но так и не понял, а возможно вообще сделать то, что я задумал. Я буду очень благодарен тому кто сможет мне помочь в данном вопросе.
2024-06-17_20.04.28.png
 
Решение
Это отдельный AABB на каждый переключатель.
Как ты делал то со своим блоком - делал AABB для всего блока, однако теперь у тебя будет 10 AABB: 1 блока и 9 переключателей.

Хотя я бы сделал это чистой математикой, но значения там придётся подбирать, что не всегда удобно. Пусть точка нажатия по поверхности блока будет определена как (x; y). Тогда, если мы имеем сетку из 9 зон (xi; yi),(xi+1; yi+1), то определить зону, по которой произошло нажатие, достаточно просто:
xi <= x <= xi+1 ; yi <= y <= yi+1.
Другое дело, что для такого решения необходимо также рассмотреть случаи поворота блока, тогда придётся мудрить с -x, z, -z. Но это и для AABB актуально (хотя на AABB несколько проще).

Для сохранения изменения положения переключателей...
Это отдельный AABB на каждый переключатель.
Как ты делал то со своим блоком - делал AABB для всего блока, однако теперь у тебя будет 10 AABB: 1 блока и 9 переключателей.

Хотя я бы сделал это чистой математикой, но значения там придётся подбирать, что не всегда удобно. Пусть точка нажатия по поверхности блока будет определена как (x; y). Тогда, если мы имеем сетку из 9 зон (xi; yi),(xi+1; yi+1), то определить зону, по которой произошло нажатие, достаточно просто:
xi <= x <= xi+1 ; yi <= y <= yi+1.
Другое дело, что для такого решения необходимо также рассмотреть случаи поворота блока, тогда придётся мудрить с -x, z, -z. Но это и для AABB актуально (хотя на AABB несколько проще).

Для сохранения изменения положения переключателей используй TileEntity. Соответственно, для отображения переключателей используй TileEntitySpecialRenderer (TESR).
 
Последнее редактирование:
Это отдельный AABB на каждый переключатель.
Как ты делал то со своим блоком - делал AABB для всего блока, однако теперь у тебя будет 10 AABB: 1 блока и 9 переключателей.

Хотя я бы сделал это чистой математикой, но значения там придётся подбирать, что не всегда удобно. Пусть точка нажатия по поверхности блока будет определена как (x; y). Тогда, если мы имеем сетку из 9 зон (xi; yi),(xi+1; yi+1), то определить зону, по которой произошло нажатие, достаточно просто:
xi <= x <= xi+1 ; yi <= y <= yi+1.
Другое дело, что для такого решения необходимо также рассмотреть случаи поворота блока, тогда придётся мудрить с -x, z, -z. Но это и для AABB актуально (хотя на AABB несколько проще).

Для сохранения изменения положения переключателей используй TileEntity. Соответственно, для отображения переключателей используй TileEntitySpecialRenderer (TESR).
Большое спасибо, очень помогли сузить круг поиска решений.
 
Назад
Сверху