传奇冲级奖励脚本变量修改与NPC配置完整教程

来源: 作者: 点击:
冲级奖励脚本的核心是两套变量的配合。全局数字变量G控制每个等级段的名额总数和已领取数量,个人逻辑变量[xxx]标记单个角色是否已领取。理解这两套变量的分工,修改起来就不会出错。

## 完整脚本范例

以下脚本适用于Hero、GOM等主流引擎,放在`Mir200\Envir\Market_Def\`目录下,文件名为冲级奖励-3.txt。NPC配置行写入`Mir200\Envir\MerChant.txt`:

```plaintext
冲级奖励 3 341 335 冲级奖励 0 8 0 0 0
```

脚本主体:

```plaintext
[@main]
#IF
CHECKLEVELEX < 999999
#ACT
MESSAGEBOX 暂未开放
BREAK

#IF
EQUAL G470 1
#ACT
OpenBigDialogBox
#SAY
<╔──────────────────────────────╗/SCOLOR=254>\
<│ 新区冲级奖励 │/SCOLOR=254>\
<│ │/SCOLOR=254>\
<│ 50级奖励:500元宝 总名额[100] 已领[<$STR(G480)>] 剩余[<$STR(G470)>] │/SCOLOR=254>\
<│ <点击领取/@50级> │/SCOLOR=254>\
<│ │/SCOLOR=254>\
<│ 70级奖励:1000元宝 总名额[50] 已领[<$STR(G481)>] 剩余[<$STR(G471)>] │/SCOLOR=254>\
<│ <点击领取/@70级> │/SCOLOR=254>\
<│ │/SCOLOR=254>\
<│ 90级奖励:屠龙 总名额[10] 已领[<$STR(G482)>] 剩余[<$STR(G472)>] │/SCOLOR=254>\
<│ <点击领取/@90级> │/SCOLOR=254>\
<╚──────────────────────────────╝/SCOLOR=254>\
<返回/@exit>\

#ELSESAY
<╔──────────────────────────────╗/SCOLOR=254>\
<│ 新区冲级奖励 │/SCOLOR=254>\
<│ │/SCOLOR=254>\
<│ 50级奖励:500元宝 总名额[100] 已领[<$STR(G480)>] 剩余[<$STR(G470)>] │/SCOLOR=254>\
<│ <点击领取/@50级> │/SCOLOR=254>\
<│ │/SCOLOR=254>\
<│ 70级奖励:1000元宝 总名额[50] 已领[<$STR(G481)>] 剩余[<$STR(G471)>] │/SCOLOR=254>\
<│ <点击领取/@70级> │/SCOLOR=254>\
<│ │/SCOLOR=254>\
<│ 90级奖励:屠龙 总名额[10] 已领[<$STR(G482)>] 剩余[<$STR(G472)>] │/SCOLOR=254>\
<│ <点击领取/@90级> │/SCOLOR=254>\
<╚──────────────────────────────╝/SCOLOR=254>\

#ACT
MOV G470 1
MOV G471 50
MOV G472 10
MOV G480 0
MOV G481 0
MOV G482 0
GOTO @main

[@50级]
#IF
CHECKLEVELEX < 50
#ACT
MESSAGEBOX 你的等级不足50级,无法领取该奖励。
BREAK

#IF
check [480] 0
#ACT
#ELSEACT
MESSAGEBOX 你已经领取过50级冲级奖励了。
BREAK

#IF
EQUAL G470 0
#ACT
MESSAGEBOX 50级奖励名额已满,无法再领取。
BREAK

#ACT
gamegold + 500
INC G480 1
DEC G470 1
SET [480] 1
SendCenterMsg 253 0 伟大的勇士[%s]顺利冲到50级,获得奖励:500元宝!剩余名额[<$STR(G470)>]名。
CLOSE

[@70级]
#IF
CHECKLEVELEX < 70
#ACT
MESSAGEBOX 你的等级不足70级,无法领取该奖励。
BREAK

#IF
check [481] 0
#ACT
#ELSEACT
MESSAGEBOX 你已经领取过70级冲级奖励了。
BREAK

#IF
EQUAL G471 0
#ACT
MESSAGEBOX 70级奖励名额已满,无法再领取。
BREAK

