异界迷宫维度 Eldritch Labyrinth

基本信息

属性 值
维度 ID ModConfig.dimOuterId,默认 -73(可配)
WorldProvider common/utils/world/WorldProviderTCEldrich.java
注册位置 common/CommonProxy.java:75-76(FML init 阶段)
区块提供器 ChunkProviderTCOuter
会话管理 common/utils/world/TCMazeHandler.java
生成器 common/utils/world/fake/FakeWorldTCGeneration.java
迷宫实现 复用 Thaumcraft 的 MazeHandler

注册细节

CommonProxy.initalize() 中:

DimensionManager.registerProviderType(ModConfig.dimOuterId, WorldProviderTCEldrich.class, true);
DimensionManager.registerDimension(ModConfig.dimOuterId, ModConfig.dimOuterId);

(CommonProxy.java:75-76)

第三个参数 true 表示该 Provider 需要保存(会写进存档)。

此外 Gadomancy.init() 向 Thaumcraft 发送维度黑名单消息,防止其异界传送门机制误处理该维度(Gadomancy.java:70):

FMLInterModComms.sendMessage(Thaumcraft.MODID, "dimensionBlacklist", ModConfig.dimOuterId + ":0");

迷宫生成

尺寸

源码注释(TCMazeHandler.java:53-56)记录了尺寸演进与缩放规律:

// The scaling is quadratic; double the size, quadruple the time.
// Width and Height are randomized separately, making a normal distribution for the size.
// Vanilla Thaumcraft sizes: 11-23 and 15-31
// Original Gadomancy size: 17-21
常量 值 说明
MIN_LABYRINTH_SIZE 12 宽高各自的下界
MAX_LABYRINTH_SIZE 16 宽高各自的上界
LABYRINTH_BUFFER_SIZE 33 MAX_LABYRINTH_SIZE * 2 + 1
TELEPORT_LAYER_Y 55 传送层高度

宽与高独立随机(TCMazeHandler.java:212-213):

int w = MIN_LABYRINTH_SIZE + rand.nextInt(MAX_LABYRINTH_SIZE - MIN_LABYRINTH_SIZE + 1);
int h = MIN_LABYRINTH_SIZE + rand.nextInt(MAX_LABYRINTH_SIZE - MIN_LABYRINTH_SIZE + 1);

即实际尺寸为 12–16 × 12–16,宽高呈正态分布。

布局算法

迷宫沿 +X 方向生长以避免重叠(TCMazeHandler.java:214-216):

int chX = LABYRINTH_BUFFER_SIZE; // To ensure we're always +x and +z
int chZ = LABYRINTH_BUFFER_SIZE;
while (MazeHandler.mazesInRange(chX, chZ, w, h)) {
    chX += LABYRINTH_BUFFER_SIZE; // We grow the mazes in +x direction!
}

生成在独立线程 MazeThread 中完成(TCMazeHandler.java:217),并通过 calculateDifferences 只取新增区域,避免重复计算(TCMazeHandler.java:222-235)。

存储结构为 ConcurrentHashMap<CellLoc, Short>(TCMazeHandler.java:64)。

会话系统

一玩家一迷宫

配置说明(ModConfig.java:113)明确:

「(-1 = infinite) Note that 1 maze = 1 player; Once the player finishes the maze, the maze closes itself and teleports the player out.」

并发上限判定(TCMazeHandler.java:237-239):

private static boolean hasFreeSessionSpace() {
    return ModConfig.maxMazeCount == -1 || TCMazeHandler.runningSessions.size() < ModConfig.maxMazeCount;
}

TCMazeSession(TCMazeHandler.java 中的类)记录单次挑战,用 java.time.Duration / Instant 计时(TCMazeHandler.java:3-4 导入)。

生命周期

事件 处理
玩家触发传送门 createSessionWaitForTeleport(EntityPlayer) 创建会话并等待传送(TCMazeHandler.java:185)
迷宫中有传送门打开 广播 gadomancy.eldritch.maze.portalSpawned:「You sense portals open across the Labyrinth.」(en_US.lang:205)
首次完成 gadomancy.eldritch.maze.first:「You completed the Eldritch Labyrinth in %s.」(en_US.lang:206)
刷新最佳纪录 gadomancy.eldritch.maze.newBest:「New fastest Eldritch Labyrinth completion: %s. Previous best time: %s.」(en_US.lang:207)
普通完成 gadomancy.eldritch.maze.default:「You completed the Eldritch Labyrinth in %s. Best time: %s.」(en_US.lang:208)
首领战结束 handleBossFinish(TCMazeSession)(TCMazeHandler.java:112)
服务器停止 closeAllSessionsAndCleanup()(TCMazeHandler.java:72),TCMazeHandler.GEN 置空(CommonProxy.java 的 onServerStopped)
服务端启动 TCMazeHandler.GEN = new FakeWorldTCGeneration()(CommonProxy.java 的 onServerAboutToStart)

世界属性

WorldProviderTCEldrich 覆写了大量 WorldProvider 方法以定制迷宫世界(WorldProviderTCEldrich.java:22-130):

方法 覆写原因
getDimensionName() / getWelcomeMessage() / getDepartMessage() 自定义维度名与进出提示
canBlockFreeze / canSnowAt / canDoLightning / canDoRainSnowIce 关闭全部天气
getFogColor / isSkyColored / calcSunriseSunsetColors 自定义雾与天空表现
isSurfaceWorld() 返回 false(非地表世界)
canRespawnHere() 玩家不能在迷宫内重生
getEntrancePortalLocation() 自定义入口传送位置
getAverageGroundLevel() 地面高度

registerWorldChunkManager() 中把 dimensionId 强制设为 ModConfig.dimOuterId(WorldProviderTCEldrich.java:57-60)。

shouldMapSpin 与 doesXZShowFog 也被覆写以配合迷宫表现。

数值

数值名 值
维度 ID(默认) -73
迷宫宽 12–16
迷宫高 12–16
缓冲区尺寸 33
传送层 Y 55
同时存在上限 -1 = 无限(可配)
天气 全部关闭
缩放规律 尺寸翻倍 → 耗时变为 4 倍(二次方)
光照计算 可关闭(关闭后有光照 bug,但节省约 2 秒)

交互

触发 行为
走入附加异界传送门 创建迷宫会话并传送
在迷宫中移动 迷宫持续计时
抵达终点 结算并传送出迷宫
迷宫内死亡 不能在此重生

相关条目