首页 / 技术文章地图 / 正文

【框架设计】NPC 仇恨系统:仇恨值表与嘲讽逻辑的实现

发布:2026-09-20 18:25 | 作者:996 技术组 | 2 阅读
完整课程入口:996 全套课程体系Lua 学习路径幂尔框架 mirs.cn

实战应用:用在哪里

多人战斗里"怪打谁"由仇恨系统决定:输出职业拉走 Boss、坦克嘲讽稳怪、治疗仇恨失控被追杀——仇恨的合理性直接影响战斗体验。仇恨系统核心是一张按怪物维护的仇恨值表,伤害、治疗、嘲讽、距离衰减都会修改表内容。

仇恨值表与事件加权

每只怪物维护一张目标 → 仇恨值 的表,事件按权重累加:

lua
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 后端逻辑、客户端界面与版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
© 威海旷世互娱 · 返回文章地图 · 课程体系 · 幂尔框架