#ACT
gamegold + 1000
INC G481 1
DEC G471 1
SET [481] 1
SendCenterMsg 253 0 伟大的勇士[%s]顺利冲到70级,获得奖励:1000元宝!剩余名额[<$STR(G471)>]名。
CLOSE

[@90级]
#IF
CHECKLEVELEX < 90
#ACT
MESSAGEBOX 你的等级不足90级,无法领取该奖励。
BREAK

#IF
check [482] 0
#ACT
#ELSEACT
MESSAGEBOX 你已经领取过90级冲级奖励了。
BREAK

#IF
EQUAL G472 0
#ACT
MESSAGEBOX 90级奖励名额已满,无法再领取。
BREAK

#ACT
GIVE 屠龙 1
INC G482 1
DEC G472 1
SET [482] 1
SendCenterMsg 253 0 伟大的勇士[%s]顺利冲到90级,获得奖励:屠龙!剩余名额[<$STR(G472)>]名。
CLOSE
```

## 两套变量的分工机制

这个脚本使用了两类变量,各管各的事。

全局数字变量G负责控制名额。脚本中用G470记录50级奖励的剩余名额,G471记录70级奖励的剩余名额,G472记录90级奖励的剩余名额。同时用G480、G481、G482分别记录已领取人数。每次有玩家领取,对应名额变量减1,已领取变量加1。

个人逻辑变量[xxx]负责防止单个角色重复领取。脚本中用[480]、[481]、[482]分别标记玩家是否已领取过50级、70级、90级的奖励。初始值为0,领取后设为1,每次领取前检测该变量是否为0。

这两套变量的分工很明确:G变量管的是“这个奖励还有没有名额”,个人变量管的是“这个玩家有没有领过”。两个条件都通过才能成功领取。

主菜单最前面有一个判断段`#IF CHECKLEVELEX < 999999`,这是用等级判断来控制活动是否开放的开关。这个条件如果成立,说明活动未开放,直接弹窗提示。修改这个等级值就能控制冲级奖励的开放时机。

第一次打开NPC时,脚本通过`MOV`命令初始化所有变量。G470到G472和G480到G482这些变量名可以根据版本需要自由修改,只要不与服务器中其他脚本已使用的G变量冲突即可。G变量从G0到G99可用,建议每个活动分配10到20个连续编号,方便管理。

## 等级检测命令的选择

脚本中用的`CHECKLEVELEX`是精确等级检测命令,支持大于、小于、等于三种比较方式。

`CHECKLEVELEX < 50`表示等级小于50时执行弹窗提示,`CHECKLEVELEX > 49`表示等级大于49时条件成立。两个写法效果相同,但`CHECKLEVELEX < 50`配合`MESSAGEBOX`提示等级不足的写法更直观,先检测不满足的情况再处理满足的情况。

如果希望等级达到即可领取,不管超出多少级,用`CHECKLEVELEX > 49`即可。如果要精确限制只有某个等级的玩家能领,用`CHECKLEVELEX = 50`。但冲级奖励通常不需要精确限制等级,玩家超过50级后仍然可以领取50级的奖励,所以用大于检测更合理。

需要注意`CHECKLEVEL`和`CHECKLEVELEX`的区别。`CHECKLEVEL 50`表示等级大于等于50,`CHECKLEVELEX = 50`表示等级精确等于50。冲级奖励场景中建议统一使用`CHECKLEVELEX`,避免不同引擎对边界值处理的差异。

## 修改奖励等级和物品

修改奖励等级只需要改两个地方。把NPC对话文字中的“50级奖励”改成需要的等级,再把`CHECKLEVELEX < 50`中的数字改成对应的等级。注意两个地方的数字要同步修改,否则会出现显示与实际不符的情况。

修改奖励物品时,元宝奖励用`gamegold + 数量`,物品奖励用`GIVE 物品名 数量`。物品名称必须与StdItems.DB数据库中的Name字段完全一致,包括括号和空格。如果数据库中物品名是“屠龙”而脚本中写成了“屠龙刀”,GIVE命令会执行失败。

修改名额数量需要改三处。主菜单对话中的“总名额[100]”文字、`MOV G470 100`中的数字、以及领取标签中`EQUAL G470 0`的判断不需要改。总名额存储在`MOV G470 数值`中,修改这个数值即可调整总名额。建议把对话中的显示数字和`MOV`中的数值同步修改。

