From ffe03f6e14c4beafa95645ee40d27f36d0686fd6 Mon Sep 17 00:00:00 2001 From: Vincent Vanclef Date: Mon, 10 Mar 2025 08:44:33 +0100 Subject: [PATCH] feat(Core/Entities): add OnPlayerCanGiveLevel script hook (#21666) --- src/server/game/Entities/Player/Player.cpp | 3 +++ .../game/Scripting/ScriptDefines/PlayerScript.cpp | 5 +++++ .../game/Scripting/ScriptDefines/PlayerScript.h | 11 +++++++++++ src/server/game/Scripting/ScriptMgr.h | 1 + 4 files changed, 20 insertions(+) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index da573bcf5..cd6c45128 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2476,6 +2476,9 @@ void Player::GiveLevel(uint8 level) if (level == oldLevel) return; + if (!sScriptMgr->OnPlayerCanGiveLevel(this, level)) + return; + if (Guild* guild = GetGuild()) guild->UpdateMemberData(this, GUILD_MEMBER_DATA_LEVEL, level); diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp index 99ef82868..2e9b78b3e 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp @@ -915,6 +915,11 @@ bool ScriptMgr::OnPlayerCanResurrect(Player* player) CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_RESURRECT, !script->OnPlayerCanResurrect(player)); } +bool ScriptMgr::OnPlayerCanGiveLevel(Player* player, uint8 newLevel) +{ + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_ON_CAN_GIVE_LEVEL, !script->OnPlayerCanGiveLevel(player, newLevel)); +} + PlayerScript::PlayerScript(const char* name, std::vector enabledHooks) : ScriptObject(name, PLAYERHOOK_END) { diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.h b/src/server/game/Scripting/ScriptDefines/PlayerScript.h index cf2242d5f..d813934e2 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.h +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.h @@ -208,6 +208,7 @@ enum PlayerHook PLAYERHOOK_ON_BEFORE_UPDATE_SKILL, PLAYERHOOK_ON_UPDATE_SKILL, PLAYERHOOK_CAN_RESURRECT, + PLAYERHOOK_ON_CAN_GIVE_LEVEL, PLAYERHOOK_END }; @@ -782,6 +783,16 @@ public: * @return true if player is authorized to resurect */ virtual bool OnPlayerCanResurrect(Player* /*player*/) { return true; } + + /** + * @brief This hook is called, to cancel the normal level up flow + * + * @param player Contains information about the Player + * @param newLevel The new level the player is about to be given + * + * @return true if player is allowed to gain the new level + */ + virtual bool OnPlayerCanGiveLevel(Player* /*player*/, uint8 /*newLevel*/) { return true; } }; #endif diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 0d7091e48..727d7a49a 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -463,6 +463,7 @@ public: /* PlayerScript */ void OnPlayerBeforeUpdateSkill(Player* player, uint32 skill_id, uint32& value, uint32 max, uint32 step); void OnPlayerUpdateSkill(Player* player, uint32 skillId, uint32 value, uint32 max, uint32 step, uint32 newValue); bool OnPlayerCanResurrect(Player* player); + bool OnPlayerCanGiveLevel(Player* player, uint8 newLevel); // Anti cheat void AnticheatSetCanFlybyServer(Player* player, bool apply);