你这个脚本最大的问题是“入口根本没接通”,不是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,顾客自然就来了。

