幽灵方块
[!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)。