传奇游戏中攻击模式决定角色对其他玩家或怪物的攻击行为,包括和平、全体、行会、编组、红名等。服务端通过人物状态标志位控制该功能,客户端双击模式图标触发指令,服务端响应并写入角色数据。
一、攻击模式类型与对应值
服务端内部使用数字标识攻击模式,常见定义如下:
0:和平模式(不攻击任何玩家)
1:全体攻击(可攻击所有玩家)
2:行会模式(仅攻击非本行会成员)
3:编组模式(仅攻击非队伍成员)
4:红名模式(仅攻击PK值>0的玩家)
该数值存储于角色数据结构中,通常在 Hero.db 或 Account角色名.txt 的 PkMode 字段。
二、客户端触发机制
玩家点击游戏界面右上角攻击模式图标时,客户端向服务端发送固定指令包。不同引擎协议略有差异,但标准Mir2协议中为:
指令码:0x40
数据体:目标模式编号(1字节)
服务端收到后执行模式切换逻辑,并广播更新状态。
三、服务端处理逻辑配置
所有模式切换行为由 QFunction-0.txt 脚本控制。需确保脚本中存在 [@ChangePkMode] 标签。
基础切换脚本
在 MirServerMir200EnvirMapQuest_defQFunction-0.txt 末尾添加:
[@ChangePkMode]
#ACT
CHANGEPKMODE PARAM(0)
SENDMSG 6 当前攻击模式已切换为
PARAM(0):接收客户端传入的模式编号
CHANGEPKMODE:内置命令,直接修改角色PkMode值
STR(A7):系统变量,返回当前模式中文名称(如“全体攻击”)
限制条件(可选)
若需禁止某些地图切换(如安全区),加入判断:
[@ChangePkMode]
#IF
CHECKMAPAREA 0 ; 安全区编号
#ACT
SENDMSG 7 安全区无法切换攻击模式!
BREAK
#ELSEACT
CHANGEPKMODE PARAM(0)
SENDMSG 6 攻击模式已切换为
四、验证与调试
手动测试
进入游戏,点击攻击模式图标循环切换
观察系统提示是否显示正确模式名称
尝试攻击其他玩家,验证模式生效(如和平模式下无法攻击白名)
数据检查
角色下线后,打开 MirServerMir200Account角色名.txt
查找字段 PkMode=,确认数值与当前模式一致(如全体攻击应为 PkMode=1)
异常处理
若切换无反应:检查 QFunction-0.txt 是否有语法错误(如缺少 #ACT)
若模式名称显示乱码:确认服务端语言包 !Abuse.txt 中包含 A7 变量定义
若安全区仍可切换:核实 CHECKMAPAREA 参数是否匹配实际安全区编号(见 MapInfo.txt)
五、特殊引擎注意事项
Hero引擎:使用 CHANGEATTACKMODE 替代 CHANGEPKMODE,参数相同
CQGEE引擎:需在 !Setup.txt 中启用 PkModeEnable=1
XGMir引擎:支持自定义模式名称,在 EnvirPkModeName.txt 中编辑显示文本
攻击模式切换完全由服务端控制,客户端仅发送请求。确保脚本逻辑完整且角色数据路径可写,即可实现无缝切换。