## 去掉名额限制的方法

有些版本不希望冲级奖励有名额限制,所有达到等级的玩家都能领取。去掉名额限制只需要两步。

第一步,把领取标签中检测名额的代码段删除。以50级领取标签为例,删掉这段:

```plaintext
#IF
EQUAL G470 0
#ACT
MESSAGEBOX 50级奖励名额已满,无法再领取。
BREAK
```

第二步,把主菜单对话中显示名额的文字去掉或改为“无限制”。比如把`总名额[100] 已领[<$STR(G480)>] 剩余[<$STR(G470)>]`改为`名额无限制`。

修改完成后,在M2控制台点击“控制”,选择“重新加载”,再点击“重新加载所有NPC”即可生效。这一步是必须的,不重新加载NPC脚本修改不会生效。

## 变量重置与活动开区

冲级奖励通常在开区时启动,需要重置所有相关变量。在`Mir200\Envir\Robot_def\RobotManage.txt`中添加重置脚本,或者直接在NPC脚本中加入一个GM专用的重置入口。

```plaintext
[@重置冲级奖励]
#IF
ISADMIN
#ACT
MOV G470 100
MOV G471 50
MOV G472 10
MOV G480 0
MOV G481 0
MOV G482 0
SENDMSG 6 冲级奖励变量已重置。
```

`ISADMIN`检测当前玩家是否为GM,只有GM才能执行重置操作。在游戏中使用GM命令`@reloadnpc`重新加载NPC脚本后,用GM账号点击NPC中的重置选项即可完成变量初始化。

也可以用RobotManage实现开区自动重置。在`AutoRunRobot.txt`中添加定时触发:

```plaintext
#AutoRun NPC RUNONDAY 00:00 @重置冲级变量
```

然后在`RobotManage.txt`中添加对应的处理标签:

```plaintext
[@重置冲级变量]
#ACT
MOV G470 100
MOV G471 50
MOV G472 10
MOV G480 0
MOV G481 0
MOV G482 0
```

这样每天0点自动重置所有冲级奖励变量,适合每天开新区的版本。

## 常见问题排查

玩家达到等级但领取时提示名额已满。检查对应G变量的值是否已经为0。在M2控制台的“管理”→“全局变量”中可以查看所有G变量的当前值。如果确实已经为0,说明名额用完了,重置变量即可。

玩家领取一次后再次领取仍然能成功。检查个人变量[480]的`SET [480] 1`是否在领取成功后的`#ACT`段中正确执行。常见错误是`SET`命令写在了`#SAY`段而不是`#ACT`段,导致变量没有被设置。另外确认`check [480] 0`的检测和`SET [480] 1`的赋值使用的是同一个变量编号。

NPC对话中显示“已领[<$STR(G480)>]”但数字不更新。检查`INC G480 1`是否在`#ACT`段中正确执行。`INC`命令给变量加1,`DEC`命令给变量减1,写反了会导致数字异常。`<$STR(变量名)>`用于在对话中显示变量当前值,变量名必须与脚本中使用的名称完全一致。

修改脚本后点击NPC没有变化。修改NPC脚本后必须在M2控制台执行“重新加载所有NPC”,否则引擎读的还是旧脚本。部分版本中还需要同时重新加载全局变量,在M2的“控制”菜单中找到“重新加载全局变量”并执行。

活动未开放但玩家能看到奖励列表。主菜单的`CHECKLEVELEX < 999999`条件中,999999是一个几乎不可能达到的等级,所以条件永远不成立,脚本会走`#ELSESAY`分支显示奖励列表。如果要关闭活动,把这个数字改成实际可达的等级,比如`CHECKLEVELEX < 50`,50级以下玩家看到的是“暂未开放”,50级以上玩家走`#IF`分支进入活动逻辑。

不同引擎对G变量的支持数量不同。部分老版本引擎的G变量只到G99,如果服务器中已经有大量脚本使用了G变量,需要检查目标编号是否被占用。在M2控制台的全局变量管理中可以查看所有已使用的G变量及其当前值,选择一个未被占用的编号使用。