传奇服务端脚本逻辑完全解析

来源: 作者: 点击:
一、 脚本构成与执行顺序

传奇脚本本质是事件驱动的条件响应系统。当游戏内发生特定事件(如对话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 提前结束。

掌握变量作用域、条件嵌套与执行顺序,即可构建从简单对话到复杂活动的一切游戏逻辑。脚本编写本质是“事件监听-条件判断-执行响应”的流程控制。