法师放火墙堵住窄口,怪物寻路绕行或硬穿火区掉血,火墙卡位是法师打宝的经典战术。战术能否成立取决于怪物寻路与地面区域的交互规则:绕行成本、穿越容忍与卡死保护,三者决定火墙是战术工具还是无限拖延的漏洞。
---火区格子的寻路代价:基础 1 提到 8
local ZONE_COST = 8
function PathFind.weight(mapId, gx, gy)
-- 逻辑格不可到达为墙体,代价无穷大
if not gridattr(mapId, gx, gy, 1) then return 999 end
for _, z in ipairs(FireWall.zones) do
local dx = gx - z.x
local dy = gy - z.y
if dx * dx + dy * dy <= z.r2 then
return ZONE_COST
end
end
return 1
end
火墙覆盖格子的寻路代价从基础 1 提到 8,怪物优先绕行火区,绕行路径过长才选择硬穿。权重值是实测参数:低于 5 怪物照穿火墙卡位失效,高于 12 怪物纹丝不动被无限风筝,8 是让怪物做出合理选择的平衡点。墙体判定复用 gridattr 的逻辑格检查,火区的范围匹配用半径平方比较,每格的判定开销保持常数。
---怪物连续 20 个寻路周期零位移:强制回家
function MobAI.stuckCheck(mob)
if not mob.lastX then
mob.lastX, mob.lastY = mob.x, mob.y
mob.stuckTicks = 0
return
end
if mob.x == mob.lastX and mob.y == mob.lastY then
mob.stuckTicks = mob.stuckTicks + 1
else
mob.stuckTicks = 0
mob.lastX, mob.lastY = mob.x, mob.y
end
if mob.stuckTicks > 20 then
mob.ignoreZonesUntil = os.time() + 5
mob.stuckTicks = 0
MobAI.forcePath(mob, mob.homePoint)
end
end
连续 20 个寻路周期零位移判定为卡死,接下来 5 秒无视地面区域强制回家,卡死保护防止几道火墙把赤月卫士困成木桩,火墙卡位的收益上限由此锁定:可以拖节奏,不能无解困死。卡死的判定指标是位移为零的周期计数,怪物在火区里掉血但保持移动不算卡死。卡位时长用 getmoncount 配合区域计时做抽样,单只怪被拖延超过 60 秒的占比要求低于 5%。
卡位战斗的时长分布统计,拖延超 60 秒的比例超标即回调权重;卡死保护的触发频次监控,频次暴涨说明火区数值或地形出现组合漏洞。
权重 8 上线前用过无限绕行策略,一只赤月卫士沿火墙边缘转圈三分钟,卡死保护上线后解决。无视区域的 5 秒窗口曾经与玩家补火墙的时机错位形成循环漏洞,玩家看怪物冲刺立刻补火,窗口期改为怪物回家后才重置寻路状态。零位移的判定曾经没排除怪物攻击时的原地挥击,正在输出的怪物被误判卡死强行回家,判定加上战斗状态豁免。
寻路权重与卡死阈值进怪物 AI 配置表,普通怪与精英怪可配不同的穿越容忍。火墙的持续时间与卡死窗口的时序关系写进设计文档:火墙 20 秒、保护 5 秒、回家路径的耗时上限 8 秒,三者叠加不产生死循环。卡位战术的教学放在法师引导任务里,战术的可见性就是职业特色的可感知性。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 跨服远征分先锋、主力、后勤三队独立推进,三线全通合围BOSS。不同战力成员都有参与感。 策划要点与配置 …
实战应用:用在哪里 副本限时挑战加入超时血量惩罚:超时后BOSS攻击递增。上线后BOSS攻击叠到十倍秒杀全队。 事故还原与补…
实战应用:用在哪里 混沌麒麟召唤是全服高光时刻:暗幕聚合、裂缝展开、麒麟着陆三段演出各1.3秒。 三段式入场演出编排 围观镜…
实战应用:用在哪里 任务对话一闪而过玩家想回顾。回看接口把对话按节点存档,面板翻阅全部对话记录。 对话存档与查询渲染 当前章…
实战应用:用在哪里 服务器承载六十张地图,空闲地图白耗资源。按需激活,末人离开后六十秒休眠。 激活与休眠触发 休眠回收 验证…
实战应用:用在哪里 坐骑资质洗炼随机重滚五条属性,锁定满意的条目不再重滚,锁定越多消耗越大。 洗炼与锁定 锁定消耗递增 验证…