多人战斗里"怪打谁"由仇恨系统决定:输出职业拉走 Boss、坦克嘲讽稳怪、治疗仇恨失控被追杀——仇恨的合理性直接影响战斗体验。仇恨系统核心是一张按怪物维护的仇恨值表,伤害、治疗、嘲讽、距离衰减都会修改表内容。
每只怪物维护一张目标 → 仇恨值 的表,事件按权重累加:
local THREAT_WEIGHT = { damage = 1.0, heal = 0.5, taunt = 999999, assist = 0.5 }
function Threat.add(monster, targetId, kind, amount)
monster.threat[targetId] = (monster.threat[targetId] or 0) + amount * THREAT_WEIGHT[kind]
end
function Threat.top(monster)
local best, bestVal = nil, -1
for targetId, val in pairs(monster.threat) do
if val > bestVal then best, bestVal = targetId, val end
end
return best
end
伤害按数值加权、治疗按治疗量的一半加权(治疗失控是仇恨事故的经典来源)、嘲讽直接写入一个超大值并在持续期内锁定目标。
脱战衰减:目标离开视野或死亡时,其仇恨条目按每秒 10% 衰减直至清除,防止死玩家的仇恨占位导致怪物原地发呆。嘲讽到期回落:嘲讽结束时把嘲讽值衰减到当前第二大仇恨的水平(而不是立即清零),怪物平滑回到原目标,不出现突然掉头。
仇恨目标切换时给客户端发一条目标变更消息,前端同步调整朝向与攻击对象,避免服务端已切目标、客户端还打旧目标的两秒错位。仇恨表的调试入口:GM 命令打印指定怪物的完整仇恨表(目标、数值、来源事件),团本 Boss 仇恨混乱的问题十有八九在这份表里一眼可见。仇恨系统的参数(各事件权重、衰减速率)放配置表,不同 Boss 可配不同的仇恨敏感度,为战术设计留出空间。
仇恨表的内存规模按怪物并发量预估:单怪平均 5 个仇恨条目、500 只活跃怪,整表不超过 10M。清理时机与怪物销毁绑定,World 销毁流程里把 threat 表一并清空,防止怪物重生后继承上一世的仇恨。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 成就点数不该只是数字摆设:点数商店兑换永久属性加成,50分换百分之一攻击,上限百分之五。兑换接口管三件事…
实战应用:用在哪里 UI 合图(把零散小图打包成图集)是 DrawCall 合批的前提(合批原理参考前篇)。手工打包的问题:…
实战应用:用在哪里 SQLite 默认的回滚日志模式在写入时会阻塞读取(写锁独占),游戏服务端“边写日志边查配置”的场景会出…
实战应用:用在哪里 烈火剑法甩出去的瞬间最怕砍到队友:PK 模式是攻击的准星开关——和平、组队、行会、全体四种模式决定谁的技…
实战应用:用在哪里 把大逃杀的缩圈机制搬进沙巴克野区:五十人无阵营乱斗,安全区每六十秒收缩一圈,圈外持续掉血,终局幸存者独享…
停服更新最怕撞上在线高峰,踢掉几百人换来一片抱怨。选对发布窗口,同样的更新内容,玩家体验是两回事。本文讲如何用996引擎的在…