AzerothCore 副本机制深度解析:从实例化、重置到动态难度与锁定的完整链路 原创
温馨提示:
本文最后更新于 2026-10-27,已超过 1 天没有更新。
若文章内的图片失效(无法正常加载),请留言反馈或直接 联系我。
AzerothCore 副本机制深度解析:从实例化、重置到动态难度与锁定的完整链路
副本(Dungeon/Raid)是魔兽世界模拟器的核心玩法。很多教程讲”怎么做副本脚本”,却没人讲清副本引擎背后的数据流:实例怎么创建、Boss 死后何时重置、不同难度如何动态切换。本文从 AzerothCore 源码层面,拆解副本机制的完整链路。
一、副本实例化:Map 与 Instance 的关系
AzerothCore 中,每个副本对应一个 Map,但同一副本可存在多个 Instance(实例)。核心概念:
| 概念 | 说明 | 数据表 |
|---|---|---|
| Map | 地图定义(含副本数据) | map_template / dungeon_template |
| Instance | 一次独立的副本实例 | instance (含 reset_time) |
| Difficulty | 难度(普通/英雄/史诗等) | dungeon_difficulty |
-- dungeon_template 关键字段
SELECT entry, name, map, difficulty_1, difficulty_2,
maxPlayers, minPlayers, reset_delay
FROM dungeon_template WHERE entry = 725;
当玩家进入副本入口时,InstanceData 会创建或复用实例。实例的 key 由 player_instances 表记录,绑定到玩家角色。
二、副本重置机制:reset_delay 与重置条件
副本何时重置?AzerothCore 用 dungeon_template.reset_delay 控制间隔(单位:天)。重置的逻辑在 InstanceSave 中:
# 核心源码逻辑(InstanceSave::IsExpired)
isExpired = (reset_time < gameTime) || (boss 未击杀且超过解锁时间)
两类重置场景:
- 定时重置:到 reset_delay 时间自动重置所有未完成实例。
- 进度重置:团队副本击杀最终 Boss 后,实例记录保存并标记”已通关”。
此外 .instance list / .instance unbind GM 命令可手动管理。
三、动态难度:从英雄到史诗的切换链路
难度切换的关键表是 dungeon_difficulty,它定义了每个副本在不同难度下的怪物与掉落倍率。实际运行中,MapManager 根据玩家队伍规模与副本类型,动态调整:
| 难度 | 触发条件 | 主要差异 |
|---|---|---|
| 普通 (DIFFICULTY_NORMAL) | 5 人队伍 | 基础血量与掉落 |
| 英雄 (DIFFICULTY_HEROIC) | 组队英雄模式 | 血量提升、Boss 机制增强 |
| 史诗 (DIFFICULTY_MYTHIC) | 10/25 人团本 | 额外机制、称号与坐骑奖励 |
# 动态难度在源码中的体现
GetInstanceDifficulty() // 读取 dungeon_template 配置
InstanceScript::OnDifficultyChanged() // 难度变化钩子
四、副本锁定:防止进度作弊
团队副本的进度锁定(Lock)由 character_instance_lock 表记录,防止玩家通过换队伍重复刷同一 Boss 的进度。锁定逻辑:击杀任一 Boss 后,该角色的该副本实例即被”保存锁定”,只有同实例成员能继续。
-- 查询角色副本锁定
SELECT instance, lock, perm
FROM character_instance_lock
WHERE guid = 12345;
五、自定义副本的接入点
想自定义副本机制,主要改三处:
dungeon_template:定义地图、难度、人数、重置间隔。InstanceScript:继承它实现 Boss 事件的OnBossStateChange()。- 副本入口脚本:控制
SummonCreature与触发器。
class MyRaidInstanceScript : public InstanceScript
{
public:
void OnBossStateChange(uint32 bossId, EncounterState state) override;
bool CheckRequirement() override;
};
小结
副本机制的根在数据表(dungeon_template、instance),行为在 InstanceScript。把”实例化→重置→难度→锁定”这条链路理解透,自定义副本就只是往链路上挂新逻辑,而不是从零造轮子。