diff options
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 29 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 | ||||
-rw-r--r-- | src/server/game/Groups/Group.cpp | 19 |
3 files changed, 37 insertions, 13 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index d1495f02614..053bd809a50 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -15297,18 +15297,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, SendNewItem(item, quest->RewardItemIdCount[i], true, false); } else if (quest->IsDFQuest()) - { - MailSender sender(MAIL_CREATURE, 34337 /* The Postmaster */ ); - MailDraft draft("Recovered Item", "We recovered a lost item in the twisting nether and noted that it was yours.$B$BPlease find said object enclosed."); // This is the text used in Cataclysm, it probably wasn't changed. - SQLTransaction trans = CharacterDatabase.BeginTransaction(); - if (Item* item = Item::CreateItem(quest->RewardItemId[i], quest->RewardItemIdCount[i], 0)) - { - item->SaveToDB(trans); - draft.AddItem(item); - } - draft.SendMailTo(trans, MailReceiver(this, this->GetGUIDLow()), sender); - CharacterDatabase.CommitTransaction(trans); - } + SendItemRetrievalMail(quest->RewardItemId[i], quest->RewardItemIdCount[i]); } } } @@ -26497,6 +26486,22 @@ void Player::RefundItem(Item* item) CharacterDatabase.CommitTransaction(trans); } +void Player::SendItemRetrievalMail(uint32 itemEntry, uint32 count) +{ + MailSender sender(MAIL_CREATURE, 34337 /* The Postmaster */); + MailDraft draft("Recovered Item", "We recovered a lost item in the twisting nether and noted that it was yours.$B$BPlease find said object enclosed."); // This is the text used in Cataclysm, it probably wasn't changed. + SQLTransaction trans = CharacterDatabase.BeginTransaction(); + + if (Item* item = Item::CreateItem(itemEntry, count, 0)) + { + item->SaveToDB(trans); + draft.AddItem(item); + } + + draft.SendMailTo(trans, MailReceiver(this, GetGUIDLow()), sender); + CharacterDatabase.CommitTransaction(trans); +} + void Player::SetRandomWinner(bool isWinner) { m_IsBGRandomWinner = isWinner; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index b1fd9d5a97f..27ea8355345 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1571,6 +1571,8 @@ class Player : public Unit, public GridObject<Player> PlayerMails::iterator GetMailBegin() { return m_mail.begin();} PlayerMails::iterator GetMailEnd() { return m_mail.end();} + void SendItemRetrievalMail(uint32 itemEntry, uint32 count); // Item retrieval mails sent by The Postmaster (34337), used in multiple places. + /*********************************************************/ /*** MAILED ITEMS SYSTEM ***/ /*********************************************************/ diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 8068e82f676..88a83ab6fde 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -1420,8 +1420,25 @@ void Group::CountTheRoll(Rolls::iterator rollI) roll->getLoot()->NotifyItemRemoved(roll->itemSlot); roll->getLoot()->unlootedCount--; ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(roll->itemid); - player->AutoStoreLoot(pProto->DisenchantID, LootTemplates_Disenchant, true); player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL, 13262); // Disenchant + + ItemPosCountVec dest; + InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, roll->itemid, item->count); + if (msg == EQUIP_ERR_OK) + player->AutoStoreLoot(pProto->DisenchantID, LootTemplates_Disenchant, true); + else // If the player's inventory is full, send the disenchant result in a mail. + { + Loot loot; + loot.FillLoot(pProto->DisenchantID, LootTemplates_Disenchant, player, true); + + uint32 max_slot = loot.GetMaxSlotInLootFor(player); + for (uint32 i = 0; i < max_slot; ++i) + { + LootItem* lootItem = loot.LootItemInSlot(i, player); + player->SendEquipError(msg, NULL, NULL, lootItem->itemid); + player->SendItemRetrievalMail(lootItem->itemid, lootItem->count); + } + } } } } |