传奇脚本不是一门编程语言,而是一堆“标签+条件+动作”的文本规则。引擎按玩家点击的按钮跳转到对应标签,从上往下读,遇到满足条件的就执行动作。搞懂这个模型,你就能看懂任何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执行 + 变量记状态 + 跳转串联。所有功能都是这个模型的组合。先跑通最简单的,再慢慢加。
传奇脚本入门:从零看懂NPC脚本结构
来源:
作者:
点击:

