异界迷宫维度 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 秒) |
交互
| 触发 | 行为 |
|---|---|
| 走入附加异界传送门 | 创建迷宫会话并传送 |
| 在迷宫中移动 | 迷宫持续计时 |
| 抵达终点 | 结算并传送出迷宫 |
| 迷宫内死亡 | 不能在此重生 |
相关条目
- 附加异界传送门 - 进入该维度的入口
- 异界传送门制造器多方块结构 - 入口的建造方式
- 配置项 -
dimOuterId/maxMazeCount/calculateEldritchLight