检测在线人物是否处于攻城期间分为两层逻辑,第一层是全局检测沙巴克攻城战是否正在开启,第二层是检测人物当前是否处在攻城作战区域,两套命令可以单独使用,也可以组合叠加,用来实现攻城时段限制NPC功能、地图传送拦截、属性buff、消息推送等功能,命令统一写在脚本#IF条件段,支持NPC对话、QF触发、机器人定时器等各类场景调用。
全局攻城状态检测核心命令CHECKCASTLEWAR,该命令不判断人物所在位置,只判断沙巴克攻城战是否处于进行状态,只要攻城已经开启,无论角色在任何地图,该条件都会判定成立。在NPC脚本内写入该条件,攻城期间可以限制领取奖励、关闭部分传送入口、弹出攻城提示。配套的ISCASTLEWAR命令功能一致,部分引擎版本使用该关键字,使用前核对引擎帮助文档确认支持的语法。全局变量<$CASTLEWARDATE>\(CASTLEWARDATE>可以读取下一次攻城日期,<\)<$LISTOFWAR>读取攻城行会列表,用于NPC面板展示攻城预告信息。
人物所在攻城区域检测命令CHECKCASTLEWARAREA 沙巴克,该命令同时判断两个条件,攻城战开启,并且人物当前坐标落在沙巴克攻城地图范围内。适合做区域专属效果,比如只有身在沙巴克城内的玩家才触发攻城buff、死亡掉落规则调整,城外在线玩家不会触发该逻辑。区分两个检测命令的使用场景,CHECKCASTLEWAR管控全服所有在线角色,CHECKCASTLEWARAREA只针对进入沙巴克地图的在线人物。
配套辅助判断命令,ISDEFENSEGUILD检测当前人物所属行会为守城方,攻城开启时用来给守城玩家附加防御增益。CHECKCASTLEOWNER检测角色是沙巴克城主行会成员,CASTLEWARDAY检测距离上次攻城间隔天数,CASTLECHANGEDAY检测行会占领沙城持续天数。CHECKCASTLEDOOR可以检测沙巴克城门状态,判断城门处于完好、损坏或者关闭状态,用于城门被击破后的脚本事件。
基础NPC检测脚本示例,在Market_Def目录新建NPC脚本,#IF段写入CHECKCASTLEWAR,#SAY输出攻城期间提示文字,#ELSESAY输出非攻城时段提示。增加叠加条件,同时检测CHECKCASTLEWARAREA,实现只有攻城并且身在沙巴克地图才执行指定逻辑。ELSEACT分支用来处理非攻城时段的功能放行,攻城期间关闭部分兑换、传送功能,非攻城状态正常开放。脚本编码保存为ANSI格式,修改完成重载NPC脚本即可生效。
QF触发内检测在线人物攻城状态,在QFunction-0.txt的各类触发段内嵌入攻城判断,比如[@OnTimer]、[@OnPickUp]、[@OnKillMon]、[@OnHurt]。攻城开启时,所有在线玩家进入沙巴克地图自动添加临时属性,离开沙巴克地图清除buff。在死亡触发段内增加判断,攻城期间沙巴克地图调整爆率,非攻城时段恢复原有掉落规则。QF内的攻城检测针对所有在线角色实时判定,每一次事件触发都会读取当前攻城状态,无需额外全局变量标记。
机器人定时器全局扫描在线人物,使用#AutoRun NPC配置定时执行任务,每分钟扫描全部在线角色,检测CHECKCASTLEWAR,向所有在线玩家推送攻城滚动提示。搭配CHECKCASTLEWARAREA筛选沙巴克地图内的玩家,发送专属战场提示。定时器脚本不要设置过短执行间隔,建议60秒执行一次,高频扫描全部在线角色会增加引擎运算压力,造成服务器卡顿。定时器内可以增加行会判断,区分攻城方与守城方发送不同提示内容。
多城堡拓展检测,版本内有多城堡攻城玩法,命令CHECKUNDERWAR 城堡名称,填写对应城堡名称,单独检测该城堡是否正在攻城,实现多城池独立判定,不会互相干扰。多城堡场景需要区分城堡编号,每个城堡拥有独立攻城时间、守城行会、攻城区域,检测命令内城堡名称必须和MapInfo内登记名称保持一致。
攻城事件专用QF触发标签,[@CastleWarStart]攻城战开启瞬间触发,服务端执行该段脚本,给全部攻城行会成员发送系统公告。[@CastleWarEnd]攻城结束触发,清除攻城临时buff,重置城门状态,统计攻城战数据。[@GetCastle0]成功占领沙巴克时触发,发放城主奖励,更新沙巴克行会标记。这三类触发是事件触发,不需要持续轮询检测,相比定时器扫描占用资源更低,适合攻城开始与结束的一次性操作。
常见使用场景配置,攻城期间关闭部分副本入口,在地图传送NPC的#IF段增加CHECKCASTLEWAR条件,攻城时段禁止传送进入副本。攻城时段修改PK模式,检测到攻城开启,强制切换玩家为行会攻击模式,禁止全体攻击模式。攻城期间调整经验倍率,沙巴克地图内攻城状态开启时,设置打怪经验加成,离开沙巴克地图倍率恢复默认。攻城期间限制回城、随机传送,在地图进入触发脚本增加条件,攻城战内禁用部分传送道具。
脚本调试与加载操作,编写完成脚本,保存ANSI编码,重载NPC脚本或者重启M2。登录测试账号,手动开启沙巴克攻城,测试全局检测命令,角色在土城、安全区,CHECKCASTLEWAR条件判定成立,CHECKCASTLEWARAREA判定不成立。进入沙巴克地图,两个条件同时生效,验证区域判断逻辑。切换账号测试守城行会与攻城行会的检测命令,确认ISDEFENSEGUILD识别正常。结束攻城之后,再次检测,所有攻城相关条件全部失效。查看M2运行日志,确认脚本执行无语法报错。
故障排查,攻城已经开启,但是检测命令不生效,核对引擎支持的命令关键字,不同引擎命令名称存在差异,部分引擎不支持CHECKCASTLEWARAREA。检查沙巴克城堡配置文件,确认攻城时间配置正确,攻城没有成功启动,命令直接返回false。条件判断顺序出错,多个条件组合时,逻辑关键字AND、OR书写错误,造成判定结果异常。文字乱码,脚本保存编码不是ANSI,修改编码后重新加载。攻城结束后buff没有清除,需要在[@CastleWarEnd]触发段增加清除变量与属性命令,不要依靠全局攻城状态持续维持buff。
性能优化要点,持续轮询检测在线人物攻城状态,尽量使用事件触发代替高频定时器扫描。不要在怪物死亡、攻击这类高频触发内叠加多层攻城判断,精简条件语句,减少引擎读取城堡数据的次数。大量玩家同时在线攻城时,减少全服广播类脚本,优先使用区域消息推送,降低消息队列压力。所有攻城相关脚本修改前备份文件,语法错误可以快速回滚,避免沙巴克攻城逻辑失效。测试完成之后,模拟完整攻城流程,从攻城开启、战斗阶段、占领沙巴克、攻城结束完整验证整套检测逻辑,确认判定准确,无状态残留问题。
传奇在线人物攻城状态检测脚本教程 沙巴克战全局判定与地图区域区分命令详解
来源:
作者:
点击:

