脚本编写基础:环境与核心语法
传奇脚本本质是纯文本文件(.txt),无需复杂开发环境,使用记事本或Notepad++即可编写。脚本逻辑基于 “条件判断→执行动作”(IF-ACT)结构,需放置在服务端 Mir200\Envir 目录下(如 Market_Def 对应NPC,QuestDiary 对应任务脚本)。
核心指令与基础结构
脚本由标签(Label)、条件判断(#IF)、执行动作(#ACT)三部分组成。常用指令如下:
- #IF:条件判断开始。其后接检测命令,如 CHECKLEVELEX > 35(等级检测)、CHECKGOLD 10000(金币检测)。
- #ACT:条件成立时执行的动作。如 GIVE 屠龙 1(给物品)、MAPMOVE 3 330 268(传送)。
- #SAY:显示对话文字。用于NPC与玩家交互。
• BREAK:终止当前脚本段,防止代码继续向下执行导致逻辑错乱。
基础结构模板:
[@Main]
#IF
CHECKLEVELEX > 30
CHECKGOLD 5000
#ACT
TAKE 金币 5000
GIVE 裁决之杖 1
SENDMSG 6 兑换成功!
BREAK
#ELSEACT
SENDMSG 6 条件不足!
此脚本含义:若玩家等级大于30且拥有5000金币,则扣除金币并给予裁决之杖;否则提示条件不足。
实战案例:编写一个传送NPC
以“盟重省老兵”传送功能为例,演示完整NPC制作流程。
1. 创建NPC配置文件
在 Merchant.txt(位于 Envir 目录)中注册NPC。添加一行:
盟重省 3 330 268 老兵 0 8 0 0
参数说明:盟重省为地图名,3 330 268为坐标,老兵为名称,0为形象,8为功能码(8代表可对话)。
2. 编写NPC脚本文件
在 Market_Def 目录下创建 盟重省-老兵.txt 文件,写入以下内容:
[@Main]
#SAY
欢迎来到盟重省,我可以送你前往练级地图。\ \
<前往石墓阵/@go_shigu> <前往祖玛寺庙/@go_zuma>\ \
<关闭/@exit>
[@go_shigu]
#IF
CHECKGOLD 1000
#ACT
TAKE 金币 1000
MAPMOVE D717 100 100
SENDMSG 6 已传送至石墓阵,消耗1000金币。
BREAK
#ELSEACT
SENDMSG 6 金币不足1000,无法传送!
BREAK
[@go_zuma]
#IF
CHECKLEVELEX > 25
#ACT
MAPMOVE 0159 50 50
SENDMSG 6 已传送至祖玛寺庙。
BREAK
#ELSEACT
SENDMSG 6 等级不足25级!
BREAK
逻辑解析:
• [@Main]:NPC主界面,显示对话和两个传送选项按钮。
• @go_shigu:点击“前往石墓阵”触发的标签。先检测金币,足够则扣钱传送。
- @go_zuma:点击“前往祖玛寺庙”触发的标签。检测等级,达标则直接传送。
- \ \ 用于换行,<关闭/@exit> 为关闭按钮。
3. 重载脚本生效
保存文件后,在游戏M2控制器(M2Server)中点击 “重新加载NPC”(或Reload Npc),NPC即可生效。无需重启整个服务端。
进阶功能:QFunction-0.txt 系统触发脚本
QFunction-0.txt 是服务端的“总控脚本”,用于处理非NPC触发的全局事件(如升级、死亡、使用物品)。
1. 升级触发送装备
在 QFunction-0.txt 中添加以下代码,实现玩家升级到35级自动送装备:
[@PlayLevelUp]
#IF
CHECKLEVELEX = 35
#ACT
GIVE 骨玉权杖 1
GIVE 恶魔长袍(男) 1
SENDMSG 0 恭喜玩家【<$USERNAME>】达到35级,获得法师终极套装!
BREAK
[@PlayLevelUp] 是引擎内置的升级触发标签,无需NPC点击,升级瞬间自动执行。
2. 物品使用触发技能
实现双击“经验卷轴”增加经验值:
1. 在数据库 StdItems.DB 中,将该卷轴的 StdMode 设为 31(触发类物品),AniCount 设为 1(触发编号)。
2. 在 QFunction-0.txt 中添加:
[@StdModeFunc1]
#ACT
CHANGEEXP + 500000
SENDMSG 6 使用经验卷轴,获得50万经验!
BREAK
[@StdModeFunc1] 中的“1”需与数据库中的 AniCount 编号对应。
调试技巧与常见错误
• M2报错:脚本语法错误(如缺少空格、标签重复)会导致M2Server启动失败或报错。务必检查命令格式,确保 #IF 和 #ACT 配对。
• 路径错误:NPC脚本文件名必须与 Merchant.txt 中的登记名严格一致(格式:地图名-NPC名.txt)。
• 变量冲突:避免在全局脚本(QFunction-0)中滥用全局变量,防止多个玩家数据串线。建议使用 HUMAN(个人变量)或 GLOBAL(全局变量)时加上玩家名标识。
掌握 IF-ACT 逻辑后,结合 CHECK 系列检测命令和 GIVE、MAPMOVE 等执行命令,即可编写出传送、兑换、任务等绝大多数游戏功能脚本。

