用金币升级武器、失败直接破碎、无论成败都向全服播报结果,这套逻辑在传奇服务端里用NPC脚本就能实现,不需要改动引擎源码。核心依赖两个命令:UPGRADEITEMEX负责执行属性升级并决定失败时是否破碎,SENDMSG 0负责向全服发送红色广播信息。下面把完整脚本拆开讲。
**必须开启的第一个开关:装备为0不破碎选项**
在写脚本之前,先在M2控制台里确认一个引擎设置。GOM和GEE引擎都有“装备为0不破碎”的选项,默认是勾选的。这个选项的含义是:当武器持久为0时,武器不会消失,只是变成不可用的状态。如果这个选项没勾,UPGRADEITEMEX的破碎参数执行后,武器会直接从背包里消失,而不是变成持久0的灰色状态。两种效果都是“碎”,但玩家的感受完全不同——武器直接没了,背包里空了一块,找客服都找不回来。所以先打开M2→选项→功能设置,找到升级武器相关的那一栏,确认“武器升级失败不破碎”没有勾选,同时“装备为0不破碎”要勾上。
**脚本主体结构**
脚本放在NPC的对话文件里,通常是Market_Def目录下对应NPC的txt文件。整个逻辑分四段:检测武器、检查金币、执行升级、广播结果。
**第一段:检测武器是否装备**
```plaintext
[@main]
#IF
CHECKITEMW 武器
#ACT
GOTO @检查金币
#ELSESAY
你手上没有拿武器,升级个什么?\
<关闭/@exit>
```
CHECKITEMW是检测身上是否装备了武器。如果没有武器,直接提示并结束对话。
**第二段:检查金币并扣除**
```plaintext
[@检查金币]
#IF
CHECKGOLD 100000
#ACT
TAKE 金币 100000
GOTO @执行升级
#ELSESAY
升级武器需要10万金币。\
你当前金币:<$GOLD>\
<关闭/@exit>
```
CHECKGOLD检测金币数量,TAKE扣除。这里把升级费用设成10万金币,数字可以按自己服务器的经济情况调整。
**第三段:执行升级,失败破碎**
```plaintext
[@执行升级]
#IF
RANDOM 3
#ACT
UPGRADEITEMEX 1 0 0 1 1
SENDMSG 0 ★☆★【<$USERNAME>】用金币锻造武器,攻击属性提升,升级成功!★☆★
#ELSEACT
UPGRADEITEMEX 1 0 0 1 1
SENDMSG 0 ☆★☆【<$USERNAME>】用金币锻造武器,武器承受不住力量冲击,破碎了……☆★☆
```
这段是整个脚本的核心。RANDOM 3代表三分之一概率走成功分支,三分之二概率走失败分支。UPGRADEITEMEX的参数含义:第一位1代表武器位置,第二位0代表攻击属性,第三位0代表100%成功(这里的成功率由RANDOM控制,UPGRADEITEMEX本身设成必定成功),第四位1代表每次加1点属性,第五位1代表失败后破碎。
这里有一个容易搞混的地方:RANDOM已经控制了成功和失败的分支,所以UPGRADEITEMEX的成功率参数要填0(即100%),否则会出现RANDOM判定成功但UPGRADEITEMEX自身判定失败的情况,导致玩家看到广播说成功,武器属性却没变。失败的破碎效果由UPGRADEITEMEX的第五个参数1实现,武器会变成持久0的状态留在背包里。
**升级魔法和道术的变体**
武器属性位置:0是攻击,1是魔法,2是道术。如果要做魔法升级的NPC,把UPGRADEITEMEX的第二个参数从0改成1即可:
```plaintext
UPGRADEITEMEX 1 1 0 1 1
```
道术则改成2。广播文字里的“攻击属性”对应改成“魔法属性”或“道术属性”。
**SENDMSG 0的广播格式**
SENDMSG 0是向全服发送红色广播,内容会自动显示在聊天框的系统频道里。<$USERNAME>会被替换成当前玩家的角色名。广播内容里可以写清楚升级的具体属性和数值,比如“攻击属性提升1点”,这样全服玩家都能看到谁在升级武器、成功了还是碎了。
如果需要把广播信息改成包含具体属性数值的动态内容,可以用变量。先通过脚本变量获取武器当前的攻击值,再拼进广播文字里。通用变量<$DC>代表物理攻击力,<$MC>代表魔法力,<$SC>代表道术。但<$DC>获取的是人物总攻击力,不是武器单件属性,所以更精确的做法是用GETITEMADDVALUE命令读取武器本身的附加属性值:
```plaintext
[@执行升级]
#IF
RANDOM 3
#ACT
UPGRADEITEMEX 1 0 0 1 1
GETITEMADDVALUE 1 0 <$STR(M0)>
SENDMSG 0 ★☆★【<$USERNAME>】用金币锻造武器,攻击属性提升,当前武器攻击加成:+<$STR(M0)>点,升级成功!★☆★
#ELSEACT
UPGRADEITEMEX 1 0 0 1 1
SENDMSG 0 ☆★☆【<$USERNAME>】用金币锻造武器,武器承受不住力量冲击,破碎了……☆★☆
```
GETITEMADDVALUE的第一个参数1是武器位置,第二个参数0是攻击属性,读取到的值存入变量M0,再用<$STR(M0)>调用。这样广播里就能显示玩家升级后武器实际的攻击加成数值。
**成功率、费用和上限的调整**
RANDOM后面的数字决定失败概率。RANDOM 3是三分之一成功,RANDOM 2是二分之一成功,RANDOM 5是五分之一成功。数字越大,成功率越低。如果想做80%成功率,用RANDOM 5配合#IF RANDOM 4走成功分支,剩下五分之一走失败。更精确的做法是直接用百分比判断,但多数传奇引擎的RANDOM只支持整数,所以用RANDOM 5分档控制。
升级费用通过CHECKGOLD和TAKE命令调整,把100000改成其他数字即可。
武器属性上限的控制,需要在升级前加一个检测。用CHECKITEMADDVALUE命令判断武器当前附加攻击值是否已经达到上限:
```plaintext
[@检查金币]
#IF
CHECKITEMADDVALUE 1 0 > 6
#ACT
SENDMSG 5 你的武器攻击加成已达上限,无法继续升级。
BREAK
#IF
CHECKGOLD 100000
#ACT
TAKE 金币 100000
GOTO @执行升级
#ELSESAY
升级武器需要10万金币。\
```
CHECKITEMADDVALUE 1 0 > 6的意思是武器附加攻击值大于6就阻止升级。上限设多少看服务器平衡需要,一般设5到7比较合理。
**广播内容里的属性类型和数值显示**
武器可以升级的属性有攻击、魔法、道术三种,还有幸运和诅咒。属性位置编号:0攻击、1魔法、2道术、3幸运、4诅咒、5准确、6攻击速度。做三个独立的NPC分别处理三种属性的升级,或者做一个NPC让玩家选择,用不同的GOTO跳转。
广播文字里“攻击属性提升”这个描述,如果做魔法升级NPC就改成“魔法属性提升”,道术同理。属性数值的显示用GETITEMADDVALUE读取,攻击对应参数0,魔法对应1,道术对应2。
**没有装备武器时的处理**
如果玩家身上没有武器,CHECKITEMW会返回假,脚本跳到#ELSESAY分支。这里可以用SENDMSG 5给玩家自己发一条提示,也可以用对话文字提示。建议用对话文字,玩家看得更清楚。
**升级成功后武器持久的变化**
UPGRADEITEMEX执行成功后,武器属性增加,持久不变。但如果武器本身持久很低,升级成功后武器持久归零的极端情况不会自动修复。建议在脚本里加一条检测,如果升级成功后武器持久低于5,自动补一点持久:
```plaintext
#ACT
UPGRADEITEMEX 1 0 0 1 1
REPAIRITEM 1
```
REPAIRITEM命令修复身上指定位置的装备持久,1代表武器。这样玩家升级后武器不会因为持久问题变得不可用。
**跟沙巴克武器升级的区别**
沙巴克武器升级用的是@upgradenow和@getbackupgnow这套命令,走的是引擎内置的武器升级流程,需要黑铁矿和首饰,取出武器时用随机数判定成败。本文的脚本是自建NPC升级系统,不走沙巴克流程,金币直接扣,升级立即生效,失败立即破碎。两者可以共存,但建议把自建NPC升级的成功率调得比沙巴克低一些,避免玩家绕过沙巴克的材料收集环节。
**测试脚本的步骤**
先在测试服或者单机环境跑通。创建一个NPC,把脚本贴进去,保存后用@ReloadNpc命令重新加载脚本,不用重启M2。角色拿一把垃圾武器,带够金币,点NPC测试。重点测三种情况:金币不够时能否正确提示、升级成功时广播是否正常发送、升级失败时武器是否变成持久0而不是直接消失。武器变成持久0说明“装备为0不破碎”选项生效了,如果武器直接没了,回去检查M2的那个选项。
如果广播没有发出来,检查SENDMSG 0后面有没有多余的空格或标点,以及NPC脚本文件的编码是否为ANSI。编码不对会导致中文乱码,广播内容显示成问号。
传奇金币升级武器脚本编写:失败破碎与全区广播提示完整实现方案
来源:
作者:
点击:

