传奇脚本不是编程语言,是引擎按行读取的指令集。写错一个符号、大小写不对、文件放错目录,整段直接跳过。先搞懂结构再动手。
一、脚本基本结构
所有传奇脚本由四部分组成:触发标记、条件判断、执行动作、文本输出。格式固定:
[@标签名]
#IF
条件命令
#ACT
执行命令
#SAY
显示给玩家的文字
[@标签名]是入口,玩家点击NPC或触发事件时引擎找这个标签。#IF后面写判断条件,#ACT后面写要执行的动作,#SAY后面写对话框内容。#ELSEACT是条件不满足时走的分支。
最小可用脚本:
[@main]
#ACT
#SAY
你好,欢迎来到杂货店。
这段放在NPC定义文件里,玩家点NPC就会弹出对话框说这句话。
二、文件放哪
不同功能放不同目录,放错了引擎不读:
•Mir200\Envir\Npc_def\或Market_Def\:NPC对话脚本
•Mir200\Envir\QuestDiary\:任务脚本,按文件夹分类
•Mir200\Envir\MonGen.txt:刷怪配置
•Mir200\Envir\MonItems\:怪物掉落
•Mir200\Envir\MapInfo.txt:地图参数
•Mir200\Envir\QManage.txt或QM:登录触发
•Mir200\Envir\QFunction.txt:穿脱装备、攻击、死亡等触发
NPC定义文件头部格式:
;NPC名字地图号坐标X坐标Y面向形象编号显示名字
;杂货商33303305杂货商
分号开头是注释,但NPC定义行的分号不能少,少了引擎当注释不加载。
三、常用条件命令
CHECKLEVELEX>35:等级大于35
CHECKLEVELEX=35:等级等于35
CHECKLEVELEX<35:等级小于35
CheckGold>1000:金币大于1000
CheckGameGold>100:元宝大于100
CheckItem裁决之杖1:背包有裁决之杖至少1把
CheckItemW裁决之杖:身上穿着裁决之杖
CheckUseItem1:武器栏有装备(0衣服1武器2头盔3项链4左戒指5右戒指6左手镯7右手镯8腰带9鞋子)
ISACCEPT任务名:已接某任务
COMPLETEQUEST任务名:已完成某任务
CHECKMONKILL半兽人100:累计杀半兽人100只
CheckInt(<$HUMAN(变量名)>)=1:自定义变量等于1
多个条件同时成立用#AND,任意成立用#OR:
#IF
CheckLevelEx>=35
CheckGold>5000
#AND
CheckItem沃玛号角1
四、常用执行命令
GameGold+100:加100元宝
GameGold-100:扣100元宝
GiveItem裁决之杖1:给裁决之杖1把
TakeItem裁决之杖1:从背包拿走1把
TakeOffToBag1:把武器栏装备脱到背包
SetLevel1:设等级为1
SetExp0:经验清零
MapMove3330330:传送到3号地图330330坐标
SendMsg0全服公告内容:发全服公告(0=全服1=个人6=黄字)
SENDMSG6你获得了奖励:发个人黄字提示
SetInt(<$HUMAN(变量名)>)=1:设玩家变量为1
SetInt(<$G(变量名)>)=1:设全局变量为1
ACCEPTQUEST任务名:接任务
COMPLETEQUEST任务名:完成任务
CLEARQUEST任务名:清任务记录
GiveBuff攻速103600:给攻速buff强度10持续3600秒
CalcInt($H(变量))+1:变量加1
CALL[\路径\文件.txt]@标签:调用其他脚本段
五、变量系统
传奇脚本有三层变量:
全局变量:<$G(名字)>,全服共用,M2重启可能保留(看引擎)
玩家变量:<$HUMAN(名字)>,跟角色走,存盘不丢
NPC变量:<$NPC(名字)>,跟NPC实例走,重启清零
命名规则:只能用英文、数字、下划线,不能中文、不能空格、不能数字开头。
正确:libao_get、kill_count、task_01
错误:领过礼包、killcount、01task
六、跳转与流程控制
GOTO[@标签]:跳转到指定标签继续执行
CALL[\目录\文件.txt]@标签:调用外部文件里的标签段
IF/#ACT/#ELSEACT:条件分支
OR:多个条件任一成立
AND:多个条件全部成立
循环写法(用变量+跳转模拟):
[@循环开始]
#IF
CheckInt(<$HUMAN(计数)>)<10
#ACT
CalcInt(<$HUMAN(计数)>)+1
#SAY
当前计数:<$HUMAN(计数)>
#GOTO[@循环开始]
#ELSEACT
#SAY
循环结束。
七、NPC对话脚本完整示例
;武器升级师33353355武器升级师
[@main]
#ACT
#SAY
欢迎来到武器升级师。\\
你的金币:<$GOLD>\\
<升级武器/@upgrade>\<离开/@exit>
[@upgrade]
#IF
CheckItem修罗1
CheckGold>5000
#ACT
TakeItem修罗1
TakeGold5000
GiveItem修罗+11
SENDMSG6武器升级成功!
#ELSEACT
#SAY
需要修罗1把和5000金币。
[@exit]
#ACT
#SAY
慢走。
八、任务脚本示例
[@main]
#IF
ISACCEPT杀猪任务
#ACT
#SAY
任务进度:<$QUEST(杀猪任务)>/10\\
<继续杀猪/@close>
#ELSEACT
#SAY
<接受任务:杀10只猪/@accept>
[@accept]
#IF
#ACT
ACCEPTQUEST杀猪任务
SetInt(<$HUMAN(杀猪任务)>)=0
SENDMSG6已接受杀猪任务!
[@杀猪回调]
#IF
ISACCEPT杀猪任务
#ACT
CalcInt(<$HUMAN(杀猪任务)>)+1
#IF
CheckInt(<$HUMAN(杀猪任务)>)>=10
#ACT
COMPLETEQUEST杀猪任务
GiveItem金币5000
SENDMSG6杀猪任务完成,奖励5000金币!
九、刷怪脚本MonGen.txt
格式:地图号XY范围怪物名数量刷新时间(秒)线数
33303305半兽人10100
33503505白野猪2600
地图号必须存在于MapInfo.txt,怪物名必须存在于Monster.DB,坐标不能是墙。
十、掉落脚本MonItems\怪物名.txt
金币100/100
强效金创药100/100
沃玛装备1/100
祖玛装备1/1000
文件名必须和怪物数据库里的名字一致,概率格式是掉落数/分母。
十一、触发类脚本
QManage(登录触发):
[@Login]
#ACT
SENDMSG6欢迎回来!
GiveBuff攻速386400
QFunction(穿装备触发):
[@TakeOn1]
#IF
CheckItemW屠龙
#ACT
CHANGESPEED2586400
SENDMSG6佩戴屠龙,攻速提升!
[@TakeOff1]
#ACT
CHANGESPEED20
SENDMSG6攻速恢复。
十二、常见错误
•文件编码:老引擎用ANSI,新引擎用UTF-8无BOM。记事本另存为UTF-8带BOM,第一行[@main]被BOM头吃掉,NPC点开空白。
•全角符号:中文逗号、中文冒号、中文分号,引擎不认,全部换成英文标点。
•Tab和空格混用:部分引擎解析异常,统一用空格。
•标签名大小写:[@Main]和[@main]在某些引擎是两个东西。
•#IF后面没条件:直接写#ACT,引擎可能跳过整段。
•#CALL路径错:QuestDiary\任务\发奖.txt写成QuestDiary\任务\发奖.txt\,多一个斜杠。
•命令名不对:GameGold在LEG里是ADDGAMEGOLD,在HERO里是Human:AddGameGold,照抄必崩。
•物品名不对:数据库里叫"裁决之杖",脚本写"裁决",GiveItem发不出来。
•地图号不对:MapInfo里是100,脚本写101,MoveTo直接失败。
十三、调试方法
1.在脚本里插#SAY测试文本,看是否弹出,判断脚本有没有被读到
2.M2控制台看Script.log,有报错会写第几行第几个文件
3.用GM命令@give物品名测试物品名是否正确
4.用@mov地图号测试地图是否能进
5.用@mob怪物名测试怪物名是否正确
6.改完脚本重载对应模块,不确定就重启M2
7.每次只改一处,改完测试,不要一次性改五十行
十四、编写流程
1.确定功能:要做什么(发奖、传图、接任务、刷怪)
2.确定触发方式:NPC点击、登录、穿装备、杀怪、定时器
3.言文件:NPC放Market_Def,任务放QuestDiary,触发放QFunction
4.写最小可用版本:只做核心功能,不加花
5.测试:重载脚本,触发一次,看结果
6.加条件判断:等级、金币、物品、任务进度
7.再加文本和菜单
8.最后加防刷:判背包空格、判是否已领、判条件是否满足
十五、各引擎命令差异速查
GOM/GEE:GameGold、GiveItem、MapMove、CHANGESPEED、ACCEPTQUEST
LEG:ADDGAMEGOLD、give、mov、ChangeSpeed(参数不同)
HERO:Human:AddGameGold()、Human:GiveItem()、Human:MapMove()、lua写法
3K/M3:各自命令集,不通用
写之前先确认引擎类型,去对应引擎的文档里查命令表,不要跨引擎抄。
十六、文件命名和目录规范
•文件名只用英文、数字、下划线
•不用中文名,不同系统编码转换会乱
•QuestDiary下按功能建文件夹:成长任务\、副本任务\、活动任务\
•NPC定义文件放Market_Def,任务逻辑放QuestDiary,不要混
•每个NPC一个文件,不要全写一起
•重要脚本备份,改之前复制一份.txt.bak
脚本写好了不生效,按顺序查:文件放对目录没、编码对没、命令名对当前引擎没、M2日志有报错没、重载了没、触发条件满足没。这六步走完,99%的问题都能定位。
一、脚本基本结构
所有传奇脚本由四部分组成:触发标记、条件判断、执行动作、文本输出。格式固定:
[@标签名]
#IF
条件命令
#ACT
执行命令
#SAY
显示给玩家的文字
[@标签名]是入口,玩家点击NPC或触发事件时引擎找这个标签。#IF后面写判断条件,#ACT后面写要执行的动作,#SAY后面写对话框内容。#ELSEACT是条件不满足时走的分支。
最小可用脚本:
[@main]
#ACT
#SAY
你好,欢迎来到杂货店。
这段放在NPC定义文件里,玩家点NPC就会弹出对话框说这句话。
二、文件放哪
不同功能放不同目录,放错了引擎不读:
•Mir200\Envir\Npc_def\或Market_Def\:NPC对话脚本
•Mir200\Envir\QuestDiary\:任务脚本,按文件夹分类
•Mir200\Envir\MonGen.txt:刷怪配置
•Mir200\Envir\MonItems\:怪物掉落
•Mir200\Envir\MapInfo.txt:地图参数
•Mir200\Envir\QManage.txt或QM:登录触发
•Mir200\Envir\QFunction.txt:穿脱装备、攻击、死亡等触发
NPC定义文件头部格式:
;NPC名字地图号坐标X坐标Y面向形象编号显示名字
;杂货商33303305杂货商
分号开头是注释,但NPC定义行的分号不能少,少了引擎当注释不加载。
三、常用条件命令
CHECKLEVELEX>35:等级大于35
CHECKLEVELEX=35:等级等于35
CHECKLEVELEX<35:等级小于35
CheckGold>1000:金币大于1000
CheckGameGold>100:元宝大于100
CheckItem裁决之杖1:背包有裁决之杖至少1把
CheckItemW裁决之杖:身上穿着裁决之杖
CheckUseItem1:武器栏有装备(0衣服1武器2头盔3项链4左戒指5右戒指6左手镯7右手镯8腰带9鞋子)
ISACCEPT任务名:已接某任务
COMPLETEQUEST任务名:已完成某任务
CHECKMONKILL半兽人100:累计杀半兽人100只
CheckInt(<$HUMAN(变量名)>)=1:自定义变量等于1
多个条件同时成立用#AND,任意成立用#OR:
#IF
CheckLevelEx>=35
CheckGold>5000
#AND
CheckItem沃玛号角1
四、常用执行命令
GameGold+100:加100元宝
GameGold-100:扣100元宝
GiveItem裁决之杖1:给裁决之杖1把
TakeItem裁决之杖1:从背包拿走1把
TakeOffToBag1:把武器栏装备脱到背包
SetLevel1:设等级为1
SetExp0:经验清零
MapMove3330330:传送到3号地图330330坐标
SendMsg0全服公告内容:发全服公告(0=全服1=个人6=黄字)
SENDMSG6你获得了奖励:发个人黄字提示
SetInt(<$HUMAN(变量名)>)=1:设玩家变量为1
SetInt(<$G(变量名)>)=1:设全局变量为1
ACCEPTQUEST任务名:接任务
COMPLETEQUEST任务名:完成任务
CLEARQUEST任务名:清任务记录
GiveBuff攻速103600:给攻速buff强度10持续3600秒
CalcInt($H(变量))+1:变量加1
CALL[\路径\文件.txt]@标签:调用其他脚本段
五、变量系统
传奇脚本有三层变量:
全局变量:<$G(名字)>,全服共用,M2重启可能保留(看引擎)
玩家变量:<$HUMAN(名字)>,跟角色走,存盘不丢
NPC变量:<$NPC(名字)>,跟NPC实例走,重启清零
命名规则:只能用英文、数字、下划线,不能中文、不能空格、不能数字开头。
正确:libao_get、kill_count、task_01
错误:领过礼包、killcount、01task
六、跳转与流程控制
GOTO[@标签]:跳转到指定标签继续执行
CALL[\目录\文件.txt]@标签:调用外部文件里的标签段
IF/#ACT/#ELSEACT:条件分支
OR:多个条件任一成立
AND:多个条件全部成立
循环写法(用变量+跳转模拟):
[@循环开始]
#IF
CheckInt(<$HUMAN(计数)>)<10
#ACT
CalcInt(<$HUMAN(计数)>)+1
#SAY
当前计数:<$HUMAN(计数)>
#GOTO[@循环开始]
#ELSEACT
#SAY
循环结束。
七、NPC对话脚本完整示例
;武器升级师33353355武器升级师
[@main]
#ACT
#SAY
欢迎来到武器升级师。\\
你的金币:<$GOLD>\\
<升级武器/@upgrade>\<离开/@exit>
[@upgrade]
#IF
CheckItem修罗1
CheckGold>5000
#ACT
TakeItem修罗1
TakeGold5000
GiveItem修罗+11
SENDMSG6武器升级成功!
#ELSEACT
#SAY
需要修罗1把和5000金币。
[@exit]
#ACT
#SAY
慢走。
八、任务脚本示例
[@main]
#IF
ISACCEPT杀猪任务
#ACT
#SAY
任务进度:<$QUEST(杀猪任务)>/10\\
<继续杀猪/@close>
#ELSEACT
#SAY
<接受任务:杀10只猪/@accept>
[@accept]
#IF
#ACT
ACCEPTQUEST杀猪任务
SetInt(<$HUMAN(杀猪任务)>)=0
SENDMSG6已接受杀猪任务!
[@杀猪回调]
#IF
ISACCEPT杀猪任务
#ACT
CalcInt(<$HUMAN(杀猪任务)>)+1
#IF
CheckInt(<$HUMAN(杀猪任务)>)>=10
#ACT
COMPLETEQUEST杀猪任务
GiveItem金币5000
SENDMSG6杀猪任务完成,奖励5000金币!
九、刷怪脚本MonGen.txt
格式:地图号XY范围怪物名数量刷新时间(秒)线数
33303305半兽人10100
33503505白野猪2600
地图号必须存在于MapInfo.txt,怪物名必须存在于Monster.DB,坐标不能是墙。
十、掉落脚本MonItems\怪物名.txt
金币100/100
强效金创药100/100
沃玛装备1/100
祖玛装备1/1000
文件名必须和怪物数据库里的名字一致,概率格式是掉落数/分母。
十一、触发类脚本
QManage(登录触发):
[@Login]
#ACT
SENDMSG6欢迎回来!
GiveBuff攻速386400
QFunction(穿装备触发):
[@TakeOn1]
#IF
CheckItemW屠龙
#ACT
CHANGESPEED2586400
SENDMSG6佩戴屠龙,攻速提升!
[@TakeOff1]
#ACT
CHANGESPEED20
SENDMSG6攻速恢复。
十二、常见错误
•文件编码:老引擎用ANSI,新引擎用UTF-8无BOM。记事本另存为UTF-8带BOM,第一行[@main]被BOM头吃掉,NPC点开空白。
•全角符号:中文逗号、中文冒号、中文分号,引擎不认,全部换成英文标点。
•Tab和空格混用:部分引擎解析异常,统一用空格。
•标签名大小写:[@Main]和[@main]在某些引擎是两个东西。
•#IF后面没条件:直接写#ACT,引擎可能跳过整段。
•#CALL路径错:QuestDiary\任务\发奖.txt写成QuestDiary\任务\发奖.txt\,多一个斜杠。
•命令名不对:GameGold在LEG里是ADDGAMEGOLD,在HERO里是Human:AddGameGold,照抄必崩。
•物品名不对:数据库里叫"裁决之杖",脚本写"裁决",GiveItem发不出来。
•地图号不对:MapInfo里是100,脚本写101,MoveTo直接失败。
十三、调试方法
1.在脚本里插#SAY测试文本,看是否弹出,判断脚本有没有被读到
2.M2控制台看Script.log,有报错会写第几行第几个文件
3.用GM命令@give物品名测试物品名是否正确
4.用@mov地图号测试地图是否能进
5.用@mob怪物名测试怪物名是否正确
6.改完脚本重载对应模块,不确定就重启M2
7.每次只改一处,改完测试,不要一次性改五十行
十四、编写流程
1.确定功能:要做什么(发奖、传图、接任务、刷怪)
2.确定触发方式:NPC点击、登录、穿装备、杀怪、定时器
3.言文件:NPC放Market_Def,任务放QuestDiary,触发放QFunction
4.写最小可用版本:只做核心功能,不加花
5.测试:重载脚本,触发一次,看结果
6.加条件判断:等级、金币、物品、任务进度
7.再加文本和菜单
8.最后加防刷:判背包空格、判是否已领、判条件是否满足
十五、各引擎命令差异速查
GOM/GEE:GameGold、GiveItem、MapMove、CHANGESPEED、ACCEPTQUEST
LEG:ADDGAMEGOLD、give、mov、ChangeSpeed(参数不同)
HERO:Human:AddGameGold()、Human:GiveItem()、Human:MapMove()、lua写法
3K/M3:各自命令集,不通用
写之前先确认引擎类型,去对应引擎的文档里查命令表,不要跨引擎抄。
十六、文件命名和目录规范
•文件名只用英文、数字、下划线
•不用中文名,不同系统编码转换会乱
•QuestDiary下按功能建文件夹:成长任务\、副本任务\、活动任务\
•NPC定义文件放Market_Def,任务逻辑放QuestDiary,不要混
•每个NPC一个文件,不要全写一起
•重要脚本备份,改之前复制一份.txt.bak
脚本写好了不生效,按顺序查:文件放对目录没、编码对没、命令名对当前引擎没、M2日志有报错没、重载了没、触发条件满足没。这六步走完,99%的问题都能定位。

