传奇脚本入门:从零看懂NPC脚本结构

来源: 作者: 点击:
传奇脚本不是一门编程语言,而是一堆“标签+条件+动作”的文本规则。引擎按玩家点击的按钮跳转到对应标签,从上往下读,遇到满足条件的就执行动作。搞懂这个模型,你就能看懂任何NPC脚本,也能自己改。

一、脚本文件在哪
服务端目录下常见路径:
• Mir200\Envir\Market_Def\ 放NPC对话脚本

• Mir200\Envir\Market_Sell\ 放商店NPC脚本

• Mir200\Envir\QuestDiary\ 放任务、功能脚本

• Mir200\Envir\MapQuest_def\ 放地图触发、QFunction

NPC要显示在游戏里,得在 Merchant.txt 里登记,指定NPC名字、地图、坐标、脚本文件名。

二、脚本最小结构
一个NPC文件长这样:

[@main]
欢迎光临\
<买药/@buy> <卖装备/@sell> <离开/@exit>\

[@buy]
IF

CHECKGOLD 100
ACT

TAKE 金币 100
GIVE 金创药 1
SENDMSG 6 购买成功
BREAK
ELSEACT

SENDMSG 6 金币不足
BREAK

[@sell]
IF

CHECKITEM 屠龙 1
ACT

TAKE 屠龙 1
GIVE 金币 500000
SENDMSG 6 卖出成功
BREAK
ELSEACT

SENDMSG 6 你没有屠龙
BREAK

[@exit]
ACT

CLOSE
BREAK

拆开看:
• [@main] 是默认入口,玩家点NPC先执行这里

• <买药/@buy> 是按钮,玩家点击后跳转到 [@buy]

• #IF 下面写检测条件,满足才往下走

• #ACT 下面写执行动作

• #ELSEACT 是条件不满足时执行的动作

• BREAK 是结束,防止继续往下执行

• \ 是换行

三、标签的三种写法
[@main] 普通标签,玩家点击按钮跳转过来
[@Login] 玩家登录时自动触发,不用点
[@KillMon] 玩家杀怪时自动触发,不用点

标签名自己起,但不能重复。跳转用 <文字/@标签名> 或 GOTO @标签名。

四、#IF 和 #ACT 的区别
IF 下面只能放检测命令,比如:

CHECKGOLD 100
CHECKITEM 屠龙 1
CHECKLEVELEX 35
CHECKMAPNAME 015
ISADMIN
EQUAL N1 5
LARGE N1 10

ACT 下面只能放执行命令,比如:

TAKE 金币 100
GIVE 屠龙 1
CHANGEEXP + 1000
MAPMOVE 015 50 50
SENDMSG 6 提示文字
MOV N1 5
INC N1 1
BREAK

检测命令放错位置,脚本直接报错或不生效。

五、变量:脚本的记性
变量就是存数字或文字的盒子,用 <$STR(变量名)> 显示出来。

数字变量:
N1、N2、D0、D1、U1、G1
• N 系列:玩家私有数字变量

• D 系列:临时数字变量,小退可能清空

• U 系列:玩家私有可保存变量

• G 系列:全局变量,全服共享

字符变量:
S1、S0、A1
存文字,比如玩家名字、地图名。

赋值:
MOV N1 5 把5存进N1
MOV S1 你好 把“你好”存进S1
INC N1 1 N1加1
DEC N1 1 N1减1
MUL N1 2 N1乘2

显示:
SENDMSG 6 当前等级:<$STR(N1)>
SENDMSG 6 玩家名:<$USERNAME>

六、常用检测命令
CHECKGOLD 1000 检查金币是否≥1000
CHECKITEM 屠龙 1 检查是否有1把屠龙
CHECKLEVELEX 35 检查等级是否≥35
CHECKMAPNAME 015 检查是否在015地图
CHECKMONMAP 015 0 检查015地图怪物数量是否为0
EQUAL N1 5 检查N1是否等于5
LARGE N1 5 检查N1是否大于5
SMALL N1 5 检查N1是否小于5
ISADMIN 检查是否管理员
RANDOM 3 1/3概率通过

