diff --git a/Source/Game/Entities/GameObject/GameObject.cs b/Source/Game/Entities/GameObject/GameObject.cs index 32927aa34..b194da09e 100644 --- a/Source/Game/Entities/GameObject/GameObject.cs +++ b/Source/Game/Entities/GameObject/GameObject.cs @@ -709,9 +709,6 @@ namespace Game.Entities case GameObjectTypes.Chest: loot?.Update(); - foreach (var (_, loot) in m_personalLoot) - loot.Update(); - // Non-consumable chest was partially looted and restock time passed, restock all loot now if (GetGoInfo().Chest.consumable == 0 && GetGoInfo().Chest.chestRestockTime != 0 && GameTime.GetGameTime() >= m_restockTime) { @@ -720,6 +717,10 @@ namespace Game.Entities ClearLoot(); UpdateDynamicFlagsForNearbyPlayers(); } + + foreach (var (_, loot) in m_personalLoot) + loot.Update(); + break; case GameObjectTypes.Trap: { @@ -2897,7 +2898,7 @@ namespace Game.Entities GetAI().OnLootStateChanged((uint)state, unit); // Start restock timer if the chest is partially looted or not looted at all - if (GetGoType() == GameObjectTypes.Chest && state == LootState.Activated && GetGoInfo().Chest.chestRestockTime > 0 && m_restockTime == 0) + if (GetGoType() == GameObjectTypes.Chest && state == LootState.Activated && GetGoInfo().Chest.chestRestockTime > 0 && m_restockTime == 0 && loot != null && loot.IsChanged()) m_restockTime = GameTime.GetGameTime() + GetGoInfo().Chest.chestRestockTime; // only set collision for doors on SetGoState diff --git a/Source/Game/Handlers/LootHandler.cs b/Source/Game/Handlers/LootHandler.cs index c1f907bed..498841ff6 100644 --- a/Source/Game/Handlers/LootHandler.cs +++ b/Source/Game/Handlers/LootHandler.cs @@ -22,7 +22,6 @@ namespace Game Player player = GetPlayer(); AELootResult aeResult = player.GetAELootView().Count > 1 ? new AELootResult() : null; - // @todo Implement looting by LootObject guid foreach (LootRequest req in packet.Loot) { Loot loot = player.GetAELootView().LookupByKey(req.Object); @@ -143,7 +142,7 @@ namespace Game SendPacket(packet); } - loot.gold = 0; + loot.LootMoney(); // Delete the money loot record from the DB if (loot.loot_type == LootType.Item) diff --git a/Source/Game/Loot/Loot.cs b/Source/Game/Loot/Loot.cs index 473ac1dcb..e9c62b8e0 100644 --- a/Source/Game/Loot/Loot.cs +++ b/Source/Game/Loot/Loot.cs @@ -728,6 +728,12 @@ namespace Game.Loots return allLooted; } + public void LootMoney() + { + gold = 0; + _changed = true; + } + public LootItem GetItemInSlot(uint lootListId) { if (lootListId < items.Count) @@ -902,6 +908,9 @@ namespace Game.Loots if (!lootRoll.TryToStart(map, this, lootListId, maxEnchantingSkill)) _rolls.Remove(lootListId); } + + if (!_rolls.Empty()) + _changed = true; } else if (_lootMethod == LootMethod.MasterLoot) { @@ -973,6 +982,7 @@ namespace Game.Loots if (is_looted) return null; + _changed = true; return item; } @@ -1064,7 +1074,8 @@ namespace Game.Loots } public bool IsLooted() { return gold == 0 && unlootedCount == 0; } - + public bool IsChanged() { return _changed; } + public void AddLooter(ObjectGuid guid) { PlayersLooting.Add(guid); } public void RemoveLooter(ObjectGuid guid) { PlayersLooting.Remove(guid); } @@ -1099,6 +1110,7 @@ namespace Game.Loots ObjectGuid _lootMaster; List _allowedLooters = new(); bool _wasOpened; // true if at least one player received the loot content + bool _changed; uint _dungeonEncounterId; }