fix(game): 崩溃修复(卸载区块实体冻结)+ 立面光照、掉落可见、打击感、水下效果、空手拳头、血条左/饥饿右
- 崩溃(index out of range):实体所在区块卸载后失去碰撞支撑无限下坠到 负坐标,光查询越界 panic——WorldView 增 ChunkLoaded,未加载区块实体冻结; chunk 光查询加越界防御(双保险) - 立面光照:mesh 每面取**邻格**光照(原版光照模型)——此前用方块自身光照 (sky=0)导致悬崖/矿洞立面全黑(泥土竖向黑色根因) - 掉落可见:生成后 1 秒拾取延迟 + 图标加大到 0.45 - 打击感:攻击命中音(block.hit)+ 实体受击白闪(uTint)+ 手持挥动动画 - 水下效果:相机入水蓝色叠加(渲染.md §8 水体) - 空手显示肤色拳头(白羊毛 × 肤色 tint),持方块正常显示 - HUD 布局:血条左下、饥饿右下(经典布局)
This commit is contained in:
@@ -79,17 +79,38 @@ func (c *Chunk) FillAll(s block.State) {
|
||||
}
|
||||
}
|
||||
|
||||
// SkyLight 读取天空光(4-bit,0–15)。
|
||||
func (c *Chunk) SkyLight(x, y, z int) uint8 { return nibble(c.sky, Index(x, y, z)) }
|
||||
// SkyLight 读取天空光(4-bit,0–15;越界返回 0——实体在未加载区块
|
||||
// 下落时查询负数坐标不应崩溃,区块管理.md §6 防御)。
|
||||
func (c *Chunk) SkyLight(x, y, z int) uint8 {
|
||||
if x < 0 || x >= SizeX || y < 0 || y >= Height || z < 0 || z >= SizeZ {
|
||||
return 0
|
||||
}
|
||||
return nibble(c.sky, Index(x, y, z))
|
||||
}
|
||||
|
||||
// SetSkyLight 写入天空光。
|
||||
func (c *Chunk) SetSkyLight(x, y, z int, v uint8) { setNibble(c.sky, Index(x, y, z), v) }
|
||||
// SetSkyLight 写入天空光(越界忽略)。
|
||||
func (c *Chunk) SetSkyLight(x, y, z int, v uint8) {
|
||||
if x < 0 || x >= SizeX || y < 0 || y >= Height || z < 0 || z >= SizeZ {
|
||||
return
|
||||
}
|
||||
setNibble(c.sky, Index(x, y, z), v)
|
||||
}
|
||||
|
||||
// BlockLight 读取方块光(4-bit,0–15)。
|
||||
func (c *Chunk) BlockLight(x, y, z int) uint8 { return nibble(c.blockLt, Index(x, y, z)) }
|
||||
// BlockLight 读取方块光(4-bit,0–15;越界返回 0)。
|
||||
func (c *Chunk) BlockLight(x, y, z int) uint8 {
|
||||
if x < 0 || x >= SizeX || y < 0 || y >= Height || z < 0 || z >= SizeZ {
|
||||
return 0
|
||||
}
|
||||
return nibble(c.blockLt, Index(x, y, z))
|
||||
}
|
||||
|
||||
// SetBlockLight 写入方块光。
|
||||
func (c *Chunk) SetBlockLight(x, y, z int, v uint8) { setNibble(c.blockLt, Index(x, y, z), v) }
|
||||
// SetBlockLight 写入方块光(越界忽略)。
|
||||
func (c *Chunk) SetBlockLight(x, y, z int, v uint8) {
|
||||
if x < 0 || x >= SizeX || y < 0 || y >= Height || z < 0 || z >= SizeZ {
|
||||
return
|
||||
}
|
||||
setNibble(c.blockLt, Index(x, y, z), v)
|
||||
}
|
||||
|
||||
// nibble 读取半字节(偶数索引 → 低 4 位,奇数索引 → 高 4 位)。
|
||||
func nibble(arr []uint8, idx int) uint8 {
|
||||
|
||||
Reference in New Issue
Block a user