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

传奇服务端脚本报错与编写排查实录

热度:
传奇服务端脚本问题一般落在几个地方:M2引擎报错、NPC脚本不触发、机器人/刷怪脚本不刷、怪物不掉落、任务脚本卡流程、命令不认识、变量写错、定时器不跑、地图不加载、Guild/行会/邮件/商城类脚本崩。

先说最基础的脚本文件位置。LegendofMir2类服务端里,脚本大多在:
•\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就看不见或点了没反应。很多新手把“地图号1003303305杂货商”写成“1003303305杂货商”前面少了分号,引擎当注释,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里可能是ADDGAMEGOLD100
HEROlua里是Human:AddGameGold(100)
你拿LEG的ADDGAMEGOLD塞进GOM,M2直接刷红字:Unknownscriptcommand:ADDGAMEGOLD。

刷怪脚本MonGen.txt格式:

地图号横坐标纵坐标范围怪物名数量刷新时间线数
10010010010半兽人10100

问题常是:地图号在MapInfo里没加载;坐标在阻挡层;数量写0不刷;刷新时间写0狂刷把CPU吃满;怪物名和Monster.db里不一致,M2报Monsternotfound;线数填错导致跨线不刷。

怪物掉落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。报错像:

attempttoindexglobal'Human'(anilvalue)

就是函数里没传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火龙洞11110

参数顺序一般是:地图号名字大地图标记允许PK允许行会允许商人掉线回城点。写错一个,地图加载出来是黑图、不能进、进了被踢、不能放技能、不能死亡回城。微端还得多查Map目录里100.map文件是否存在,文件名大小写、扩展名.map/.wem不对就加载空图。

M2报错排查顺序:
1.开M2→查看→日志→脚本日志
2.点NPC看M2是否刷“ScriptError”
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加#IFCHECK[000]1类每日限制

•机器人发奖走离线结算,不跟玩家点击同线程

插件脚本(lua/js/py):
lua常见问题:require路径错、Metatable被覆盖、Human对象生命周期结束还调用、协程没resume、死循环whiletrue不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里10010010010祖玛卫士5010
刷新时间1秒、数量50、地图就100x100,怪堆爆,寻路吃满,玩家卡顿,M2CPU100%。正确做法分多块坐标、刷新时间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裁决之杖测物品名对不对

•用@mov100330330测地图坐标进得去不

•机器人段里#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类):

;杂货商33303305杂货商
[@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先写:

33303305半兽人5100

进游戏/move3看怪刷不刷;不刷就查MapInfo里3号图在不在、半兽人在Monster.db叫啥、坐标是不是墙、线数0是不是当前线。

掉落最小排错:
MonItems\半兽人.txt:

金币100/100
强效金创药100/100

杀一只必掉,不掉就是怪物名不对/文件没重载/掉落开关关了/微端没同步。

lua插件最小排错:
functionOnNpcClick(HumanNpc)
ifnotHumanthen
print("Humanisnil")
return
end
Human:Say("hello")
end

M2日志里没hello,就是NPC没绑这个lua函数;报Humanisnil就是调用方没传玩家对象。

服务端脚本问题归根到底就五类:
命令不对引擎、
变量作用域写错、
文件编码/格式坏了、
数据库名字对不上、
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和编码。把每条链路拆开测,比整服抄别人全套脚本稳得多。
[顶部]