Иконка ресурса

Слив кода Простой вращатель AxisAlignedBB (VoxelShape)

Версия(и) Minecraft
1.16.5
Уже давно при каждом создании коллизии для сложной модели я сталкивался с постоянным выдрачиванием нужных позиций. И если с вращением на 180 градусов проблем было еще не так много - нужно было просто поменять местами координаты, то вот дело с поворотом на 90 градусов что против, что по часовой превращалось в часовое дрочево.
Как бы было хорошо сделать одну коллизию и потом просто провращать ее по всем направлениям! Теперь такая возможность есть!
Логика кода проста и пригодна для использования на любых версиях начиная с 1.7(точно, а может и раньше), просто вам нужно немного его адаптировать.
‼️Код применим исключительно к простым боксам. Если вы попытаетесь вращать какой то сложный составной бокс, у вас ничего не получится.

Класс содержит три метода для поворота на 90 по часовой, на 90 против часовой и на 180 градусов соответственно.
VoxelShapeUtil:
public class VoxelShapeUtil {
    public static final VoxelShapeUtil INSTANCE = new VoxelShapeUtil();
    public static VoxelShape shapeRotССW90(VoxelShape vs) {
            double new_minX, new_minZ, new_maxX, new_maxZ;
            new_minX = vs.getBoundingBox().minZ;
            new_minZ = 1 - vs.getBoundingBox().maxX;
            new_maxX = vs.getBoundingBox().maxZ;
            new_maxZ = 1 - vs.getBoundingBox().minX;
            return VoxelShapes.create(new_minX, vs.getBoundingBox().minY, new_minZ, new_maxX, vs.getBoundingBox().maxY, new_maxZ);
        }
        public static VoxelShape shapeRotСW90(VoxelShape vs) {
            double new_minX, new_minZ, new_maxX, new_maxZ;
            new_minX = vs.getBoundingBox().minZ;
            new_minZ = vs.getBoundingBox().minX;
            new_maxX = vs.getBoundingBox().maxZ;
            new_maxZ = vs.getBoundingBox().maxX;
            return VoxelShapes.create(new_minX, vs.getBoundingBox().minY, new_minZ, new_maxX, vs.getBoundingBox().maxY, new_maxZ);
        }
        public static VoxelShape shapeRot180(VoxelShape vs) {
        double new_minX, new_minZ, new_maxX, new_maxZ;
        new_minX = 1 - vs.getBoundingBox().minX;
        new_minZ = 1 - vs.getBoundingBox().minZ;
        new_maxX = 1 - vs.getBoundingBox().maxX;
        new_maxZ = 1 - vs.getBoundingBox().maxZ;
        return VoxelShapes.create(new_minX, vs.getBoundingBox().minY, new_minZ, new_maxX, vs.getBoundingBox().maxY, new_maxZ);
        }
}
Приятного использования! Если у вас есть критические замечания или мысли о том, как этот код улучшить, напишите пожалуйста в комментариях.
Автор
Maxik
Просмотры
130
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя Maxik

Сверху