核心逻辑:通过HERO引擎时间判断命令控制攻沙开启,用行会占领标记记录获胜方,再在NPC脚本中添加奖励领取判断(区分首攻沙与后续攻沙奖励),全程无需手动干预,具体脚本分“自动攻沙配置”“奖励领取核心脚本”两部分,均附详细注释可直接复制使用。
第一步:前期准备与核心文件确认。需操作的核心脚本文件为QFunction-0.txt(控制攻沙时间与占领标记)和Envir/NpcDef文件夹下的自定义NPC脚本(如“沙巴克奖励使者.txt”,用于发放奖励)。先确认服务端沙巴克相关配置:打开M2Server→选项→城堡设置,核对沙巴克城堡编号(默认1)、占领行会存储变量(默认HumCastle1),确保后续脚本变量与之匹配,避免占领状态无法识别。同时记录两个关键参数:开区时间(脚本中用“开服天数”判断,无需手动填具体日期)、首攻沙奖励(10000元宝)、日常攻沙奖励(3000元宝)。
第二步:编写自动攻沙控制脚本(QFunction-0.txt中添加)。该脚本用于实现“开区4天开启首次攻沙,后续每日固定时间开启攻沙”的自动触发逻辑,添加在QFunction-0.txt文件末尾即可,脚本带详细注释,关键参数可按需调整:
#IF
CheckServerOpenDay >= 4 // 判断开服天数是否≥4天(触发首次攻沙)
CheckServerOpenDay < 5 // 限制仅开区第4天执行首次攻沙逻辑
CheckTime 20:00 22:00 // 首次攻沙时间:晚上20点-22点(可改)
#ACT
StartCastleWar 1 // 开启编号1的城堡(沙巴克)攻城战
SendMsg 2 全服通知:首次沙巴克攻城战已开启,获胜行会可获10000元宝! // 系统广播提示
SaveVar CastleWarFirst 1 // 标记首次攻沙已开启,避免重复触发
#IF
CheckServerOpenDay >= 5 // 开服5天及以后(日常攻沙)
CheckWeekDay 0-6 // 每周一到周日均开启(即每日开启)
CheckTime 20:00 22:00 // 日常攻沙时间:晚上20点-22点(可改)
#ACT
StartCastleWar 1 // 开启沙巴克攻城战
SendMsg 2 全服通知:日常沙巴克攻城战已开启,获胜行会可获3000元宝! // 系统广播提示
脚本关键命令解释:1. CheckServerOpenDay:HERO引擎自带开服天数判断命令,无需额外配置,精准匹配开区时间;2. CheckTime 20:00 22:00:设定攻沙持续时间,仅在该时间段内执行开启命令;3. StartCastleWar 1:强制开启编号1的城堡攻城战(沙巴克默认编号1);4. SaveVar CastleWarFirst 1:自定义变量标记首次攻沙已完成,避免开区第4天重复触发。
第三步:编写沙巴克占领标记脚本(QFunction-0.txt中追加)。用于记录攻沙结束后的获胜行会,确保NPC能识别哪个行会可领取奖励,同样添加在QFunction-0.txt末尾:
#IF
CheckCastleWarEnd 1 // 判断编号1的城堡(沙巴克)攻城战已结束
CheckHumCastle 1 > 0 // 确认有行会占领沙巴克(HumCastle1变量>0代表有占领行会)
#ACT
GetCastleOwner 1 S0 // 获取占领沙巴克(编号1)的行会名称,存储到变量S0
SaveVar CastleWinner <$STR(S0)> 1 // 记录当前获胜行会,标记为可领取奖励
SaveVar CastleWarEndTime <$TIME> // 记录攻沙结束时间(可选,用于后续清理标记)
SendMsg 2 恭喜行会【<$STR(S0)>】成功占领沙巴克,可到沙巴克奖励使者处领取奖励! // 全服通知获胜行会
关键说明:1. CheckCastleWarEnd 1:仅在攻沙结束后触发,避免提前记录占领状态;2. GetCastleOwner 1 S0:核心命令,获取沙巴克占领行会名称并存储到变量S0,后续NPC脚本需调用该变量;3. 变量CastleWinner:以行会名称为键值记录可领取状态,确保仅获胜行会成员能领取奖励。
第四步:编写NPC奖励领取脚本(核心重点,附两种领取模式)。在Envir/NpcDef文件夹下新建文本文档,命名为“沙巴克奖励使者.txt”(NPC名称可自定义,需与游戏中NPC名称一致),打开后编写脚本,支持“行会任意成员领取(发放到领取者)”“仅行会会长领取(发放到会长)”两种模式,按需选择一种使用即可。
模式一:行会任意成员可领取(奖励发放到领取者背包),脚本如下:
[@main]
#IF
CheckServerOpenDay <5 // 开服4天内(首次攻沙未开启)
#SAY
当前首次沙巴克攻城战尚未开启!\
开区4天晚上20点将开启首次攻沙,获胜行会奖励10000元宝!\
#IF
CheckServerOpenDay ==4 // 开区第4天(首次攻沙结束后)
CheckGuild <$VAR(CastleWinner)> // 检查领取者所在行会是否为获胜行会
CheckVar CastleWinnerReward<$GUILDNAME> 0 // 检查该行会是否未领取过首次奖励
#SAY
恭喜你所在的行会获得首次沙巴克攻城战胜利!\
点击领取10000元宝奖励!\
领取首次攻沙奖励\
#IF
CheckServerOpenDay >=5 // 开服5天及以后(日常攻沙)
CheckGuild <$VAR(CastleWinner)> // 检查领取者所在行会是否为当前获胜行会
CheckVar CastleWinnerRewardDaily<$GUILDNAME> 0 // 检查该行会是否未领取当日奖励
#SAY
恭喜你所在的行会获得本次沙巴克攻城战胜利!\
点击领取3000元宝奖励!\
领取日常攻沙奖励\
#IF
CheckVar CastleWinnerReward<$GUILDNAME> 1 // 首次奖励已领取
#SAY
你所在的行会已领取首次沙巴克奖励,请勿重复领取!\
#IF
CheckVar CastleWinnerRewardDaily<$GUILDNAME> 1 // 日常奖励已领取
#SAY
你所在的行会今日奖励已领取,明日攻沙结束后可再次领取!\
[@getFirstReward]
#ACT
GiveGold 10000 // 发放10000元宝(Gold为元宝字段,部分版本为YuanBao,需核对数据库)
SaveVar CastleWinnerReward<$GUILDNAME> 1 // 标记该行会已领取首次奖励,禁止重复领取
SendMsg 6 你已成功领取首次沙巴克奖励10000元宝! // 个人提示
[@getDailyReward]
#ACT
GiveGold 3000 // 发放3000元宝
SaveVar CastleWinnerRewardDaily<$GUILDNAME> 1 // 标记该行会今日奖励已领取
SendMsg 6 你已成功领取日常沙巴克奖励3000元宝! // 个人提示
// 每日凌晨自动清理日常奖励领取标记(避免次日无法领取)
#IF
CheckTime 00:00 00:01 // 凌晨0点-0点01分执行清理
#ACT
DelVar CastleWinnerRewardDaily* // 清空所有行会日常奖励领取标记
模式二:仅行会会长可领取(适合奖励统一发放),仅需修改[@main]中的判断条件,核心修改如下(其余脚本不变):
#IF
CheckServerOpenDay ==4 // 首次攻沙领取条件
CheckGuild <$VAR(CastleWinner)> // 所在行会为获胜行会
CheckGuildLeader // 领取者为行会会长
CheckVar CastleWinnerReward<$GUILDNAME> 0 // 未领取过奖励
#SAY
恭喜你的行会获得首次沙巴克胜利,作为会长可领取10000元宝!\
领取首次攻沙奖励\
#IF
CheckServerOpenDay >=5 // 日常攻沙领取条件
CheckGuild <$VAR(CastleWinner)> // 所在行会为获胜行会
CheckGuildLeader // 领取者为行会会长
CheckVar CastleWinnerRewardDaily<$GUILDNAME> 0 // 未领取过当日奖励
#SAY
恭喜你的行会获得本次沙巴克胜利,作为会长可领取3000元宝!\
领取日常攻沙奖励\
第五步:脚本关键参数核对与调整(避免踩坑)。1. 元宝字段确认:打开DBC数据库→物品表,查看元宝对应的字段名称,若为“YuanBao”,需将脚本中的“GiveGold”改为“GiveYuanBao”,否则奖励无法发放;2. 时间参数调整:自动攻沙时间(CheckTime)、清理日常奖励标记时间(00:00)可按需修改,格式需严格为“时:分 时:分”;3. 变量命名:所有自定义变量(如CastleWarFirst、CastleWinner)需避免与引擎默认变量重复,建议前缀统一为CastleWar相关,便于后续管理。
第六步:脚本测试与异常排查。1. 攻沙触发测试:通过M2Server→调试→执行命令,输入“SetServerOpenDay 4”(模拟开区4天),到设定时间查看是否自动开启攻沙并广播;2. 占领标记测试:手动让某行会占领沙巴克,查看变量CastleWinner是否正确记录行会名称;3. 奖励领取测试:用获胜行会成员(或会长)对话NPC,点击领取后查看背包元宝是否到账,再尝试重复领取,确认是否提示“已领取”;4. 常见问题解决:① 奖励无法领取:核对NPC名称与脚本文件名一致,检查行会名称是否正确记录到CastleWinner变量;② 重复领取:确认领取标记变量(CastleWinnerReward)是否正确保存,清理日常标记的脚本是否添加;③ 攻沙未自动开启:检查QFunction-0.txt脚本是否有语法错误(如缺少空格、符号错误),开服天数判断命令是否正确。
额外实用补充:1. 奖励拓展:若需添加实物奖励(如装备、道具),可在[@getFirstReward]或[@getDailyReward]的#ACT下追加“GiveItem 裁决之杖 1”(格式为GiveItem 物品名称 数量),物品名称需与数据库完全一致;2. 领取记录留存:可追加“WriteLog 沙巴克奖励记录 <$USERNAME> 领取<$GUILDNAME>首次攻沙奖励10000元宝”,记录保存到Logs文件夹下,便于后续核对;3. 攻沙时间提醒:可在攻沙前1小时添加广播提示,脚本示例:#IF CheckTime 19:00 19:01 #ACT SendMsg 2 沙巴克攻城战将于1小时后开启,请各行会做好准备!
综上,HERO引擎自动攻沙与NPC奖励脚本的核心是“时间判断+占领标记+领取权限控制”。按上述步骤编写脚本,确保变量、字段、NPC名称一致,就能实现需求中的奖励规则。重点关注开服天数判断、获胜行会记录、领取标记清理三个关键环节,遇到问题优先核对脚本语法和数据库字段,新手也能顺利完成配置。

