脚本报错直指D:MirServerMir200EnvirMapQuest_defQManage.txt文件的第1554至1574行,错误命令均为SENDMSG。用户确认QMange.txt主文件无误,问题核心锁定在“封号分类”这段独立脚本的逻辑结构与变量传递机制上。引擎解析器在处理连续的条件判断(#IF)与动作执行(#ACT)时,因作用域混淆、变量未初始化或格式符号非法导致指令失效。
首要错误在于变量s5的生命周期与赋值逻辑。脚本开头多次使用“MOV s5 〖行会掌门人〗”等指令试图给变量s5赋值。在多数传奇引擎(如GOM、GEE)中,MOV命令用于数值移动,若s5被定义为整数型变量(通常用于计数或ID),直接写入包含特殊符号“〖〗”的字符串会导致类型不匹配报错。即使s5是字符串变量,连续的#IF #ELSEACT结构若未正确闭合,会导致后续SENDMSG命令读取到的s5为空值或乱码,进而使格式化字符串“〖%s〗”解析失败。SENDMSG命令要求所有占位符必须有合法对应的变量值,否则直接抛出脚本错误。
其次,条件判断语句“CheckVar GLOBAL 男法名字 = ”存在逻辑陷阱。GLOBAL全局变量通常在玩家登录时由登录脚本(Login.txt)写入,若该变量未在数据库中预先定义或当前会话未成功写入,CheckVar判断结果可能异常。更关键的是,每个#IF块后的#ACT分支中使用了“INC s5 ↘天下第一男战↙”。INC命令意为“加1”,其后应跟数值,而非字符串。试图将字符串“↘天下第一男战↙”作为增量加到变量s5上,这是严重的语法错误。引擎无法执行“数字+字符串”的操作,导致该行及后续依赖s5变量的SENDMSG命令全部崩溃。正确的做法应是使用MOV命令直接覆盖字符串,或使用专门的字符串赋值命令,而非INC。
第三,特殊符号编码问题。脚本中大量使用的“〖〗”、“↘↙”、“【】”等特殊符号,若脚本文件编码格式不是ANSI(GBK),或者引擎内核不支持直接在这些符号内进行变量替换,会导致解析器识别错误。特别是在SENDMSG命令中,括号内的内容被视为消息体,若内部包含未转义的百分号或格式控制符,会干扰引擎对“%s”占位符的识别。建议将特殊符号移至变量赋值外部,或在发送消息时拼接字符串,避免在SENDMSG参数内部直接进行复杂格式化。
第四,脚本结构嵌套混乱。观察代码片段,多个#IF语句连续排列,但缺乏明确的段落分隔或大括号包裹(视引擎版本而定)。在某些引擎逻辑中,前一个#IF的#ELSEACT分支若未正确终止,会“穿透”到下一个#IF判断中,造成逻辑互斥失效。例如,当玩家既是行会掌门人又是沙城城主时,脚本执行流可能同时进入两个分支,导致变量s5被反复重写或状态不确定。应在每个独立的逻辑块结束后,使用RETURN或明确的跳转标签切断执行流,确保每次只执行一个封号赋值逻辑。
针对SENDMSG报错的具体修复方案:
修正赋值命令:将所有“INC s5 字符串”改为“MOV s5 字符串”。确保变量s5被正确定义为字符串类型(若引擎支持类型声明),或直接使用引擎专用的字符串变量(如S0-S99)。
分离赋值与发送:不要在一个动作行内完成赋值并立即发送。先执行MOV s5 "封号内容",换行后再执行SENDMSG 0 (*)封号描述〖%s〗进入!。确保s5在发送前已稳定存储数据。
检查变量存在性:在SENDMSG之前,增加判断“#IF EQUAL s5 0”或“#IF STRCOMPARE s5 ""”,若变量为空则跳过发送或赋予默认值,防止空指针异常。
简化消息格式:测试时将SENDMSG内容简化为纯文本,如“SENDMSG 0 测试消息”,若不再报错,则证实是特殊符号或占位符引起。逐步添加符号,定位具体哪个字符引发解析错误。
验证全局变量:确认登录脚本中确实写入了“男法名字”等全局变量。可在测试账号登录时,通过M2日志查看变量写入记录,或使用游戏内命令查询变量值是否为空。
关于“封号错了”的推断:用户认为QMange.txt无误,问题出在封号脚本。实际上,这段封号逻辑本身就是QMange.txt的一部分(或被其调用)。报错行号1554-1574正是这段逻辑中的SENDMSG行。因此,并非封号分类概念错误,而是实现该分类的代码写法违反了引擎语法规则。特别是INC命令误用于字符串赋值,是导致后续连锁报错的根源。
此外,注意“”的使用。在最后一行“SETRANKLEVELNAME %s”中,试图将s5转换为字符串。若s5本身已是字符串变量,此转换多余且可能出错;若s5是数值,需确认引擎是否支持将含特殊符号的数值直接转为字符串显示。建议统一变量类型,全程使用字符串变量处理封号文本。
最后,检查M2Server.ini中的脚本设置。部分引擎需在M2选项中开启“允许脚本使用特殊字符”或“支持复杂变量替换”功能。若未开启,即便语法正确也会报错。同时,确保MapQuest_def目录权限正常,文件未被只读锁定。
综上,修复重点在于纠正INC命令的错误用法,规范变量赋值流程,隔离特殊符号干扰,并确保全局变量有效传递。按此调整脚本逻辑,即可消除SENDMSG报错,实现动态封号显示功能。
传奇脚本SENDMSG报错修复与变量逻辑冲突深度排查
来源:
作者:
点击:

