一、 脚本构成与执行顺序
传奇脚本本质是事件驱动的条件响应系统。当游戏内发生特定事件(如对话NPC、击杀怪物、穿戴装备)时,引擎会查找并执行对应的脚本段。所有脚本均位于 MirServer\Mir200\Envir\ 目录下,按功能分为四类:
• 对话脚本 (Market_Def\):NPC对话与功能交互。
• 触发脚本 (MapQuest.txt, QFunction-0.txt):响应攻击、拾取、死亡等事件。
• 机器人脚本 (Robot_def\):系统定时自动执行任务。
• 任务脚本 (QuestDiary\):复杂任务链与变量存储。
脚本按 NPC对话 → 地图触发 → 全局触发 → 机器人 的优先级顺序执行,后触发的脚本可覆盖前序效果。
二、 核心命令分类与功能
1. 条件检测命令
• #IF:开启条件检测,后接判断语句。
• CHECKITEM:检测背包物品(CHECKITEM 金币 1000)。
• CHECKLEVEL:检测人物等级(CHECKLEVEL > 40)。
• EQUAL / LARGE:变量比较(EQUAL <$STR(S0)> 1)。
• RANDOM:概率检测(RANDOM 5 表示5%概率通过)。
2. 执行动作命令
• #ACT:条件满足时执行的动作块。
• GIVE:给予物品(GIVE 屠龙 1)。
• TAKE:拿走物品(TAKE 金币 1000)。
• MAPMOVE:传送地图(MAPMOVE 3 330 330)。
• SENDMSG:发送消息(SENDMSG 6 消息内容)。
3. 变量操作命令
• SET:设置变量(SET [100] 1 设置个人变量100为1)。
• CALCVAR:计算变量(CALCVAR HUMAN N1 + 1)。
• CHECKVAR:检测变量(CHECKVAR HUMAN N1 > 5)。
• MOV:赋值(MOV S0 测试字符串)。
4. 流程控制命令
• GOTO:跳转标签(GOTO @功能1)。
• #SAY:NPC对话显示。
• #ELSESAY:条件不满足时显示。
三、 脚本执行流与嵌套逻辑
脚本遵循 “检测 → 执行 → 跳转” 的线性流程,但可通过嵌套实现复杂逻辑。
基础对话脚本结构
[@Main] ; 主标签
#SAY
欢迎来到盟重土城。\
<查看装备/@查看> <购买药品/@购买>\
<离开/@exit>
[@查看]
#IF
CHECKITEM 屠龙 1
#ACT
SENDMSG 6 你拥有一把屠龙刀。
#ELSESAY
你还没有屠龙刀。
[@购买]
#ACT
GOTO @药品列表
条件嵌套示例
[@进入副本]
#IF
CHECKLEVEL > 35 ; 条件1:等级>35
CHECKITEM 凭证 1 ; 条件2:拥有凭证
CHECKGAMEGOLD > 99 ; 条件3:元宝>99
#ACT
TAKE 凭证 1
GAMEGOLD - 100
MAPMOVE FB01 50 50
SENDMSG 6 进入副本成功!
#ELSESAY
条件不足:需等级35以上、持有凭证、消耗100元宝。
四、 变量系统深度解析
变量是脚本实现动态功能的核心,分为四类:
1. 个人变量 (P0-P999, A0-A999)
• 作用域:角色私有,随角色保存。
• 用途:记录任务进度、个人状态。
• 示例:SET [100] 1 记录“已完成任务1”。
2. 全局变量 (G0-G999)
• 作用域:全服共享,所有玩家读写同一变量。
• 用途:全服活动开关、世界状态。
• 示例:CALCVAR G10 + 1 记录“全服击杀BOSS次数”。
3. 字符串变量 (S0-S99)
• 作用域:临时存储字符串。
• 用途:存储名字、消息。
• 示例:MOV S0 <$USERNAME> 保存当前玩家名。
4. 自定义变量 (HUMAN)
• 作用域:角色私有,可保存到文件。
• 用途:复杂数据存储。
• 示例:CALCVAR HUMAN 充值点数 + 100 记录充值额度。
变量生命周期
• 临时变量(P、S):本次登录有效,小退清零。
• 永久变量(G、自定义HUMAN):服务器重启后仍存在(需配合SAVEVAR命令保存到文件)。
五、 实战:编写自动日常任务脚本
以下脚本实现“每日击杀10只怪物,领取奖励”的全流程。
1. 登录初始化(QManage.txt)
[@Login]
; 每日重置任务计数
#IF
EQUAL <$DATETIME> <$HUMAN(日常日期)>
#ACT
; 日期相同,不清零
#ELSESAY
; 日期不同,重置计数
CALCVAR HUMAN 日常计数 = 0
SAVEVAR HUMAN 日常计数 ..\QuestDiary\日常任务\计数.txt
MOV S0 <$DATETIME>
SAVEVAR HUMAN 日常日期 ..\QuestDiary\日常任务\日期.txt
2. 击杀计数(QFunction-0.txt)
[@KillMon]
#IF
EQUAL <$CURRRACE> 0 ; 目标为怪物
LARGE <$HUMAN(日常计数)> 9 ; 已杀满10只
#ACT
SENDMSG 6 今日任务已完成,请返回领取奖励!
#ELSESAY
#ACT
CALCVAR HUMAN 日常计数 + 1
SAVEVAR HUMAN 日常计数 ..\QuestDiary\日常任务\计数.txt
SENDMSG 6 今日进度:<$HUMAN(日常计数)>/10
3. NPC领奖(Market_Def\日常任务.txt)
[@Main]
#SAY
今日击杀进度:<$HUMAN(日常计数)>/10\
<领取奖励/@领取>
[@领取]
#IF
LARGE <$HUMAN(日常计数)> 9
#ACT
CALCVAR HUMAN 日常计数 = 0
GIVE 金币 100000
SENDMSG 6 奖励10万金币已发放!
#ELSESAY
进度不足,请继续努力。
六、 调试技巧与效率优化
1. 语法检查:使用专业工具(如“传奇脚本编辑器”)检查括号匹配、命令拼写。
2. 日志输出:在关键节点用 SENDMSG 6 输出变量值,或用 SystemMsg 记录到服务端日志。
3. 避免死循环:慎用 GOTO 跳转回自身,需设置跳出条件。
4. 性能优化:高频触发脚本(如 [@Attack])中避免全服广播、复杂计算,用 RETURN 提前结束。
掌握变量作用域、条件嵌套与执行顺序,即可构建从简单对话到复杂活动的一切游戏逻辑。脚本编写本质是“事件监听-条件判断-执行响应”的流程控制。

