传奇脚本调用M2命令:NPC/任务/QF写法

来源: 作者: 点击:
传奇里“调用M2命令”分三层:GM聊天命令、NPC脚本命令、引擎内置触发标签。不是把 M2 里的函数直接写进 txt 就能跑,而是用引擎约定的脚本命令去触发 M2 已经实现的功能。

一、NPC脚本里直接写执行命令
文件在 Mir200\Envir\Market_Def\ 或 Market_Sell\ 里,结构就是标签+条件+动作:

[@main]
欢迎\
<传送到祖玛/@go_zuma>\
<发元宝/@give_yb>\

[@go_zuma]
IF

CHECKLEVELEX > 10
ACT

MAPMOVE 015 50 50
SENDMSG 6 已传送到祖玛寺庙
BREAK
ELSESAY

等级不足10级
BREAK

[@give_yb]
IF

ISADMIN
ACT

GAMEGOLD + 100
SENDMSG 6 管理员发放100元宝
BREAK
ELSESAY

你不是管理员
BREAK

MAPMOVE、GAMEGOLD、GIVE、TAKE、SENDMSG、MAPMOVED、SET、MOV、CHECKLEVELEX、CHECKITEM、ISADMIN 这些都是 M2 解析的脚本命令,不是你自己写的函数。

二、GM命令在游戏里触发
M2 里很多功能做成 @命令,GM账号在聊天框直接输:
@reloadnpc
@move 3 330 330
@kick 玩家名
@make 屠龙 1
@mob 祖玛卫士 5
这些命令在 Command.ini / AdminList.txt / UserCmd.txt 里能改名字和权限。脚本里不能写“调用 @move”,但可以让玩家点NPC后由脚本执行 MAPMOVE 这种等价命令。

三、任务脚本 QuestDiary 里用内置触发
Envir\QuestDiary\某某目录\文件.txt:

[@PlayLevelUp]
IF

CHECKLEVELEX = 35
ACT

GIVE 骨玉权杖 1
SENDMSG 0 恭喜达到35级,获得骨玉权杖
BREAK

[@Login]
ACT

SENDMSG 6 欢迎回来
SET D0 0

[@UseItemXXX]
ACT

CHANGEEXP + 500000
SENDMSG 6 使用经验卷轴+50万经验
BREAK

[@Login]、[@PlayLevelUp]、[@PlayDie]、[@KillPlay]、[@PickUpItem] 是引擎自动调用的标签,不是点NPC才跑。

四、QFunction.txt / QManage.txt 里挂全局事件
Envir\MapQuest_def\QFunction-0.txt:
[@KillMonGen]、[@PlayDie]、[@Revival]、[@StdModeFunc1]
这些段由 M2 在玩家死亡、打怪、用触发类物品时自动执行,里面写 #IF/#ACT 就行。

五、BLUE/LEGEND 自定义 @命令传参
玩家输 @装备购买 屠龙 1,脚本里:

[@装备购买]
ACT

MOV S1 $PARAM(1)
MOV D0 $PARAM(2)
SENDMSG 6 购买物品:<STR(S1)> 数量:<STR(D0)>

PARAM(0) 是整条命令串,PARAM(1) 第一个参数,后面依次排。这个就是“脚本调用M2自定义命令”的写法。

六、想让脚本执行“M2里没有的命令”
两种路:
1. M2 插件/DLL 注册新脚本命令,比如 AddHeroSkill、OpenShopEx,然后在 NPC 里直接写:
ACT

AddHeroSkill 烈火剑法 1
2. 用 EXEC 类命令调外部程序(部分引擎支持 EXECUTE、RunProgram、CALL 外部),但老 BLUE/HERO 不一定有,GEE 有些扩展命令。

七、重载方式
改完 NPC 脚本:M2 里 控制→重新加载NPC,或 GM 输 @reloadnpc
改 QuestDiary:@reloadmanage / 重载任务脚本
改 QFunction:一般重载NPC或重载登录脚本
改 Merchant.txt(NPC坐标/名字):多数要重启 M2 或点“重新加载商人”

八、常见写错
• #IF 后面写 GIVE → 错,#IF 只放检测命令

• #ACT 后面写 CHECKGOLD → 错,#ACT 只放执行命令

• 想“调用M2函数”写成 Call MapMove(015,50,50) → 传奇脚本不是Lua/JS,不支持这种

• 自定义 @命令没在 UserCmd 配权限,普通玩家输出来没反应

• 变量混用:N0/M0/S0/G0/D0/A0 用途各引擎有差异,BLUE 里 M0 常接输入,G 系列做全局,D 系列做临时,A/S 做字符

九、最小可跑模板
[@main]
主城传送员\
<进祖玛/@zuma> <进石墓/@shigu>\
<离开/@exit>\

[@zuma]
IF

CHECKGOLD 1000
ACT

TAKE 金币 1000
MAPMOVE 015 50 50
SENDMSG 6 消耗1000金币,进入祖玛
BREAK
ELSEACT

SENDMSG 6 金币不够
BREAK

[@shigu]
IF

ACT

MAPMOVE 717 100 100
SENDMSG 6 进入石墓阵
BREAK

这就是“脚本调M2命令”的真实样子:标签接收点击,#IF 检测,#ACT 里写 M2 认得的命令,BREAK 防穿透。

十、如果你说的是“M2控制台命令”
M2Server 界面里输:
@ReloadNpc
@ReloadManage
@ReloadMonItems
@ReloadLineNotice
这些是给引擎自己热重载配置,不是给 NPC 脚本里嵌的;脚本里只能用 MAPMOVE / GIVE / TAKE / SENDMSG / GAMEGOLD 这类“脚本级命令”去达到同样效果。