From f70ed8b8cad9d24ca68744da07599412893ab856 Mon Sep 17 00:00:00 2001 From: Axel Cocat Date: Sat, 1 May 2021 07:03:59 +0200 Subject: [PATCH] fix(Core): fix chests not despawning when opened in group (2) (#5387) * fix(Core): fix chests not despawning when opened in group * fix(Core): fix crashes in pr #5371 * Replaced nullptr checks * Used if with initializer instead of separate scope --- src/server/game/Entities/GameObject/GameObject.cpp | 1 + src/server/game/Groups/Group.cpp | 10 ++++++++++ src/server/game/Loot/LootMgr.h | 2 ++ 3 files changed, 13 insertions(+) diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 1c0d4ea15..e74cf20b5 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -58,6 +58,7 @@ GameObject::GameObject() : WorldObject(false), MovableMapObject(), m_lootGenerationTime = 0; ResetLootMode(); // restore default loot mode + loot.sourceGameObject = this; m_stationaryPosition.Relocate(0.0f, 0.0f, 0.0f, 0.0f); } diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index bc4f39d9a..335df3d6d 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -1493,6 +1493,16 @@ void Group::CountTheRoll(Rolls::iterator rollI, Map* allowedMap) item->is_blocked = false; } + if (Loot* loot = roll->getLoot(); loot && loot->isLooted() && loot->sourceGameObject) + { + const GameObjectTemplate* goInfo = loot->sourceGameObject->GetGOInfo(); + if (goInfo && goInfo->type == GAMEOBJECT_TYPE_CHEST) + { + // Deactivate chest if the last item was rolled in group + loot->sourceGameObject->SetLootState(GO_JUST_DEACTIVATED); + } + } + RollId.erase(rollI); delete roll; } diff --git a/src/server/game/Loot/LootMgr.h b/src/server/game/Loot/LootMgr.h index f55ca83e8..8f98c6b62 100644 --- a/src/server/game/Loot/LootMgr.h +++ b/src/server/game/Loot/LootMgr.h @@ -111,6 +111,7 @@ enum LootSlotType class Player; class LootStore; class ConditionMgr; +class GameObject; struct Loot; struct LootStoreItem @@ -313,6 +314,7 @@ struct Loot // GUID of container that holds this loot (item_instance.entry), set for items that can be looted ObjectGuid containerGUID; + GameObject* sourceGameObject{nullptr}; Loot(uint32 _gold = 0) : gold(_gold) { } ~Loot() { clear(); }