faction_template 表
faction_template表(对应FactionTemplate.dbc)定义生物所属阵营模板,控制生物与各阵营之间的友好/敌对关系和战斗行为。
表概述
faction_template表是阵营关系系统的核心配置表,数据来源于FactionTemplate.dbc文件。每个生物通过creature_template.faction字段引用此表,决定该生物所属阵营、与其他阵营的敌对/友好关系以及战斗行为标志。
主键为 ID,通过Enemies/Friend字段定义最多4个敌对阵营和4个友方阵营的关系。
表结构
| 字段名 | 数据类型 | 默认值 | 说明 |
|---|---|---|---|
| ID | INT | 0 | 阵营模板唯一ID(主键) |
| Faction | INT | 0 | 所属基础阵营ID,对应faction.ID |
| Flags | INT | 0 | 阵营行为标志位 |
| FactionGroup | INT | 0 | 阵营组别 |
| FriendGroup | INT | 0 | 友方组别掩码 |
| EnemyGroup | INT | 0 | 敌方组别掩码 |
| Enemies_1 | INT | 0 | 敌对阵营1的ID |
| Enemies_2 | INT | 0 | 敌对阵营2的ID |
| Enemies_3 | INT | 0 | 敌对阵营3的ID |
| Enemies_4 | INT | 0 | 敌对阵营4的ID |
| Friend_1 | INT | 0 | 友方阵营1的ID |
| Friend_2 | INT | 0 | 友方阵营2的ID |
| Friend_3 | INT | 0 | 友方阵营3的ID |
| Friend_4 | INT | 0 | 友方阵营4的ID |
重要字段详解
Faction (基础阵营ID)
指向faction表(Faction.dbc)中的基础阵营ID。该字段决定了生物所属的根本阵营。
常见基础阵营值:
- 7 - 生物(中立)
- 14 - 怪物(敌对)
- 35 - 友方(不可攻击)
- 74 - 暴风城守卫
- 76 - 奥格瑞玛守卫
Flags (阵营行为标志)
控制该阵营生物的行为特征:
- 0x01 - 不可被攻击
- 0x02 - PvP
- 0x04 - 可被攻击
- 0x08 - 敌对
- 0x10 - 协助友方
- 0x20 - 协助所有
Enemies / Friend (阵营关系)
定义该阵营与最多4个阵营的敌对关系和最多4个阵营的友好关系。
- Enemies_1-4:该阵营敌对的阵营ID列表
- Friend_1-4:该阵营友好的阵营ID列表
这些值通常引用factiontemplate_dbc自身的ID,形成阵营关系网络。
实战案例
查询某生物所属阵营的完整关系:
SELECT ct.entry, ct.name, ct.faction, ft.ID, ft.Flags,
ft.Enemies_1, ft.Enemies_2, ft.Friend_1, ft.Friend_2
FROM creature_template ct
JOIN faction_template ft ON ct.faction = ft.ID
WHERE ct.entry = 12345;
查询所有敌对阵营模板(Flags包含敌对标志):
SELECT ID, Faction, Flags, Enemies_1, Enemies_2
FROM faction_template
WHERE Flags & 0x08 != 0
ORDER BY ID;
设置生物为完全中立(不攻击也不被攻击):
-- 查找中立模板
SELECT ID, Flags FROM faction_template WHERE Flags = 0 LIMIT 1;
-- 应用到生物
UPDATE creature_template SET faction = [中立模板ID] WHERE entry = [生物ID];
常见问题
Q: 生物攻击了不该攻击的目标,如何排查?
按以下步骤:
- 检查creature_template.faction对应的faction_template.Flags是否包含敌对标志
- 检查Enemies_1-4列表中是否包含目标的阵营
- 检查EnemyGroup/FriendGroup掩码定义
Q: 如何让中立NPC可被攻击?
修改对应faction_template记录,确保Flags包含可攻击标志(0x04),并将玩家阵营添加到Enemies列表中。