传奇脚本不是编程语言,是引擎按行读取的指令集。写错一个符号、大小写不对、文件放错目录,整段直接跳过。先搞懂结构再动手。
一、脚本基本结构
所有传奇脚本由四部分组成:触发标记、条件判断、执行动作、文本输出。格式固定:
[@标签名]
#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 面向 形象编号 显示名字
;杂货商 3 330 330 5 杂货商
分号开头是注释,但NPC定义行的分号不能少,少了引擎当注释不加载。
三、常用条件命令
CHECKLEVELEX > 35:等级大于35
CHECKLEVELEX = 35:等级等于35
CHECKLEVELEX < 35:等级小于35
CheckGold > 1000:金币大于1000
CheckGameGold > 100:元宝大于100
CheckItem 裁决之杖 1:背包有裁决之杖至少1把
CheckItemW 裁决之杖:身上穿着裁决之杖
CheckUseItem 1:武器栏有装备(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把
TakeOffToBag 1:把武器栏装备脱到背包
SetLevel 1:设等级为1
SetExp 0:经验清零
MapMove 3 330 330:传送到3号地图330,330坐标
SendMsg 0 全服公告内容:发全服公告(0=全服 1=个人 6=黄字)
SENDMSG 6 你获得了奖励:发个人黄字提示
SetInt(<$HUMAN(变量名)>) = 1:设玩家变量为1
SetInt(<$G(变量名)>) = 1:设全局变量为1
ACCEPTQUEST 任务名:接任务
COMPLETEQUEST 任务名:完成任务
CLEARQUEST 任务名:清任务记录
GiveBuff 攻速 10 3600:给攻速buff强度10持续3600秒
CalcInt($H(变量)) + 1:变量加1
CALL [\路径\文件.txt] @标签:调用其他脚本段
五、变量系统
传奇脚本有三层变量:
全局变量:<$G(名字)>,全服共用,M2重启可能保留(看引擎)
玩家变量:<$HUMAN(名字)>,跟角色走,存盘不丢
NPC变量:<$NPC(名字)>,跟NPC实例走,重启清零
命名规则:只能用英文、数字、下划线,不能中文、不能空格、不能数字开头。
正确:libao_get、kill_count、task_01
错误:领过礼包、kill count、01task
六、跳转与流程控制
GOTO [@标签]:跳转到指定标签继续执行
CALL [\目录\文件.txt] @标签:调用外部文件里的标签段
IF / #ACT / #ELSEACT:条件分支
OR:多个条件任一成立
AND:多个条件全部成立
循环写法(用变量+跳转模拟):
[@循环开始]
#IF
CheckInt(<$HUMAN(计数)>) < 10
#ACT
CalcInt(<$HUMAN(计数)>) + 1
#SAY
当前计数:<$HUMAN(计数)>
#GOTO [@循环开始]
#ELSEACT
#SAY
循环结束。
七、NPC对话脚本完整示例
;武器升级师 3 335 335 5 武器升级师
[@main]
#ACT
#SAY
欢迎来到武器升级师。\ \
你的金币:<$GOLD>\ \
<升级武器/@upgrade>\ <离开/@exit>
[@upgrade]
#IF
CheckItem 修罗 1
CheckGold > 5000
#ACT
TakeItem 修罗 1
TakeGold 5000
GiveItem 修罗+1 1
SENDMSG 6 武器升级成功!
#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
SENDMSG 6 已接受杀猪任务!
[@杀猪回调]
#IF
ISACCEPT 杀猪任务
#ACT
CalcInt(<$HUMAN(杀猪任务)>) + 1
#IF
CheckInt(<$HUMAN(杀猪任务)>) >= 10
#ACT
COMPLETEQUEST 杀猪任务
GiveItem 金币 5000
SENDMSG 6 杀猪任务完成,奖励5000金币!
九、刷怪脚本 MonGen.txt
格式:地图号 X Y 范围 怪物名 数量 刷新时间(秒) 线数
3 330 330 5 半兽人 10 10 0
3 350 350 5 白野猪 2 60 0
地图号必须存在于 MapInfo.txt,怪物名必须存在于 Monster.DB,坐标不能是墙。
十、掉落脚本 MonItems\怪物名.txt
金币 100/100
强效金创药 100/100
沃玛装备 1/100
祖玛装备 1/1000
文件名必须和怪物数据库里的名字一致,概率格式是 掉落数/分母。
十一、触发类脚本
QManage(登录触发):
[@Login]
#ACT
SENDMSG 6 欢迎回来!
GiveBuff 攻速 3 86400
QFunction(穿装备触发):
[@TakeOn1]
#IF
CheckItemW 屠龙
#ACT
CHANGESPEED 2 5 86400
SENDMSG 6 佩戴屠龙,攻速提升!
[@TakeOff1]
#ACT
CHANGESPEED 2 0
SENDMSG 6 攻速恢复。
十二、常见错误
• 文件编码:老引擎用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%的问题都能定位。

