PlayerChoice系统介绍
PlayerChoice系统是TrinityCore中用于向玩家显示选项并处理其选择的机制。它允许服务器向玩家展示一组选项,玩家选择其中一个后,服务器可以执行相应的操作,如给予奖励、启动任务等。
数据库表结构详解
playerchoice
这个表定义了玩家选择的基本属性:
ChoiceId
- 选择的唯一标识符UiTextureKitId
- UI纹理资源ID,控制选项界面的外观SoundKitId
- 声音效果ID,当选项出现时播放的声音CloseSoundKitId
- 关闭声音效果IDDuration
- 选项持续时间(秒),超时后自动关闭PendingChoiceText
- 等待选择时显示的文本Question
- 选项的主要问题或标题文本HideWarboardHeader
- 是否隐藏战争板标题KeepOpenAfterChoice
- 选择后是否保持窗口打开ShowChoicesAsList
- 是否以列表形式显示选项ForceDontShowChoicesAsList
- 强制不以列表形式显示选项MaxResponses
- 最大可选响应数ScriptName
- 关联的脚本名称InfiniteRange
- 是否无限距离可用
playerchoice_response
这个表定义了每个选项的具体响应内容:
ChoiceId
- 关联的选项IDResponseId
- 响应的唯一标识符- Index - 响应在界面中的显示顺序
ChoiceArtFileId
- 选项艺术文件ID- Flags - 响应标志(如禁用、隐藏等)
WidgetSetID
- 控件集IDUiTextureAtlasElementID
- UI纹理图集元素IDSoundKitID
- 响应声音效果IDGroupID
- 分组IDUiTextureKitID
- UI纹理资源ID- Header - 响应标题
SubHeader
- 响应子标题ButtonTooltip
- 按钮提示文本Answer
- 响应答案文本Description
- 响应详细描述Confirmation
- 确认文本RewardQuestID
- 奖励任务ID
PlayerChoice系统相关表
PlayerChoice系统支持多种类型的奖励:
playerchoice_response_reward
- 基础奖励(头衔、技能点、金钱、经验等)playerchoice_response_reward_item
- 物品奖励playerchoice_response_reward_currency
- 货币奖励playerchoice_response_reward_faction
- 阵营声望奖励playerchoice_response_reward_item_choice
- 可选物品奖励playerchoice_response_maw_power
- Maw Power特殊奖励
系统工作原理
- 服务器启动时通过 LoadPlayerChoices() 函数加载所有选项数据到内存中
- 当需要向玩家显示选项时,使用 Player::SendPlayerChoice() 方法
- 玩家做出选择后,服务器通过 PlayerChoiceScript 处理响应
- 可以通过脚本自定义选择后的处理逻辑
使用示例
在代码中,可以通过以下方式发送一个 PlayerChoice 给玩家:
player->SendPlayerChoice(senderGuid, choiceId);
当玩家做出选择后,会触发 PlayerChoiceScript::OnResponse 回调,可以在自定义脚本中处理玩家的选择:
class MyPlayerChoiceScript : public PlayerChoiceScript
{
public:MyPlayerChoiceScript() : PlayerChoiceScript("MyPlayerChoiceScript") { }void OnResponse(WorldObject* object, Player* player, PlayerChoice const* choice, PlayerChoiceResponse const* response, uint16 clientIdentifier) override{// 处理玩家选择// 可以根据 choice->ChoiceId 和 response->ResponseId 执行不同操作}
};