From 8d08a861aad9d1fd79a9a3ca455a4e85e8f84871 Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Fri, 8 Sep 2023 01:52:02 -0300 Subject: [PATCH] feat(Core/Scripting): Implement OnAllowedToLootContainerCheck() hook (#17209) * chore(Core/Loot): Move OnAllowedForPlayerLootCheck() hook call up * Revert "chore(Core/Loot): Move OnAllowedForPlayerLootCheck() hook call up" This reverts commit f841ef9da313976179fb788d9573ff8ced05ecb9. * feat(Core/Scripting): Implement OnAllowedToLootContainerCheck() hook * Update GlobalScript.cpp --- src/server/game/Entities/Player/Player.cpp | 6 ++++++ .../game/Scripting/ScriptDefines/GlobalScript.cpp | 15 +++++++++++++++ src/server/game/Scripting/ScriptMgr.h | 6 +++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 787d4ecb1..1f0d9e314 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -8041,6 +8041,12 @@ void Player::SendLoot(ObjectGuid guid, LootType loot_type) // need know merged fishing/corpse loot type for achievements loot->loot_type = loot_type; + if (!sScriptMgr->OnAllowedToLootContainerCheck(this, guid)) + { + SendLootError(guid, LOOT_ERROR_DIDNT_KILL); + return; + } + if (permission != NONE_PERMISSION) { SetLootGUID(guid); diff --git a/src/server/game/Scripting/ScriptDefines/GlobalScript.cpp b/src/server/game/Scripting/ScriptDefines/GlobalScript.cpp index 1e10185de..74b1ddbe4 100644 --- a/src/server/game/Scripting/ScriptDefines/GlobalScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/GlobalScript.cpp @@ -178,6 +178,21 @@ bool ScriptMgr::OnAllowedForPlayerLootCheck(Player const* player, ObjectGuid sou return true; } +bool ScriptMgr::OnAllowedToLootContainerCheck(Player const* player, ObjectGuid source) +{ + auto ret = IsValidBoolScript([&](GlobalScript* script) + { + return script->OnAllowedToLootContainerCheck(player, source); + }); + + if (ret && *ret) + { + return false; + } + + return true; +} + /** * @brief Called when an instance Id is deleted, usually because it expired or no players are bound to it anymore. * diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index e4fcd3f96..5c66b2a8d 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -1646,9 +1646,12 @@ public: // Called after loading spell dbc corrections virtual void OnLoadSpellCustomAttr(SpellInfo* /*spell*/) { } - // Called when checking if a player can see the creature loot + // Called when checking if a player can see the creature loot item virtual bool OnAllowedForPlayerLootCheck(Player const* /*player*/, ObjectGuid /*source*/) { return false; }; + // Called when checking if a player can see the creature loot (if it can click the corpse f.e) + virtual bool OnAllowedToLootContainerCheck(Player const* /*player*/, ObjectGuid /*source*/) { return false; }; + // Called when instance id is removed from database (e.g. instance reset) virtual void OnInstanceIdRemoved(uint32 /*instanceId*/) { } @@ -2494,6 +2497,7 @@ public: /* GlobalScript */ bool OnSpellHealingBonusTakenNegativeModifiers(Unit const* target, Unit const* caster, SpellInfo const* spellInfo, float& val); void OnLoadSpellCustomAttr(SpellInfo* spell); bool OnAllowedForPlayerLootCheck(Player const* player, ObjectGuid source); + bool OnAllowedToLootContainerCheck(Player const* player, ObjectGuid source); void OnInstanceIdRemoved(uint32 instanceId); void OnBeforeSetBossState(uint32 id, EncounterState newState, EncounterState oldState, Map* instance);