# 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`