Хитбокс для блока

Хитбокс для блока

Версия(и) Minecraft
1.12
Хитбокс для блока
Основной класс
Java:
public class BlockPlantsSticks extends Block {
    public BlockPlantsSticks(String name) {
        super(Material.WOOD);
        this.setRegistryName(name);
        this.setUnlocalizedName(name);
     
@Override
public boolean isOpaqueCube(IBlockState state)
{    
    return false;
}  

@Override
public boolean isFullCube(IBlockState state)
{    
    return false;
}
    }

В данном случае мы будем делать блок палок для растений. Наша задача сделать так, чтобы можно было между палками проходить.

Модель и blockstates
Сделаем для них какую-нибудь красивую модель по пути tut/resources/assets/tut/models/block
JSON:
{
    "textures": {
        "0": "minecraft:blocks/log_oak",
        "1": "minecraft:blocks/log_oak_top"
    },
    "elements": [
        {
            "from": [ 1.0, -1.0, 14.0 ],
            "to": [ 2.0, 16.0, 15.0 ],
            "faces": {
                "north": { "texture": "#0", "uv": [ 0.0, 0.0, 6.0, 16.0 ] },
                "east": { "texture": "#0", "uv": [ 13.0, 0.0, 4.0, 14.0 ] },
                "south": { "texture": "#0", "uv": [ 4.0, 0.0, 10.0, 16.0 ] },
                "west": { "texture": "#0", "uv": [ 1.0, 0.0, 7.0, 16.0 ] },
                "up": { "texture": "#1", "uv": [ 0.0, 0.0, -16.0, 16.0 ] },
                "down": { "texture": "#1", "uv": [ 0.0, 0.0, -16.0, -16.0 ] }
            }
        },
        {
            "from": [ 14.0, -1.0, 14.0 ],
            "to": [ 15.0, 16.0, 15.0 ],
            "faces": {
                "north": { "texture": "#0", "uv": [ 0.0, 0.0, 6.0, 16.0 ] },
                "east": { "texture": "#0", "uv": [ 13.0, 0.0, 4.0, 14.0 ] },
                "south": { "texture": "#0", "uv": [ 4.0, 0.0, 10.0, 16.0 ] },
                "west": { "texture": "#0", "uv": [ 1.0, 0.0, 7.0, 16.0 ] },
                "up": { "texture": "#1", "uv": [ 0.0, 0.0, -16.0, 16.0 ] },
                "down": { "texture": "#1", "uv": [ 0.0, 0.0, -16.0, -16.0 ] }
            }
        },
        {
            "from": [ 14.0, -1.0, 1.0 ],
            "to": [ 15.0, 16.0, 2.0 ],
            "faces": {
                "north": { "texture": "#0", "uv": [ 0.0, 0.0, 6.0, 16.0 ] },
                "east": { "texture": "#0", "uv": [ 13.0, 0.0, 4.0, 14.0 ] },
                "south": { "texture": "#0", "uv": [ 4.0, 0.0, 10.0, 16.0 ] },
                "west": { "texture": "#0", "uv": [ 1.0, 0.0, 7.0, 16.0 ] },
                "up": { "texture": "#1", "uv": [ 0.0, 0.0, -16.0, 16.0 ] },
                "down": { "texture": "#1", "uv": [ 0.0, 0.0, -16.0, -16.0 ] }
            }
        },
        {
            "from": [ 1.0, -1.0, 1.0 ],
            "to": [ 2.0, 16.0, 2.0 ],
            "faces": {
                "north": { "texture": "#0", "uv": [ 0.0, 0.0, 6.0, 16.0 ] },
                "east": { "texture": "#0", "uv": [ 13.0, 0.0, 4.0, 14.0 ] },
                "south": { "texture": "#0", "uv": [ 4.0, 0.0, 10.0, 16.0 ] },
                "west": { "texture": "#0", "uv": [ 1.0, 0.0, 7.0, 16.0 ] },
                "up": { "texture": "#1", "uv": [ 0.0, 0.0, -16.0, 16.0 ] },
                "down": { "texture": "#1", "uv": [ 0.0, 0.0, -16.0, -16.0 ] }
            }
        }
    ]
}

И варианты блока по пути tut/resources/assets/tut/blockstates

JSON:
{
  "variants": {
    "normal": { "model": "tut:plants_sticks" }
  }
}

2018-06-05_18.14.01.png


Так как текстура у меня берётся из minecraft, то самому делать её не придётся.
Пока это целый блок через который пройти нельзя. Чтобы это исправить надо сделать для него хитбокс.

Создание хитбокса
Теперь нам надо вставить в наш класс этот код.

Java:
private static final AxisAlignedBB[] PLANTS_STICKS_AABB = new AxisAlignedBB[] {
    new AxisAlignedBB(0.0625, 0.125, 0.875, 0.125, 1.0, 0.9375),
    new AxisAlignedBB(0.875, 0.125, 0.875, 0.9375, 1.0, 0.9375),
    new AxisAlignedBB(0.875, 0.125, 0.0625, 0.9375, 1.0, 0.125),
    new AxisAlignedBB(0.0625, 0.125, 0.0625, 0.125, 1.0, 0.125)
};

AxicAlignedBB[] (Axic Aligned Bounding Box) - это и есть массив, отвечающий за наш хитбокс. В данном случае мы создаём в нём четыре хитбокса (четыре палки) с аргументами x1, y1, z1, x2, y2, z2. Очень важно, что значения - это НЕ КОЛ-ВО ПИКСЕЛЕЙ, а величина ОТНОСИТЕЛЬНО БЛОКА. То есть 1.0 - это целый блок, а 0.0625 - это один пиксель.

Соединяем все хитбоксы.

Java:
@Override
public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List<AxisAlignedBB> collidingBoxes, @Nullable Entity entityIn, boolean isActualState) {
    addCollisionBoxToList(pos, entityBox, collidingBoxes, PLANTS_STICKS_AABB[0]);
    addCollisionBoxToList(pos, entityBox, collidingBoxes, PLANTS_STICKS_AABB[1]);
    addCollisionBoxToList(pos, entityBox, collidingBoxes, PLANTS_STICKS_AABB[2]);
    addCollisionBoxToList(pos, entityBox, collidingBoxes, PLANTS_STICKS_AABB[3]);
}

public AxisAlignedBB getBoundingBox(IBlockState blockState, IBlockAccess source, BlockPos position) {

    return FULL_BLOCK_AABB;
}

addCollisionBoxToList - это функция соединяющая наши хитбоксы.
FULL_BLOCK_AABB - в этом массиве хранятся все наши хибоксы

Результат

Вот теперь можно заходить в minecraft и радоваться результатом.

2018-06-05_18.47.06.png

2018-06-05_18.47.37.png
Автор
ReyMagos
Просмотры
3,213
Первый выпуск
Обновление
Оценка
5.00 звёзд 3 оценок

Последние рецензии

Просто хитбоксы делать умел, а вот такие нет... Пригодиться. Спасибо!
Жду продолжения где расскажут про хитбоксы размерами больше одного блока
Сверху