diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 19801ea944..2486bcb36c 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -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; diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp index d52bb272f3..72dcb83e86 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp @@ -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)); diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.h b/src/server/game/Scripting/ScriptDefines/PlayerScript.h index c90c774107..e0418eb876 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.h +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.h @@ -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*/) { } diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 7024e52d59..6f139bbd07 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -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);