完整课程入口:996 全套课程体系 | Lua 学习路径 | 幂尔框架 mirs.cn
多人战斗里"怪打谁"由仇恨系统决定:输出职业拉走 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 表一并清空,防止怪物重生后继承上一世的仇恨。