你这个脚本最大的问题是“入口根本没接通”,不是NPC不吸引人。脚本本体写的是[@main]、[@upgrade]、[@confirmupgrade],但传奇引擎真正把玩家带进NPC对话的是“功能标志行”,你只在标题里写了:
(@upgradenow@getbackupgnow)
这一行要满足三个条件才能生效:第一,它必须紧挨在NPC脚本名下面,且单独一行;第二,括号里的名字必须和后面回调标签完全一致;第三,功能名要用引擎支持的固定词。很多版本里武器升级功能标志不是upgradenow,而是UPGRADEWEAPON、Upgrade、或直接对应M2里“升级武器”功能号。你现在写的@upgradenow、@getbackupgnow,只是自定义回调,引擎识别不到“这是一个升级武器NPC”,所以玩家点进来只看到[@main]的普通对话,点“开始武器升级”后没有任何功能接管,自然一个顾客都没有。
先把功能标志改成引擎认的写法。以常见GEE/3K引擎为例,脚本开头应该是:
;升级武器
(@UpgradeWeapon@GetBackupWeapon)
或者:
;升级武器
(@UPGRADEWEAPON@GETBACKUPWEAPON)
具体用哪个,去M2控制台—NPC管理—功能列表里查,找到“升级武器”和“取回升级武器”对应的功能名,照抄进括号,大小写也要一致。改完后重启M2或重载该NPC,玩家再点“开始武器升级”,引擎才会把武器、黑铁矿、饰品、金币的判定接管过去。
第二个问题是[%100]这一行。你写的是:
%100
+5
+6
这三行位置不对。%100表示成功率100%,+5、+6表示每次成功加的点数范围,它们必须紧跟在功能标志行下面,中间不能隔空行,也不能写在[@main]后面。正确结构是:
;升级武器
(@UpgradeWeapon@GetBackupWeapon)
%100
+5
+6
[@main]
...
如果%100被写到了[@main]之后,引擎会把它当成普通文本显示,而不是当作升级规则,结果就是升级功能根本不按这个概率和点数走。另外+5、+6在不同引擎里含义不同,有的是“最低+5、最高+6”,有的是“固定+5、上限+6”,要看你的引擎说明,别想当然。
第三个问题是变量和金币判定。你在[@upgrade]里写了“升级价格是<UPGRADEWEAPONFEE>金币”,但UPGRADEWEAPONFEE这个值从哪来?它需要在M2的“武器升级设置”里填好,或者脚本里用SET赋值。如果这个变量是0或空,玩家看到的报价就是“0金币”或者直接显示变量名,当然没人敢升。在[@confirmupgrade]里应该先校验金币:
[@confirmupgrade]
if
checkgold<$UPGRADEWEAPONFEE>
act
takegold<$UPGRADEWEAPONFEE>
goto@upgradenow
elsesay
<返回/@main>
你现在这段[@confirmupgrade]里没有checkgold和takegold,等于玩家点“确认修炼”后直接跳到[@upgradenow],但[@upgradenow]又没定义成独立段,只有[~@upgradenow_ok]、[~@upgradenow_ing]、[~@upgradenow_fail]这几个回调。引擎找不到[@upgradenow],就什么都不做,玩家以为卡了。
回调标签的写法也对不上。功能接管后,引擎会自动跳到这些标签:
•@upgradenow_ok→写成[~@upgradenow_ok]是对的
•@upgradenow_ing→[~@upgradenow_ing]
•@upgradenow_fail→[~@upgradenow_fail]
•@getbackupgnow_ok→[~@getbackupgnow_ok]
•@getbackupgnow_ing→[~@getbackupgnow_ing]
•@getbackupgnow_fail→[~@getbackupgnow_fail]
但问题是,你现在根本没有[@upgradenow]和[@getbackupgnow]这两个“请求”标签。玩家点“请求修炼”跳到@upgradenow,引擎去找[@upgradenow],找不到,就停在[@confirmupgrade]。解决方法是补上这两个标签,或者在[@confirmupgrade]里直接用goto跳到引擎功能:
[@confirmupgrade]
IF
ACT
goto@UpgradeWeapon
这里的@UpgradeWeapon就是功能标志里那个名字,引擎会自动处理材料校验、扣费、进队列。你不需要自己写扣矿石、扣饰品的代码,那是引擎升级系统的事;脚本只负责对话流程和确认。
再看[Goods]这段。你在最后写了[Goods]但下面没有商品列表。如果这是武器升级NPC,[Goods]一般可以省略;但如果你同时还想卖东西,就要在[Goods]下面列物品,否则留个空[Goods]段在某些引擎里会报错,导致整个NPC加载失败。最稳妥是直接删掉[Goods],或者确认它真的需要再填。
还有一个致命细节:[@main]里你写的是“没有一个人来光顾,顾客,请进”,说明你把这段当普通对话在用,但它缺少最关键的#IF判断。一个完整的升级NPC,[@main]应该判断玩家身上有没有武器、有没有在升级队列里,再决定显示什么:
[@main]
if
checkupgradestatus
act
goto@getbackupgnow
elsesay
欢迎光临武器修炼店\
<开始武器升级/@upgrade>\
<离开/@exit>
checkupgradestatus是引擎提供的判断,用来检测玩家是否已有武器在升级中。没有这个判断,玩家反复点“开始武器升级”,引擎那边却显示“一个人只能进行一个项目”,就出现了你脚本里[~@upgradenow_ing]的提示,但玩家根本不知道怎么回事。
变量USERWEAPON也一样。[@confirmupgrade]里你用了<USERWEAPON>,但这个变量只有在引擎接管升级功能后才会被赋值。如果你在玩家还没点“请求修炼”之前就显示它,变量是空的,对话里会出现“修炼你的,我的视力不好”这种缺字的尴尬场面。正确做法是把显示武器名放在引擎回调[~@upgradenow_ok]里,那时$USERWEAPON才有值。
版本兼容问题也不能忽略。你这段脚本明显是从老传奇1.76版本扒下来的,用了~前缀标签和[Goods]结构。如果你现在跑的是GEE、3K、HGE、LEGEND这些新版引擎,标签规则已经变了:
•老版:[@label]和[~@label]混用
•新版:统一用[@Label],回调标签不用~前缀,或者用#CALL显式调用
新版引擎里[~@upgradenow_ok]这种写法可能被当成无效段,直接忽略,导致升级完成后玩家看不到任何提示。改成[@upgradenow_ok]试试,或者在M2的脚本兼容设置里勾选“兼容老脚本格式”。
还有个常见坑:NPC名字和脚本文件名要对得上。你在Envir/NPCs目录下放的脚本文件,文件名要和M2里添加的NPC名一致,比如NPC-武器修炼师.txt,MPC坐标、地图号、名字也要匹配。文件放错目录、名字对不上,M2根本不加载,你在游戏里看到的要么是默认对话,要么点NPC没反应。
最后把完整可用结构给你理一遍,对照你原来的改:
;武器升级NPC
(@UpgradeWeapon@GetBackupWeapon)
%80
+3
+7
[@main]
欢迎来到武器修炼店\
<开始武器升级/@upgrade>\
<离开/@exit>\
[@upgrade]
升级需要黑铁矿、饰品、武器和金币\
价格是<$UPGRADEWEAPONFEE>金币\
<确认修炼/@confirmupgrade>\
<取回武器/@getbackupgnow>\
<返回/@main>\
[@confirmupgrade]
if
checkgold<$UPGRADEWEAPONFEE>
act
goto@UpgradeWeapon
elsesay
金币不足,请准备<$UPGRADEWEAPONFEE>金币\
<返回/@upgrade>
这里把[@Biron]、[@Etc]、[@Weapon]、[@Gold]那些说明段保留没问题,但要注意它们只能被链接调用(如<黑铁矿/@Biron>),不能自己主动触发。你原来把它们放在[@upgrade]的对话流里是对的,这部分不用动。
[@heardsing]和[@paythree]这两段跟升级完全无关,是“听歌付钱”的彩蛋内容,留着不影响功能,但如果你的NPC只想做升级,建议删掉,减少干扰。特别是[@paythree]里写着“不知名的杂草”就退出,没有任何实际奖励代码,玩家付了3万金币只换来一句废话,属于典型的半成品脚本,留着只会挨骂。
调试时打开M2的“NPC脚本日志”,玩家点一次NPC,日志里会显示当前走到了哪个标签。如果日志里完全没有这个NPC的记录,说明脚本没被加载,检查文件名、目录、NPC名字;如果日志显示停在[@main]不动,说明功能标志没接上;如果停在[@confirmupgrade],说明缺少goto或checkgold失败。
还有一个细节:升级时间。你在[~@upgradenow_ok]里写了“30分钟以后再回来”,这个时间是在M2的“武器升级设置”里控制的,不是脚本写的。脚本里这句话只是显示文本,实际等待时间以M2设置为准。如果你M2里设的是60分钟,脚本却写30分钟,玩家会按30分钟来,结果取武器时提示“工作正忙着”,就是[~@getbackupgnow_ing]那段。把两边时间对齐。
材料判定也是M2管的。你在对话里写了“需要黑铁矿、饰品、武器”,但具体要多少块、多少纯度,是在M2的升级配方里设的,脚本不用写。脚本只负责确认和跳转。如果你发现玩家明明朝包里放了矿石和饰品,还是提示“材料不够”([~@upgradenow_fail]),那就是M2里的配方要求和玩家实际放的不匹配,去M2里调,不是改脚本能解决的。
最后提醒一句,传奇的武器升级脚本是最容易出兼容问题的模块之一,因为引擎版本差异太大。你这段从结构上看是能用的,主要就三处致命伤:功能标志没接对、缺[@upgradenow]请求标签、回调标签~前缀在新引擎里不认。把这三处改了,重启M2,顾客自然就来了。
(@upgradenow@getbackupgnow)
这一行要满足三个条件才能生效:第一,它必须紧挨在NPC脚本名下面,且单独一行;第二,括号里的名字必须和后面回调标签完全一致;第三,功能名要用引擎支持的固定词。很多版本里武器升级功能标志不是upgradenow,而是UPGRADEWEAPON、Upgrade、或直接对应M2里“升级武器”功能号。你现在写的@upgradenow、@getbackupgnow,只是自定义回调,引擎识别不到“这是一个升级武器NPC”,所以玩家点进来只看到[@main]的普通对话,点“开始武器升级”后没有任何功能接管,自然一个顾客都没有。
先把功能标志改成引擎认的写法。以常见GEE/3K引擎为例,脚本开头应该是:
;升级武器
(@UpgradeWeapon@GetBackupWeapon)
或者:
;升级武器
(@UPGRADEWEAPON@GETBACKUPWEAPON)
具体用哪个,去M2控制台—NPC管理—功能列表里查,找到“升级武器”和“取回升级武器”对应的功能名,照抄进括号,大小写也要一致。改完后重启M2或重载该NPC,玩家再点“开始武器升级”,引擎才会把武器、黑铁矿、饰品、金币的判定接管过去。
第二个问题是[%100]这一行。你写的是:
%100
+5
+6
这三行位置不对。%100表示成功率100%,+5、+6表示每次成功加的点数范围,它们必须紧跟在功能标志行下面,中间不能隔空行,也不能写在[@main]后面。正确结构是:
;升级武器
(@UpgradeWeapon@GetBackupWeapon)
%100
+5
+6
[@main]
...
如果%100被写到了[@main]之后,引擎会把它当成普通文本显示,而不是当作升级规则,结果就是升级功能根本不按这个概率和点数走。另外+5、+6在不同引擎里含义不同,有的是“最低+5、最高+6”,有的是“固定+5、上限+6”,要看你的引擎说明,别想当然。
第三个问题是变量和金币判定。你在[@upgrade]里写了“升级价格是<UPGRADEWEAPONFEE>金币”,但UPGRADEWEAPONFEE这个值从哪来?它需要在M2的“武器升级设置”里填好,或者脚本里用SET赋值。如果这个变量是0或空,玩家看到的报价就是“0金币”或者直接显示变量名,当然没人敢升。在[@confirmupgrade]里应该先校验金币:
[@confirmupgrade]
if
checkgold<$UPGRADEWEAPONFEE>
act
takegold<$UPGRADEWEAPONFEE>
goto@upgradenow
elsesay
<返回/@main>
你现在这段[@confirmupgrade]里没有checkgold和takegold,等于玩家点“确认修炼”后直接跳到[@upgradenow],但[@upgradenow]又没定义成独立段,只有[~@upgradenow_ok]、[~@upgradenow_ing]、[~@upgradenow_fail]这几个回调。引擎找不到[@upgradenow],就什么都不做,玩家以为卡了。
回调标签的写法也对不上。功能接管后,引擎会自动跳到这些标签:
•@upgradenow_ok→写成[~@upgradenow_ok]是对的
•@upgradenow_ing→[~@upgradenow_ing]
•@upgradenow_fail→[~@upgradenow_fail]
•@getbackupgnow_ok→[~@getbackupgnow_ok]
•@getbackupgnow_ing→[~@getbackupgnow_ing]
•@getbackupgnow_fail→[~@getbackupgnow_fail]
但问题是,你现在根本没有[@upgradenow]和[@getbackupgnow]这两个“请求”标签。玩家点“请求修炼”跳到@upgradenow,引擎去找[@upgradenow],找不到,就停在[@confirmupgrade]。解决方法是补上这两个标签,或者在[@confirmupgrade]里直接用goto跳到引擎功能:
[@confirmupgrade]
IF
ACT
goto@UpgradeWeapon
这里的@UpgradeWeapon就是功能标志里那个名字,引擎会自动处理材料校验、扣费、进队列。你不需要自己写扣矿石、扣饰品的代码,那是引擎升级系统的事;脚本只负责对话流程和确认。
再看[Goods]这段。你在最后写了[Goods]但下面没有商品列表。如果这是武器升级NPC,[Goods]一般可以省略;但如果你同时还想卖东西,就要在[Goods]下面列物品,否则留个空[Goods]段在某些引擎里会报错,导致整个NPC加载失败。最稳妥是直接删掉[Goods],或者确认它真的需要再填。
还有一个致命细节:[@main]里你写的是“没有一个人来光顾,顾客,请进”,说明你把这段当普通对话在用,但它缺少最关键的#IF判断。一个完整的升级NPC,[@main]应该判断玩家身上有没有武器、有没有在升级队列里,再决定显示什么:
[@main]
if
checkupgradestatus
act
goto@getbackupgnow
elsesay
欢迎光临武器修炼店\
<开始武器升级/@upgrade>\
<离开/@exit>
checkupgradestatus是引擎提供的判断,用来检测玩家是否已有武器在升级中。没有这个判断,玩家反复点“开始武器升级”,引擎那边却显示“一个人只能进行一个项目”,就出现了你脚本里[~@upgradenow_ing]的提示,但玩家根本不知道怎么回事。
变量USERWEAPON也一样。[@confirmupgrade]里你用了<USERWEAPON>,但这个变量只有在引擎接管升级功能后才会被赋值。如果你在玩家还没点“请求修炼”之前就显示它,变量是空的,对话里会出现“修炼你的,我的视力不好”这种缺字的尴尬场面。正确做法是把显示武器名放在引擎回调[~@upgradenow_ok]里,那时$USERWEAPON才有值。
版本兼容问题也不能忽略。你这段脚本明显是从老传奇1.76版本扒下来的,用了~前缀标签和[Goods]结构。如果你现在跑的是GEE、3K、HGE、LEGEND这些新版引擎,标签规则已经变了:
•老版:[@label]和[~@label]混用
•新版:统一用[@Label],回调标签不用~前缀,或者用#CALL显式调用
新版引擎里[~@upgradenow_ok]这种写法可能被当成无效段,直接忽略,导致升级完成后玩家看不到任何提示。改成[@upgradenow_ok]试试,或者在M2的脚本兼容设置里勾选“兼容老脚本格式”。
还有个常见坑:NPC名字和脚本文件名要对得上。你在Envir/NPCs目录下放的脚本文件,文件名要和M2里添加的NPC名一致,比如NPC-武器修炼师.txt,MPC坐标、地图号、名字也要匹配。文件放错目录、名字对不上,M2根本不加载,你在游戏里看到的要么是默认对话,要么点NPC没反应。
最后把完整可用结构给你理一遍,对照你原来的改:
;武器升级NPC
(@UpgradeWeapon@GetBackupWeapon)
%80
+3
+7
[@main]
欢迎来到武器修炼店\
<开始武器升级/@upgrade>\
<离开/@exit>\
[@upgrade]
升级需要黑铁矿、饰品、武器和金币\
价格是<$UPGRADEWEAPONFEE>金币\
<确认修炼/@confirmupgrade>\
<取回武器/@getbackupgnow>\
<返回/@main>\
[@confirmupgrade]
if
checkgold<$UPGRADEWEAPONFEE>
act
goto@UpgradeWeapon
elsesay
金币不足,请准备<$UPGRADEWEAPONFEE>金币\
<返回/@upgrade>
这里把[@Biron]、[@Etc]、[@Weapon]、[@Gold]那些说明段保留没问题,但要注意它们只能被链接调用(如<黑铁矿/@Biron>),不能自己主动触发。你原来把它们放在[@upgrade]的对话流里是对的,这部分不用动。
[@heardsing]和[@paythree]这两段跟升级完全无关,是“听歌付钱”的彩蛋内容,留着不影响功能,但如果你的NPC只想做升级,建议删掉,减少干扰。特别是[@paythree]里写着“不知名的杂草”就退出,没有任何实际奖励代码,玩家付了3万金币只换来一句废话,属于典型的半成品脚本,留着只会挨骂。
调试时打开M2的“NPC脚本日志”,玩家点一次NPC,日志里会显示当前走到了哪个标签。如果日志里完全没有这个NPC的记录,说明脚本没被加载,检查文件名、目录、NPC名字;如果日志显示停在[@main]不动,说明功能标志没接上;如果停在[@confirmupgrade],说明缺少goto或checkgold失败。
还有一个细节:升级时间。你在[~@upgradenow_ok]里写了“30分钟以后再回来”,这个时间是在M2的“武器升级设置”里控制的,不是脚本写的。脚本里这句话只是显示文本,实际等待时间以M2设置为准。如果你M2里设的是60分钟,脚本却写30分钟,玩家会按30分钟来,结果取武器时提示“工作正忙着”,就是[~@getbackupgnow_ing]那段。把两边时间对齐。
材料判定也是M2管的。你在对话里写了“需要黑铁矿、饰品、武器”,但具体要多少块、多少纯度,是在M2的升级配方里设的,脚本不用写。脚本只负责确认和跳转。如果你发现玩家明明朝包里放了矿石和饰品,还是提示“材料不够”([~@upgradenow_fail]),那就是M2里的配方要求和玩家实际放的不匹配,去M2里调,不是改脚本能解决的。
最后提醒一句,传奇的武器升级脚本是最容易出兼容问题的模块之一,因为引擎版本差异太大。你这段从结构上看是能用的,主要就三处致命伤:功能标志没接对、缺[@upgradenow]请求标签、回调标签~前缀在新引擎里不认。把这三处改了,重启M2,顾客自然就来了。

