Personal Dimension
基本信息
| 属性 | 值 |
|---|---|
| WorldProvider | me.eigenraven.personalspace.world.PersonalWorldProvider extends WorldProvider |
| 维度 ID 范围 | 从 firstDimensionId(默认 180)开始顺序分配 |
| 维度命名 | Personal World <dimId>(getDimensionName) |
| 出生点 | (8, groundLevel+2, 8)(非随机化) |
| 是否可以重生 | 否(canRespawnHere=false) |
| 是否表面世界 | 是 |
| 区块生成器 | PersonalChunkProvider(平面层 + 边界/间隙/中心标记) |
进入方式
PortalTileEntity.transport(EntityPlayerMP)→transferPlayerToDimension(dimId, tp)。PersonalTeleporter继承Teleporter.placeInExistingPortal:- 重置
motionX/Y/Z = 0,将玩家放置到(target.x + 0.5, target.y + 0.1, target.z + 0.5),yaw 由 source/target 偏移计算(保证朝向面对 home portal)。
- 重置
特殊设定(来自 DimensionConfig)
视觉/环境字段:
| 字段 | 默认 | 含义 |
|---|---|---|
skyColor |
0xc0d8ff |
当 daylightCycle ≠ CYCLE 时,雾色和天空色都使用此 RGB |
starBrightness |
1.0 | 星空亮度 (0~1) |
weatherEnabled |
false | 天气(雨/雷/雪)开关 |
daylightCycle |
CYCLE |
SUN=白天, MOON=黑夜, CYCLE=正常循环 |
cloudsEnabled |
true | 云层可见(getCloudHeight → 256.0 或 NEGATIVE_INFINITY) |
skyType |
VANILLA |
VANILLA/BARNADA_C(GalaxySpace) / GARDEN_OF_GLASS(Botania),对应不同的 sky/cloud renderer |
biomeId |
Plains |
默认生物群系;强制通过 DimensionConfig.canUseBiome 白名单(来自 Config.allowedBiomes) |
世界生成字段:
| 字段 | 含义 |
|---|---|
generatingVegetation |
biome.decorate 流程触发(如花草) |
generatingTrees |
BiomeGenBase.plains.func_150567_a → WorldGenTrees(false, 4, 0, 0, false) |
layers |
FlatLayerInfo 列表,从 Config.allowedBlocks 中允许的方块构造(如 minecraft:bedrock*4;minecraft:stone*58;minecraft:dirt;minecraft:grass) |
applyToAllSurfaceLayers |
是否将边界/间隙/中心生成作用于每个表面层(默认仅作用于 groundLevel) |
边界生成:
| 字段 | 含义 |
|---|---|
boundaryBlockA / metaA / blockB / metaB |
在 chunkIntervalX/Z 倍数坐标处画出 A/B 两种方块的竖条纹(getStripeBlock) |
boundaryChunkIntervalX / Z |
每隔 N 个区块画一条边界(0~20,0=禁用) |
间隙生成:
| 字段 | 含义 |
|---|---|
gapWidth |
每 interval + gapWidth 区块切出一条"空隙"(0~5,0=禁用) |
gapPreset |
ROAD(A 路基 + B 路面 + C 中央虚线?) 或 SOLID(仅 A+B 交替) |
gapBlockA / metaA / blockB / metaB / blockC / metaC |
ROAD 模式下 A=B=路基/B=路面;SOLID 模式下仅 A+B 交替 |
中心标记:
| 字段 | 含义 |
|---|---|
centerEnabled |
在每个 area 中心中央放置 centerBlock:meta |
centerDirection |
SE(x+z+), SW(x-z+), NE(x+z-), NW(x-z-),决定标记点偏移 |
centerBlock / meta |
中心方块 |
时间/天气持久化(首次加载前从主世界捕获,之后与主世界解耦):
| 字段 | 含义 |
|---|---|
timeDataPersisted |
是否已经从主世界初始化过 |
worldTime, raining, rainTime, thundering, thunderTime |
维度独立的时间状态;WorldInfo 反射替换为 standaloneInfo |
WorldProvider 行为
PersonalWorldProvider 重写以下与原版 WorldProvider 不同:
| 方法 | 行为 |
|---|---|
registerWorldChunkManager |
new WorldChunkManagerHell(BiomeGenBase.plains, 1.0F)(固定 Plains chunk mgr) |
createChunkGenerator |
new PersonalChunkProvider(this, getSeed()) |
getSpawnPoint / getRandomizedSpawnPoint |
(8, groundLevel+2, 8)(不随机) |
getSkyColor / getFogColor |
daylightCycle=CYCLE 时走原版;否则使用 config.getSkyColor |
isDaytime / getSunBrightness* / getStarBrightness / calculateCelestialAngle |
SUN/MOON 时直接返回 0/1 二值 |
getCloudHeight |
启用 → 256.0;禁用 → NEGATIVE_INFINITY |
canCoordinateBeSpawn |
仅当最高方块阻止移动 |
getAverageGroundLevel |
来自 DimensionConfig.getGroundLevel() |
canRespawnHere |
false |
isSurfaceWorld |
true |
doesXZShowFog |
false |
calculateInitialWeather / updateWeather / canDoLightning / canDoRainSnowIce / canBlockFreeze / canSnowAt |
一律要求 isWeatherEnabled()=true 才允许 |
getSkyRenderer / getCloudRenderer |
客户端钩子:当 skyType 变化时切换 setSkyRenderer / setCloudRenderer 为对应 mod 的 provider |
Chunk 生成
PersonalChunkProvider 主要逻辑(provideChunk):
- 填平面层:根据
cfg.getLayers()把FlatLayerInfo逐层填到 chunk;meta 同步写入。 - 间隙覆盖:若该 chunk 是 X 或 Z 间隙(
isGapChunkX||Z),用generateGapInChunk写入路基/路面。 - 边界画线:在
(localX=0/15)或(localZ=0/15)处根据条纹规则写入 boundary 方块。 - 中心标记:若启用,在每个 area 中心
(centerLocalX, centerLocalZ)写入centerBlock:meta。 - 出生平台:chunk (0,0) 的
(4..13, 4..13)处铺Blocks.double_stone_slab。 - 生物群系填充:把整个 chunk 的 biomeArray 全部写入
savedBiomeId,然后generateSkylightMap。
populate 阶段:
- 若
isGeneratingVegetation()→biome.decorate。 - 若
isGeneratingTrees()+TerrainGen.decorate(...TREE)→ 用BiomeGenBase.plains的默认WorldGenTrees(false, 4, 0, 0, false),scale = 1.0。
限制
- 维度 ID 由
Config.firstDimensionId(默认 180)开始,按已注册列表往后扫描。 - 必须在主世界(dim 0)中右键才能创建新维度(
updateSettings检查)。 - 层方块、边界方块、间隙方块、中心方块、生物群系都受到
Config.allowedBlocks/...白名单约束(白名单在服务器端的Config.synchronizeConfiguration中读取,并通过sendWorldList包广播到所有客户端,客户端用WBlockDropdown.buildEntriesFromRules构造 GUI 选项)。