完美世界 180 端副本单人化教程
一、先确定目标模式
模式 A:允许单人进入,同时保留组队进入
这是最常用、风险最低的方案。
需要修改:
tasks.data中的入口任务。- 如果入口不是任务,则检查 NPC 传送服务。
- 一般不修改
gs.conf。
模式 B:每个玩家创建独立副本
需要修改:
tasks.data,解除组队要求。gs.conf,设置owner_mode=single。- 可以保留多人容量,但进入者不会共享同一个队伍副本。
模式 C:强制严格单人副本
需要修改:
tasks.data,解除组队要求并要求玩家不在队伍。gs.conf,设置单人所有权和最大一人。- 必要时修改 NPC 入口服务。
推荐先实现模式 A,确认副本可以单人进入后,再决定是否改成模式 B 或 C。
二、查找副本编号
先确定副本对应的实例别名,例如:
is05
is38
is61
is93
可以在以下位置查询:
- NPC 编辑器中的地图列表。
- 任务编辑器中的完成方式、传送目标或 WorldTag。
instance_cn.txt地图中文对照表。- 服务端
/PWServer/gamed/gs.conf。 - 当前项目的地图与副本目录文档。
在服务器中查找:
grep -n '^\[Instance_isXX\]' /PWServer/gamed/gs.conf
将 isXX 换成真实副本编号。
如果找到多个同名配置段,暂时不要直接修改,要先确认实际生效段,避免只修改了重复配置中的一处。
三、备份文件
在服务器执行:
mkdir -p /PWServer/backups/solo-instance
cp -a /PWServer/gamed/gs.conf \
/PWServer/backups/solo-instance/gs.conf.before-solo
cp -a /PWServer/gamed/config/tasks.data \
/PWServer/backups/solo-instance/tasks.data.before-solo
如果还要修改 elements.data:
cp -a /PWServer/gamed/config/elements.data \
/PWServer/backups/solo-instance/elements.data.before-solo
客户端同样备份:
KHD_3840\element\data\tasks.data
KHD_3840\element\data\elements.data
四、修改入口任务
使用当前项目中的任务编辑器打开:
/PWServer/gamed/config/tasks.data
实际操作时先把文件下载到 Windows 本地,不要直接远程编辑二进制文件。
1. 定位入口任务
可以通过以下方式寻找:
- 搜索副本名称。
- 搜索 NPC 对话中显示的任务名称。
- 搜索副本入口任务 ID。
- 在 EL 编辑器的
NPC_TASK_IN_SERVICE中查看入口 NPC 关联的任务 ID。 - 根据完成方式中的传送地图或 WorldTag 定位。
找到后同时检查父任务和子任务,因为组队条件可能设置在父节点。
2. 设置为“允许单人,也允许组队”
在任务编辑器的“队伍与共享”区域设置:
要求组队:关闭
全队成功:关闭
队伍成员条件:全部清空
成员距离:0
要求不在队伍中:关闭
对应底层字段:
m_bTeamwork = false
m_bAllSucc = false
m_TeamMemsWanted = 空
m_ulTeamMemsWanted = 0
m_bPremNotInTeam = false
这样单人可以接取任务,组队玩家通常也可以进入。
3. 设置为“强制玩家单独进入”
在上面设置的基础上启用:
要求不在队伍中:开启
对应:
m_bPremNotInTeam = true
m_bShowByNotInTeam 主要控制限制提示的显示,不是核心校验字段。
4. 保存并校验
保存后必须确认:
- 文件仍为当前 180 端的任务版本 198。
- 任务数量没有异常变化。
- 队伍成员条件计数为 0。
- 没有出现截断、字段错位或任务树断链。
- 保存后的文件可以重新打开。
五、修改 gs.conf
只有需要“独立副本”或“严格一人”时才修改。
找到对应配置:
[Instance_isXX]
index = ...
tag = ...
base_path = aXX/
1. 每个玩家独立副本
加入或修改:
owner_mode = single
这会让副本实例按角色而不是按队伍分配。
2. 严格限制每个实例一人
再修改:
player_per_instance = 1
完整示例:
[Instance_isXX]
index = 78
tag = 138
base_path = a38/
owner_mode = single
player_per_instance = 1
instance_capacity = 300
player_capacity = 3000
npc_count = 131072
matter_count = 131072
pool_threshold_low = 10
pool_threshold_high = 20
cid = 0,2,13
idle_time = 300
不要随意修改:
index
tag
base_path
cid
instance_capacity
listen_addr
save_point
其中 player_per_instance=1 只控制容量,不能解除任务中的“必须组队”条件。
当前项目中的 is38 和 is93 已经采用:
owner_mode=single
player_per_instance=1
可以作为参考。
六、检查 NPC 或传送服务
如果任务中已经关闭“要求组队”,游戏仍提示必须组队,说明入口可能不是普通任务控制。
使用 EL 编辑器检查入口 NPC,重点关注:
NPC_TASK_IN_SERVICE
NPC_TASK_OUT_SERVICE
NPC_TRANSMIT_SERVICE
需要确认:
- 入口服务关联的任务 ID。
- 目标地图 Tag。
- 目标坐标。
- 等级、转生、境界和物品要求。
- 是否存在其他入口任务。
- 是否由活动控制器或 Lua 脚本控制。
如果入口是点击传送石直接进入,通常更应该检查传送服务,而不是只改任务。
不要直接删除 faction_team_instance 等世界限制。该参数用于特殊帮派或团队副本,盲目删除可能破坏副本匹配、重进和实例 Key。
七、同步客户端和服务端
只修改了 gs.conf
只上传服务端:
/PWServer/gamed/gs.conf
修改了 tasks.data
必须同步:
服务端:
/PWServer/gamed/config/tasks.data
客户端:
KHD_3840\element\data\tasks.data
修改了 elements.data
同样必须同步:
服务端:
/PWServer/gamed/config/elements.data
客户端:
KHD_3840\element\data\elements.data
客户端和服务端数据不一致可能出现:
- 入口显示与服务端校验不一致。
- 任务无法接取。
- 进入后立即断开。
- 客户端显示任务但服务端拒绝。
- GS 启动失败。
八、重启与验证
修改 tasks.data、elements.data 或 gs.conf 后,建议完整重启:
pw restart
查看状态:
pw status
如果目标副本不是默认常驻地图,需要启动对应实例:
pw instance-start isXX
查看副本日志:
tail -n 200 /PWServer/logs/gs-isXX.log
重点检查:
initialization failed
key mismatch
player count exceed
invalid instance
task error
world tag error
九、测试清单
修改完成后至少验证:
- 玩家不组队时可以进入。
- 入口任务可以正常接取和完成。
- 进入后不会立即被踢出。
- 死亡后复活点正常。
- 退出副本后返回坐标正常。
- 副本重置正常。
- 第二名玩家进入时:
- 模式 A:可以进入或组队进入。
- 模式 B:进入自己的独立实例。
- 模式 C:被限制,不能进入同一实例。
- 重新登录后可以正常重进或退出。
- GS 日志中没有实例 Key 不匹配。
- 客户端任务显示与服务端一致。
十、回滚方法
如果出现异常:
cp -a /PWServer/backups/solo-instance/gs.conf.before-solo \
/PWServer/gamed/gs.conf
cp -a /PWServer/backups/solo-instance/tasks.data.before-solo \
/PWServer/gamed/config/tasks.data
pw restart
同时恢复客户端原来的 tasks.data 和 elements.data。
最终建议
如果只是希望老副本可以一个人刷,优先只修改入口任务:
关闭“要求组队”
清空队伍成员条件
不启用“要求不在队伍中”
只有希望每名玩家拥有完全独立的副本空间时,再增加:
owner_mode=single
只有希望副本内绝对不能出现第二名玩家时,才增加:
player_per_instance=1
