地面标线

基本信息

属性 值
实现类 modernmarkings.blocks.MarkingFloor(继承 BlockBase)
方块数 87
注册位置 modernmarkings.init.ModBlocks 的 new MarkingFloor(...) 静态字段
材质 Material.carpet
碰撞 无(getCollisionBoundingBoxFromPool 返回全 0 包围盒)
厚度 0.0001(setBlockBounds(0, 0, 0, 1, 0.0001, 1))
不透明 否(isOpaqueCube() 返回 false)
渲染 自定义 ISimpleBlockRendering(renderMarkingFloorID)

87 个方块全部在 ModBlocks.java 的 // spotless:off / // spotless:on 区间内硬编码声明,没有任何元数据变体——每个视觉差异都是一个独立方块。

分类统计

类别 数量 成员示例
字母 A–Z 26 floor_marking_letter_a … floor_marking_letter_z
黄色系 11 yellow_arrow / yellow_lane / yellow_t_crossing / yellow_stripes …
白色系 10 white_arrow / white_lane / white_lane_cross / white_singleline / white_square …
绿色系 8 green_t_crossing / green_turn / green_end / green_sideline …
蓝色系 8 blue_t_crossing / blue_crossing / blue_turn / blue_end …
红色系 8 red_t_crossing / red_crossing / red_turn / red_end …
橙色系 8 orange_t_crossing / orange_crossing / orange_turn / orange_end …
危险色 2 danger_yellow / danger_red
黑色单线 1 black_singleline
黑白警示线 1 whiteblack_hazardline
禁止进入 1 noentry
禁止踩踏 1 nostep
出口 1 exit
红叉 1 redx

合计 87。

放置规则

canPlaceBlockAt 先走原版方块规则,再要求下方方块顶面为实心:

return World.doesBlockHaveSolidTopSurface(world, x, y - 1, z);

因此地面标线不能悬空放置。

onNeighborBlockChange 监听正下方方块:一旦顶面不再实心,标线自动掉落为物品并消失(setBlockToAir + dropBlockAsItem)。所以拆掉支撑方块不会留下悬空的贴花。

朝向换算

onBlockPlacedBy 把放置者的 rotationYaw 归一化到 [0, 360),再按 MathHelper.floor_double((yaw * 4.0F / 360.0F) + 0.5D) & 3 折成 4 个朝向,写入 4 个元数据值:

rotation meta 含义
0 3 向南
1 2 向北
2 0 向东 / 零位
3 1 向西

[!NOTE] 注意 rotation 0–3 与 meta 0–3 不是同一套编号,switch 里做了一次重排。meta 0 既是「rotation 2」的朝向,也是 default 分支的兜底值——MarkingFloorRenderer 正是靠这 4 个 meta 旋转贴花纹理。

相关条目