From 054018232cb8af20d301ad592bd5be1c6a537f3e Mon Sep 17 00:00:00 2001 From: iThorgrim <125808072+iThorgrim@users.noreply.github.com> Date: Tue, 4 Feb 2025 07:41:29 +0100 Subject: [PATCH] feat(Core/Scripting): Add new hook OnUnitSetShapeshiftForm (#21235) --- src/server/game/Entities/Unit/Unit.cpp | 6 ++++++ src/server/game/Entities/Unit/Unit.h | 5 +---- src/server/game/Scripting/ScriptDefines/UnitScript.cpp | 5 +++++ src/server/game/Scripting/ScriptDefines/UnitScript.h | 2 ++ src/server/game/Scripting/ScriptMgr.h | 1 + 5 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 46e7fe274..9994ed8b8 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -21324,6 +21324,12 @@ bool Unit::CanRestoreMana(SpellInfo const* spellInfo) const return false; } +void Unit::SetShapeshiftForm(ShapeshiftForm form) +{ + SetByteValue(UNIT_FIELD_BYTES_2, 3, form); + sScriptMgr->OnUnitSetShapeshiftForm((Unit*)this, form); +} + bool Unit::IsInDisallowedMountForm() const { if (SpellInfo const* transformSpellInfo = sSpellMgr->GetSpellInfo(getTransForm())) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index c12f862b2..6680bcf25 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1868,10 +1868,7 @@ public: // ShapeShitForm (use by druid) [[nodiscard]] ShapeshiftForm GetShapeshiftForm() const { return ShapeshiftForm(GetByteValue(UNIT_FIELD_BYTES_2, 3)); } - void SetShapeshiftForm(ShapeshiftForm form) - { - SetByteValue(UNIT_FIELD_BYTES_2, 3, form); - } + void SetShapeshiftForm(ShapeshiftForm form); bool IsAttackSpeedOverridenShapeShift() const; [[nodiscard]] bool IsInFeralForm() const { diff --git a/src/server/game/Scripting/ScriptDefines/UnitScript.cpp b/src/server/game/Scripting/ScriptDefines/UnitScript.cpp index 5470b3a32..bbf83e5c6 100644 --- a/src/server/game/Scripting/ScriptDefines/UnitScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/UnitScript.cpp @@ -148,6 +148,11 @@ void ScriptMgr::OnUnitDeath(Unit* unit, Unit* killer) CALL_ENABLED_HOOKS(UnitScript, UNITHOOK_ON_UNIT_DEATH, script->OnUnitDeath(unit, killer)); } +void ScriptMgr::OnUnitSetShapeshiftForm(Unit* unit, uint8 form) +{ + CALL_ENABLED_HOOKS(UnitScript, UNITHOOK_ON_UNIT_SET_SHAPESHIFT_FORM, script->OnUnitSetShapeshiftForm(unit, form)); +} + UnitScript::UnitScript(const char* name, bool addToScripts, std::vector enabledHooks) : ScriptObject(name, UNITHOOK_END) { diff --git a/src/server/game/Scripting/ScriptDefines/UnitScript.h b/src/server/game/Scripting/ScriptDefines/UnitScript.h index 27354ec6f..efee6defe 100644 --- a/src/server/game/Scripting/ScriptDefines/UnitScript.h +++ b/src/server/game/Scripting/ScriptDefines/UnitScript.h @@ -45,6 +45,7 @@ enum UnitHook UNITHOOK_ON_UNIT_ENTER_EVADE_MODE, UNITHOOK_ON_UNIT_ENTER_COMBAT, UNITHOOK_ON_UNIT_DEATH, + UNITHOOK_ON_UNIT_SET_SHAPESHIFT_FORM, UNITHOOK_END }; @@ -115,6 +116,7 @@ public: virtual void OnUnitEnterEvadeMode(Unit* /*unit*/, uint8 /*evadeReason*/) { } virtual void OnUnitEnterCombat(Unit* /*unit*/, Unit* /*victim*/) { } virtual void OnUnitDeath(Unit* /*unit*/, Unit* /*killer*/) { } + virtual void OnUnitSetShapeshiftForm(Unit* /*unit*/, uint8 /*form*/) { } }; #endif diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 0d1f04eb6..af4b49490 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -557,6 +557,7 @@ public: /* UnitScript */ void OnUnitEnterEvadeMode(Unit* unit, uint8 why); void OnUnitEnterCombat(Unit* unit, Unit* victim); void OnUnitDeath(Unit* unit, Unit* killer); + void OnUnitSetShapeshiftForm(Unit* unit, uint8 form); public: /* MovementHandlerScript */ void OnPlayerMove(Player* player, MovementInfo movementInfo, uint32 opcode);