沙城老兵申请攻城脚本核心是实现“行会会长触发NPC对话→校验申请条件→提交申请→系统记录→公告播报”的闭环,依赖传奇服务端脚本文件(Dialog.txt、QFunction-0.txt)与变量存储,以下是通用完整编写方案,适配主流服务端引擎。
一、脚本核心逻辑与前置准备
1.核心逻辑拆解
玩家(行会会长)与沙城老兵(NPC)对话→选择“申请攻城”选项→脚本校验条件(是否为会长、行会等级、申请金币、申请间隔、当前是否有攻城申请)→校验通过则扣除金币、记录申请信息(行会名、申请时间、攻城时间)→发送全服公告→校验失败则返回失败提示。
2.前置准备
(1)确认关键标识:沙城老兵NPCID(默认常用601,以自身服务端Npc.txt配置为准)、沙巴克地图ID(默认3)、攻城战默认开启时间(如每周六20:00-22:00,可自定义)。
(2)文件权限:确保可编辑Dialog.txt(NPC对话脚本)、QFunction-0.txt(核心逻辑脚本),新增攻城申请变量存储文件(如AttackVar.txt,用于记录申请状态)。
(3)语法适配:以下案例采用#IF/#ACT/#ELSE通用语法,不同引擎(GOM/HERO/Blue)仅部分指令细节有差异,核心逻辑一致。
二、完整脚本编写步骤(分2大核心模块)
模块1:沙城老兵NPC对话脚本(Dialog.txt)
功能:搭建玩家与沙城老兵的交互入口,提供申请攻城选项,跳转核心逻辑脚本。
//沙城老兵NPC对话脚本(NPCID=601)
[@Dialog601]
#IF
//先读取攻城申请状态变量(是否已有行会申请)
LoadVarAttackVar.txt//加载变量存储文件
CheckVarAttackStatus0//0=无申请,1=已申请
#ACT
Say欢迎来到沙巴克!我负责处理攻城申请相关事宜。\
Say申请攻城需满足以下条件:\
Say1.你必须是行会会长;2.行会等级≥3级;\
Say3.需缴纳100万金币申请费;4.距上次攻城结束满7天;\
Say当前攻城申请状态:未有人申请\
<申请攻城/@ApplyAttack>\
<查询攻城信息/@QueryAttack>\
<离开/@exit>
#ELSE
#ACT
LoadVarAttackVar.txt
Say当前已有行会申请攻城!\
Say申请行会:<$AttackGuildName>\
Say攻城时间:<$AttackDate>20:00-22:00\
<查询攻城信息/@QueryAttack>\
<离开/@exit>
#ENDIF
//查询攻城信息子脚本(可选,提升交互性)
[@QueryAttack]
#IF
LoadVarAttackVar.txt
CheckVarAttackStatus1
#ACT
Say【攻城信息查询】\
Say申请行会:<$AttackGuildName>\
Say申请会长:<$AttackLeaderName>\
Say攻城时间:<$AttackDate>20:00-22:00\
Say请准时带领行会成员参与!\
<返回/@Dialog601>
#ELSE
#ACT
Say当前暂无攻城申请信息!\
Say如需申请,请满足对应条件后提交!\
<返回/@Dialog601>
#ENDIF
模块2:申请攻城核心逻辑脚本(QFunction-0.txt)
功能:校验申请条件、处理金币扣除、记录申请信息、发送全服公告,是脚本核心模块。
//申请攻城核心逻辑脚本
[@ApplyAttack]
#IF
//条件1:校验当前玩家是否为行会会长
CheckGuildLeader<$USERID>
#ELSE
SendMsg6只有行会会长才能申请攻城!
Goto@Dialog601
#ENDIF
#IF
//条件2:校验行会等级≥3级(GuildLevel为行会等级变量)
CheckGuildLevel<$USERGUILD>3
#ELSE
SendMsg6你的行会等级不足3级,无法申请攻城!
Goto@Dialog601
#ENDIF
#IF
//条件3:校验背包金币≥100万(可按需调整金额)
CheckGold1000000
#ELSE
SendMsg6申请攻城需缴纳100万金币,你的金币不足!
Goto@Dialog601
#ENDIF
#IF
//条件4:距上次攻城结束满7天(LastAttackEndTime为上次结束时间变量)
LoadVarAttackVar.txt
CheckTime>=<$LastAttackEndTime>+7*24*60*60
#ELSE
SendMsg6距上次攻城结束未满7天,无法申请!
Goto@Dialog601
#ENDIF
#IF
//条件5:当前无其他行会申请攻城
CheckVarAttackStatus0
#ELSE
SendMsg6已有其他行会提交攻城申请,请等待本次攻城结束后再试!
Goto@Dialog601
#ENDIF
#ACT
//所有条件校验通过,执行申请流程
GoldDeduct1000000//扣除100万申请金币
//记录攻城申请核心信息
SetVarAttackStatus1//标记已有申请
SetVarAttackGuildName<$USERGUILD>//存储申请行会名
SetVarAttackLeaderName<$USERNAME>//存储申请会长名
SetVarAttackApplyTime<$CURRENTTIME>//存储申请时间
//设定攻城时间(默认本周六20:00-22:00,可自定义逻辑)
GetWeekAttackWeek//获取当前星期(1=周一,6=周六)
#IF
CheckVarAttackWeek<6
#ACT
SetVarAttackDate<$CURRENTDATE>+(6-<$AttackWeek>)//本周六
#ELSEIF
CheckVarAttackWeek=6
#ACT
SetVarAttackDate<$CURRENTDATE>//今日为周六,直接设为今日
#ELSE
#ACT
SetVarAttackDate<$CURRENTDATE>+(6+7-<$AttackWeek>)//下周六
#ENDIF
//发送全服公告(2为全服广播颜色代码)
SendBroadCast2【攻城申请成功】<$USERGUILD>行会会长<$USERNAME>已申请攻城!攻城时间:<$AttackDate>20:00-22:00,请各行会做好准备!
//保存变量到文件,防止服务端重启丢失
SaveVarAttackVar.txt
SendMsg6攻城申请成功!攻城时间为<$AttackDate>20:00-22:00,请准时带领行会成员参与!
Goto@Dialog601
模块3:攻城结束后状态重置脚本(QFunction-0.txt)
功能:攻城结束后自动重置申请状态,允许下次申请,需绑定攻城结束触发事件。
//攻城结束状态重置脚本(绑定攻城结束触发事件)
[@AttackEnd]
#ACT
LoadVarAttackVar.txt
SetVarAttackStatus0//重置为无申请状态
SetVarLastAttackEndTime<$CURRENTTIME>//记录本次结束时间
//发送攻城结束公告
SendBroadCast2【攻城战结束】本次沙巴克攻城战已结束!距下次可申请攻城还有7天!
SaveVarAttackVar.txt
三、脚本关键要点与调试技巧
1.关键编写要点
(1)权限严格校验:必须添加CheckGuildLeader指令校验会长身份,避免普通成员误申请;金币扣除前需先校验,防止出现“扣币失败但申请成功”的异常。
(2)变量持久化:所有核心变量(申请状态、行会名、时间)需通过LoadVar/SaveVar读写,确保服务端重启后数据不丢失。
(3)时间逻辑精准:攻城时间设定需考虑当前星期,避免出现“申请后当天已过攻城时间”的问题;间隔时间计算需用秒为单位(1天=86400秒)。
(4)公告清晰明确:全服公告需包含行会名、会长名、攻城时间,让所有玩家清晰知晓关键信息。
2.常见问题调试技巧
(1)会长身份校验失败:检查CheckGuildLeader指令格式,确认<$USERID>变量正确获取当前玩家ID;部分引擎需用CheckGuildMaster指令,可按需替换。
(2)金币扣除异常:校验CheckGold与GoldDeduct的金额是否一致(均为100万),避免单位错误(如多写或少写0);测试时可先将金额设为1,方便调试。
(3)公告不显示:检查SendBroadCast指令的颜色代码(2为全服广播,6为个人提示),确认引擎支持该指令;部分引擎用SendMsg2替代SendBroadCast2。
(4)变量保存失败:确保AttackVar.txt文件路径正确(服务端根目录),具备可写入权限;部分引擎变量存储需用WriteFile指令,可参考引擎语法文档调整。
四、脚本拓展方向(丰富功能适配更多场景)
1.申请时间限制:添加“仅每周一至周五可申请”逻辑,通过CheckWeek指令限制申请时段,避免周末临时申请。
2.申请次数限制:新增变量记录单个行会年度申请次数(如每年最多申请4次),通过CheckVar指令校验,防止频繁申请。
3.申请记录查询:扩展[@QueryAttack]脚本,支持查询历史申请记录(行会名、申请时间、攻城结果),通过追加变量存储历史数据实现。
4.申请取消功能:为会长添加“取消攻城申请”选项,校验会长身份后返还部分金币(如80万),重置申请状态变量。
总结:沙城老兵申请攻城脚本核心是“条件校验+信息记录+状态闭环”,按上述步骤编写后,替换对应NPCID与参数即可使用。调试时优先验证核心条件(会长权限、金币扣除、公告播报),再优化时间逻辑与拓展功能,可适配多数传奇服务端版本。
一、脚本核心逻辑与前置准备
1.核心逻辑拆解
玩家(行会会长)与沙城老兵(NPC)对话→选择“申请攻城”选项→脚本校验条件(是否为会长、行会等级、申请金币、申请间隔、当前是否有攻城申请)→校验通过则扣除金币、记录申请信息(行会名、申请时间、攻城时间)→发送全服公告→校验失败则返回失败提示。
2.前置准备
(1)确认关键标识:沙城老兵NPCID(默认常用601,以自身服务端Npc.txt配置为准)、沙巴克地图ID(默认3)、攻城战默认开启时间(如每周六20:00-22:00,可自定义)。
(2)文件权限:确保可编辑Dialog.txt(NPC对话脚本)、QFunction-0.txt(核心逻辑脚本),新增攻城申请变量存储文件(如AttackVar.txt,用于记录申请状态)。
(3)语法适配:以下案例采用#IF/#ACT/#ELSE通用语法,不同引擎(GOM/HERO/Blue)仅部分指令细节有差异,核心逻辑一致。
二、完整脚本编写步骤(分2大核心模块)
模块1:沙城老兵NPC对话脚本(Dialog.txt)
功能:搭建玩家与沙城老兵的交互入口,提供申请攻城选项,跳转核心逻辑脚本。
//沙城老兵NPC对话脚本(NPCID=601)
[@Dialog601]
#IF
//先读取攻城申请状态变量(是否已有行会申请)
LoadVarAttackVar.txt//加载变量存储文件
CheckVarAttackStatus0//0=无申请,1=已申请
#ACT
Say欢迎来到沙巴克!我负责处理攻城申请相关事宜。\
Say申请攻城需满足以下条件:\
Say1.你必须是行会会长;2.行会等级≥3级;\
Say3.需缴纳100万金币申请费;4.距上次攻城结束满7天;\
Say当前攻城申请状态:未有人申请\
<申请攻城/@ApplyAttack>\
<查询攻城信息/@QueryAttack>\
<离开/@exit>
#ELSE
#ACT
LoadVarAttackVar.txt
Say当前已有行会申请攻城!\
Say申请行会:<$AttackGuildName>\
Say攻城时间:<$AttackDate>20:00-22:00\
<查询攻城信息/@QueryAttack>\
<离开/@exit>
#ENDIF
//查询攻城信息子脚本(可选,提升交互性)
[@QueryAttack]
#IF
LoadVarAttackVar.txt
CheckVarAttackStatus1
#ACT
Say【攻城信息查询】\
Say申请行会:<$AttackGuildName>\
Say申请会长:<$AttackLeaderName>\
Say攻城时间:<$AttackDate>20:00-22:00\
Say请准时带领行会成员参与!\
<返回/@Dialog601>
#ELSE
#ACT
Say当前暂无攻城申请信息!\
Say如需申请,请满足对应条件后提交!\
<返回/@Dialog601>
#ENDIF
模块2:申请攻城核心逻辑脚本(QFunction-0.txt)
功能:校验申请条件、处理金币扣除、记录申请信息、发送全服公告,是脚本核心模块。
//申请攻城核心逻辑脚本
[@ApplyAttack]
#IF
//条件1:校验当前玩家是否为行会会长
CheckGuildLeader<$USERID>
#ELSE
SendMsg6只有行会会长才能申请攻城!
Goto@Dialog601
#ENDIF
#IF
//条件2:校验行会等级≥3级(GuildLevel为行会等级变量)
CheckGuildLevel<$USERGUILD>3
#ELSE
SendMsg6你的行会等级不足3级,无法申请攻城!
Goto@Dialog601
#ENDIF
#IF
//条件3:校验背包金币≥100万(可按需调整金额)
CheckGold1000000
#ELSE
SendMsg6申请攻城需缴纳100万金币,你的金币不足!
Goto@Dialog601
#ENDIF
#IF
//条件4:距上次攻城结束满7天(LastAttackEndTime为上次结束时间变量)
LoadVarAttackVar.txt
CheckTime>=<$LastAttackEndTime>+7*24*60*60
#ELSE
SendMsg6距上次攻城结束未满7天,无法申请!
Goto@Dialog601
#ENDIF
#IF
//条件5:当前无其他行会申请攻城
CheckVarAttackStatus0
#ELSE
SendMsg6已有其他行会提交攻城申请,请等待本次攻城结束后再试!
Goto@Dialog601
#ENDIF
#ACT
//所有条件校验通过,执行申请流程
GoldDeduct1000000//扣除100万申请金币
//记录攻城申请核心信息
SetVarAttackStatus1//标记已有申请
SetVarAttackGuildName<$USERGUILD>//存储申请行会名
SetVarAttackLeaderName<$USERNAME>//存储申请会长名
SetVarAttackApplyTime<$CURRENTTIME>//存储申请时间
//设定攻城时间(默认本周六20:00-22:00,可自定义逻辑)
GetWeekAttackWeek//获取当前星期(1=周一,6=周六)
#IF
CheckVarAttackWeek<6
#ACT
SetVarAttackDate<$CURRENTDATE>+(6-<$AttackWeek>)//本周六
#ELSEIF
CheckVarAttackWeek=6
#ACT
SetVarAttackDate<$CURRENTDATE>//今日为周六,直接设为今日
#ELSE
#ACT
SetVarAttackDate<$CURRENTDATE>+(6+7-<$AttackWeek>)//下周六
#ENDIF
//发送全服公告(2为全服广播颜色代码)
SendBroadCast2【攻城申请成功】<$USERGUILD>行会会长<$USERNAME>已申请攻城!攻城时间:<$AttackDate>20:00-22:00,请各行会做好准备!
//保存变量到文件,防止服务端重启丢失
SaveVarAttackVar.txt
SendMsg6攻城申请成功!攻城时间为<$AttackDate>20:00-22:00,请准时带领行会成员参与!
Goto@Dialog601
模块3:攻城结束后状态重置脚本(QFunction-0.txt)
功能:攻城结束后自动重置申请状态,允许下次申请,需绑定攻城结束触发事件。
//攻城结束状态重置脚本(绑定攻城结束触发事件)
[@AttackEnd]
#ACT
LoadVarAttackVar.txt
SetVarAttackStatus0//重置为无申请状态
SetVarLastAttackEndTime<$CURRENTTIME>//记录本次结束时间
//发送攻城结束公告
SendBroadCast2【攻城战结束】本次沙巴克攻城战已结束!距下次可申请攻城还有7天!
SaveVarAttackVar.txt
三、脚本关键要点与调试技巧
1.关键编写要点
(1)权限严格校验:必须添加CheckGuildLeader指令校验会长身份,避免普通成员误申请;金币扣除前需先校验,防止出现“扣币失败但申请成功”的异常。
(2)变量持久化:所有核心变量(申请状态、行会名、时间)需通过LoadVar/SaveVar读写,确保服务端重启后数据不丢失。
(3)时间逻辑精准:攻城时间设定需考虑当前星期,避免出现“申请后当天已过攻城时间”的问题;间隔时间计算需用秒为单位(1天=86400秒)。
(4)公告清晰明确:全服公告需包含行会名、会长名、攻城时间,让所有玩家清晰知晓关键信息。
2.常见问题调试技巧
(1)会长身份校验失败:检查CheckGuildLeader指令格式,确认<$USERID>变量正确获取当前玩家ID;部分引擎需用CheckGuildMaster指令,可按需替换。
(2)金币扣除异常:校验CheckGold与GoldDeduct的金额是否一致(均为100万),避免单位错误(如多写或少写0);测试时可先将金额设为1,方便调试。
(3)公告不显示:检查SendBroadCast指令的颜色代码(2为全服广播,6为个人提示),确认引擎支持该指令;部分引擎用SendMsg2替代SendBroadCast2。
(4)变量保存失败:确保AttackVar.txt文件路径正确(服务端根目录),具备可写入权限;部分引擎变量存储需用WriteFile指令,可参考引擎语法文档调整。
四、脚本拓展方向(丰富功能适配更多场景)
1.申请时间限制:添加“仅每周一至周五可申请”逻辑,通过CheckWeek指令限制申请时段,避免周末临时申请。
2.申请次数限制:新增变量记录单个行会年度申请次数(如每年最多申请4次),通过CheckVar指令校验,防止频繁申请。
3.申请记录查询:扩展[@QueryAttack]脚本,支持查询历史申请记录(行会名、申请时间、攻城结果),通过追加变量存储历史数据实现。
4.申请取消功能:为会长添加“取消攻城申请”选项,校验会长身份后返还部分金币(如80万),重置申请状态变量。
总结:沙城老兵申请攻城脚本核心是“条件校验+信息记录+状态闭环”,按上述步骤编写后,替换对应NPCID与参数即可使用。调试时优先验证核心条件(会长权限、金币扣除、公告播报),再优化时间逻辑与拓展功能,可适配多数传奇服务端版本。

