From 87fdd300724a452196232d3f29c7074834875c76 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Tue, 4 Oct 2022 19:59:15 -0400 Subject: [PATCH] Core/Loot: Send DungeonEncounter id in SMSG_ITEM_PUSH_RESULT Port From (https://github.com/TrinityCore/TrinityCore/commit/5a516fb6549e460e68b45005a17ec1b6217fefa5) --- Source/Game/AI/ScriptedAI/ScriptedAI.cs | 9 +++++++++ Source/Game/Entities/Player/Player.Items.cs | 15 ++++++++++----- Source/Game/Handlers/LootHandler.cs | 4 ++-- Source/Game/Loot/Loot.cs | 12 +++++++++--- Source/Game/Maps/Instances/InstanceScript.cs | 5 +++++ Source/Game/Spells/SpellEffects.cs | 2 ++ 6 files changed, 37 insertions(+), 10 deletions(-) diff --git a/Source/Game/AI/ScriptedAI/ScriptedAI.cs b/Source/Game/AI/ScriptedAI/ScriptedAI.cs index 15cf65a32..0e0b50472 100644 --- a/Source/Game/AI/ScriptedAI/ScriptedAI.cs +++ b/Source/Game/AI/ScriptedAI/ScriptedAI.cs @@ -547,7 +547,16 @@ namespace Game.AI summons.DespawnAll(); _scheduler.CancelAll(); if (instance != null) + { + if (me.loot != null) + { + DungeonEncounterRecord dungeonEncounter = instance.GetBossDungeonEncounter(_bossId); + if (dungeonEncounter != null) + me.loot.SetDungeonEncounterId(dungeonEncounter.Id); + } + instance.SetBossState(_bossId, EncounterState.Done); + } } public void _JustEngagedWith(Unit who) diff --git a/Source/Game/Entities/Player/Player.Items.cs b/Source/Game/Entities/Player/Player.Items.cs index 5334aeae6..8dd6461b4 100644 --- a/Source/Game/Entities/Player/Player.Items.cs +++ b/Source/Game/Entities/Player/Player.Items.cs @@ -2502,7 +2502,7 @@ namespace Game.Entities } return true; } - public void SendNewItem(Item item, uint quantity, bool pushed, bool created, bool broadcast = false) + public void SendNewItem(Item item, uint quantity, bool pushed, bool created, bool broadcast = false, uint dungeonEncounterId = 0) { if (item == null) // prevent crash return; @@ -2519,7 +2519,6 @@ namespace Game.Entities //packet.QuestLogItemID; packet.Quantity = quantity; packet.QuantityInInventory = GetItemCount(item.GetEntry()); - //packet.DungeonEncounterID; packet.BattlePetSpeciesID = (int)item.GetModifier(ItemModifier.BattlePetSpeciesId); packet.BattlePetBreedID = (int)item.GetModifier(ItemModifier.BattlePetBreedData) & 0xFFFFFF; packet.BattlePetBreedQuality = (item.GetModifier(ItemModifier.BattlePetBreedData) >> 24) & 0xFF; @@ -2531,7 +2530,13 @@ namespace Game.Entities packet.DisplayText = ItemPushResult.DisplayType.Normal; packet.Created = created; //packet.IsBonusRoll; - //packet.IsEncounterLoot; + + if (dungeonEncounterId != 0) + { + packet.DisplayText = ItemPushResult.DisplayType.EncounterLoot; + packet.DungeonEncounterID = (int)dungeonEncounterId; + packet.IsEncounterLoot = true; + } if (broadcast && GetGroup() && !item.GetTemplate().HasFlag(ItemFlags3.DontReportLootLogToParty)) GetGroup().BroadcastPacket(packet, true); @@ -6020,13 +6025,13 @@ namespace Game.Entities // if aeLooting then we must delay sending out item so that it appears properly stacked in chat if (aeResult == null) { - SendNewItem(newitem, item.count, false, false, true); + SendNewItem(newitem, item.count, false, false, true, loot.GetDungeonEncounterId()); UpdateCriteria(CriteriaType.LootItem, item.itemid, item.count); UpdateCriteria(CriteriaType.GetLootByType, item.itemid, item.count, (uint)SharedConst.GetLootTypeForClient(loot.loot_type)); UpdateCriteria(CriteriaType.LootAnyItem, item.itemid, item.count); } else - aeResult.Add(newitem, item.count, SharedConst.GetLootTypeForClient(loot.loot_type)); + aeResult.Add(newitem, item.count, SharedConst.GetLootTypeForClient(loot.loot_type), loot.GetDungeonEncounterId()); // LootItem is being removed (looted) from the container, delete it from the DB. if (loot.loot_type == LootType.Item) diff --git a/Source/Game/Handlers/LootHandler.cs b/Source/Game/Handlers/LootHandler.cs index c7c378e24..5862d9df8 100644 --- a/Source/Game/Handlers/LootHandler.cs +++ b/Source/Game/Handlers/LootHandler.cs @@ -86,7 +86,7 @@ namespace Game { foreach (var resultValue in aeResult.GetByOrder()) { - player.SendNewItem(resultValue.item, resultValue.count, false, false, true); + player.SendNewItem(resultValue.item, resultValue.count, false, false, true, resultValue.dungeonEncounterId); player.UpdateCriteria(CriteriaType.LootItem, resultValue.item.GetEntry(), resultValue.count); player.UpdateCriteria(CriteriaType.GetLootByType, resultValue.item.GetEntry(), resultValue.count, (ulong)resultValue.lootType); player.UpdateCriteria(CriteriaType.LootAnyItem, resultValue.item.GetEntry(), resultValue.count); @@ -445,7 +445,7 @@ namespace Game // now move item from loot to target inventory Item newitem = target.StoreNewItem(dest, item.itemid, true, item.randomBonusListId, item.GetAllowedLooters(), item.context, item.BonusListIDs); - aeResult.Add(newitem, item.count, loot.loot_type); + aeResult.Add(newitem, item.count, loot.loot_type, loot.GetDungeonEncounterId()); // mark as looted item.count = 0; diff --git a/Source/Game/Loot/Loot.cs b/Source/Game/Loot/Loot.cs index bf19a2a58..9cdb1c6f8 100644 --- a/Source/Game/Loot/Loot.cs +++ b/Source/Game/Loot/Loot.cs @@ -822,7 +822,7 @@ namespace Game.Loots List ffaItems = new(); - foreach (LootItem item in items) + foreach (LootItem item in items) { if (!item.AllowedForPlayer(player)) continue; @@ -950,7 +950,7 @@ namespace Game.Loots var itemList = PlayerFFAItems.LookupByKey(player.GetGUID()); if (itemList != null) { - foreach (NotNormalLootItem notNormalLootItem in itemList) + foreach (NotNormalLootItem notNormalLootItem in itemList) { if (notNormalLootItem.LootListId == lootListId) { @@ -1087,6 +1087,9 @@ namespace Game.Loots public ObjectGuid GetLootMasterGUID() { return _lootMaster; } + public uint GetDungeonEncounterId() { return _dungeonEncounterId; } + public void SetDungeonEncounterId(uint dungeonEncounterId) { _dungeonEncounterId = dungeonEncounterId; } + public MultiMap GetPlayerFFAItems() { return PlayerFFAItems; } public List items = new(); @@ -1108,11 +1111,12 @@ namespace Game.Loots ObjectGuid _lootMaster; List _allowedLooters = new(); bool _wasOpened; // true if at least one player received the loot content + uint _dungeonEncounterId; } public class AELootResult { - public void Add(Item item, byte count, LootType lootType) + public void Add(Item item, byte count, LootType lootType, uint dungeonEncounterId) { var id = _byItem.LookupByKey(item); if (id != 0) @@ -1127,6 +1131,7 @@ namespace Game.Loots value.item = item; value.count = count; value.lootType = lootType; + value.dungeonEncounterId = dungeonEncounterId; _byOrder.Add(value); } } @@ -1144,6 +1149,7 @@ namespace Game.Loots public Item item; public byte count; public LootType lootType; + public uint dungeonEncounterId; } } } diff --git a/Source/Game/Maps/Instances/InstanceScript.cs b/Source/Game/Maps/Instances/InstanceScript.cs index a87dfead5..300671070 100644 --- a/Source/Game/Maps/Instances/InstanceScript.cs +++ b/Source/Game/Maps/Instances/InstanceScript.cs @@ -693,6 +693,11 @@ namespace Game.Maps } } + public DungeonEncounterRecord GetBossDungeonEncounter(uint id) + { + return id < bosses.Count ? bosses[id].GetDungeonEncounterForDifficulty(instance.GetDifficultyID()) : null; + } + public virtual bool CheckAchievementCriteriaMeet(uint criteria_id, Player source, Unit target = null, uint miscvalue1 = 0) { Log.outError(LogFilter.Server, "Achievement system call CheckAchievementCriteriaMeet but instance script for map {0} not have implementation for achievement criteria {1}", diff --git a/Source/Game/Spells/SpellEffects.cs b/Source/Game/Spells/SpellEffects.cs index fb29b60dc..341b8bbbe 100644 --- a/Source/Game/Spells/SpellEffects.cs +++ b/Source/Game/Spells/SpellEffects.cs @@ -1267,6 +1267,8 @@ namespace Game.Spells if (addon != null) loot.GenerateMoneyLoot(addon.Mingold, addon.Maxgold); } + + loot.SetDungeonEncounterId(gameObjTarget.GetGoInfo().Chest.DungeonEncounter); } /// @todo possible must be moved to loot release (in different from linked triggering)