# Minecraft Fabric Modding - 方塊專欄
## 進階方塊
### Glass Block
將原本 register 的 `Block()` 改為 `GlassBlock()`,並在 `FabricBlockSettings` 後加入 `nonOpaque()`
```java=
public static final Block TOUGHENED_GLASS = registerBlock("toughened_glass",
new GlassBlock(FabricBlockSettings.of(Material.GLASS).strength(15.0f)
.breakByTool(FabricToolTags.PICKAXES, 3).requiresTool().nonOpaque()));
```
在 `ModBlocks` 加入函數:
```java=
public static void renderGlassBlock(Block... block) {
for(int i = 0 ; i < block.length ; i++) { BlockRenderLayerMap.INSTANCE.putBlock(List.of(block).get(i), RenderLayer.getCutout()); }
}
```
### Stairs & Slabs
### Trap Doors & Doors
## Block State
BlockState 是來用來描述擁有一些性質 (Property) 方塊,他是儲存在 World 裡,並且只能由 World 來改變。
宣告 (In Custom Block):
```java=
public static final BooleanProperty LIT = BooleanProperty.of("lit");
```
字串中為 ***LIT*** 的名稱,可用在 json 顯示不同 blockstates 時。
Properties:
```java=
IntProperty
BooleanProperty
DirectionProperty
EnumProperty<T>
```
加入 Property
```java=
@Override
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
builder.add(LIT, ...);
}
```
初始化 Property (在建構子內初始化):
```java=
this.setDefaultState(this.getDefaultState().with(LIT, false).with()...;
```
修改 Property:
```java=
// check if your function has these parameters
World world; BlockPos pos; BlockState state;
world.setBlockState(pos, state.with(LIT, true).with()..., Block.NOTIFY_ALL);
```
`Block.NOTIFY_ALL` 代表更新後的行為,可加可不加
## Voxel Shape
> *立體像素(Voxel),是體積像素 (Volume Pixel) 的簡稱,概念上類似二維空間的最小單位—像素,是數位資料於三維空間分割上的最小單位。*
宣告與初始化變數:
```java=
private static final VoxelShape vs = Block.createCuboidShape(
double minX, double minY, double minZ,
double maxX, double maxY, double maxZ);
```
※其中的參數皆是小格數
再來我們需要 Override OutlineShape:
```java=
@Override
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
return VoxelShapes.union(VoxelShape...);
}
```
`union()` 是代表將很多不同的 VoxelShape 組合起來。
---
###### tags: `Minecraft Fabric Modding`