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);