Core/Loot: Refactored Player::SendLoot to accept Loot object directly

Port From (https://github.com/TrinityCore/TrinityCore/commit/cbf2064c62137d9f0c0397956592f3ab9700480c)
This commit is contained in:
hondacrx
2022-09-18 22:22:44 -04:00
parent 6c7991c28f
commit 40f06a3fb0
6 changed files with 33 additions and 75 deletions
@@ -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;
}
+8 -58
View File
@@ -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);
}
+2 -2
View File
@@ -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());
}
}
+4 -1
View File
@@ -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);
}
}
+3 -1
View File
@@ -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;
}
+13 -10
View File
@@ -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)]