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→C | SC_EntitySpawn | 实体进入视野 |
| S→C | SC_EntityState | 移动/攻击/状态变化 |
| S→C | SC_EntityDeath | 死亡与击杀者 |
| S→C | SC_MonsterSkill | 怪物技能起手/命中 |
| S→C | SC_BossSpawn | BOSS 刷新公告 |
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 更新不影响帧率。
- 服务器重启后刷新状态可恢复或按规则重置。