WorldLib

基本信息

属性 值
路径 mrtjp.core.world.WorldLib
源码 src/main/scala/mrtjp/core/world/WorldLib.scala(247 行,本 mod 最大 world 文件)

世界操作工具库,基于 CodeChickenLib 的 BlockCoord / Vector3 简化坐标操作。

TileEntity

getTileEntity(w, bc)、getTileEntity\[T\]\(w, bc, clazz)(含返回 null 的重载)。

坐标打包(⭐ 值得注意的实现)

方法 说明
packCoords(x, y, z): Long 打包进 1 个 long
unpackX(c) (c & ((1 << 26) - 1)).toInt - 30000000 → 26 位,偏移 3000 万
unpackZ(c) ((c >> 26) & ((1 << 26) - 1)).toInt - 30000000
unpackY(c) ((c >> 52) & ((1 << 12) - 1)).toInt → 12 位,无偏移
unpackCoords(c) 还原为 BlockCoord

布局:X 占 0–25、Z 占 26–51、Y 占 52–63。

其它

分组 方法
方块 getBlock、bulkBlockUpdate、uncheckedSetBlock
TileEntity uncheckedRemoveTileEntity、uncheckedSetTileEntity、uncheckedGetTileEntity
掉落 dropItem(w, bc, stack)、centerEject(...)
判定 isLeafType、isPlantType、isBlockSoft、isAssociatedTreeBlock、isBlockTouchingAir、isBlockUnderTree、findSurfaceHeight
光照 getSkyLightValue、getBlockLightValue
风 getWindSpeed
组合 getBlockMetaPair、getBlockInfo

缺陷

  • unpackY 只取 12 位(0–4095),不含符号位;负 Y 坐标在 packCoords 时会溢出, 须由调用方保证 y >= 0。
  • 大量 uncheckedXxx 方法直接写 world 内部字段,绕过 Forge 的正常更新通知, 使用不当会导致区块不重绘 / TileEntity 不同步。

相关条目