From 40f06a3fb068b0a6e95bffc25d4a20f43b6c015f Mon Sep 17 00:00:00 2001 From: hondacrx Date: Sun, 18 Sep 2022 22:22:44 -0400 Subject: [PATCH] Core/Loot: Refactored Player::SendLoot to accept Loot object directly Port From (https://github.com/TrinityCore/TrinityCore/commit/cbf2064c62137d9f0c0397956592f3ab9700480c) --- Source/Game/Entities/GameObject/GameObject.cs | 6 +- Source/Game/Entities/Player/Player.Items.cs | 66 +++---------------- Source/Game/Handlers/LootHandler.cs | 4 +- Source/Game/Handlers/SpellHandler.cs | 5 +- Source/Game/Loot/LootItemStorage.cs | 4 +- Source/Game/Spells/SpellEffects.cs | 23 ++++--- 6 files changed, 33 insertions(+), 75 deletions(-) diff --git a/Source/Game/Entities/GameObject/GameObject.cs b/Source/Game/Entities/GameObject/GameObject.cs index 866ba9a03..0882febe4 100644 --- a/Source/Game/Entities/GameObject/GameObject.cs +++ b/Source/Game/Entities/GameObject/GameObject.cs @@ -1900,13 +1900,13 @@ namespace Game.Entities else { loot = GetFishLoot(player); - player.SendLoot(GetGUID(), LootType.Fishing); + player.SendLoot(loot); } } else// If fishing skill is too low, send junk loot. { loot = GetFishLootJunk(player); - player.SendLoot(GetGUID(), LootType.FishingJunk); + player.SendLoot(loot); } break; } @@ -2121,7 +2121,7 @@ namespace Game.Entities loot.FillLoot(GetGoInfo().GetLootId(), LootStorage.Gameobject, player, true); m_personalLoot[player.GetGUID()] = loot; - player.SendLoot(GetGUID(), LootType.Fishinghole); + player.SendLoot(loot); player.UpdateCriteria(CriteriaType.CatchFishInFishingHole, GetGoInfo().entry); return; } diff --git a/Source/Game/Entities/Player/Player.Items.cs b/Source/Game/Entities/Player/Player.Items.cs index d29af2a3a..9dca857b9 100644 --- a/Source/Game/Entities/Player/Player.Items.cs +++ b/Source/Game/Entities/Player/Player.Items.cs @@ -6082,7 +6082,7 @@ namespace Game.Entities // Now it works like this: lvl10: ~6copper, lvl70: ~9silver bones.loot.gold = (uint)(RandomHelper.URand(50, 150) * 0.016f * Math.Pow((float)GetLevel() / 5.76f, 2.5f) * WorldConfig.GetFloatValue(WorldCfg.RateDropMoney)); bones.lootRecipient = looterPlr; - looterPlr.SendLoot(bones.GetGUID(), LootType.Insignia); + looterPlr.SendLoot(bones.loot); } public void SendLootRelease(ObjectGuid guid) @@ -6098,71 +6098,21 @@ namespace Game.Entities SendPacket(new LootReleaseAll()); } - public void SendLoot(ObjectGuid guid, LootType loot_type, bool aeLooting = false) + public void SendLoot(Loot loot, bool aeLooting = false) { if (!GetLootGUID().IsEmpty() && !aeLooting) Session.DoLootReleaseAll(); - Loot loot; + Log.outDebug(LogFilter.Loot, $"Player::SendLoot: Player: '{GetName()}' ({GetGUID()}), Loot: {loot.GetOwnerGUID()}"); - Log.outDebug(LogFilter.Loot, "Player.SendLoot"); - if (guid.IsGameObject()) - { - GameObject go = GetMap().GetGameObject(guid); - if (go == null) - { - SendLootRelease(guid); - return; - } - - loot = go.GetLootForPlayer(this); - } - else if (guid.IsItem()) - { - Item item = GetItemByGuid(guid); - - if (item == null) - { - SendLootRelease(guid); - return; - } - - loot = item.GetLootForPlayer(this); - } - else if (guid.IsCorpse()) // remove insignia - { - Corpse bones = ObjectAccessor.GetCorpse(this, guid); - if (bones == null) - { - SendLootRelease(guid); - return; - } - - loot = bones.GetLootForPlayer(this); - } - else - { - Creature creature = GetMap().GetCreature(guid); - - // must be in range and creature must be alive for pickpocket and must be dead for another loot - if (creature == null) - { - SendLootRelease(guid); - return; - } - - loot = creature.GetLootForPlayer(this); - } - - - if (!guid.IsItem() && !aeLooting) - SetLootGUID(guid); + if (!loot.GetOwnerGUID().IsItem() && !aeLooting) + SetLootGUID(loot.GetOwnerGUID()); LootResponse packet = new(); - packet.Owner = guid; + packet.Owner = loot.GetOwnerGUID(); packet.LootObj = loot.GetGUID(); packet.LootMethod = loot.GetLootMethod(); - packet.AcquireReason = (byte)SharedConst.GetLootTypeForClient(loot_type); + packet.AcquireReason = (byte)SharedConst.GetLootTypeForClient(loot.loot_type); packet.Acquired = true; // false == No Loot (this too^^) packet.AELooting = aeLooting; loot.BuildLootResponse(packet, this); @@ -6172,7 +6122,7 @@ namespace Game.Entities loot.OnLootOpened(GetMap(), GetGUID()); m_AELootView[loot.GetGUID()] = loot; - if (loot_type == LootType.Corpse && !guid.IsItem()) + if (loot.loot_type == LootType.Corpse && !loot.GetOwnerGUID().IsItem()) SetUnitFlag(UnitFlags.Looting); } diff --git a/Source/Game/Handlers/LootHandler.cs b/Source/Game/Handlers/LootHandler.cs index b05bc353f..c7c378e24 100644 --- a/Source/Game/Handlers/LootHandler.cs +++ b/Source/Game/Handlers/LootHandler.cs @@ -234,7 +234,7 @@ namespace Game if (!corpses.Empty()) SendPacket(new AELootTargets((uint)corpses.Count + 1)); - GetPlayer().SendLoot(packet.Unit, LootType.Corpse); + GetPlayer().SendLoot(lootTarget.GetLootForPlayer(GetPlayer())); if (!corpses.Empty()) { @@ -243,7 +243,7 @@ namespace Game foreach (Creature creature in corpses) { - GetPlayer().SendLoot(creature.GetGUID(), LootType.Corpse, true); + GetPlayer().SendLoot(creature.GetLootForPlayer(GetPlayer()), true); SendPacket(new AELootTargetsAck()); } } diff --git a/Source/Game/Handlers/SpellHandler.cs b/Source/Game/Handlers/SpellHandler.cs index 1b51f4ea5..29fde1f4c 100644 --- a/Source/Game/Handlers/SpellHandler.cs +++ b/Source/Game/Handlers/SpellHandler.cs @@ -212,7 +212,10 @@ namespace Game if (loot.gold > 0 || loot.unlootedCount > 0) Global.LootItemStorage.AddNewStoredLoot(item.GetGUID().GetCounter(), loot, player); } - player.SendLoot(item.GetGUID(), LootType.Item); + if (item.loot != null) + player.SendLoot(item.loot); + else + player.SendLootError(ObjectGuid.Empty, item.GetGUID(), LootError.NoLoot); } } diff --git a/Source/Game/Loot/LootItemStorage.cs b/Source/Game/Loot/LootItemStorage.cs index 82e1689ce..30e1d5458 100644 --- a/Source/Game/Loot/LootItemStorage.cs +++ b/Source/Game/Loot/LootItemStorage.cs @@ -99,11 +99,12 @@ namespace Game.Loots public bool LoadStoredLoot(Item item, Player player) { - Loot loot = item.GetLootForPlayer(player); if (!_lootItemStorage.ContainsKey(item.GetGUID().GetCounter())) return false; var container = _lootItemStorage[item.GetGUID().GetCounter()]; + + Loot loot = new(player.GetMap(), item.GetGUID(), LootType.Item, null); loot.gold = container.GetMoney(); LootTemplate lt = LootStorage.Items.GetLootFor(item.GetEntry()); @@ -141,6 +142,7 @@ namespace Game.Loots } // Mark the item if it has loot so it won't be generated again on open + item.loot = loot; item.m_lootGenerated = true; return true; } diff --git a/Source/Game/Spells/SpellEffects.cs b/Source/Game/Spells/SpellEffects.cs index b18094799..83d06ed71 100644 --- a/Source/Game/Spells/SpellEffects.cs +++ b/Source/Game/Spells/SpellEffects.cs @@ -1245,6 +1245,7 @@ namespace Game.Spells } } + Loot loot = null; if (gameObjTarget.GetLootState() == LootState.Ready) { uint lootId = gameObjTarget.GetGoInfo().GetLootId(); @@ -1255,7 +1256,7 @@ namespace Game.Spells Group group = player.GetGroup(); bool groupRules = group != null && gameObjTarget.GetGoInfo().Chest.usegrouplootrules != 0; - Loot loot = new(gameObjTarget.GetMap(), guid, loottype, groupRules ? group : null); + loot = new(gameObjTarget.GetMap(), guid, loottype, groupRules ? group : null); gameObjTarget.loot = loot; loot.FillLoot(lootId, LootStorage.Gameobject, player, !groupRules, false, gameObjTarget.GetLootMode(), gameObjTarget.GetMap().GetDifficultyLootItemContext()); @@ -1282,16 +1283,18 @@ namespace Game.Spells gameObjTarget.SetLootState(LootState.Activated, player); } + else + loot = gameObjTarget.GetLootForPlayer(player); + + // Send loot + if (loot != null) + player.SendLoot(loot); break; } - // Don't return, let loots been taken default: break; } } - - // Send loot - player.SendLoot(guid, loottype); } [SpellEffectHandler(SpellEffectName.OpenLock)] @@ -1980,7 +1983,7 @@ namespace Game.Spells return; } - player.SendLoot(unitTarget.GetGUID(), LootType.Pickpocketing); + player.SendLoot(creature.loot); } [SpellEffectHandler(SpellEffectName.AddFarsight)] @@ -3240,7 +3243,7 @@ namespace Game.Spells caster.UpdateCraftSkill(m_spellInfo); itemTarget.loot = new Loot(caster.GetMap(), itemTarget.GetGUID(), LootType.Disenchanting, null); itemTarget.loot.FillLoot(itemTarget.GetDisenchantLoot(caster).Id, LootStorage.Disenchant, caster, true); - caster.SendLoot(itemTarget.GetGUID(), LootType.Disenchanting); + caster.SendLoot(itemTarget.loot); } // item will be removed at disenchanting end @@ -3616,7 +3619,7 @@ namespace Game.Spells creature.loot = new Loot(creature.GetMap(), creature.GetGUID(), LootType.Skinning, null); creature.loot.FillLoot(creature.GetCreatureTemplate().SkinLootId, LootStorage.Skinning, player, true); creature.SetLootRecipient(player, false); - player.SendLoot(creature.GetGUID(), LootType.Skinning); + player.SendLoot(creature.loot); if (skill == SkillType.Skinning) { @@ -4329,7 +4332,7 @@ namespace Game.Spells itemTarget.loot = new Loot(player.GetMap(), itemTarget.GetGUID(), LootType.Prospecting, null); itemTarget.loot.FillLoot(itemTarget.GetEntry(), LootStorage.Prospecting, player, true); - player.SendLoot(itemTarget.GetGUID(), LootType.Prospecting); + player.SendLoot(itemTarget.loot); } [SpellEffectHandler(SpellEffectName.Milling)] @@ -4357,7 +4360,7 @@ namespace Game.Spells itemTarget.loot = new Loot(player.GetMap(), itemTarget.GetGUID(), LootType.Milling, null); itemTarget.loot.FillLoot(itemTarget.GetEntry(), LootStorage.Milling, player, true); - player.SendLoot(itemTarget.GetGUID(), LootType.Milling); + player.SendLoot(itemTarget.loot); } [SpellEffectHandler(SpellEffectName.Skill)]