当前位置 : 145z游戏站 | 热血传奇 | 技术教程 | 

传奇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
HOUR2222
MIN0210
#ACT
GOTO@领取奖励
#ELSESAY
攻沙时间:20~22点,领取时间:22:02~22:10
如果不是,则不能领取,如果错过,弃权处理!
<[返回]/@MAIN><[关闭]/@EXIT>

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

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

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

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

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

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

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

```
[@SHIJIAN]
#IF
HOUR2222
MIN5059
#ACT
GOTO@领取奖励
BREAK
#IF
HOUR2323
MIN0010
#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
SETVARGLOBALG2130
SAVEVARGLOBALG213..\QuestDiary\数据文件\沙城奖励.txt
```

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

```
[@领取奖励]
#IF
EQUALG2132
ISCASTLEMASTER
#ACT
MOVG2130
GAMEGOLD+88888
sendmsg0首任沙城主[%s],已经成功领取奖励88888元宝。
SAVEVARGLOBALG213..\QuestDiary\数据文件\沙城奖励.txt
BREAK
```

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

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

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

```
[@SandAttackEnd]
#IF
EQUALG800
#ACT
CALCVARGLOBAL攻沙次数+1
SAVEVARGLOBAL攻沙次数..\QuestDiary\数据文件\攻沙次数.txt
MOVG801
SENDMSG0本次攻沙结束!获胜行会可前往沙巴克奖励使者处领取奖励!
BREAK
```

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

```
[@领取奖励]
#IF
EQUALG2132
ISCASTLEMASTER
#ACT
MOVG2130
GOTO@分档发放
BREAK

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

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

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

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

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

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

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

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

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

```
[@OnCastleOwnerChange]
#IF
EQUALG2131
#ACT
MOVG2132
SAVEVARGLOBALG213..\QuestDiary\数据文件\沙城奖励.txt
SENDMSG0沙巴克城主已变更!新任城主可前往沙巴克奖励使者处领取奖励!
BREAK
```

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

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

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

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

```
[@Login]
#IF
ISNEWHUMAN
#ACT
LOADVARGLOBALG213..\QuestDiary\数据文件\沙城奖励.txt
LOADVARGLOBALG214..\QuestDiary\数据文件\沙城成员奖励.txt
LOADVARGLOBAL攻沙次数..\QuestDiary\数据文件\攻沙次数.txt
```

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

##部署验证与常见问题

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

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

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