feat(Core/Player): Add 'OnPlayerCanLearnTalent' hook (#24826)

This commit is contained in:
EElenov
2026-03-17 21:30:57 +02:00
committed by GitHub
parent 6da5bf3a7a
commit 601a4231f6
4 changed files with 13 additions and 0 deletions

View File

@@ -13958,6 +13958,9 @@ void Player::LearnTalent(uint32 talentId, uint32 talentRank, bool command /*= fa
if (!talentInfo)
return;
if (!sScriptMgr->OnPlayerCanLearnTalent(this, talentInfo, talentRank))
return;
TalentTabEntry const* talentTabInfo = sTalentTabStore.LookupEntry(talentInfo->TalentTab);
if (!talentTabInfo)
return;

View File

@@ -109,6 +109,11 @@ void ScriptMgr::OnPlayerTalentsReset(Player* player, bool noCost)
CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_TALENTS_RESET, script->OnPlayerTalentsReset(player, noCost));
}
bool ScriptMgr::OnPlayerCanLearnTalent(Player* player, TalentEntry const* talent, uint32 rank)
{
CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_LEARN_TALENT, !script->OnPlayerCanLearnTalent(player, talent, rank));
}
void ScriptMgr::OnPlayerAfterSpecSlotChanged(Player* player, uint8 newSlot)
{
CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_AFTER_SPEC_SLOT_CHANGED, script->OnPlayerAfterSpecSlotChanged(player, newSlot));

View File

@@ -43,6 +43,7 @@ enum PlayerHook
PLAYERHOOK_ON_LEVEL_CHANGED,
PLAYERHOOK_ON_FREE_TALENT_POINTS_CHANGED,
PLAYERHOOK_ON_TALENTS_RESET,
PLAYERHOOK_CAN_LEARN_TALENT,
PLAYERHOOK_ON_AFTER_SPEC_SLOT_CHANGED,
PLAYERHOOK_ON_BEFORE_UPDATE,
PLAYERHOOK_ON_UPDATE,
@@ -260,6 +261,9 @@ public:
// Called when a player's talent points are reset (right before the reset is done)
virtual void OnPlayerTalentsReset(Player* /*player*/, bool /*noCost*/) { }
// Called when a player attempts to put a point in a talent.
virtual bool OnPlayerCanLearnTalent(Player* /*player*/, TalentEntry const* /*talent*/, uint32 /*rank*/) { return true; }
// Called after a player switches specs using the dual spec system
virtual void OnPlayerAfterSpecSlotChanged(Player* /*player*/, uint8 /*newSlot*/) { }

View File

@@ -308,6 +308,7 @@ public: /* PlayerScript */
void OnPlayerLevelChanged(Player* player, uint8 oldLevel);
void OnPlayerFreeTalentPointsChanged(Player* player, uint32 newPoints);
void OnPlayerTalentsReset(Player* player, bool noCost);
bool OnPlayerCanLearnTalent(Player* player, TalentEntry const* talent, uint32 rank);
void OnPlayerAfterSpecSlotChanged(Player* player, uint8 newSlot);
void OnPlayerMoneyChanged(Player* player, int32& amount);
void OnPlayerBeforeLootMoney(Player* player, Loot* loot);