传奇服务端的“代码”并非传统编程语言,而是由脚本命令与触发段组成的逻辑文本。它运行于引擎底层,控制着游戏内所有非图形逻辑,包括NPC对话、怪物爆率、技能效果及装备属性。
一、 代码文件存储架构
服务端代码按功能分散在 Mir200\Envir\ 目录下的特定文本文件中,修改后需在M2Server中重载对应模块生效。
文件路径 核心作用 典型代码内容
MapQuest_def\QManage.txt 登录触发。玩家上线自动执行,用于发放新手装、检测状态。 [@Login] 段
Market_def\QFunction-0.txt 功能中枢。处理技能触发、物品使用、死亡事件等核心逻辑。 [@Struck](攻击触发)
QuestDiary\ 下的子文件 自定义NPC。各类功能NPC的对话与任务脚本。 [@Main](NPC主界面)
MonItems\ 目录 怪物爆率。每个怪物对应一个.txt文件,定义掉落列表。 1/100 屠龙
二、 基础脚本语法结构
传奇脚本采用“标签+条件+动作”的块状结构,严格区分大小写,行首符号具有特定功能。
1. 标签段(Section)
以 [@Label] 格式定义代码块入口,引擎根据上下文跳转到对应段执行。
• [@Login]:登录时触发。
• [@GetBagItems]:捡取物品时触发。
• [@KillMon]:杀死怪物时触发。
2. 条件判断(#IF)
用于检测角色状态,只有条件满足时才会执行后续 #ACT 动作。
#IF
CHECKLEVEL 35 ;检测等级是否≥35级
CHECKITEM 金条 1 ;检测背包是否有1根金条
#ACT ;条件满足则执行
TAKE 金条 1 ;收回1根金条
GIVE 裁决之杖 1 ;给予1把裁决之杖
BREAK ;跳出当前代码块
常用检测命令:CHECKJOB(职业)、CHECKGAMEGOLD(元宝)、RANDOM(随机数)。
3. 动作执行(#ACT)
条件满足后执行的具体操作,包括资源增减、状态变更和界面交互。
#ACT
GAMEGOLD + 1000 ;增加1000元宝
MAPMOVE 0 330 330 ;传送到比奇安全区
SENDMSG 6 领取成功! ;发送屏幕中央提示
三、 核心功能代码实战
1. 登录赠送新手套装
在 QManage.txt 的 [@Login] 段中写入,利用 ISNEWHUMAN 检测新角色。
[@Login]
#IF
ISNEWHUMAN ;仅新角色触发
CHECKJOB WARRIOR ;检测是否为战士
#ACT
GIVE 木剑 1
GIVE 布衣(男) 1
GIVE 金币 5000
BREAK
2. NPC礼包兑换脚本
在 QuestDiary\ 目录下的NPC脚本中实现交互逻辑。
[@Main]
欢迎光临,是否兑换新手礼包?\
<兑换/@getgift> <离开/@exit>
[@getgift]
#IF
CHECKGAMEGOLD < 500 ;检测元宝是否少于500
#ACT
SENDMSG 6 元宝不足!
BREAK
#IF
#ACT
GAMEGOLD - 500
GIVE 圣战戒指 1
SENDMSG 0 玩家【<$USERNAME>】兑换了新手礼包!
CLOSE
3. 自定义技能触发效果
在 QFunction-0.txt 中绑定技能ID,实现特殊效果(如烈火剑法触发吸血)。
[@MagTagFunc100] ;假设100为烈火剑法技能ID
#IF
RANDOM 3 ;1/3概率触发
#ACT
HUMANHP + 50 ;恢复50点HP
SENDMSG 6 烈火剑意触发,吸取生命值!
四、 变量与计时器高级应用
实现复杂的活动或状态记忆需使用变量和计时器。
1. 个人字符变量(S变量)
用于标记玩家状态,如是否已领取首充。
#IF
EQUAL S10 已领 ;检测S10变量是否为“已领”
#ACT
SENDMSG 6 你已经领过了!
BREAK
#IF
#ACT
GIVE 屠龙 1
MOV S10 已领 ;设置S10变量为“已领”
2. 定时器(Timer)
实现持续状态或延时任务,如在线泡点。
[@Login]
#ACT
SetOnTimer 1 1 ;开启1号计时器,每秒触发一次
[@OnTimer1]
#IF
CHECKMAP 3 ;检测是否在土城地图
#ACT
CHANGEEXP + 1000 ;每秒增加1000经验
五、 代码调试与常见错误
• 编码问题:脚本文件必须保存为 ANSI 编码,UTF-8会导致中文乱码或引擎无法解析。
• 符号错误:脚本中必须使用英文半角符号(如 " " 而非 “ ”),#IF、#ACT 前不能有空格。
• 生效方式:修改脚本后,在M2Server界面点击“控制” → “重新加载” → “QF脚本”或“QM脚本”即可生效,无需重启服务端。
• 逻辑穿透:每个条件块结尾务必加 BREAK,否则会继续执行下一个 #IF 段,导致逻辑错乱。
掌握这些基础代码结构后,即可通过组合条件与动作,实现从简单的NPC商店到复杂的全服活动系统。建议从修改现有脚本入手,逐步理解变量传递与事件触发的机制。

