传奇Hero引擎占领沙城领取奖励脚本编写与时间变量配置

来源: 作者: 点击:
沙城奖励脚本的核心逻辑是攻城结束后由沙巴克城主前往指定NPC处领取奖励,整个过程依赖时间窗口检测、城主身份验证、全局变量记录和领取状态锁定四个环节。Hero引擎的脚本命令与GOM存在差异,变量系统使用HUMAN和GLOBAL两种作用域,时间判断使用HOUR和MIN命令,城主检测使用ISCASTLEMASTER命令。以下从完整脚本范例入手,逐段拆解编写方法。

## 基础领取NPC脚本完整范例

在Market_Def目录下新建NPC脚本文件,写入以下内容:

```
[@main]
我可是只为沙巴克成员服务的哦。请当天晚上攻完沙10-11点之间来领取
<沙城争霸首任沙城主领88888元宝奖/@首任沙城主领奖>点击领取
<沙成员每天奖励/@成员奖励>
<关闭选单/@EXIT>

[@首任沙城主领奖]
#IF
ISCASTLEMASTER
#ACT
GOTO @SHIJIAN
#ELSESAY
对不起,无法领取奖励,原因可能如下:
1、你不是沙城主
2、当前还没有攻沙
<[返回]/@MAIN> <[关闭]/@EXIT>

[@SHIJIAN]
#IF
HOUR 22 22
MIN 02 10
#ACT
GOTO @领取奖励
#ELSESAY
攻沙时间:20~22点,领取时间:22:02~22:10
如果不是,则不能领取,如果错过,弃权处理!
<[返回]/@MAIN> <[关闭]/@EXIT>

[@领取奖励]
#IF
EQUAL G213 2
ISCASTLEMASTER
#ACT
MOV G213 0
GAMEGOLD + 88888
sendmsg 0 首任沙城主[%s],已经成功领取奖励88888元宝。
sendmsg 0 首任沙城主[%s],已经成功领取奖励88888元宝。
BREAK
CLOSE
#ELSESAY
攻沙奖励已经被领走!如果不是你领的,那就是另外一个沙主领的!
<[返回]/@MAIN> <[关闭]/@EXIT>
```

这段脚本的结构参考了同类沙城领取脚本的通用写法。进入[@main]后展示领取入口,[@首任沙城主领奖]段通过ISCASTLEMASTER检测玩家是否为沙巴克城主,非城主直接弹出提示。[@SHIJIAN]段使用HOUR 22 22和MIN 02 10组合检测当前时间是否在22:02至22:10之间。HOUR 22 22表示小时等于22,MIN 02 10表示分钟在02到10之间,两个条件同时满足才允许领取。[@领取奖励]段通过EQUAL G213 2检测全局变量G213的值是否为2,值为2表示奖励尚未被领取,执行领取后MOV G213 0将变量归零,防止重复领取。

## 时间窗口检测的精确控制

Hero引擎的时间检测命令HOUR和MIN是沙城奖励脚本的关键。HOUR的格式为“HOUR 起始值 结束值”,MIN同理。如果需要设置领取窗口为22:02至22:10,则需要同时满足小时等于22且分钟在2到10之间。

部分版本需要将领取时间设置在攻城结束后立即开放,使用以下写法:

```
[@SHIJIAN]
#IF
HOUR 22 22
MIN 00 10
#ACT
GOTO @领取奖励
#ELSESAY
攻沙已在22:00结束,领取时间:22:00~22:10
<[返回]/@MAIN> <[关闭]/@EXIT>
```

如果版本需要跨小时检测,比如22:50至23:10,需要拆分为两个条件段:

```
[@SHIJIAN]
#IF
HOUR 22 22
MIN 50 59
#ACT
GOTO @领取奖励
BREAK
#IF
HOUR 23 23
MIN 00 10
#ACT
GOTO @领取奖励
BREAK
#ELSESAY
领取时间:22:50~23:10
<[返回]/@MAIN> <[关闭]/@EXIT>
```

## 全局变量记录与防重复领取

沙城奖励脚本使用全局变量记录领取状态。G213是Hero引擎常用的全局变量之一,值为0表示未领取,值为1或2表示已领取。变量声明需要在变量配置文件中完成。

在M2Server的变量配置中声明全局变量:

```
[GlobalVar]
G213=0
```

初始化脚本放在QManage.txt的[@Login]段中,确保服务器启动时变量状态正确:

```
[@Login]
#IF
ISNEWHUMAN
#ACT
SETVAR GLOBAL G213 0
SAVEVAR GLOBAL G213 ..\QuestDiary\数据文件\沙城奖励.txt
```

在领取脚本中修改和保存变量:

```
[@领取奖励]
#IF
EQUAL G213 2
ISCASTLEMASTER
#ACT
MOV G213 0
GAMEGOLD + 88888
sendmsg 0 首任沙城主[%s],已经成功领取奖励88888元宝。
SAVEVAR GLOBAL G213 ..\QuestDiary\数据文件\沙城奖励.txt
BREAK
```

MOV命令将变量值设为0,SAVEVAR将修改后的变量值写入文件。Hero引擎的GLOBAL变量需要使用CALCVAR命令进行加减操作,格式为“CALCVAR GLOBAL 变量名 + 数值”。如果需要累加攻城次数,可以使用CALCVAR GLOBAL 攻城次数 + 1。

## 区分首次攻沙与日常攻沙的分档奖励

开区首次攻沙和后续每日攻沙的奖励额度需要区分。在攻城结束触发脚本中设置奖励档位:

