dst饥荒联机版洞穴连接问题:洞口被堵住问题(不回主世界档热修复)——DST 专用服务器洞穴修复(解决洞穴入口被木板堵上)

起因

玩着玩着发现洞口一直是堵上的。

翻日志看到所有 cave_entrance 的 worldmigrator 组件状态都是 enabled: false。原因很简单:之前某次启动时,我只启动了 Master(主世界),迟迟没有启动 Caves(洞穴世界)。Master 生成洞口后等不到 Caves 连接,超时后就把 portal 永久禁用了。这个状态被写进了存档,之后无论怎么重启,洞口都打不开。


关键资料

在 Klei 官方论坛找到了开发者 Ipsquiggle 的帖子:

《Understanding Shards and Migration Portals》
https://forums.kleientertainment.com/forums/topic/59174-understanding-shards-and-migration-portals/

这篇帖子解释了 DST 分片(shard)通信的底层机制:

  • 每个世界是一个独立的服务进程
  • Master 和 Caves 之间通过 cluster_key 握手,通过 10888 端口内部通信
  • 洞口(cave_entrance / cave_exit)上的 worldmigrator 组件负责传送
  • SetDestinationWorld(shard_id, true) 可以手动绑定洞口到目标世界
  • cluster_key 必须在每个 server.ini[SHARD] 段都写上,光写在 cluster.ini 不够

跟着ai修了两天发现不如自己去找有用的消息。

最后解决的还是十多年前的帖子

探索过程

最初尝试用ai在 mod 里批量修复,但 DST 的 server 环境里 pcall 不存在,SetEnabled 方法也不可用。后来在 mod 里加 GetDebugString() 打印每个 portal 的状态,确认 10 个洞口全部 enabled: false

也尝试了 Nuke1 的 Shard Configuration Mod(workshop-595764362),但它只对新建 portal 生效,无法修复已持久化的 disabled 状态。而且按官方说明,两个世界的集群根本不需要这个 mod。
直到找到一个命令:

SetDestinationWorld("2", true)

true 是"关闭自动链接、写入持久化",false 才是"启用自动链接"。
在只有主世界和洞穴的普通服务器下应该用false而不是ai或者某些帖子说的用true
只有在2+以上多个世界相连接才需要设置为true手动连接,详见那个帖子。


最终方案

1. 给自己管理员权限

在服务器 cluster 目录下创建 adminlist.txt,写入自己的 Klei User ID(日志里 KU_ 开头的那串)。重启服务器生效。

2. 修复洞口

注意:在专用服务器上,c_find("cave_entrance"):Remove() 会失效。必须用鼠标指到目标实体,用 c_select() 操作。
~打开控制台

-- 鼠标悬停在堵住的洞口上
c_select():Remove()

-- 鼠标位置生成新洞口
c_spawn("cave_entrance")

-- 绑定到洞穴世界(false = 启用自动链接),c_find命令是找最近的"cave_entrance对象"
c_find("cave_entrance").components.worldmigrator:SetDestinationWorld("2", false)

然后敲开洞口的石头就能看到打开的洞口,直接就可以下去(热修复)

如果像我一样多个洞口已经处于敲开状态,跳转到下一个,逐个修复:

c_gonext("cave_entrance_open")

重复以上步骤,逐个修复。然后save

-- 使用此命令保存修复
c_save()

所有洞口 active,可以正常下洞。


给agent看的,如果你在利用agent部署:

附带修复的配置问题

在排查过程中还顺便修复了几个配置文件的问题:

  1. cluster_key 必须在每个 server.ini[SHARD] 段都写,光写在 cluster.ini 不够。缺失会导致 Caves 日志反复刷 MasterBind: (null),Master 拒绝连接。

  2. cluster.ini[SHARD] 段不要写 bind_ip,删掉。

  3. server.ini 里删掉 authentication_portmaster_server_port,让引擎随机分配,避免端口冲突。

  4. 启动顺序:Master 先启动,等到日志出现 Sim paused,再启动 Caves。否则 Master 先跑完了 Caves 还没连上,又会把洞口锁死。


总结

如果你也遇到洞穴被堵住的情况:

  1. 给自己 admin 权限
  2. c_select():Remove() 移除鼠标指的洞口
  3. c_spawn("cave_entrance") 原地创建一个新洞口
  4. c_find("cave_entrance").components.worldmigrator:SetDestinationWorld("2", false) 绑定到洞穴世界
  5. 敲开,下去

就这么简单。花了我十几个小时。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