虚空岛(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不一致。以源码为准。见 源码缺陷。