AzerothCore 声望系统开发:从 FactionTemplate 到阵营奖励的完整链路 原创

温馨提示:
本文最后更新于 2026-10-26,已超过 1 天没有更新。 若文章内的图片失效(无法正常加载),请留言反馈或直接 联系我。

声望系统的定位

在 AzerothCore 中,声望(Reputation)是阵营关系与内容解锁的核心机制。玩家通过击杀、任务、捐赠等途径积累声望,达到阈值后解锁声望商人物品、折扣与特殊奖励。实现声望系统需要理解底层表结构与脚本接口。

核心数据表

声望数据主要存储在 characters 库中,而规则定义在 world 库。

表 库 作用
character_reputation characters 记录每个角色对各阵营的声望值与旗标
faction world 定义阵营的基础参数(对战关系、团队旗标)
factiontemplate world 定义与其它阵营的敌友关系矩阵
reputation_spillover_template world 定义声望溢出到关联阵营的比例

角色声望值存储在 character_reputation,其 standing 字段为 32 位有符号整数,0 表示中立,正负值代表友好/敌对方向。

使用 SQL 定义阵营与声望

新增一个自定义阵营需要先插入 faction 与 factiontemplate 记录。

-- 插入自定义阵营
INSERT INTO faction (ID, Name, ReputationIndex)
VALUES (1900, '艾泽拉斯守护者', 1900);

-- 设置与联盟友善、与部落敌对
INSERT INTO factiontemplate (faction, ourMask, friendMask, enemyMask)
VALUES (1900, 1, 64, 2);

ReputationIndex 用于将阵营关联到 UI 声望面板;敌友掩码决定 PvP 交战状态。

通过脚本给予声望

在 C++ 或 Eluna 脚本中可灵活地增减声望。以 Eluna 为例:

-- 击杀自定义生物后给予声望
function BossOnKill(event, killer, victim)
    local player = killer:GetPlayer()
    player:ModifyReputation(1900, 500)  -- 增加 500 点
    player:SendBroadcastMessage('你对艾泽拉斯守护者声望 +500')
    return true
end
RegisterCreatureEvent(90001, 7, BossOnKill)

使用 GetReputationRank 可查询当前等级(中立、友善、尊敬、崇敬、崇拜等),用于解锁条件判断。

声望奖励与折扣

达到特定声望等级后,可通过脚本解锁商人物品或提供折扣。常见做法是在商人脚本中按声望等级动态调整价格。

-- 按声望等级给予购买折扣
local rank = player:GetReputationRank(1900)
local discount = 0
if rank >= 4 then discount = 0.1 end  -- 尊敬 10%
if rank >= 6 then discount = 0.2 end  -- 崇敬 20%

通过将折扣乘入物品售价,实现声望驱动的经济体系。

溢出与平衡

多个阵营共享同一 factiontemplate 时,声望变化会通过溢出表传递给关联阵营,用于设计”此消彼长”的对立声望体系。调优时需关注声望增长速度,避免过快解锁造成内容过早耗尽。

理解 faction 与 factiontemplate 的分工,是构建稳定声望系统的关键:一个定义”我是谁”,一个定义”我跟谁敌对”。