From a23d5ee50dc42063779021c98d01593941079f5f Mon Sep 17 00:00:00 2001 From: KJack <19712078+kjack9@users.noreply.github.com> Date: Sun, 1 Oct 2023 01:25:06 -0400 Subject: [PATCH] feat(Core/Scripting): Implement `OnBeforeCreatureSelectLevel()` hook (#17391) * Add `OnBeforeCreatureSelectLevel()` hook - allows modules to alter the level of a creature just before it is set * Fix missing class name. * Hook should catch even if the level isn't being changed. * Trim whitespace. * Revert "Trim whitespace." This reverts commit 76768d85c0b9878828b71a008e709c1df7ddadc5. * Fix whitespace --- src/server/game/Entities/Creature/Creature.cpp | 3 +++ .../game/Scripting/ScriptDefines/AllCreatureScript.cpp | 9 +++++++++ src/server/game/Scripting/ScriptMgr.h | 4 ++++ 3 files changed, 16 insertions(+) diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index d86bc3b45..d48b8e087 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1486,6 +1486,9 @@ void Creature::SelectLevel(bool changelevel) uint8 minlevel = std::min(cInfo->maxlevel, cInfo->minlevel); uint8 maxlevel = std::max(cInfo->maxlevel, cInfo->minlevel); uint8 level = minlevel == maxlevel ? minlevel : urand(minlevel, maxlevel); + + sScriptMgr->OnBeforeCreatureSelectLevel(cInfo, this, level); + if (changelevel) SetLevel(level); diff --git a/src/server/game/Scripting/ScriptDefines/AllCreatureScript.cpp b/src/server/game/Scripting/ScriptDefines/AllCreatureScript.cpp index 896191242..ab588dcdd 100644 --- a/src/server/game/Scripting/ScriptDefines/AllCreatureScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/AllCreatureScript.cpp @@ -48,6 +48,15 @@ void ScriptMgr::OnCreatureSaveToDB(Creature* creature) }); } +void ScriptMgr::OnBeforeCreatureSelectLevel(const CreatureTemplate* cinfo, Creature* creature, uint8& level) +{ + ExecuteScript([&](AllCreatureScript* script) + { + script->OnBeforeCreatureSelectLevel(cinfo, creature, level); + }); + +} + void ScriptMgr::Creature_SelectLevel(const CreatureTemplate* cinfo, Creature* creature) { ExecuteScript([&](AllCreatureScript* script) diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 5827e1612..b933130ee 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -555,6 +555,9 @@ public: // Called from End of Creature Update. virtual void OnAllCreatureUpdate(Creature* /*creature*/, uint32 /*diff*/) { } + // Called just before the level of the creature is set. + virtual void OnBeforeCreatureSelectLevel(const CreatureTemplate* /*cinfo*/, Creature* /*creature*/, uint8& /*level*/) { } + // Called from End of Creature SelectLevel. virtual void Creature_SelectLevel(const CreatureTemplate* /*cinfo*/, Creature* /*creature*/) { } @@ -2555,6 +2558,7 @@ public: /* MovementHandlerScript */ public: /* AllCreatureScript */ //listener function (OnAllCreatureUpdate) is called by OnCreatureUpdate //void OnAllCreatureUpdate(Creature* creature, uint32 diff); + void OnBeforeCreatureSelectLevel(const CreatureTemplate* cinfo, Creature* creature, uint8& level); void Creature_SelectLevel(const CreatureTemplate* cinfo, Creature* creature); void OnCreatureSaveToDB(Creature* creature);