世界与玩法
CaelCraft 的世界是「种子 + 修改记录」:地形、树、洞穴、岩浆和村庄都能从种子重算,存档只保存你动过的方块。下面按系统拆开讲,最后附一点实现细节。
世界生成
世界横向无限,纵向固定 64 格(4 个区块 × 16 格),海平面在 y=30。x/z 没有硬边界,编辑坐标支持 ±1,048,576。区块按需生成:玩家走近时现场算出一列 16×64×16 的地形,远处再卸载。
地表由低频噪声分成四种:平原、森林、沙漠和雪地。雪地由一层低频「冷」噪声决定,不是按高度切雪线;所以不会在常见的 40 多格高度突然出现一格高的雪台。树大约每 6 格尝试长一次,低洼处灌水,地下用三维噪声挖洞穴。
岩浆不是「低处全是岩浆海」:只有 y ≤ 5、洞体足够深(cave > 0.70)并且低频 mask 通过的地方才会填岩浆。这样地下有零星岩浆池,不会把整个底层掏空。
- World height
- 64格
- Sea level
- 30格
- Biomes
- 4种
- Day cycle
- 180秒
改地形生成算法会让同种子的旧存档地形整体变样。存档只存种子和方块修改,所以升级开发版前先备份 saves\。
方块
内置方块固定 0–14:空气、草、土、石、沙、木、叶、雪、水、岩浆、木板、圆石、砖块、书架、碎石。草方块掉土,石头掉圆石;其他方块默认掉自己。树叶是 cutout,透明部分在着色器里直接丢弃;水是半透明,走单独的透明管线。
生存模式挖掘按 hardness 秒计算:草 / 土 0.4、沙 0.35、石 1.4、木 1.2、叶 0.2、雪 0.3、木板 0.8、圆石 1.5、砖块 1.6、书架 0.9、碎石 0.5。创造模式瞬破,不掉落。
模组可以从 ID 15 起追加方块,注册后会进同一个方块表;完整的方块名和 ID 见 命令与方块。缺模组的旧存档里,未知方块会退化成空气。
水与岩浆
水最多流 7 格,岩浆最多 3 格。流动液面的高度按等级降低:水每级降 0.12 格,岩浆每级降 0.25 格;网格会按等级削顶,并在不同液面之间补侧面。水走半透明网格,岩浆走不透明网格。
模拟不是逐格邻接规则,而是局部重算:改动把附近格子排进队列,tickFluids(水 0.15 秒一次、岩浆 0.7 秒一次)从附近水源重新 BFS 整个连通区域,一次算完填、退、降级。这样删掉水源时整片流动水会一起退掉,不会互相喂水越流越远;水源本身永远不会消失。
- 重算只往种子所在 y 及以下扩散,水不会往上流。
- 单次重算区域上限 2 万格;改过的区块统一重建网格。
- 水挨着岩浆会把岩浆变成圆石,六个方向都算。
- 放置判定接受空气和水 / 岩浆;射线仍只认固体,所以水下挖海底不受影响。
联机时只有房主跑流体模拟,客户端收到方块修改后应用;客户端不会自己推演流体。
村庄与村民
村庄按 160 格网格 + 种子抖动找候选位置,要求周围 ±32 格采样范围内全是陆地:高于海平面 4 格、非沙漠 / 雪地、高差不超过 7。结果会缓存。构造世界时还会从原点向外强制找一块平地放一个村,保证出生点附近有村。
每个村有中央水井(圆石圈 + 水 + 四根木柱 + 木板顶)、4 栋房子(圆石地基、木板墙、砖瓦阶梯顶、门窗、书架 / 木板桌)、碎石路和四角岩浆灯柱。核心半径 20 格压平,外面 12 格用 smoothstep 过渡,房子都在核心平地上。
村民每个村 3–5 个,4 点生命,home 是活动中心:离村 8 格会走回去,否则随机闲逛;不会攻击玩家,被打会逃跑。生存模式右键村民,有 8 块木板就换 1 个书架。
进出村庄时左下角会显示村名,名字由中心坐标和种子哈希决定。用 /village 查最近的村,/village tp 直接传送过去。
生物
新世界会先生成一批史莱姆和猪,之后每个村庄再生成 3–5 个村民。生物有重力、碰撞和朝移动方向平滑转身;掉到 y < -5 会重置到 y=40。
| 生物 | 生命 | 行为 |
|---|---|---|
| 史莱姆 | 3 | 随机游走;生存模式在 10 格内追击玩家,高差小于 6 才追。追到约 1.1 格会绕着玩家转,每 1.2 秒造成 1 点伤害。创造和旁观模式完全无视玩家。 |
| 猪 | 2 | 随机游走,速度更快;被攻击会扣血、红闪、击退并逃跑。 |
| 村民 | 4 | 在村庄附近闲逛,离活动中心太远会走回去;不攻击,被打会逃;可以交易。 |
被攻击的生物头顶会显示血条;血量归零后移除。水下不生成生物。联机时生物由房主模拟,客户端只按快照平滑朝向和位置。
掉落物与背包
生存模式挖掉方块不再直接进背包,而是在方块中心生成一个掉落物;创造模式不产生掉落。掉落物有重力,按 0.05 步长分轴推进,水里降重力并加阻尼,碰到岩浆直接销毁。落地后 0.35 秒可拾取,水平 1.3 格、垂直 -1.9 到 1.5 格内自动捡起;同方块 0.6 格内自动合并,5 分钟消失。
背包固定 36 格,前 9 格是快捷栏。生存模式显示实际堆叠数量,放置会消耗;创造模式快捷栏直接画调色板,放置不消耗。按 E 打开背包,点击格子是整组拿起 / 放下 / 同类合并 / 交换;关闭时手里的东西会塞回背包。
联机时客户端捡掉落物发 PickupDrop,主机回 InventoryAdd;客户端自己的背包和位置不会写进房主的存档。
三种游戏模式
| 模式 | 能做什么 | 限制 |
|---|---|---|
| 创造 | 飞行、方块不限量、瞬破、无伤害。 | E 背包提示只在生存用;没有生命和掉落。 |
| 生存 | 20 点生命、36 格背包、按硬度挖掘、掉落物要捡、摔落 / 岩浆 / 生物伤害、脱战回血。 | 血量归零进入死亡界面,只能重生或回主菜单。 |
| 旁观 | 穿墙、无重力、22 格/秒,从天上观察。 | 禁止交互;退出时回到进入前的位置。 |
按 F3 + F4 循环,F4 单独切旁观;也可以用 /gamemode。生存模式 8 秒不受伤会回血;死亡界面有 Respawn 和 Quit to Menu。
昼夜、天气和界面
昼夜循环 180 秒一轮,天空色、雾色和整体亮度随时间变化;没有方块光源传播,所以夜里和洞穴里主要靠天空光。天气每 70–190 秒随机切换晴 / 雨 / 雪,下雨或下雪时屏幕上会有雨丝 / 雪点,日照强度乘 0.72。
右上角小地图 64×64 采样,按地表方块着色、按高度明暗,带朝向箭头和 N,每 0.45 秒刷新;按 M 开关。小地图只画地表颜色,不显示生物和远端玩家。
雨雪是屏幕特效,不会真的落到地面,也没有声音。按 F2 截图会把当前帧(含 HUD)写成 exe 目录的 screenshots/<ISO时间>_CaelC.png,例如 2026-10-19T08-00-44_CaelC.png。
实现细节
区块是 16³,地形按列现场生成;ChunkStreamer 每帧最多生成 3 列、入队 8 个网格、上传 8 个网格。网格在 1–4 个 worker 的线程池里生成:主线程把 18³ 带边区块(含 ±1 邻居)拷出来,worker 只读这份拷贝做面剔除和顶点 AO,结果回主线程上传,所以不需要锁。
玩家挖 / 放方块时仍同步重建周围 3×3×3 区块(主线程)。渲染距离默认 8 区块,可调 4–16;水面走单独的透明管线,每帧按距离从远到近排序绘制。流式加载、流体模拟和掉落物更新都在主循环里按帧推进。
这些数字写在 World、ChunkStreamer、Player 和 main.cpp 里;文档只描述当前版本,调参后以代码为准。
玩法上的边界
- 没有方块光源传播、火把和洞穴照明。
- 没有饥饿、合成、工具耐久、附魔和物品堆叠数量。
- 生物 AI 只有游走、追击、逃跑和受击反应;没有繁殖、作息和好感度。
- 没有 PvP;远端玩家不参与碰撞。
- 没有专用服务器,房主要一直开着游戏。