一、MOV命令基础语法与功能
MOV命令是传奇脚本核心赋值命令,格式为“MOV 变量 值”。变量类型包括S变量(字符串)、N变量(整数)、A变量(人物)、G变量(全局)、P变量(私有)等。赋值时值可为数字、字符串、变量表达式,如“MOV S5 \〖行会掌门人〗”将“〖行会掌门人〗”存入S5变量。
INC命令是MOV的补充,格式为“INC 变量 值”,功能是变量值加上指定值。对S变量使用INC命令可实现字符串追加,如“INC S5 \↘天下第一男战↙”在S5原有内容后追加“↘天下第一男战↙”。MOV与INC组合使用可构建复杂字符串。
二、原始脚本错误分析
错误根本原因:SENDMSG命令格式错误。原始代码中SENDMSG使用“%s”作为变量占位符,但传奇引擎解析时“%s”需转换为“<USERNAME>”变量。报错行显示M2无法识别“%s”格式,应修改为“<USERNAME>”。
脚本逻辑错误:多个条件判断顺序不当。原始脚本先检测行会掌门人,再检测城主保镖,然后检测沙城城主。如果玩家同时满足多个条件,后者会覆盖前者封号。应采用累计叠加方式,而非覆盖。
变量清空错误:多个#ELSEACT段落使用“MOV S5”清空变量,但无参数时引擎可能视为错误。应使用“MOV S5 ”(带空格)或“MOV S5 ”(空字符串)。部分引擎要求#ELSEACT段落必须有有效命令,空MOV可能报错。
三、SENDMSG命令正确格式
全服公告格式“SENDMSG 0 颜色 内容”,颜色代码可选,0为默认颜色。内容中可使用变量替换,如“<USERNAME>”替换为玩家名称,“<SERVERNAME>”替换为服务器名称。变量需用“<>”括起,而非“%s”格式。
时间戳显示“()”表示在消息前添加当前时间,格式为“[]”。位置在SENDMSG命令后,如“SENDMSG 0 (*)伟大的沙城城主〖<USERNAME>〗进入<SERVERNAME>!”。时间戳可选,省略时只显示消息内容。
多行消息使用“\”换行,但SENDMSG单次命令只能发送一行。需发送多条消息时,使用多个SENDMSG命令。消息长度有限制,超出部分截断,建议单条消息不超过100字符。
四、修复后完整脚本
[@封号分类]
IF
ISGUILDMASTER
ACT
MOV S5 \〖行会掌门人〗
ELSEACT
MOV S5
IF
ISCASTLEGUILD
ACT
INC S5 \〖城主保镖〗
ELSEACT
MOV S5
IF
ISCASTLEMASTER
ACT
INC S5 \〖沙城城主〗
SENDMSG 0 (*)伟大的沙城城主〖<USERNAME>〗进入<SERVERNAME>!
CHANGENAMECOLOR 253
ELSEACT
MOV S5
IF
CheckVar GLOBAL 男战名字 = <$USERNAME>
ACT
INC S5 \↘天下第一男战↙
SENDMSG 0 (*)天下第一男战〖<USERNAME>〗进入<SERVERNAME>!
IF
CheckVar GLOBAL 男法名字 = <$USERNAME>
ACT
INC S5 \↘天下第一男法↙
SENDMSG 0 (*)天下第一男法〖<USERNAME>〗进入<SERVERNAME>!
IF
CheckVar GLOBAL 男道名字 = <$USERNAME>
ACT
INC S5 \↘天下第一男道↙
SENDMSG 0 (*)天下第一男道〖<USERNAME>〗进入<SERVERNAME>!
IF
CheckVar GLOBAL 女战名字 = <$USERNAME>
ACT
INC S5 \↘天下第一女战↙
SENDMSG 0 (*)天下第一女战〖<USERNAME>〗进入<SERVERNAME>!
IF
CheckVar GLOBAL 女法名字 = <$USERNAME>
ACT
INC S5 \↘天下第一女法↙
SENDMSG 0 (*)天下第一女法〖<USERNAME>〗进入<SERVERNAME>!
IF
CheckVar GLOBAL 女道名字 = <$USERNAME>
ACT
INC S5 \↘天下第一女道↙
SENDMSG 0 (*)天下第一女道〖<USERNAME>〗进入<SERVERNAME>!
IF
CHECKRENEWLEVEL > 0
ACT
INC S5 \【荣誉勇士】
IF
EQUAL S5
ACT
MOV S5 \普通玩家
IF
NOT EQUAL S5
ACT
SETRANKLEVELNAME %s\<$STR(S5)>
break
五、修改要点详解
SENDMSG修正将所有“%s”替换为“<USERNAME>”,确保变量正确解析。颜色代码添加,如“SENDMSG 0 253 ()天下第一男战〖<USERNAME>〗进入<$SERVERNAME>!”其中253为粉色。时间戳统一使用“()”,位置在消息开头。
变量叠加逻辑使用INC命令而非MOV,保留之前封号内容。如行会掌门人又获得天下第一男战封号,显示“〖行会掌门人〗↘天下第一男战↙”。清空变量使用“MOV S5 ”确保语法正确。
条件判断优化每个#IF独立检测,避免相互干扰。检测顺序从特殊到一般,先检测行会职位,再检测天下第一,最后检测转生等级。添加默认封号,当S5为空时设置为“普通玩家”。
六、变量类型与作用域
S变量为字符串变量,S0-S99为私有变量,S100-S199为全局变量。S5在当前脚本中存储封号内容,脚本结束后释放。N变量为数字变量,用于计算和比较,如检测转生等级“CHECKRENEWLEVEL > 0”。
A变量指向人物对象,如“<$USERNAME>”为当前玩家名称变量。G变量为全局变量,跨脚本保持,如“CheckVar GLOBAL 男战名字”检测全局变量“男战名字”是否等于当前玩家名。
P变量为私有变量,当前脚本有效。M变量为怪物变量,D变量为地图变量。变量赋值时注意类型匹配,字符串用“\”开头,数字直接写。
七、条件检测命令详解
ISGUILDMASTER检测是否为行会掌门人,返回布尔值。ISCASTLEGUILD检测是否为沙巴克行会成员。ISCASTLEMASTER检测是否为沙巴克城主,最尊贵身份。
CheckVar检测变量值,格式“CheckVar 变量类型 变量名 操作符 值”。GLOBAL表示全局变量,“=”表示相等检测。变量名“男战名字”需在其他脚本中设置,如擂台赛获胜者。
CHECKRENEWLEVEL检测转生等级,>0表示已转生。转生系统需开启,等级数据从数据库读取。其他检测命令包括CHECKLEVEL(等级)、CHECKGOLD(金币)、CHECKITEM(物品)等。
八、脚本执行流程控制
break命令结束当前脚本段,防止后续代码执行。在封号设置完成后使用,避免多余操作。注意break位置,应在所有封号检测之后,封号设置之前。
IF、#ACT、#ELSEACT配对使用,每个#IF必须有对应的#ACT或#ELSEACT。#ELSEACT可省略,但建议保留确保逻辑完整。嵌套条件使用多个#IF,传奇脚本不支持#ELSEIF语法。
执行顺序从上到下,每个条件独立检测。即使前一个条件满足,后续条件仍会检测。利用此特性实现多封号叠加,每个满足条件都会追加封号。
九、封号显示与样式
SETRANKLEVELNAME设置人物封号,格式“%s\<STR(S5)>”。%s表示玩家名字,\<STR(S5)>表示封号内容,中间“\”为分隔符。封号显示在人物头顶,原名字下方。
颜色代码CHANGENAMECOLOR 253设置名字颜色,253为粉色。颜色值0-255,0为黑色,255为白色。特殊身份使用醒目颜色,如沙城城主用红色(249),天下第一用金色(253)。
封号长度限制,最长支持多少字符因引擎而异,通常不超过20个汉字。超长部分截断,建议控制封号长度。特殊符号如“〖〗”、“↘↙”、“【】”增加视觉效果。
十、全局变量设置方法
天下第一变量在擂台赛脚本中设置,获胜时执行“CALCVAR GLOBAL 男战名字 = <$USERNAME>”和“SAVEVAR GLOBAL 男战名字 ..\QuestDiary\数据文件\天下第一.txt”。变量保存到文件,服务器重启不丢失。
每日重置或定期重置,使用机器人脚本定时清空变量。如每天0点执行“CALCVAR GLOBAL 男战名字 = ”清空变量。重置后重新比赛产生新的天下第一。
多职业变量分开存储,男战名字、男法名字、男道名字、女战名字、女法名字、女道名字六个变量。检测时分别比较,玩家只可能匹配其中一个。
十一、调试技巧与错误排查
M2报错时查看具体行号和错误内容,如“第:1554 行”。用文本编辑器打开QManage.txt,跳转到对应行检查。注意行号可能因换行符差异略有偏移,查看附近代码。
注释调试在怀疑代码前后添加“SENDMSG 6 调试信息”输出到玩家聊天框。如“SENDMSG 6 进入封号分类脚本”确认脚本执行。输出变量值“SENDMSG 6 当前S5=<$STR(S5)>”查看变量状态。
分段测试将复杂脚本拆分为多个小段,逐个测试功能。先测试SENDMSG是否正确,再测试变量赋值,最后测试条件检测。使用测试角色模拟不同身份,验证封号是否正确。
十二、引擎兼容性差异
GOM引擎与HERO引擎MOV命令格式略有差异,GOM支持“MOV S5”清空,HERO可能报错。SENDMSG格式通用,但颜色代码位置可能不同,GOM颜色在消息前,HERO颜色在消息后。
变量引用方式GOM使用“<STR(S5)>”,HERO可能使用“STR(S5)”。转生检测命令GOM用“CHECKRENEWLEVEL”,HERO用“CHECKRENEWLEVEL”或“CHECKRENEW”。确认引擎版本,使用对应命令格式。
时间戳显示GOM使用“()”,HERO可能使用“[]”。文本换行符GOM使用“\”,HERO可能使用“/”。适配当前引擎,避免语法错误。
十三、性能优化建议
减少SENDMSG次数,多个条件满足时可能发送多条公告。可改为满足特殊身份才发送,如沙城城主、天下第一。普通封号如行会掌门人不发送公告,避免刷屏。
变量检测顺序优化,将最可能满足的条件放前面。如大部分玩家是普通玩家,先检测普通条件减少计算。但特殊身份如沙城城主较少,放前放后影响不大。
封号缓存机制,将计算好的封号存入私有变量,登录时直接读取。避免每次都需要重新检测所有条件。在QFunction-0.txt的[@Login]段调用封号设置,但只检测变化部分。
十四、扩展功能与自定义
多行封号支持,使用“\”换行符分割,但部分引擎只显示一行。可用小号显示第二行封号,或使用自定义界面显示。封号图标添加,使用“/”加图片编号,如“\〖行会掌门人〗/100”显示100号图标。
封号时效性,天下第一封号保留24小时,使用机器人脚本定时清除。添加时间检测“CheckVar GLOBAL 男战时间”记录获得时间,超时后清除。
封号属性加成,根据封号给予额外属性。如沙城城主增加攻击力,天下第一增加血量。在封号设置后执行“POWERRATE 攻击 100 65535”增加100%攻击力300秒。
十五、常见问题解决方案
封号不显示检查SETRANKLEVELNAME命令是否执行,S5变量是否有值。使用“SENDMSG 6 封号=<$STR(S5)>”输出查看。人物必须重登录或使用“@ReloadNpc”重载NPC才能刷新封号显示。
重复封号检测条件有重叠,如玩家同时是行会掌门人和沙城成员,可能获得两个封号。按需调整,使用“#ELSEACT”避免重复。或使用优先级,高级封号覆盖低级封号。
SENDMSG不显示检查颜色值是否有效,消息长度是否超限。使用简单消息测试“SENDMSG 0 测试消息”,逐步添加复杂内容。查看M2控制台是否有发送成功提示。
十六、脚本集成与调用
在QManage.txt的[@Login]段加入“#CALL [\封号系统\封号分类.txt] @封号分类”。将封号脚本独立为单独文件,便于管理。调用前确保玩家已登录,变量已初始化。
在QFuntion-0.txt的[@PlayOffLine]段清除封号,玩家离线时执行“SETRANKLEVELNAME %s\”。或保留封号,下次登录时重新计算。根据需求选择封号持久化方案。
机器人脚本定时检测,如每小时检测天下第一是否在线,不在线则清除封号。使用“ISONLINE <$STR(男战名字)>”检测玩家在线状态,离线后执行“CALCVAR GLOBAL 男战名字 = ”。
十七、安全与防错机制
变量清空保护,执行“MOV S5”前备份原值到S6,错误时恢复。使用“MOV S6 <STR(S5)>”备份,“MOV S5 <STR(S6)>”恢复。关键操作添加确认,避免误操作。
防刷公告,相同玩家短时间内重复登录只发送一次公告。使用“P5”变量记录上次发送时间,检测时间间隔。格式“#IF LARGE <$STR(P5)> 60”,大于60秒才发送公告。
输入验证,检测变量值是否合法,如“CheckContainsText <STR(S5)> <USERNAME>”防止封号包含玩家名。过滤敏感词汇,使用“CheckTextList ..\QuestDiary\敏感词.txt <$STR(S5)>”检测。
十八、测试用例设计
测试角色1:普通玩家,无任何特殊身份,封号应为“普通玩家”。测试角色2:行会掌门人,封号应为“〖行会掌门人〗”。测试角色3:沙城城主,封号应为“〖沙城城主〗”,公告发送,名字变粉色。
测试角色4:天下第一男战,封号应为“↘天下第一男战↙”,公告发送。测试角色5:行会掌门人+天下第一男战,封号应为“〖行会掌门人〗↘天下第一男战↙”。测试角色6:已转生玩家,封号应有“【荣誉勇士】”。
多条件组合测试,模拟各种身份组合,验证封号叠加正确性。公告发送测试,确保特殊身份登录时正确发送公告。颜色显示测试,沙城城主名字变为粉色。
十九、维护与更新日志
每次修改保存备份,文件名加日期后缀,如“封号分类_20230515.txt”。修改记录文档,记录修改内容、时间、原因。版本控制使用Git或SVN,管理脚本变更。
定期检查脚本,随着游戏更新调整封号规则。新活动添加新封号,在脚本中增加检测条件。废弃封号及时移除,避免无效检测浪费资源。
玩家反馈收集,封号显示问题、公告问题及时修复。社区交流学习,参考其他服务器优秀封号脚本。持续优化性能,减少脚本执行时间。
二十、总结与最终建议
MOV命令是传奇脚本基础,掌握MOV、INC、SENDMSG等命令组合可实现复杂功能。封号系统增强玩家荣誉感,合理设计提升游戏体验。脚本错误排查需耐心,从报错信息出发,逐步定位问题根源。
原始脚本主要错误是SENDMSG格式,将“%s”改为“<$USERNAME>”即可修复。封号叠加逻辑使用INC命令,保留之前封号内容。条件检测独立,避免相互覆盖。
测试至关重要,模拟各种角色验证脚本正确性。维护文档记录修改,便于后续更新和问题排查。掌握这些技巧,可编写出稳定高效的传奇脚本。

