From ae8dd49fd49181039dd4ad815de33b964809715f Mon Sep 17 00:00:00 2001 From: Munzeria <58388054+Munzeria@users.noreply.github.com> Date: Sat, 27 Dec 2025 00:09:56 +0100 Subject: [PATCH] feat(Core/PlayerScript): Add Unequip hook (#23248) Co-authored-by: Munzeria Co-authored-by: sudlud --- src/server/game/Entities/Player/PlayerStorage.cpp | 6 ++++++ src/server/game/Scripting/ScriptDefines/PlayerScript.cpp | 5 +++++ src/server/game/Scripting/ScriptDefines/PlayerScript.h | 4 ++++ src/server/game/Scripting/ScriptMgr.h | 1 + 4 files changed, 16 insertions(+) diff --git a/src/server/game/Entities/Player/PlayerStorage.cpp b/src/server/game/Entities/Player/PlayerStorage.cpp index 5e85b1e10..e8117aa58 100644 --- a/src/server/game/Entities/Player/PlayerStorage.cpp +++ b/src/server/game/Entities/Player/PlayerStorage.cpp @@ -3540,6 +3540,8 @@ void Player::SwapItem(uint16 src, uint16 dst) Item* pSrcItem = GetItemByPos(srcbag, srcslot); Item* pDstItem = GetItemByPos(dstbag, dstslot); + bool isUnequipingItem = false; + if (!pSrcItem) return; @@ -3570,6 +3572,7 @@ void Player::SwapItem(uint16 src, uint16 dst) SendEquipError(msg, pSrcItem, pDstItem); return; } + isUnequipingItem = true; } // anti-wpe @@ -3670,6 +3673,9 @@ void Player::SwapItem(uint16 src, uint16 dst) AutoUnequipOffhandIfNeed(); } + if (isUnequipingItem) + sScriptMgr->OnPlayerUnequip(this, pSrcItem); + return; } diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp index b03268893..63258d4f0 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp @@ -329,6 +329,11 @@ void ScriptMgr::OnPlayerEquip(Player* player, Item* it, uint8 bag, uint8 slot, b CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_EQUIP, script->OnPlayerEquip(player, it, bag, slot, update)); } +void ScriptMgr::OnPlayerUnequip(Player* player, Item* it) +{ + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_UNEQUIP_ITEM, script->OnPlayerUnequip(player, it)); +} + void ScriptMgr::OnPlayerJoinBG(Player* player) { CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_PLAYER_JOIN_BG, script->OnPlayerJoinBG(player)); diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.h b/src/server/game/Scripting/ScriptDefines/PlayerScript.h index 3b6dfe728..7d1bb46c0 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.h +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.h @@ -88,6 +88,7 @@ enum PlayerHook PLAYERHOOK_ON_AFTER_SET_VISIBLE_ITEM_SLOT, PLAYERHOOK_ON_AFTER_MOVE_ITEM_FROM_INVENTORY, PLAYERHOOK_ON_EQUIP, + PLAYERHOOK_ON_UNEQUIP_ITEM, PLAYERHOOK_ON_PLAYER_JOIN_BG, PLAYERHOOK_ON_PLAYER_JOIN_ARENA, PLAYERHOOK_GET_CUSTOM_GET_ARENA_TEAM_ID, @@ -395,6 +396,9 @@ public: // After an item has been equipped virtual void OnPlayerEquip(Player* /*player*/, Item* /*it*/, uint8 /*bag*/, uint8 /*slot*/, bool /*update*/) { } + // After an item has been unequipped + virtual void OnPlayerUnequip(Player* /*player*/, Item* /*it*/) { } + // After player enters queue for BG virtual void OnPlayerJoinBG(Player* /*player*/) { } diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 5aa131f04..2d8b93e3e 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -351,6 +351,7 @@ public: /* PlayerScript */ void OnPlayerAfterSetVisibleItemSlot(Player* player, uint8 slot, Item* item); void OnPlayerAfterMoveItemFromInventory(Player* player, Item* it, uint8 bag, uint8 slot, bool update); void OnPlayerEquip(Player* player, Item* it, uint8 bag, uint8 slot, bool update); + void OnPlayerUnequip(Player* player, Item* it); void OnPlayerJoinBG(Player* player); void OnPlayerJoinArena(Player* player); void OnPlayerGetMaxPersonalArenaRatingRequirement(Player const* player, uint32 minSlot, uint32& maxArenaRating) const;