Personal Dimension

基本信息

属性 值
WorldProvider me.eigenraven.personalspace.world.PersonalWorldProvider extends WorldProvider
维度 ID 范围 从 firstDimensionId(默认 180)开始顺序分配
维度命名 Personal World <dimId>(getDimensionName)
出生点 (8, groundLevel+2, 8)(非随机化)
是否可以重生 否(canRespawnHere=false)
是否表面世界 是
区块生成器 PersonalChunkProvider(平面层 + 边界/间隙/中心标记)

进入方式

通过 Personal Dimension Portal:

  • 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):

  1. 填平面层:根据 cfg.getLayers() 把 FlatLayerInfo 逐层填到 chunk;meta 同步写入。
  2. 间隙覆盖:若该 chunk 是 X 或 Z 间隙(isGapChunkX||Z),用 generateGapInChunk 写入路基/路面。
  3. 边界画线:在 (localX=0/15) 或 (localZ=0/15) 处根据条纹规则写入 boundary 方块。
  4. 中心标记:若启用,在每个 area 中心 (centerLocalX, centerLocalZ) 写入 centerBlock:meta。
  5. 出生平台:chunk (0,0) 的 (4..13, 4..13) 处铺 Blocks.double_stone_slab。
  6. 生物群系填充:把整个 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 选项)。

相关条目