diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 76 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 | ||||
-rw-r--r-- | src/server/game/Handlers/LootHandler.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Handlers/SpellHandler.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Loot/Loot.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Loot/Loot.h | 6 | ||||
-rw-r--r-- | src/server/game/Loot/LootItemStorage.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 24 |
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() |