跳到主要内容

联机

联机是「房主就是服务器」:房主的游戏进程负责世界、生物、掉落物、流体、时间和天气,客户端只本地模拟自己的移动、视角和粒子。没有专用服务器,也没有账号系统。

开服​

  1. 主菜单 → 多人游戏。
  2. 选一个已保存的世界,或者填名字新开一个;新世界可以填种子,留空随机。
  3. 端口默认 27632,点 Host。房主要一直开着游戏,关掉游戏就断线。
  4. 把房主的 IP 或域名告诉朋友。局域网直接给内网地址;公网要给公网 IP 或域名。

房主自己也可以正常玩。房主的玩家状态和世界会写进存档;客户端玩家的背包和位置不落盘,重连后从主机给的出生点开始。

加入​

主菜单 → 多人游戏 → 加入服务器,填地址:

联机地址格式
写法行为
192.168.1.20局域网地址,端口默认 27632。
example.com先查 _caelcraft._udp.example.com 的 SRV 记录;没有记录就用默认端口 27632。
example.com:30000显式端口,跳过 SRV。
203.0.113.5:27632公网 IPv4 + 端口。

只支持 IPv4。SRV 记录的目标和端口会覆盖默认值;如果你的域名解析到 IPv6 而主机只有 IPv4,解析会失败。

端口、防火墙和公网​

默认使用 UDP 27632。公网联机要做两件事:

  1. 在房主电脑的 Windows 防火墙里允许 CaelCraft 通过专用网络,或者手动放行 UDP 27632。
  2. 在路由器上把 UDP 27632 转发到房主电脑的内网 IP。

如果房主在运营商的大内网(CGNAT)里,路由器上看到的「公网 IP」不是真正的公网地址,端口转发不会生效;这种情况需要公网 IP、IPv6(当前不支持)或内网穿透工具。

UDP 没有 TCP 那样的握手,ping、telnet 或普通的端口扫描都测不准。先在同一个局域网里确认能连,再排查公网转发。游戏里连不上会显示具体原因。

没有密码、认证和加密:知道地址的人都能尝试加入。不要把这个端口当公网服务长期暴露;和朋友玩完就关掉游戏。

什么由房主算​

联机同步范围
内容谁负责
方块修改客户端先本地预测,再发 EditRequest;主机校验 6 格距离、目标格和玩家碰撞后用 setBlock,拒绝时回一条当前方块让客户端撤销预测。
生物主机模拟并广播快照;客户端只按 id 匹配、平滑朝向和位置。打生物发 AttackMob,主机扣血。
掉落物主机模拟重力、合并、拾取和寿命;客户端只本地推进 age / spin。捡东西发 PickupDrop,主机回 InventoryAdd。
流体主机跑 tickFluids 并广播改动;客户端应用,不自己推演。
时间 / 天气主机算,随 WorldState 同步(1Hz)。客户端不能改。
玩家每个客户端本地模拟自己的移动和视角,20Hz 发 PlayerState;主机转发给其他人。
生命客户端本地判定自己的受伤和死亡,主机不跟踪客户端血量。
背包客户端本地维护;主机的掉落物拾取结果通过 InventoryAdd 回给客户端。

连接时 Welcome 带种子和出生点;主机把 edits_ 全量按每包 64 条发过去,再发 Ready。之后主机的方块改动和流体改动会持续广播。生物 / 掉落物快照 15Hz,每个客户端只发 96 / 128 格内最近的 40 个。

协议细节​

传输是 UDP + 自带可靠通道。包头 19 字节:magic、版本、类型、flags、可靠序号、累计确认序号和 ackBits。32 位可靠序号按序交付,0.32 秒重传,最多 12 次,窗口 128。协议版本是 2,双方版本不一致会拒绝连接。

主要消息:Hello / Welcome / Ready / Reject、EditBatch / EditRequest、PlayerState、WorldState、MobSnapshot / DropSnapshot、PlayerJoined / Left、Chat、InventoryAdd、AttackMob、PickupDrop、Ping / Pong。

没有认证、加密、NAT 穿透和预测回滚。客户端移动是客户端权威的;延迟高时方块操作会等主机确认,远处玩家也不参与碰撞。

联机与模组​

模组脚本只在单机和主机执行;客户端只加载方块注册表和纹理,收到 Welcome 后关闭执行。连接时 Hello 会带模组签名(模组名 + 每个 main.lua 的哈希),两端不一致会直接拒绝。

所以联机双方要装同一套模组包,版本也要一致。只改纹理的资源包不需要两端一致(只影响本地画面),但模组注册的方块需要两端都有,否则客户端不认识那些方块。

客户端不能做的事​

联机时客户端不能执行 /time、/weather、/fill、/mobs 和 /save,这些只对房主生效。其他命令(/tp、/spawn、/give、/gamemode 等)客户端可以用,但改的是客户端自己的状态,不会同步给房主或其他人。

完整命令见 命令与方块。

现在的限制​

  • 没有专用服务器,房主必须一直开着游戏。
  • 没有密码、认证、加密、NAT 穿透和 PvP。
  • 只支持 IPv4;没有 IPv6。
  • 客户端玩家的背包和位置不存档;重连从出生点开始。
  • 远端玩家不参与碰撞;客户端移动没有预测回滚。
  • 模组两端要一致;资源包只影响本地。

连不上时先查这些​

  1. 房主的游戏还开着吗?主菜单进多人游戏后点 Host,游戏没有退出或回到主菜单。
  2. 地址和端口对吗?局域网用内网 IP,公网用公网 IP / 域名;不写端口默认 27632。
  3. 防火墙放行了吗?Windows 专用网络 + 路由器 UDP 27632 转发。
  4. 两边版本和模组一致吗?协议版本或模组签名不一致会在握手时被拒绝。
  5. 域名只写了域名?先在本地用 nslookup 看解析,再确认 SRV 记录是否指向正确的目标和端口。

更完整的排查见 故障排查 / 联机。