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 的分工,是构建稳定声望系统的关键:一个定义”我是谁”,一个定义”我跟谁敌对”。