幽灵方块

[!WARNING] 本方块无合成配方且无法破坏,只能由灵魂世界传送器结构生成。可用 /rt spectre 等方式交互,但拿不到物品形态。

基本信息

属性 值
注册名 RandomThings:spectreBlock
类 lumien.randomthings.Blocks.Spectre.BlockSpectreBlock
物品形态 ItemBlockColored(BlockSpectreBlock.java:27 传入)
材质 Material.rock
光照值 15(满光,:28)
硬度 -1(setBlockUnbreakable(),:29)
爆炸抗性 6 000 000.0F(:30)
脚步声 Block.soundTypeGlass(:29)
可被实体破坏 否,canEntityDestroy 返回 false(:34-37)
颜色变体 16 种(metadata 0–15)
开关 无 —— 始终注册(ModBlocks.java:62,注释 // Always there)

功能

幽灵方块是灵魂世界的不可破坏屏障方块,全亮度发光,颜色由 metadata 决定。

不可破坏性

三重保障(BlockSpectreBlock.java:28-37):

this.lightValue = 15;
this.setBlockUnbreakable().setStepSound(soundTypeGlass);
this.setResistance(6000000.0F);
...
@Override
public boolean canEntityDestroy(IBlockAccess world, int x, int y, int z, Entity entity) {
    return false;
}

setBlockUnbreakable() 在 1.7.10 中把 blockHardness 设为 -1 并把 blockResistance 设为 6000000;随后 setResistance(6000000.0F) 再次显式确认。加上 canEntityDestroy 恒 false,任何手段都无法取得物品形态。

16 色变体

颜色取自原版染料色板:getRenderColor(damage) 返回 ItemDye.field_150922_c[damage](:67-70)。16 个中文名在 zh_CN.lang:19-35(黑色 / 红色 / 绿色 / 棕色 / 蓝色 / 紫色 / 青色 / 淡灰色 / 灰色 / 粉红色 / 黄绿色 / 黄色 / 淡蓝色 / 品红色 / 橙色 / 白色)。

染色传播

右键时若手持染料,会把该颜色传播到所有相连的幽灵方块(BlockSpectreBlock.java:42-59):

int dye = Colors.getDye(entityplayer.getCurrentEquippedItem());
if (dye != -1) {
    WorldUtils.setConnectedBlocksTo(worldObj, i, j, k, this, dye, this, worldObj.getBlockMetadata(i, j, k));
    return true;
}

WorldUtils.setConnectedBlocksTo 做的是洪水填充式的连通染色,因此可以一次染一整片。语言键为 entityDyeingIdentifier = "rtColoring"(Reference.java:9),用于标记已染色方块。

数值

数值名 值
光照值 15(满)
硬度 -1(不可破坏)
爆炸抗性 6 000 000.0
canEntityDestroy 恒 false
颜色变体 16(metadata 0–15)
生成方块条件 仅 isBlockContainer 式传送器结构边界

生成方式

唯一放置点是灵魂世界传送器。TeleporterSpectre.placeInPortal 在玩家进入灵魂世界时,用幽灵方块现场搭建一个 16×13×16 的空腔边框(Handler/Spectre/TeleporterSpectre.java:41-58):

final int minY = 40, maxY = 52;
final int minZ = 0,   maxZ = 15;
for (int x = minX; x <= maxX; x++)
  for (int y = minY; y <= maxY; y++)
    for (int z = minZ; z <= maxZ; z++)
      if (x == minX || y == minY || z == minZ || x == maxX || y == maxY || z == maxZ)
        this.world.setBlock(x, y, z, ModBlocks.spectreBlock, 12, 2);

放置的固定 metadata 是 12(淡蓝色),玩家随后可用染料改色。玩家被传送到腔体中心 coord * 32 + 8, 42, 1.5(:60)。

相关条目