虚空岛(Void Island)

VOID_ISLAND 子变体给玩家一个悬浮在虚空中的出生小岛,并由 IslandControl 提供一套多人岛屿管理命令。

岛屿分配

util/islands/IslandControl.java 以 8000 格为间距的网格分配岛屿:

return lastIsland = new Pair<>(currentRow * 8000, currentCol * 8000);

每个玩家占一格 (row, col),实际坐标为该格乘 8000。分配时按行推进,并设边界检查:

if (Math.abs(currentCol * 8000) > 30_000_000 || Math.abs(currentRow * 8000) > 30_000_000)

即坐标被限制在 ±30,000,000 以内。IslandControlSaveData 负责把分配结果持久化。

岛屿模板

util/islands/skyIslands.java 定义 7 套模板,每套是 Object[][] 形式的字符画(key → 方块):

方法 用途
createIslandOW() 主世界出生岛
createIslandNether() 下界岛
createIslandDD() Dream Dimensions 岛
createIslandSpaceStation() 空间站
createIslandEnd() 末地岛
createIslandThaum() 神秘时代岛
createIslandTwilight() 暮色森林岛

私有辅助方法:islandChest() 与 treeBlock(Block)(后者把树木方块包成模板条目)。

跨模组方块

模板用 GameRegistry.findBlock(modid, name) 按字符串跨 mod 取方块,共涉及 11 个其它 mod:

modid 取用次数
HardcoreEnderExpansion 16
Thaumcraft 14
BiomesOPlenty 13
GalacticraftCore 7
Natura 6
chisel 5
thaumicbases 3
etfuturum 3
Ztones 2
miscutils / OpenBlocks / EnderIO 各 1

⚠️ 这些是本 mod 合法引用的外部方块,不是误混入的内容。但它们全部是硬编码字符串:skyIslands.java 中 == null / != null 判定共 0 处,没有对 GameRegistry.findBlock 的返回值做存在性检查。若整合包缺少其中任一 mod,岛屿生成会异常。BlockData / BlocksRegistry / GridGenerator 三个工具类负责方块解析与网格展开;其中 BlocksRegistry 内部另有 checkIfBlacklisted() 黑名单跳过机制,但那是给 SKYGRID 的 tileentity 白/黑名单用的,不覆盖岛屿模板。

出生岛内容开关

配置 默认
allowVoidIslandTree true
allowVoidIslandChest true

本地化描述称玩家会得到「一点基础物品和一棵树」("nothing but some basic items and a tree")。

出生点

MixinWorldProvider_SetExactSpawn(builder SET_EXACT_SPAWN_LOCATION)取消出生点的随机偏移,并把 y 固定为 65——这正是虚空岛需要一个精确落点的原因。

ALLOW_RESPAWN_IN_DIMENSION 的条件同时检查 VOID_ISLAND,保证玩家在虚空岛死亡后能原地重生而不被送回主世界。

命令

VOID_ISLAND 激活时,CommonProxy.serverStarting 会注册 IslandCommands 并把 IslandControl.instance 挂到 FML 总线上:

/island <create|join> [args...]

所需权限等级 0(getRequiredPermissionLevel() 返回 0)——即所有玩家可用,无需 OP。别名 Island。

⚠️ 本地化描述称需要「permission level 1」,与源码返回的 0 不一致。以源码为准。见 源码缺陷。

相关条目