```
[@SandAttackEnd]
#IF
EQUAL G80 0
#ACT
CALCVAR GLOBAL 攻沙次数 + 1
SAVEVAR GLOBAL 攻沙次数 ..\QuestDiary\数据文件\攻沙次数.txt
MOV G80 1
SENDMSG 0 本次攻沙结束!获胜行会可前往沙巴克奖励使者处领取奖励!
BREAK
```

在NPC领取脚本中根据攻沙次数分档发放:

```
[@领取奖励]
#IF
EQUAL G213 2
ISCASTLEMASTER
#ACT
MOV G213 0
GOTO @分档发放
BREAK

[@分档发放]
#IF
CHECKVAR GLOBAL 攻沙次数 = 1
#ACT
GAMEGOLD + 10000
SENDMSG 0 首任沙城主[%s]领取首次攻沙奖励10000元宝!
SAVEVAR GLOBAL G213 ..\QuestDiary\数据文件\沙城奖励.txt
BREAK
#IF
CHECKVAR GLOBAL 攻沙次数 > 1
#ACT
GAMEGOLD + 3000
SENDMSG 0 沙城主[%s]领取日常攻沙奖励3000元宝!
SAVEVAR GLOBAL G213 ..\QuestDiary\数据文件\沙城奖励.txt
BREAK
```

## 行会成员奖励与城主奖励分离

部分版本需要城主和普通行会成员都能领取奖励,但额度不同。在[@main]中增加成员领取入口:

```
[@main]
我可是只为沙巴克成员服务的哦。
<沙城争霸首任沙城主领88888元宝奖/@首任沙城主领奖>点击领取
<沙成员每天奖励/@成员奖励>
<关闭选单/@EXIT>

[@成员奖励]
#IF
CHECKCASTLESTATE 1 1
#ELSEACT
MESSAGEBOX 你不是沙巴克成员,无法领取奖励!
BREAK
#IF
HOUR 22 22
MIN 02 10
#ACT
GOTO @成员领取
#ELSESAY
领取时间:22:02~22:10
<[返回]/@MAIN>

[@成员领取]
#IF
EQUAL G214 2
#ACT
MOV G214 0
GAMEGOLD + 1000
SENDMSG 0 沙巴克成员[%s]领取了每日奖励1000元宝。
SAVEVAR GLOBAL G214 ..\QuestDiary\数据文件\沙城成员奖励.txt
BREAK
#ELSESAY
今日奖励已被领取!
<[返回]/@MAIN>
```

CHECKCASTLESTATE 1 1检测当前玩家是否属于沙巴克占领行会,第一个1代表沙巴克城堡编号,第二个1代表已占领状态。城主和成员使用独立的全局变量记录领取状态,G213记录城主领取,G214记录成员领取,两者互不影响。

## 攻城结束自动触发脚本

在QFunction-0.txt中添加攻城结束监听标签,攻城结束时自动设置领取标志:

```
[@OnCastleOwnerChange]
#IF
EQUAL G213 1
#ACT
MOV G213 2
SAVEVAR GLOBAL G213 ..\QuestDiary\数据文件\沙城奖励.txt
SENDMSG 0 沙巴克城主已变更!新任城主可前往沙巴克奖励使者处领取奖励!
BREAK
```

Hero引擎的沙巴克易主触发标签为[@OnCastleOwnerChange]或[@GetCastle],具体标签名取决于引擎版本。部分版本使用[@SabukVictory]标签在沙巴克易主时自动触发。如果标签不生效,需要在M2控制台的攻城设置中勾选“攻城结束后触发自定义脚本”,并确认脚本文件名与QFunction-0.txt中的标签对应。

## 变量存储路径与持久化

Hero引擎的SAVEVAR命令路径写法需要特别注意。推荐使用“..\QuestDiary\数据文件\”的相对路径格式。变量文件需要手动创建目录,确保引擎对该目录有读写权限。SAVEVAR的路径如果写错,变量数据无法正常保存,玩家下线再上线后领取状态会恢复为初始值。

变量的加载在[@Login]段中完成:

```
[@Login]
#IF
ISNEWHUMAN
#ACT
LOADVAR GLOBAL G213 ..\QuestDiary\数据文件\沙城奖励.txt
LOADVAR GLOBAL G214 ..\QuestDiary\数据文件\沙城成员奖励.txt
LOADVAR GLOBAL 攻沙次数 ..\QuestDiary\数据文件\攻沙次数.txt
```

LOADVAR在玩家每次上线时从文件读取变量值,SAVEVAR在变量修改后立即写入。两个命令配对使用,确保数据不会因服务端异常关闭而丢失。

## 部署验证与常见问题

脚本文件放入Market_Def目录后,在M2控制台执行重新加载所有NPC。用一个沙巴克城主角色测试完整流程:不在领取时间段内与NPC对话,确认是否正确提示时间范围;在领取时间段内再次对话,确认是否正常发放元宝;领取后再次对话,确认是否提示奖励已被领取;下线再上线后再次对话,确认领取状态是否保持。

如果城主无法领取但提示条件不满足,检查ISCASTLEMASTER命令是否被正确识别。部分Hero引擎版本需要配合CHECKCASTLESTATE命令使用,ISCASTLEMASTER只检测角色是否为城主,CHECKCASTLESTATE检测行会归属。如果奖励可以无限领取,检查MOV G213 0是否在领取脚本中正确执行,以及SAVEVAR是否正常写入文件。G213的值在领取后必须从2变为0,如果保持为2则每次都通过EQUAL G213 2检测,导致重复领取。

变量文件编码需要保持ANSI格式,Hero引擎对UTF-8编码的变量文件解析可能异常,导致LOADVAR读取失败。如果变量值在重启后丢失,检查M2控制台是否启用了“全局变量持久化存储”选项,以及变量文件路径是否存在拼写错误。