沙城服务员脚本的核心逻辑围绕三个判断展开:玩家是否为沙城城主或成员、是否在允许领取的时间段内、是否已经领取过奖励。Hero引擎提供了ISCASTLEMASTER、ISCASTLEGUILD、CHECKGUILDLIST等专属命令来处理这些判断。以下脚本可直接使用,适用于Hero引擎的攻城奖励自动发放系统。
## 完整脚本代码
脚本文件放在`Mir200\Envir\Market_Def\`目录下,命名为沙城奖励-3.txt。NPC配置行写入`Mir200\Envir\Merchant.txt`:
```plaintext
沙城奖励 3 330 320 沙城奖励使者 0 8 0 0 0
```
其中3为盟重省地图编号,330和320为NPC坐标,8为外观代码。
脚本主体如下:
```plaintext
[@Main]
#IF
EQUAL G262 1
#SAY
\-------------<$SERVERNAME>攻城奖励自动发放系统-----------
每日攻城结束后10点-10点10分可在我这里领取攻城奖励
<过时不候!>
沙巴克行会只有1个老大领取奖励
<领取奖励/@领取>
#elsesay
\-------------<$SERVERNAME>攻城奖励自动发放系统-----------
每日攻城结束后10点-10:15分可在我这里领取攻城奖励
<过时不候!>
沙巴克行会只有1个老大领取奖励
<领取攻沙奖励/@领取>
:时间未到,未开启
[@领取]
#IF
ISCASTLEMASTER
#ACT
goto @检测沙老大完成
#ELSESAY
你不是沙城老大!
[@检测沙老大完成]
#IF
CHECKGUILDLIST ..\QuestDiary\数据文件\领取元宝.txt
#SAY
靠!领取了还领!找死啊!
#elseact
Goto @检测时间
[@检测时间]
#IF
EQUAL A70 老区
HOUR 22 24
#ACT
Gamegold + 100000
ADDGUILDLIST ..\QuestDiary\数据文件\领取元宝.txt
sendmsg 0 沙巴克城主已经领取攻城奖励1万元宝!
#IF
EQUAL A70
HOUR 22 24
#ACT
Gamegold + 100000
mov A70 老区
ADDGUILDLIST ..\QuestDiary\数据文件\领取元宝.txt
sendmsg 0 沙巴克城主已经领取攻城奖励1万元宝!
```
这段脚本的核心逻辑是:主标签通过全局变量G262判断攻城活动是否已结束。G262等于1时活动已结束,允许领取;否则显示时间未到。领取环节先通过ISCASTLEMASTER确认玩家是沙城城主,再通过CHECKGUILDLIST检查行会是否已经在领奖名单中。两个条件都满足后,通过GAMEGOLD命令发放元宝,通过ADDGUILDLIST将行会名写入名单文件,防止重复领取。
## 关键命令逐一解析
**ISCASTLEMASTER**检测当前玩家是否为沙巴克城主。这个命令在Hero引擎中直接可用,格式简单,不跟任何参数。检测通过后执行ACT段,不通过走ELSESAY。
**ISCASTLEGUILD**检测玩家是否为沙巴克行会成员。城主和成员的区别在于,城主是行会的掌门人,成员是行会内的普通角色。如果奖励需要同时覆盖城主和成员,用这个命令做二次判断。
**CHECKGUILDLIST**检测当前玩家所在行会是否在指定的行会列表文件中。参数为文件路径,通常放在`..\QuestDiary\数据文件\`目录下。文件每行写一个行会名称,引擎读取后与玩家当前行会名比对。如果文件中已有该行会名,说明这个行会已经领取过奖励,检测结果为真。
**ADDGUILDLIST**将当前玩家所在行会的名称追加写入指定文件。执行这个命令后,该行会的名字会出现在文件中,下次用CHECKGUILDLIST检测时就会返回真,从而实现防重复领取。
**GAMEGOLD +** 为玩家增加元宝。格式为`GAMEGOLD + 数量`,数量写纯数字,不要带货币单位。
**HOUR**检测当前小时数,格式为`HOUR 起始值 结束值`。HOUR 22 24表示当前时间在22点到24点之间。MIN命令类似,检测分钟数。两个命令配合使用可以精确控制领取时间段。
## 区分新区和老区的奖励脚本
如果服务端同时运行新区和老区,需要分别设置奖励金额,可以用全局变量A70记录当前区域标记。以下脚本在领取时先判断A70的值,新区和老区走不同的发放逻辑:
```plaintext
[@领取]
#IF
ISCASTLEMASTER
#ACT
goto @检测沙老大完成
#ELSESAY
你不是沙城老大!
[@检测沙老大完成]
#IF
CHECKGUILDLIST ..\QuestDiary\数据文件\领取元宝.txt
#SAY
靠!领取了还领!找死啊!
#elseact
Goto @检测时间
[@检测时间]
#IF
EQUAL A70 老区
HOUR 22 24
#ACT
Gamegold + 100000
ADDGUILDLIST ..\QuestDiary\数据文件\领取元宝.txt
sendmsg 0 沙巴克城主已经领取攻城奖励1万元宝!
#IF
EQUAL A70 新区
HOUR 22 24
#ACT
Gamegold + 88888
ADDGUILDLIST ..\QuestDiary\数据文件\领取元宝.txt
sendmsg 0 沙巴克城主已经领取攻城奖励88888元宝!
mov A70 老区
```
新区第一次领取后将A70设为老区,后续该区就按老区的标准发放。这个设计适合开区时间不同的多个区共用同一套脚本文件的场景。
## 沙巴克成员每日福利脚本
如果奖励不只覆盖城主,而是面向所有沙巴克成员,可以用ISCASTLEGUILD做判断,结合日期变量实现每日领取:
```plaintext
[@成员福利]
#IF
ISCASTLEGUILD
CHECKLEVELEX > 39
EQUAL G0 <$DATE>
#SAY
你今天已经领取过沙城福利了,明天再来。
<返回/@main>
#IF
ISCASTLEGUILD
CHECKLEVELEX > 39
#ACT
GAMEGOLD + 10
MOV G0 <$DATE>
SENDMSG 0 沙巴克成员[%s]领取了今日沙城福利10元宝!
#SAY
你领取了今日沙城福利10元宝。
<返回/@main>
#ELSESAY
你不是沙巴克成员,或者等级不足40级。
<返回/@main>
```
<$DATE>是引擎内置的日期变量,返回格式为年月日。G0变量记录上次领取的日期,如果G0不等于今天的日期,说明今天还没领过,允许发放并更新G0。如果G0已经等于今天的日期,说明今天已经领过了。
## 沙巴克成员会员证明领取脚本
会员证明是一次性奖励,每个角色只能领取一次,不需要日期判断,用一个持久变量做标记即可:
```plaintext
[@领取会员证明]
#IF
ISCASTLEGUILD
CHECKLEVELEX > 59
EQUAL P0 0
#ACT
GIVE 会员证明 1
MOV P0 1
SENDMSG 0 沙巴克成员[%s]领取了会员证明!
#SAY
你领取了会员证明,荣誉属于沙巴克。
<返回/@main>
#ELSESAY
领取条件不符:需沙巴克成员,等级60级以上,且未领取过。
<返回/@main>
```
P0是个人持久变量,跟随角色保存,玩家下线后重新登录仍然保留。0表示未领取,1表示已领取。EQUAL P0 0检测变量当前值是否为0,如果为0说明还没领过,执行发放后将P0设为1,下次再来检测就不通过了。
## NPC配置与文件路径
沙城服务员的NPC配置写在`Mir200\Envir\Merchant.txt`中,格式为一行一个NPC:
```plaintext
沙城奖励 3 330 320 沙城奖励使者 0 8 0 0 0
```
第一个字段“沙城奖励”是脚本文件名去掉后缀的部分。第二个字段3是盟重省的地图编号。330和320是NPC在盟重省中的坐标。第四个字段是NPC在游戏里显示的名字。第五个字段0是NPC面朝方向。第六个字段8是外观代码,不同数字对应不同形象。后面几个0分别表示是否属于沙城NPC、是否自动移动、移动间隔和变色速度,默认写0即可。
脚本文件放在`Mir200\Envir\Market_Def\`目录下,文件名为沙城奖励-3.txt。后缀-3对应盟重省的地图编号,如果NPC放在其他地图,后缀要改成对应地图的编号。文件编码使用ANSI,不要存成UTF-8,否则中文字符可能显示异常。
## 攻城状态控制与定时器
沙城服务员脚本依赖一个全局变量来判断攻城是否结束。以G262为例,这个变量由攻城控制脚本在攻城结束时设置。攻城脚本放在`Mir200\Envir\QuestDiary\`目录下的自动攻沙脚本中,通常在攻城开始前将G262设为0,攻城结束后设为1。
定时攻沙的触发写在`Mir200\Envir\Robot.txt`文件中:
```plaintext
#AutoRun NPC RUNONDAY 19:55 @自动攻沙
#AutoRun NPC RUNONDAY 22:00 @结束攻沙战
```
第一行在每天19:55触发@自动攻沙标签,开启攻城。第二行在每天22:00触发@结束攻沙战标签,结束攻城并将G262设为1,允许玩家领取奖励。
攻城结束的脚本写在RobotManage.txt中:
```plaintext
[@结束攻沙战]
#IF
EQUAL G80 1
#ACT
SetCastleWar 0
MOV G262 1
SENDMSG 0 攻城已结束,请沙巴克城主到沙城服务员处领取奖励。
```
SetCastleWar 0关闭攻城状态,MOV G262 1设置领取标记,玩家看到公告后前往NPC处领取。
## 调试与常见问题
点击NPC没有任何反应,首先检查Merchant.txt中的脚本名称与Market_Def目录下的文件名是否一致。地图3的NPC,脚本文件名必须是沙城奖励-3.txt,后缀不对引擎找不到脚本。
领取时提示“你不是沙城老大”,检查玩家是否确实是当前沙巴克行会的掌门人。ISCASTLEMASTER检测的是行会掌门人身份,普通成员无法通过这个检测。如果需要成员也能领取,把ISCASTLEMASTER换成ISCASTLEGUILD。
领取成功但元宝没有到账,检查GAMEGOLD命令后面是否写了正确的数量。数量必须是正整数,不要写单位。如果元宝扣除后没有增加,可能是引擎版本不支持GAMEGOLD命令,确认Hero引擎版本是否为最新版。
防重复领取失效,玩家换行会掌门人后再次领取,这是CHECKGUILDLIST的正常行为。这个命令检测的是行会名称,如果行会名称没变但掌门人换了,检测仍然会拦截。但如果玩家把行会名改了或者换了一个新行会当掌门,检测就会失效。更严格的防重复方案是同时记录行会名和角色名,用CHECKNAMELIST配合CHECKGUILDLIST双重检测。
时间判断不生效,HOUR命令的参数必须是24小时制,下午2点要写14而不是2。如果服务器时区与游戏内时间不一致,在M2控制台的参数设置中调整时间偏移。MIN命令的参数范围是0到59,超出范围的值引擎不会正确解析。
传奇Hero引擎沙城服务员脚本完整范例与配置解析
来源:
作者:
点击:

