- Версия(и) Minecraft
- 1.12
Хитбокс для блока
Основной класс
В данном случае мы будем делать блок палок для растений. Наша задача сделать так, чтобы можно было между палками проходить.
Модель и blockstates
Сделаем для них какую-нибудь красивую модель по пути
И варианты блока по пути
Так как текстура у меня берётся из minecraft, то самому делать её не придётся.
Пока это целый блок через который пройти нельзя. Чтобы это исправить надо сделать для него хитбокс.
Создание хитбокса
Теперь нам надо вставить в наш класс этот код.
Соединяем все хитбоксы.
Результат
Вот теперь можно заходить в minecraft и радоваться результатом.
Основной класс
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" }
}
}
Так как текстура у меня берётся из 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 и радоваться результатом.