传奇沙城老兵申请攻城脚本编写全流程实操指南

来源: 作者: 点击:
沙城老兵申请攻城脚本核心是实现“行会会长触发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
// 先读取攻城申请状态变量(是否已有行会申请)
LoadVar AttackVar.txt // 加载变量存储文件
CheckVar AttackStatus 0 // 0=无申请,1=已申请
#ACT
Say 欢迎来到沙巴克!我负责处理攻城申请相关事宜。\
Say 申请攻城需满足以下条件:\
Say 1. 你必须是行会会长;2. 行会等级≥3级;\
Say 3. 需缴纳100万金币申请费;4. 距上次攻城结束满7天;\
Say 当前攻城申请状态:未有人申请\
<申请攻城/@ApplyAttack>\
<查询攻城信息/@QueryAttack>\
<离开/@exit>
#ELSE
#ACT
LoadVar AttackVar.txt
Say 当前已有行会申请攻城!\
Say 申请行会:<$AttackGuildName>\
Say 攻城时间:<$AttackDate> 20:00-22:00\
<查询攻城信息/@QueryAttack>\
<离开/@exit>
#ENDIF

// 查询攻城信息子脚本(可选,提升交互性)
[@QueryAttack]
#IF
LoadVar AttackVar.txt
CheckVar AttackStatus 1
#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
SendMsg 6 只有行会会长才能申请攻城!
Goto @Dialog601
#ENDIF
#IF
// 条件2:校验行会等级≥3级(GuildLevel为行会等级变量)
CheckGuildLevel <$USERGUILD> 3
#ELSE
SendMsg 6 你的行会等级不足3级,无法申请攻城!
Goto @Dialog601
#ENDIF
#IF
// 条件3:校验背包金币≥100万(可按需调整金额)
CheckGold 1000000
#ELSE
SendMsg 6 申请攻城需缴纳100万金币,你的金币不足!
Goto @Dialog601
#ENDIF
#IF
// 条件4:距上次攻城结束满7天(LastAttackEndTime为上次结束时间变量)
LoadVar AttackVar.txt
CheckTime >= <$LastAttackEndTime> + 7*24*60*60
#ELSE
SendMsg 6 距上次攻城结束未满7天,无法申请!
Goto @Dialog601
#ENDIF
#IF
// 条件5:当前无其他行会申请攻城
CheckVar AttackStatus 0
#ELSE
SendMsg 6 已有其他行会提交攻城申请,请等待本次攻城结束后再试!
Goto @Dialog601
#ENDIF
#ACT
// 所有条件校验通过,执行申请流程
GoldDeduct 1000000 // 扣除100万申请金币
// 记录攻城申请核心信息
SetVar AttackStatus 1 // 标记已有申请
SetVar AttackGuildName <$USERGUILD> // 存储申请行会名
SetVar AttackLeaderName <$USERNAME> // 存储申请会长名
SetVar AttackApplyTime <$CURRENTTIME> // 存储申请时间
// 设定攻城时间(默认本周六20:00-22:00,可自定义逻辑)
GetWeek AttackWeek // 获取当前星期(1=周一,6=周六)
#IF
CheckVar AttackWeek <6
#ACT
SetVar AttackDate <$CURRENTDATE> + (6 - <$AttackWeek>) // 本周六
#ELSEIF
CheckVar AttackWeek =6
#ACT
SetVar AttackDate <$CURRENTDATE> // 今日为周六,直接设为今日
#ELSE
#ACT
SetVar AttackDate <$CURRENTDATE> + (6 +7 - <$AttackWeek>) // 下周六
#ENDIF
// 发送全服公告(2为全服广播颜色代码)
SendBroadCast 2 【攻城申请成功】<$USERGUILD>行会会长<$USERNAME>已申请攻城!攻城时间:<$AttackDate> 20:00-22:00,请各行会做好准备!
// 保存变量到文件,防止服务端重启丢失
SaveVar AttackVar.txt
SendMsg 6 攻城申请成功!攻城时间为<$AttackDate> 20:00-22:00,请准时带领行会成员参与!
Goto @Dialog601

模块3:攻城结束后状态重置脚本(QFunction-0.txt)

功能:攻城结束后自动重置申请状态,允许下次申请,需绑定攻城结束触发事件。

// 攻城结束状态重置脚本(绑定攻城结束触发事件)
[@AttackEnd]
#ACT
LoadVar AttackVar.txt
SetVar AttackStatus 0 // 重置为无申请状态
SetVar LastAttackEndTime <$CURRENTTIME> // 记录本次结束时间
// 发送攻城结束公告
SendBroadCast 2 【攻城战结束】本次沙巴克攻城战已结束!距下次可申请攻城还有7天!
SaveVar AttackVar.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为个人提示),确认引擎支持该指令;部分引擎用SendMsg 2替代SendBroadCast 2。

(4)变量保存失败:确保AttackVar.txt文件路径正确(服务端根目录),具备可写入权限;部分引擎变量存储需用WriteFile指令,可参考引擎语法文档调整。

四、脚本拓展方向(丰富功能适配更多场景)

1. 申请时间限制:添加“仅每周一至周五可申请”逻辑,通过CheckWeek指令限制申请时段,避免周末临时申请。

2. 申请次数限制:新增变量记录单个行会年度申请次数(如每年最多申请4次),通过CheckVar指令校验,防止频繁申请。

3. 申请记录查询:扩展[@QueryAttack]脚本,支持查询历史申请记录(行会名、申请时间、攻城结果),通过追加变量存储历史数据实现。

4. 申请取消功能:为会长添加“取消攻城申请”选项,校验会长身份后返还部分金币(如80万),重置申请状态变量。

总结:沙城老兵申请攻城脚本核心是“条件校验+信息记录+状态闭环”,按上述步骤编写后,替换对应NPCID与参数即可使用。调试时优先验证核心条件(会长权限、金币扣除、公告播报),再优化时间逻辑与拓展功能,可适配多数传奇服务端版本。