七、常用执行命令
GIVE 屠龙 1 给物品
TAKE 屠龙 1 收物品
GAMEGOLD + 100 加元宝
CHANGEEXP + 1000 加经验
MAPMOVE 015 50 50 传送
SENDMSG 6 文字 玩家自己看提示
SENDMSG 0 文字 全服广播
BREAK 结束
GOTO @标签 跳转
CLOSE 关闭NPC窗口
MOV N1 5 赋值
INC N1 1 加1
SET [001] 1 设置标志位

八、标志位:简单的是非开关
SET [001] 1 把标志001设为开
SET [001] 0 把标志001设为关
CHECK [001] 1 检查标志001是否开
CHECK [001] 0 检查标志001是否关

用于“是否接过任务”“是否领过奖励”这种二选一状态。

九、NPC按钮写法
<显示文字/@跳转标签>
<买药/@buy>
<传送到祖玛/@go_zuma>

按钮可以带参数:
<输入数字/@@InPutInteger1>
<输入文字/@@InPutString1>

输入后跳转到:
[@InPutInteger1]
ACT

MOV N1 <$STR(M0)>
SENDMSG 6 你输入的数字是:<$STR(N1)>

M0 是引擎存输入值的临时变量。

十、条件分支的完整写法
[@main]
IF

CHECKLEVELEX 35
ACT

SENDMSG 6 你等级够了
GOTO @高级功能
BREAK
ELSEACT

SENDMSG 6 你等级不够
GOTO @低级功能
BREAK

IF 满足走 #ACT,不满足走 #ELSEACT。没有 #ELSEACT 就不执行任何动作。

十一、多条件组合
IF

CHECKLEVELEX 35
CHECKGOLD 1000
ACT

SENDMSG 6 等级和金币都满足
BREAK

两个条件都要满足才执行。要“或”关系,用 OR:

IF

OR
CHECKLEVELEX 35
ISADMIN
ACT

SENDMSG 6 等级35或管理员
BREAK

十二、脚本调试方法
1. 改完脚本,M2里点“重新加载NPC”或GM输 @reloadnpc
2. 游戏里点NPC,看有没有报错提示
3. M2窗口的日志区会显示脚本错误行号
4. 最常见错误:标签名重复、#IF下面写了执行命令、跳转的标签不存在

十三、从改到写
先找一个现成NPC脚本,比如仓库NPC,改按钮文字、改给的东西、改条件,跑通了再自己从零写。别一上来就写复杂任务系统,先写一个“给钱发装备”的NPC,再写“杀怪计数”,再写“任务链”。

十四、完整入门示例:一个卖药NPC
[@main]
<药店老板>\
\
<买金创药/@buy_jcy> <买魔法药/@buy_mfy>\
<离开/@exit>\

[@buy_jcy]
IF

CHECKGOLD 100
ACT

TAKE 金币 100
GIVE 金创药 1
SENDMSG 6 购买成功
GOTO @main
BREAK
ELSEACT

SENDMSG 6 金币不足
GOTO @main
BREAK

[@buy_mfy]
IF

CHECKGOLD 100
ACT

TAKE 金币 100
GIVE 魔法药 1
SENDMSG 6 购买成功
GOTO @main
BREAK
ELSEACT

SENDMSG 6 金币不足
GOTO @main
BREAK

[@exit]
ACT

CLOSE
BREAK

这个脚本能跑通,你就入门了。剩下的就是背命令、看引擎帮助文档、拆别人的脚本。

十五、引擎差异
BLUE/LEGEND/HERO/GOM/GEE 命令名有细微差别:
• 检查等级:CHECKLEVELEX 或 CHECKLEVEL

• 检查金币:CHECKGOLD 或 CHECKGAMEGOLD

• 传送:MAPMOVE 或 MAP

• 变量:N$ 前缀有的引擎支持,有的不支持

写之前先看你引擎的脚本命令手册,别把 GEE 的命令抄到 HERO 里。

十六、最后一句
传奇脚本 = 标签 + #IF检测 + #ACT执行 + 变量记状态 + 跳转串联。所有功能都是这个模型的组合。先跑通最简单的,再慢慢加。