跳到主要内容

PRD-028 怪物 AI 与刷新

文档编号:PRD-028
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
关联模块:ScenesServer、tbl/Monster.xml、scenesinfo.xml

1. 背景与目标​

当前怪物存在仇恨丢失后原地发呆、刷新点重叠、掉落归属争议等问题。本 PRD 定义怪物从刷新、巡逻、索敌、战斗、回归到死亡的完整状态机,并统一掉落归属规则。

目标

  • 怪物行为可配置、可调试、可复现。
  • 刷新点、刷新数量、刷新时间由地图配置驱动。
  • 掉落归属、经验归属与最后一击解耦。

2. 核心规则​

2.1 状态机​

IDLE(待机) → PATROL(巡逻) → CHASE(追击) → ATTACK(攻击)
↑ ↑ ↓
└── RETURN(回归) ←── EVADE(脱战) ←── FLEE(逃跑)
DEAD(死亡)→ 等待刷新 → IDLE

2.2 索敌与仇恨​

  • 索敌范围 sight_range,超出后不再主动攻击。
  • 仇恨来源:首次攻击、治疗被治疗者、嘲讽、特定技能。
  • 仇恨值按伤害/治疗量累积,嘲讽强制置顶。
  • 目标死亡/离图/隐身超过 5 秒,仇恨转移至第二目标。
  • 所有目标失效后进入 RETURN,回血速度可配置。

2.3 攻击与技能​

  • 普攻按 attack_interval 循环。
  • 技能按 skill_probability 与 CD 选择,优先高威胁目标。
  • 怪物不会释放未配置的技能,不消耗 MP。
  • 精英/BOSS 可配置阶段技能(血量阈值触发)。

2.4 刷新​

  • 刷新点由 scenesinfo.xml 配置坐标、半径、怪物 ID、数量、间隔。
  • 刷新时检查范围内是否已有同组怪物,避免重叠。
  • BOSS 刷新全服公告,可配置公告频道。
  • 怪物死亡后尸体保留 corpse_time,期间可拾取/采集。

3. 服务端设计​

3.1 模块职责​

模块职责
MonsterAI状态机、索敌、追击、攻击、回归
SpawnManager刷新点管理、定时刷新、数量控制
HatredManager仇恨列表与目标选择
LootManager掉落归属与分配

3.2 数据结构​

struct MonsterRuntime {
uint64_t entity_id;
uint32_t monster_id;
AIState state;
uint64_t target_id;
uint32_t spawn_point_id;
uint32_t next_attack_ms;
uint32_t evade_deadline_ms;
std::vector<HatredEntry> hatred;
};

struct SpawnPoint {
uint32_t id;
int32_t map_id, x, y, radius;
uint32_t monster_id, count, respawn_ms;
uint32_t alive_count;
};

3.3 协议​

方向协议说明
S→CSC_EntitySpawn实体进入视野
S→CSC_EntityState移动/攻击/状态变化
S→CSC_EntityDeath死亡与击杀者
S→CSC_MonsterSkill怪物技能起手/命中
S→CSC_BossSpawnBOSS 刷新公告

3.4 AI 更新​

  • 使用分帧更新,每帧处理一部分怪物,避免全图 AI 同时计算。
  • 距离计算用格子坐标,避免浮点误差。
  • 追击超过 leash_range 或离开出生区域过远,强制回归。
  • 回归途中受到攻击可重新进入战斗,但超过 3 次强制脱战。

3.5 掉落归属​

  • 首个造成有效伤害的玩家获得归属,持续 loot_owner_time。
  • 队伍/帮会成员按分配规则共享。
  • 治疗者不获得归属,但计入协助名单。
  • 归属者离线/离图超过 60 秒,归属转移给伤害最高的存活玩家。

4. 客户端设计​

  • 怪物血条按精英/BOSS 样式区分,BOSS 显示阶段与狂暴倒计时。
  • 仇恨目标在怪物头顶显示标记(可选)。
  • 怪物释放技能时播放预警圈/读条,客户端只表现,不判定。
  • 刷新时播放淡入/光效,BOSS 刷新播放全屏公告。
  • 尸体可拾取时高亮,归属者看到专属光柱。

5. 配置与数值​

tbl/Monster.xml 关键字段:

字段说明
id怪物 ID
level / hp / attack / defense基础属性
sight_range / attack_range索敌/攻击距离
attack_interval普攻间隔
move_speed移动速度
leash_range脱战距离
skills技能 ID 与概率
drop_group掉落组
exp / gold基础收益
corpse_time尸体停留时间

6. 边界与异常​

场景处理
刷新点被玩家占位允许刷新在半径内随机点,不刷新在不可行走格
怪物卡地形超过 5 秒无法接近目标,传送到目标附近或放弃
目标隐身丢失视野,转移仇恨/回归
同时被多人攻击按仇恨列表选择,不频繁切换目标
归属者掉线60 秒后转移归属
服务器重启普通怪重新刷新,BOSS 按配置补偿/重置

7. 埋点与运营​

  • 记录怪物击杀数、平均击杀时间、掉落产出。
  • 记录卡怪/脱战/无目标异常次数。
  • 后台可调整刷新间隔、掉落组、精英属性。

8. 验收标准​

  • 怪物按状态机运行,脱战/回归/重新索敌正确。
  • 刷新数量不超过配置,刷新点不重叠。
  • 仇恨列表在目标死亡/隐身/离图后正确转移。
  • 掉落归属与队伍分配符合规则,无多拿/漏拿。
  • 200 只怪物同图 AI 更新不影响帧率。
  • 服务器重启后刷新状态可恢复或按规则重置。