传奇服务端脚本问题一般落在几个地方:M2引擎报错、NPC脚本不触发、机器人/刷怪脚本不刷、怪物不掉落、任务脚本卡流程、命令不认识、变量写错、定时器不跑、地图不加载、 Guild/行会/邮件/商城类脚本崩。
先说最基础的脚本文件位置。Legend of Mir 2 类服务端里,脚本大多在:
• \Mir200\Envir\Npc_def\ (NPC对话脚本)
• \Mir200\Envir\QuestDiary\ (任务脚本,按文件夹分模块)
• \Mir200\Envir\MonGen.txt (刷怪)
• \Mir200\Envir\MonItems\ (怪物掉落)
• \Mir200\Envir\MapInfo.txt (地图参数)
• \Mir200\Envir\AdminList.txt (GM权限)
• \Mir200\Logs\ (看报错)
• \Mir200\PlugIns\ (插件脚本/lua/js/py类扩展)
NPC不说话、点不开对话框,先查 NPC_def 里文件头:
;NPCNAME 地图 坐标 面向 形象 名字
地图号写错、坐标被墙挡、名字重名、分号漏写、中文空格混用,NPC就看不见或点了没反应。很多新手把“地图号 100 330 330 5 杂货商”写成“100 330 330 5 杂货商”前面少了分号,引擎当注释,NPC直接不加载。
QuestDiary 里任务脚本常见死法:
[@main]
#IF
CHECKLEVELEX > 35
#ACT
#SAY
你等级够了。
#ELSEACT
#SAY
回去练级。
错误写法:#IF 后面没条件直接 #ACT,或者 #SAY 写成了 #say 但引擎大小写敏感版本会当未知命令;#IF 和 #ACT 之间夹了空行,部分引擎直接忽略整段;变量用 <$STR(NPC变量)> 但没在 [@XXX] 里声明,就回空值。
服务端脚本命令分引擎:
• 盛大系/LEG/微端:#IF #ACT #SAY #CALL #GOTO #ELSEACT
• GOM/GEE:支持 #IF、#OR、#ACT、#SAY、GameGold、GiveItem、MapMove
• HEROPLUGIN/lua:NPC用lua写,错误会写进 PlugIns\log\
• 3K/M3/翎风:命令集不同,Give 和 GiveItem 不是一回事
“脚本问题”里 80% 是命令名不对。比如想给元宝:
GOM 里是 GAMEGOLD + 100 或 GameGold + 100
LEG 里可能是 ADDGAMEGOLD 100
HERO lua 里是 Human:AddGameGold(100)
你拿 LEG 的 ADDGAMEGOLD 塞进 GOM,M2直接刷红字:Unknown script command: ADDGAMEGOLD。
刷怪脚本 MonGen.txt 格式:
地图号 横坐标 纵坐标 范围 怪物名 数量 刷新时间 线数
100 100 100 10 半兽人 10 10 0
问题常是:地图号在 MapInfo 里没加载;坐标在阻挡层;数量写0不刷;刷新时间写0狂刷把CPU吃满;怪物名和 Monster.db 里不一致,M2报 Monster not found;线数填错导致跨线不刷。
怪物掉落 MonItems\半兽人.txt:
金币 100/100
强效金创药 5/3
沃玛装备 1/1000
掉落不出的原因:文件名叫“半兽人.txt”但怪物数据库里是“BanShouRen”,中文名对不上就不掉;概率格式写反;物品名和 StdItems.db 不一致;服务端关了“死亡掉落”开关;跨服/微端没同步 MonItems 到网关。
机器人/定时脚本问题:
GOM 用 Robot.txt + RobotDef:
[Robot]
0:00 执行 @每日重置
常见错:Robot.txt 编码是UTF-8带BOM,引擎只认ANSI,时间行不解析;[@每日重置] 段写在 QuestDiary 里但 Robot 没 #CALL 过去;定时器在 M2 设置里被关;机器人账号没建在 Robot.txt 指定账号名。
Lua 插件脚本崩了看 PlugIns\log\PlugIn.log。报错像:
attempt to index global 'Human' (a nil value)
就是函数里没传 Human 对象,或者 NPC 调用lua时没绑玩家对象。传奇lua脚本里 Human、Npc、Monster 三个对象必须分清:Human 是玩家,Npc 是脚本载体,Monster 是怪。把 Human:GetName() 写在怪物死亡事件里,怪物没有 GetName 就 nil。
变量作用域也常出事。
全局变量:<$G(变量名)> 或 SetGlobalVal
玩家变量:<$HUMAN(变量名)> 或 Human:SetCustomVarInt
NPC变量:<$NPC(变量名)>
很多人把玩家任务进度写进 NPC 变量,重启M2进度全没;写进全局变量,全服玩家共用一个进度,A做任务B也过了。
地图脚本进不去:
MapInfo.txt 里:
100 火龙洞 1 1 1 1 0
参数顺序一般是:地图号 名字 大地图标记 允许PK 允许行会 允许商人 掉线回城点。写错一个,地图加载出来是黑图、不能进、进了被踢、不能放技能、不能死亡回城。微端还得多查 Map 目录里 100.map 文件是否存在,文件名大小写、扩展名 .map/.wem 不对就加载空图。
M2报错排查顺序:
1. 开 M2 → 查看 → 日志 → 脚本日志
2. 点 NPC 看 M2 是否刷 “Script Error”
3. 看报错行号:QuestDiary\任务\某文件 第 12 行
4. 第12行看 #IF/#ACT/#SAY 是否齐全
5. 看命令是否在当前引擎命令表里
6. 看变量 <$XXX> 是否声明
7. 把中文逗号、全角空格、BOM头、Tab混用全清掉
8. 改完重启 M2,别只点“重新加载脚本”,有些引擎重载不重挂NPC
“脚本能存盘但游戏里没效果”通常是:
• 改了 QuestDiary\功能\泡点.txt,但 NPC 里没 #CALL 这个文件
• 改了 MonGen 但没点 M2 的“重新加载怪物刷新”
• 改了 MonItems 但怪物是缓存里的旧对象,等刷新型才掉
• 改了 StdItems 但没重读物品数据库,发出来是 0 持久 0 重量 名字空
• 改了地图但没重载 MapInfo,老地图还占着号
合击/英雄脚本问题另算:
英雄出招、合击怒气、英雄技能自动放,通常在:
• \Mir200\Envir\HeroDef\
• M2 里 选项 → 英雄设置 → 合击设置
• 数据库 HeroDB / MagicHero.db
英雄不放合击:怒气公式在 M2 里被关;HeroMagic 里合击技能 MagicID 填错;英雄状态设成“休息”;合击触发条件写“主号攻击后 9999 毫秒”实际永远不会到;版本里合击要火龙之心,道具没挂英雄装备位。
任务卡流程典型:
[@kill100mon]
#IF
CHECKMONKILL 半兽人 100
#ACT
#CALL [\任务\发奖.txt] @reward
玩家杀了100只但任务不跳,原因:CHECKMONKILL 只在指定任务会话里计数;玩家进地图前没触发 [@main] 注册任务;服务器重启计数清了;怪物名和数据库不一致;跨线杀怪计数不进当前线任务上下文。
商城/充值/礼包脚本最容易被改坏:
#IF
CHECKGAMEGOLD > 1000
#ACT
GameGold - 1000
GiveItem 裁决之杖 1
错误点:GameGold 减了但没判负;GiveItem 物品名数据库没有;没写 #ELSEACT 提示“元宝不足”;商城NPC被玩家卡刷,重复点一次发两次;没加防连点锁,导致“0元宝领裁决”。
防刷脚本底线:
• 发物品前判背包空格
• 扣元宝在前,发物在后
• 用 SetInt(HUMAN(领过礼包)) = 1 做一次性标记
• 标记写进人物存档不是全局变量
• 商城NPC加 #IF CHECK [000] 1 类每日限制
• 机器人发奖走离线结算,不跟玩家点击同线程
插件脚本(lua/js/py):
lua 常见问题:require 路径错、Metatable 被覆盖、Human 对象生命周期结束还调用、协程没 resume、死循环 while true 不 yield 把 M2 主线程卡死。
js 插件:this 指向错、异步回调里改人物属性没加锁、JSON 解析怪物名乱码。
py 插件:和 M2 通信靠管道/共享内存,编码 gbk/utf8 没转,中文物品名变问号,发出来叫“????”。
脚本编码铁律:
• 老 LEG/GOM 用 ANSI(GB2312/GBK)
• 新 GEE/HERO 支持 UTF-8 但别带 BOM
• QuestDiary 里别粘 Word 空格
• 中文标点全部换成英文标点
• Tab 和空格别混用
• 文件结尾留空行,很多引擎最后一行不读
M2 报 “Line: 0” 基本不是第0行,是脚本段没找到 [@main] 或 [@XXX] 入口。NPC 脚本必须有:
[@main]
#ACT
#SAY
欢迎来杂货店。
没 [@main],点 NPC 直接关对话框。
机器人不跑检查:
• M2 里“机器人管理”开关开没开
• Robot.txt 里账号密码和 M2 设置里机器人账号一致不
• 机器人角色有没有真的登进游戏
• 机器人地图有没有禁入
• 机器人执行 @段 但段写在 QuestDiary 里,Robot 文件没 #CALL
• 时间格式 10:30 别写 10 :30(全角冒号)
刷怪刷炸了:
MonGen 里 100 100 100 10 祖玛卫士 50 1 0
刷新时间1秒、数量50、地图就100x100,怪堆爆,寻路吃满,玩家卡顿,M2 CPU 100%。正确做法分多块坐标、刷新时间 10-30 秒、数量按地图承载来,祖玛级图单块别超 20 只。
掉落概率写法:
裁决之杖 1/5000
不是 1/5000% ,也不是 0.02% 看引擎。有的引擎写 1/5000 是万分之五?不对,是五千分之一。有的写 500/10000 才等价。配表前先拿小怪试:强效金创药 100/100 必掉,沃玛 1/100 刷十次看掉不掉,掉率系统没被“全局爆率倍数”改过再上正式表。
全局爆率倍数在 M2:
选项 → 参数设置 → 怪物 → 爆率控制
那里填 2 就是全服掉率 ×2,填 0.5 腰斩。很多人脚本写 1/1000,实测从不出,一查 M2 里爆率倍数被设成 0。
任务 NPC 点进去空白:
• #SAY 后面没内容
• #IF 条件不满足直接跳 #ELSEACT 但 #ELSEACT 没写
• 用了 <$USERNAME> 但引擎变量名是 <$NAME>
• 对话框里用了颜色码 \颜色 但格式错成 \红 全角斜杠
• 文本里有 { } 没闭合,富文本解析直接弃整段
合服/跨服脚本问题:
跨服NPC在 A 服写好了,B 服没同步 QuestDiary;跨服人物对象在网关层,M2 里 Human 某些方法返回 nil;跨服发物品要走中心服队列,直接 GiveItem 发到跨服角色身上会丢。
版本迁移脚本废掉:
LEG 脚本迁 GOM:ADDGAMEGOLD→GameGold,give→GiveItem,checklevel→CheckLevelEx,goto→#GOTO 但参数写法变;HERO 迁 GEE:很多功能变 lua 插件,原来 #CALL 文本段要重写;3K 迁 GOM:怪物名、物品名、地图号全部对一遍,中文名编码一转就乱。
调试技巧:
• 在脚本里插 #SAY 到这里了1 #SAY 到这里了2 看流程卡哪
• M2 开“显示脚本调试信息”
• 用 GM 命令 @mob 祖玛卫士 测刷怪
• 用 @give 裁决之杖 测物品名对不对
• 用 @mov 100 330 330 测地图坐标进得去不
• 机器人段里 #SAY 机器人执行OK 看机器人真跑没
• MonItems 里先塞 强效金创药 100/100 验证掉落链路通不通
权限问题:
AdminList.txt 里 * 游戏管理员 才能用 @命令;普通玩家点 NPC 调 @reload 会被拒;脚本里想Reload 一般走 M2 控制台,不让玩家NPC触发,不然玩家点一下重读全服脚本,卡全服。
常见的“脚本没问题但就是不行”:
1. 客户端和网关没重启,只改了服务端
2. 微端资源没更新,NPC形象是空的,点了没面板
3. 数据库 StdItems 里物品禁交易/禁掉落/绑定,发出来立马回收
4. 地图 PK 模式限制,进图被强制和平,合击/PK脚本不触发
5. 行会地图没开行会权限,行会NPC不认人
6. 节日/活动开关在 M2 里没开,活动脚本整体跳过
7. 防外挂层把脚本命令当异常包拦了
NPC脚本最小可用模板(GOM类):
;杂货商 3 330 330 5 杂货商
[@main]
#ACT
#SAY
欢迎,<$\NAME>。\ \
<买药/@buy>\ <离开/@exit>
[@buy]
#ACT
#SAY
这里暂时只发强效金创药。
GiveItem 强效金创药 1
[@exit]
#ACT
#SAY
慢走。
任务脚本最小模板:
[@main]
#IF
CHECKLEVELEX < 35
#ACT
#SAY
35级再来。
#ELSEACT
#SAY
<接任务/@accept>
[@accept]
#IF
#ACT
SetInt(<$HUMAN(做过初探)>)=1
#SAY
任务接了,去杀100只半兽人。
刷怪最小排错:
MonGen 先写:
3 330 330 5 半兽人 5 10 0
进游戏 /move 3 看怪刷不刷;不刷就查 MapInfo 里 3 号图在不在、半兽人在 Monster.db 叫啥、坐标是不是墙、线数 0 是不是当前线。
掉落最小排错:
MonItems\半兽人.txt:
金币 100/100
强效金创药 100/100
杀一只必掉,不掉就是怪物名不对 / 文件没重载 / 掉落开关关了 / 微端没同步。
lua 插件最小排错:
function OnNpcClick(Human, Npc)
if not Human then
print("Human is nil")
return
end
Human:Say("hello")
end
M2 日志里没 hello,就是 NPC 没绑这个 lua 函数;报 Human is nil 就是调用方没传玩家对象。
服务端脚本问题归根到底就五类:
命令不对引擎、
变量作用域写错、
文件编码/格式坏了、
数据库名字对不上、
M2开关没开。
别一上来改大系统,先拿“强效金创药 100/100”“@give 裁决”“mov 地图号”三件事把链路打通:物品链路、怪物链路、地图链路通了,再写任务、商城、合击、跨服、机器人。
脚本改完别信“保存即生效”。LEG 类部分读盘老,GOM 类点“重新加载脚本”,HERO/lua 类有时要重载插件,微端要重发资源,跨服要中心服同步。每次只改一处,改完用 GM 命令验证,验证通过再改下一项,比一次性改五十行然后 M2 狂红省十倍时间。
NPC重名也会静默失效:两个 NPC 都叫“传送员”,第二个不加载;地图里两个坐标都放“杂货商”,玩家点到的可能是没写完整的那个。命名用 土城传送员 / 沙巴克传送员 / 祖玛传送员,别全服都叫“传送员”。
任务变量别用数字开头,别用空格,别用中文:
错:SetInt(<$HUMAN(领过 礼包)>)=1
对:SetInt(<$HUMAN(libao_get)>)=1
定时器不跑:
GOM 用 Robot.txt 的 0:00/10:00 行;
LEG 用 定时器.txt / 机器人管理;
HERO 用 lua 的 Timer 注册;
M3 用 内置调度;
你拿 LEG 的定时器文件塞 GOM,当然不跑。
最后一类:版本被二次打包,脚本目录看着像 GOM,实际内核是 GEE/HERO/翎风。解决办法不是猜命令,是进 M2 → 关于/版本信息 看引擎名,再去对应引擎文档查命令表。同一句“发元宝”,GOM 写 GameGold + 100,GEE 写 AddGameGold(100),HERO 写 Human:AddGameGold(100),翎风又是另一套。引擎不对,教程再对也白搭。
服务端脚本没有“万能模板”,只有“先打通物品/怪物/地图/变量/定时器五条线,再叠业务”。NPC不说话看定义行和[@main],任务卡住看#IF/#ACT/#SAY和变量作用域,刷怪不出看MonGen和MapInfo,掉落没有看MonItems和数据库名,合击不放看英雄库和怒气开关,机器人不动看Robot账号和时间格式,lua崩看对象是否为nil和编码。把每条链路拆开测,比整服抄别人全套脚本稳得多。

