当前位置 : 145z游戏站 | 热血传奇 | 技术教程 | 

传奇脚本入门:从零看懂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

CHECKGOLD100
ACT

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

SENDMSG6金币不足
BREAK

[@sell]
IF

CHECKITEM屠龙1
ACT

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

SENDMSG6你没有屠龙
BREAK

[@exit]
ACT

CLOSE
BREAK

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

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

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

•#ACT下面写执行动作

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

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

•\是换行

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

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

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

CHECKGOLD100
CHECKITEM屠龙1
CHECKLEVELEX35
CHECKMAPNAME015
ISADMIN
EQUALN15
LARGEN110

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

TAKE金币100
GIVE屠龙1
CHANGEEXP+1000
MAPMOVE0155050
SENDMSG6提示文字
MOVN15
INCN11
BREAK

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

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

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

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

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

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

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

赋值:
MOVN15把5存进N1
MOVS1你好把“你好”存进S1
INCN11N1加1
DECN11N1减1
MULN12N1乘2

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

六、常用检测命令
CHECKGOLD1000检查金币是否≥1000
CHECKITEM屠龙1检查是否有1把屠龙
CHECKLEVELEX35检查等级是否≥35
CHECKMAPNAME015检查是否在015地图
CHECKMONMAP0150检查015地图怪物数量是否为0
EQUALN15检查N1是否等于5
LARGEN15检查N1是否大于5
SMALLN15检查N1是否小于5
ISADMIN检查是否管理员
RANDOM31/3概率通过

七、常用执行命令
GIVE屠龙1给物品
TAKE屠龙1收物品
GAMEGOLD+100加元宝
CHANGEEXP+1000加经验
MAPMOVE0155050传送
SENDMSG6文字玩家自己看提示
SENDMSG0文字全服广播
BREAK结束
GOTO@标签跳转
CLOSE关闭NPC窗口
MOVN15赋值
INCN11加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

MOVN1<$STR(M0)>
SENDMSG6你输入的数字是:<$STR(N1)>

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

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

CHECKLEVELEX35
ACT

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

SENDMSG6你等级不够
GOTO@低级功能
BREAK

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

十一、多条件组合
IF

CHECKLEVELEX35
CHECKGOLD1000
ACT

SENDMSG6等级和金币都满足
BREAK

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

IF

OR
CHECKLEVELEX35
ISADMIN
ACT

SENDMSG6等级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

CHECKGOLD100
ACT

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

SENDMSG6金币不足
GOTO@main
BREAK

[@buy_mfy]
IF

CHECKGOLD100
ACT

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

SENDMSG6金币不足
GOTO@main
BREAK

[@exit]
ACT

CLOSE
BREAK

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

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

•检查金币:CHECKGOLD或CHECKGAMEGOLD

•传送:MAPMOVE或MAP

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

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

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