aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-09-18 18:24:57 +0200
committerShauren <shauren.trinity@gmail.com>2022-09-18 18:24:57 +0200
commitcbf2064c62137d9f0c0397956592f3ab9700480c (patch)
tree2b4be1d88a04b72231eb0921892f807362a9f5ec
parent0b75187ee38c18b1322309fd493820fd36887a8a (diff)
Core/Loot: Refactored Player::SendLoot to accept Loot object directly
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp6
-rw-r--r--src/server/game/Entities/Player/Player.cpp76
-rw-r--r--src/server/game/Entities/Player/Player.h2
-rw-r--r--src/server/game/Handlers/LootHandler.cpp5
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp5
-rw-r--r--src/server/game/Loot/Loot.cpp6
-rw-r--r--src/server/game/Loot/Loot.h6
-rw-r--r--src/server/game/Loot/LootItemStorage.cpp3
-rw-r--r--src/server/game/Spells/SpellEffects.cpp24
9 files changed, 51 insertions, 82 deletions
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index ed518b5cf7a..7bbf6cccf76 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -2416,13 +2416,13 @@ void GameObject::Use(Unit* user)
else
{
m_loot.reset(GetFishLoot(player));
- player->SendLoot(GetGUID(), LOOT_FISHING);
+ player->SendLoot(*m_loot);
}
}
else // If fishing skill is too low, send junk loot.
{
m_loot.reset(GetFishLootJunk(player));
- player->SendLoot(GetGUID(), LOOT_FISHING_JUNK);
+ player->SendLoot(*m_loot);
}
break;
}
@@ -2639,7 +2639,7 @@ void GameObject::Use(Unit* user)
loot->FillLoot(GetGOInfo()->GetLootId(), LootTemplates_Gameobject, player, true);
m_personalLoot[player->GetGUID()].reset(loot);
- player->SendLoot(GetGUID(), LOOT_FISHINGHOLE);
+ player->SendLoot(*loot);
player->UpdateCriteria(CriteriaType::CatchFishInFishingHole, GetGOInfo()->entry);
return;
}
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index e149b1a0bc3..e38e45e80a8 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -8772,7 +8772,7 @@ void Player::RemovedInsignia(Player* looterPlr)
// Now it works like this: lvl10: ~6copper, lvl70: ~9silver
bones->m_loot->gold = uint32(urand(50, 150) * 0.016f * std::pow(float(GetLevel()) / 5.76f, 2.5f) * sWorld->getRate(RATE_DROP_MONEY));
bones->lootRecipient = looterPlr;
- looterPlr->SendLoot(bones->GetGUID(), LOOT_INSIGNIA);
+ looterPlr->SendLoot(*bones->m_loot);
}
void Player::SendLootRelease(ObjectGuid guid) const
@@ -8788,82 +8788,32 @@ void Player::SendLootReleaseAll() const
SendDirectMessage(WorldPackets::Loot::LootReleaseAll().Write());
}
-void Player::SendLoot(ObjectGuid guid, LootType loot_type, bool aeLooting/* = false*/)
+void Player::SendLoot(Loot& loot, bool aeLooting)
{
if (!GetLootGUID().IsEmpty() && !aeLooting)
m_session->DoLootReleaseAll();
- Loot* loot;
-
TC_LOG_DEBUG("loot", "Player::SendLoot: Player: '%s' (%s), Loot: %s",
- GetName().c_str(), GetGUID().ToString().c_str(), guid.ToString().c_str());
- if (guid.IsGameObject())
- {
- GameObject* go = GetMap()->GetGameObject(guid);
-
- if (!go)
- {
- SendLootRelease(guid);
- return;
- }
-
- loot = go->GetLootForPlayer(this);
- }
- else if (guid.IsItem())
- {
- Item* item = GetItemByGuid(guid);
-
- if (!item)
- {
- SendLootRelease(guid);
- return;
- }
-
- loot = item->GetLootForPlayer(this);
- }
- else if (guid.IsCorpse()) // remove insignia
- {
- Corpse* bones = ObjectAccessor::GetCorpse(*this, guid);
-
- if (!bones)
- {
- SendLootRelease(guid);
- return;
- }
-
- loot = bones->GetLootForPlayer(this);
- }
- else
- {
- Creature* creature = GetMap()->GetCreature(guid);
-
- if (!creature)
- {
- SendLootRelease(guid);
- return;
- }
-
- loot = creature->GetLootForPlayer(this);
- }
+ GetName().c_str(), GetGUID().ToString().c_str(), loot.GetOwnerGUID().ToString().c_str());
- if (!guid.IsItem() && !aeLooting)
- SetLootGUID(guid);
+ if (!loot.GetOwnerGUID().IsItem() && !aeLooting)
+ SetLootGUID(loot.GetOwnerGUID());
WorldPackets::Loot::LootResponse packet;
- packet.Owner = guid;
- packet.LootObj = loot->GetGUID();
- packet._LootMethod = loot->GetLootMethod();
- packet.AcquireReason = GetLootTypeForClient(loot_type);
+ packet.Owner = loot.GetOwnerGUID();
+ packet.LootObj = loot.GetGUID();
+ packet._LootMethod = loot.GetLootMethod();
+ packet.AcquireReason = GetLootTypeForClient(loot.loot_type);
packet.Acquired = true; // false == No Loot (this too^^)
packet.AELooting = aeLooting;
- loot->BuildLootResponse(packet, this);
+ loot.BuildLootResponse(packet, this);
SendDirectMessage(packet.Write());
// add 'this' player as one of the players that are looting 'loot'
- loot->OnLootOpened(GetMap(), GetGUID());
- m_AELootView[loot->GetGUID()] = loot;
+ loot.OnLootOpened(GetMap(), GetGUID());
+ m_AELootView[loot.GetGUID()] = &loot;
- if (loot_type == LOOT_CORPSE && !guid.IsItem())
+ if (loot.loot_type == LOOT_CORPSE && !loot.GetOwnerGUID().IsItem())
SetUnitFlag(UNIT_FLAG_LOOTING);
}
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 4ad0f6af647..d1b716bba3f 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2351,7 +2351,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
PlayerMenu* PlayerTalkClass;
std::vector<ItemSetEffect*> ItemSetEff;
- void SendLoot(ObjectGuid guid, LootType loot_type, bool aeLooting = false);
+ void SendLoot(Loot& loot, bool aeLooting = false);
void SendLootError(ObjectGuid const& lootObj, ObjectGuid const& owner, LootError error) const;
void SendLootRelease(ObjectGuid guid) const;
void SendLootReleaseAll() const;
diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp
index 3d32e72e66e..28442b1abf8 100644
--- a/src/server/game/Handlers/LootHandler.cpp
+++ b/src/server/game/Handlers/LootHandler.cpp
@@ -30,7 +30,6 @@
#include "Log.h"
#include "Loot.h"
#include "LootItemStorage.h"
-#include "LootMgr.h"
#include "LootPackets.h"
#include "Object.h"
#include "ObjectAccessor.h"
@@ -233,7 +232,7 @@ void WorldSession::HandleLootOpcode(WorldPackets::Loot::LootUnit& packet)
if (!corpses.empty())
SendPacket(WorldPackets::Loot::AELootTargets(uint32(corpses.size() + 1)).Write());
- GetPlayer()->SendLoot(packet.Unit, LOOT_CORPSE);
+ GetPlayer()->SendLoot(*lootTarget->GetLootForPlayer(GetPlayer()));
if (!corpses.empty())
{
@@ -242,7 +241,7 @@ void WorldSession::HandleLootOpcode(WorldPackets::Loot::LootUnit& packet)
for (Creature* creature : corpses)
{
- GetPlayer()->SendLoot(creature->GetGUID(), LOOT_CORPSE, true);
+ GetPlayer()->SendLoot(*creature->GetLootForPlayer(GetPlayer()), true);
SendPacket(WorldPackets::Loot::AELootTargetsAck().Write());
}
}
diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp
index 4b1559fc2a4..2be6d4612c9 100644
--- a/src/server/game/Handlers/SpellHandler.cpp
+++ b/src/server/game/Handlers/SpellHandler.cpp
@@ -222,7 +222,10 @@ void WorldSession::HandleOpenItemOpcode(WorldPackets::Spells::OpenItem& packet)
if (loot->gold > 0 || loot->unlootedCount > 0)
sLootItemStorage->AddNewStoredLoot(item->GetGUID().GetCounter(), loot, player);
}
- player->SendLoot(item->GetGUID(), LOOT_ITEM);
+ if (item->m_loot)
+ player->SendLoot(*item->m_loot);
+ else
+ player->SendLootError(ObjectGuid::Empty, item->GetGUID(), LOOT_ERROR_NO_LOOT);
}
}
diff --git a/src/server/game/Loot/Loot.cpp b/src/server/game/Loot/Loot.cpp
index 62d86b7ce0c..ff3a77279c4 100644
--- a/src/server/game/Loot/Loot.cpp
+++ b/src/server/game/Loot/Loot.cpp
@@ -61,6 +61,12 @@ LootItem::LootItem(LootStoreItem const& li)
rollWinnerGUID = ObjectGuid::Empty;
}
+LootItem::LootItem(LootItem const&) = default;
+LootItem::LootItem(LootItem&&) noexcept = default;
+LootItem& LootItem::operator=(LootItem const&) = default;
+LootItem& LootItem::operator=(LootItem&&) noexcept = default;
+LootItem::~LootItem() = default;
+
// Basic checks for player/item compatibility - if false no chance to see the item in the loot
bool LootItem::AllowedForPlayer(Player const* player, bool isGivenByMasterLooter) const
{
diff --git a/src/server/game/Loot/Loot.h b/src/server/game/Loot/Loot.h
index a966a4df4dd..3af9963aa06 100644
--- a/src/server/game/Loot/Loot.h
+++ b/src/server/game/Loot/Loot.h
@@ -186,6 +186,12 @@ struct TC_GAME_API LootItem
LootItem() : itemid(0), LootListId(0), randomBonusListId(0), context(ItemContext::NONE), count(0), is_looted(false), is_blocked(false),
freeforall(false), is_underthreshold(false), is_counted(false), needs_quest(false), follow_loot_rules(false) { }
+ LootItem(LootItem const&);
+ LootItem(LootItem&&) noexcept;
+ LootItem& operator=(LootItem const&);
+ LootItem& operator=(LootItem&&) noexcept;
+ ~LootItem();
+
// Basic checks for player/item compatibility - if false no chance to see the item in the loot
bool AllowedForPlayer(Player const* player, bool isGivenByMasterLooter = false) const;
void AddAllowedLooter(Player const* player);
diff --git a/src/server/game/Loot/LootItemStorage.cpp b/src/server/game/Loot/LootItemStorage.cpp
index 605b2e6c2f9..5edb9f7e9fd 100644
--- a/src/server/game/Loot/LootItemStorage.cpp
+++ b/src/server/game/Loot/LootItemStorage.cpp
@@ -137,7 +137,6 @@ void LootItemStorage::LoadStorageFromDB()
bool LootItemStorage::LoadStoredLoot(Item* item, Player* player)
{
- Loot* loot = item->GetLootForPlayer(player);
StoredLootContainer const* container = nullptr;
// read
@@ -152,6 +151,7 @@ bool LootItemStorage::LoadStoredLoot(Item* item, Player* player)
}
// container is never null at this point
+ Loot* loot = new Loot(player->GetMap(), item->GetGUID(), LOOT_ITEM, nullptr);
loot->gold = container->GetMoney();
if (LootTemplate const* lt = LootTemplates_Item.GetLootFor(item->GetEntry()))
@@ -188,6 +188,7 @@ bool LootItemStorage::LoadStoredLoot(Item* item, Player* player)
}
// Mark the item if it has loot so it won't be generated again on open
+ item->m_loot.reset(loot);
item->m_lootGenerated = true;
return true;
}
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index af66302df7f..c213e78e01f 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -1547,6 +1547,7 @@ void Spell::SendLoot(ObjectGuid guid, LootType loottype)
return;
case GAMEOBJECT_TYPE_CHEST:
+ {
if (Battleground* bg = player->GetBattleground())
{
if (!bg->CanActivateGO(gameObjTarget->GetEntry(), bg->GetPlayerTeam(player->GetGUID())))
@@ -1556,6 +1557,7 @@ void Spell::SendLoot(ObjectGuid guid, LootType loottype)
}
}
+ Loot* loot = nullptr;
if (gameObjTarget->getLootState() == GO_READY)
{
if (uint32 lootId = gameObjTarget->GetGOInfo()->GetLootId())
@@ -1565,7 +1567,7 @@ void Spell::SendLoot(ObjectGuid guid, LootType loottype)
Group const* group = player->GetGroup();
bool groupRules = group && gameObjTarget->GetGOInfo()->chest.usegrouplootrules;
- Loot* loot = new Loot(gameObjTarget->GetMap(), guid, loottype, groupRules ? group : nullptr);
+ loot = new Loot(gameObjTarget->GetMap(), guid, loottype, groupRules ? group : nullptr);
gameObjTarget->m_loot.reset(loot);
loot->FillLoot(lootId, LootTemplates_Gameobject, player, !groupRules, false, gameObjTarget->GetLootMode(), gameObjTarget->GetMap()->GetDifficultyLootItemContext());
@@ -1588,16 +1590,18 @@ void Spell::SendLoot(ObjectGuid guid, LootType loottype)
gameObjTarget->SetLootState(GO_ACTIVATED, player);
}
+ else
+ loot = gameObjTarget->GetLootForPlayer(player);
- // Don't return, let loots been taken
+ // Send loot
+ if (loot)
+ player->SendLoot(*loot);
break;
+ }
default:
break;
}
}
-
- // Send loot
- player->SendLoot(guid, loottype);
}
void Spell::EffectOpenLock()
@@ -2281,7 +2285,7 @@ void Spell::EffectPickPocket()
return;
}
- player->SendLoot(unitTarget->GetGUID(), LOOT_PICKPOCKETING);
+ player->SendLoot(*creature->m_loot);
}
void Spell::EffectAddFarsight()
@@ -3481,7 +3485,7 @@ void Spell::EffectDisEnchant()
caster->UpdateCraftSkill(m_spellInfo);
itemTarget->m_loot.reset(new Loot(caster->GetMap(), itemTarget->GetGUID(), LOOT_DISENCHANTING, nullptr));
itemTarget->m_loot->FillLoot(ASSERT_NOTNULL(itemTarget->GetDisenchantLoot(caster))->ID, LootTemplates_Disenchant, caster, true);
- caster->SendLoot(itemTarget->GetGUID(), LOOT_DISENCHANTING);
+ caster->SendLoot(*itemTarget->m_loot);
}
// item will be removed at disenchanting end
@@ -3843,7 +3847,7 @@ void Spell::EffectSkinning()
creature->m_loot.reset(new Loot(creature->GetMap(), creature->GetGUID(), LOOT_SKINNING, nullptr));
creature->m_loot->FillLoot(creature->GetCreatureTemplate()->SkinLootId, LootTemplates_Skinning, player, true);
creature->SetLootRecipient(player, false);
- player->SendLoot(creature->GetGUID(), LOOT_SKINNING);
+ player->SendLoot(*creature->m_loot);
if (skill == SKILL_SKINNING)
{
@@ -4544,7 +4548,7 @@ void Spell::EffectProspecting()
itemTarget->m_loot.reset(new Loot(player->GetMap(), itemTarget->GetGUID(), LOOT_PROSPECTING, nullptr));
itemTarget->m_loot->FillLoot(itemTarget->GetEntry(), LootTemplates_Prospecting, player, true);
- player->SendLoot(itemTarget->GetGUID(), LOOT_PROSPECTING);
+ player->SendLoot(*itemTarget->m_loot);
}
void Spell::EffectMilling()
@@ -4571,7 +4575,7 @@ void Spell::EffectMilling()
itemTarget->m_loot.reset(new Loot(player->GetMap(), itemTarget->GetGUID(), LOOT_MILLING, nullptr));
itemTarget->m_loot->FillLoot(itemTarget->GetEntry(), LootTemplates_Milling, player, true);
- player->SendLoot(itemTarget->GetGUID(), LOOT_MILLING);
+ player->SendLoot(*itemTarget->m_loot);
}
void Spell::EffectSkill()