核心逻辑:通过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天执行首次攻沙逻辑
CheckTime20:0022:00//首次攻沙时间:晚上20点-22点(可改)
#ACT
StartCastleWar1//开启编号1的城堡(沙巴克)攻城战
SendMsg2全服通知:首次沙巴克攻城战已开启,获胜行会可获10000元宝!//系统广播提示
SaveVarCastleWarFirst1//标记首次攻沙已开启,避免重复触发
#IF
CheckServerOpenDay>=5//开服5天及以后(日常攻沙)
CheckWeekDay0-6//每周一到周日均开启(即每日开启)
CheckTime20:0022:00//日常攻沙时间:晚上20点-22点(可改)
#ACT
StartCastleWar1//开启沙巴克攻城战
SendMsg2全服通知:日常沙巴克攻城战已开启,获胜行会可获3000元宝!//系统广播提示
脚本关键命令解释:1.CheckServerOpenDay:HERO引擎自带开服天数判断命令,无需额外配置,精准匹配开区时间;2.CheckTime20:0022:00:设定攻沙持续时间,仅在该时间段内执行开启命令;3.StartCastleWar1:强制开启编号1的城堡攻城战(沙巴克默认编号1);4.SaveVarCastleWarFirst1:自定义变量标记首次攻沙已完成,避免开区第4天重复触发。
第三步:编写沙巴克占领标记脚本(QFunction-0.txt中追加)。用于记录攻沙结束后的获胜行会,确保NPC能识别哪个行会可领取奖励,同样添加在QFunction-0.txt末尾:
#IF
CheckCastleWarEnd1//判断编号1的城堡(沙巴克)攻城战已结束
CheckHumCastle1>0//确认有行会占领沙巴克(HumCastle1变量>0代表有占领行会)
#ACT
GetCastleOwner1S0//获取占领沙巴克(编号1)的行会名称,存储到变量S0
SaveVarCastleWinner<$STR(S0)>1//记录当前获胜行会,标记为可领取奖励
SaveVarCastleWarEndTime<$TIME>//记录攻沙结束时间(可选,用于后续清理标记)
SendMsg2恭喜行会【<$STR(S0)>】成功占领沙巴克,可到沙巴克奖励使者处领取奖励!//全服通知获胜行会
关键说明:1.CheckCastleWarEnd1:仅在攻沙结束后触发,避免提前记录占领状态;2.GetCastleOwner1S0:核心命令,获取沙巴克占领行会名称并存储到变量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)>//检查领取者所在行会是否为获胜行会
CheckVarCastleWinnerReward<$GUILDNAME>0//检查该行会是否未领取过首次奖励
#SAY
恭喜你所在的行会获得首次沙巴克攻城战胜利!\
点击领取10000元宝奖励!\
领取首次攻沙奖励\
#IF
CheckServerOpenDay>=5//开服5天及以后(日常攻沙)
CheckGuild<$VAR(CastleWinner)>//检查领取者所在行会是否为当前获胜行会
CheckVarCastleWinnerRewardDaily<$GUILDNAME>0//检查该行会是否未领取当日奖励
#SAY
恭喜你所在的行会获得本次沙巴克攻城战胜利!\
点击领取3000元宝奖励!\
领取日常攻沙奖励\
#IF
CheckVarCastleWinnerReward<$GUILDNAME>1//首次奖励已领取
#SAY
你所在的行会已领取首次沙巴克奖励,请勿重复领取!\
#IF
CheckVarCastleWinnerRewardDaily<$GUILDNAME>1//日常奖励已领取
#SAY
你所在的行会今日奖励已领取,明日攻沙结束后可再次领取!\
[@getFirstReward]
#ACT
GiveGold10000//发放10000元宝(Gold为元宝字段,部分版本为YuanBao,需核对数据库)
SaveVarCastleWinnerReward<$GUILDNAME>1//标记该行会已领取首次奖励,禁止重复领取
SendMsg6你已成功领取首次沙巴克奖励10000元宝!//个人提示
[@getDailyReward]
#ACT
GiveGold3000//发放3000元宝
SaveVarCastleWinnerRewardDaily<$GUILDNAME>1//标记该行会今日奖励已领取
SendMsg6你已成功领取日常沙巴克奖励3000元宝!//个人提示
//每日凌晨自动清理日常奖励领取标记(避免次日无法领取)
#IF
CheckTime00:0000:01//凌晨0点-0点01分执行清理
#ACT
DelVarCastleWinnerRewardDaily*//清空所有行会日常奖励领取标记
模式二:仅行会会长可领取(适合奖励统一发放),仅需修改[@main]中的判断条件,核心修改如下(其余脚本不变):
#IF
CheckServerOpenDay==4//首次攻沙领取条件
CheckGuild<$VAR(CastleWinner)>//所在行会为获胜行会
CheckGuildLeader//领取者为行会会长
CheckVarCastleWinnerReward<$GUILDNAME>0//未领取过奖励
#SAY
恭喜你的行会获得首次沙巴克胜利,作为会长可领取10000元宝!\
领取首次攻沙奖励\
#IF
CheckServerOpenDay>=5//日常攻沙领取条件
CheckGuild<$VAR(CastleWinner)>//所在行会为获胜行会
CheckGuildLeader//领取者为行会会长
CheckVarCastleWinnerRewardDaily<$GUILDNAME>0//未领取过当日奖励
#SAY
恭喜你的行会获得本次沙巴克胜利,作为会长可领取3000元宝!\
领取日常攻沙奖励\
第五步:脚本关键参数核对与调整(避免踩坑)。1.元宝字段确认:打开DBC数据库→物品表,查看元宝对应的字段名称,若为“YuanBao”,需将脚本中的“GiveGold”改为“GiveYuanBao”,否则奖励无法发放;2.时间参数调整:自动攻沙时间(CheckTime)、清理日常奖励标记时间(00:00)可按需修改,格式需严格为“时:分时:分”;3.变量命名:所有自定义变量(如CastleWarFirst、CastleWinner)需避免与引擎默认变量重复,建议前缀统一为CastleWar相关,便于后续管理。
第六步:脚本测试与异常排查。1.攻沙触发测试:通过M2Server→调试→执行命令,输入“SetServerOpenDay4”(模拟开区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小时添加广播提示,脚本示例:#IFCheckTime19:0019:01#ACTSendMsg2沙巴克攻城战将于1小时后开启,请各行会做好准备!
综上,HERO引擎自动攻沙与NPC奖励脚本的核心是“时间判断+占领标记+领取权限控制”。按上述步骤编写脚本,确保变量、字段、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天执行首次攻沙逻辑
CheckTime20:0022:00//首次攻沙时间:晚上20点-22点(可改)
#ACT
StartCastleWar1//开启编号1的城堡(沙巴克)攻城战
SendMsg2全服通知:首次沙巴克攻城战已开启,获胜行会可获10000元宝!//系统广播提示
SaveVarCastleWarFirst1//标记首次攻沙已开启,避免重复触发
#IF
CheckServerOpenDay>=5//开服5天及以后(日常攻沙)
CheckWeekDay0-6//每周一到周日均开启(即每日开启)
CheckTime20:0022:00//日常攻沙时间:晚上20点-22点(可改)
#ACT
StartCastleWar1//开启沙巴克攻城战
SendMsg2全服通知:日常沙巴克攻城战已开启,获胜行会可获3000元宝!//系统广播提示
脚本关键命令解释:1.CheckServerOpenDay:HERO引擎自带开服天数判断命令,无需额外配置,精准匹配开区时间;2.CheckTime20:0022:00:设定攻沙持续时间,仅在该时间段内执行开启命令;3.StartCastleWar1:强制开启编号1的城堡攻城战(沙巴克默认编号1);4.SaveVarCastleWarFirst1:自定义变量标记首次攻沙已完成,避免开区第4天重复触发。
第三步:编写沙巴克占领标记脚本(QFunction-0.txt中追加)。用于记录攻沙结束后的获胜行会,确保NPC能识别哪个行会可领取奖励,同样添加在QFunction-0.txt末尾:
#IF
CheckCastleWarEnd1//判断编号1的城堡(沙巴克)攻城战已结束
CheckHumCastle1>0//确认有行会占领沙巴克(HumCastle1变量>0代表有占领行会)
#ACT
GetCastleOwner1S0//获取占领沙巴克(编号1)的行会名称,存储到变量S0
SaveVarCastleWinner<$STR(S0)>1//记录当前获胜行会,标记为可领取奖励
SaveVarCastleWarEndTime<$TIME>//记录攻沙结束时间(可选,用于后续清理标记)
SendMsg2恭喜行会【<$STR(S0)>】成功占领沙巴克,可到沙巴克奖励使者处领取奖励!//全服通知获胜行会
关键说明:1.CheckCastleWarEnd1:仅在攻沙结束后触发,避免提前记录占领状态;2.GetCastleOwner1S0:核心命令,获取沙巴克占领行会名称并存储到变量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)>//检查领取者所在行会是否为获胜行会
CheckVarCastleWinnerReward<$GUILDNAME>0//检查该行会是否未领取过首次奖励
#SAY
恭喜你所在的行会获得首次沙巴克攻城战胜利!\
点击领取10000元宝奖励!\
领取首次攻沙奖励\
#IF
CheckServerOpenDay>=5//开服5天及以后(日常攻沙)
CheckGuild<$VAR(CastleWinner)>//检查领取者所在行会是否为当前获胜行会
CheckVarCastleWinnerRewardDaily<$GUILDNAME>0//检查该行会是否未领取当日奖励
#SAY
恭喜你所在的行会获得本次沙巴克攻城战胜利!\
点击领取3000元宝奖励!\
领取日常攻沙奖励\
#IF
CheckVarCastleWinnerReward<$GUILDNAME>1//首次奖励已领取
#SAY
你所在的行会已领取首次沙巴克奖励,请勿重复领取!\
#IF
CheckVarCastleWinnerRewardDaily<$GUILDNAME>1//日常奖励已领取
#SAY
你所在的行会今日奖励已领取,明日攻沙结束后可再次领取!\
[@getFirstReward]
#ACT
GiveGold10000//发放10000元宝(Gold为元宝字段,部分版本为YuanBao,需核对数据库)
SaveVarCastleWinnerReward<$GUILDNAME>1//标记该行会已领取首次奖励,禁止重复领取
SendMsg6你已成功领取首次沙巴克奖励10000元宝!//个人提示
[@getDailyReward]
#ACT
GiveGold3000//发放3000元宝
SaveVarCastleWinnerRewardDaily<$GUILDNAME>1//标记该行会今日奖励已领取
SendMsg6你已成功领取日常沙巴克奖励3000元宝!//个人提示
//每日凌晨自动清理日常奖励领取标记(避免次日无法领取)
#IF
CheckTime00:0000:01//凌晨0点-0点01分执行清理
#ACT
DelVarCastleWinnerRewardDaily*//清空所有行会日常奖励领取标记
模式二:仅行会会长可领取(适合奖励统一发放),仅需修改[@main]中的判断条件,核心修改如下(其余脚本不变):
#IF
CheckServerOpenDay==4//首次攻沙领取条件
CheckGuild<$VAR(CastleWinner)>//所在行会为获胜行会
CheckGuildLeader//领取者为行会会长
CheckVarCastleWinnerReward<$GUILDNAME>0//未领取过奖励
#SAY
恭喜你的行会获得首次沙巴克胜利,作为会长可领取10000元宝!\
领取首次攻沙奖励\
#IF
CheckServerOpenDay>=5//日常攻沙领取条件
CheckGuild<$VAR(CastleWinner)>//所在行会为获胜行会
CheckGuildLeader//领取者为行会会长
CheckVarCastleWinnerRewardDaily<$GUILDNAME>0//未领取过当日奖励
#SAY
恭喜你的行会获得本次沙巴克胜利,作为会长可领取3000元宝!\
领取日常攻沙奖励\
第五步:脚本关键参数核对与调整(避免踩坑)。1.元宝字段确认:打开DBC数据库→物品表,查看元宝对应的字段名称,若为“YuanBao”,需将脚本中的“GiveGold”改为“GiveYuanBao”,否则奖励无法发放;2.时间参数调整:自动攻沙时间(CheckTime)、清理日常奖励标记时间(00:00)可按需修改,格式需严格为“时:分时:分”;3.变量命名:所有自定义变量(如CastleWarFirst、CastleWinner)需避免与引擎默认变量重复,建议前缀统一为CastleWar相关,便于后续管理。
第六步:脚本测试与异常排查。1.攻沙触发测试:通过M2Server→调试→执行命令,输入“SetServerOpenDay4”(模拟开区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小时添加广播提示,脚本示例:#IFCheckTime19:0019:01#ACTSendMsg2沙巴克攻城战将于1小时后开启,请各行会做好准备!
综上,HERO引擎自动攻沙与NPC奖励脚本的核心是“时间判断+占领标记+领取权限控制”。按上述步骤编写脚本,确保变量、字段、NPC名称一致,就能实现需求中的奖励规则。重点关注开服天数判断、获胜行会记录、领取标记清理三个关键环节,遇到问题优先核对脚本语法和数据库字段,新手也能顺利完成配置。

