@@ -66,6 +66,40 @@ Loot* Roll::getLoot()
6666 return getTarget ();
6767}
6868
69+ static void SendRollWonItemViaMail (Player* player, LootItem const * lootItem, uint32 itemId)
70+ {
71+ Item* mailItem = Item::CreateItem (itemId, lootItem->count , player, false , lootItem->randomPropertyId );
72+ if (!mailItem)
73+ return ;
74+
75+ AllowedLooterSet looters = lootItem->GetAllowedLooters ();
76+ ItemTemplate const * proto = mailItem->GetTemplate ();
77+ // Preserve the 2-hour group trade window the item would have had if stored directly.
78+ if (looters.size () > 1 && proto->GetMaxStackSize () == 1 &&
79+ (proto->Bonding == BIND_WHEN_PICKED_UP || proto->Bonding == BIND_QUEST_ITEM ) &&
80+ sWorld ->getBoolConfig (CONFIG_SET_BOP_ITEM_TRADEABLE ))
81+ {
82+ mailItem->SetBinding (true );
83+ mailItem->SetSoulboundTradeable (looters);
84+ mailItem->SetUInt32Value (ITEM_FIELD_CREATE_PLAYED_TIME , player->GetTotalPlayedTime ());
85+
86+ std::string lootersStr;
87+ for (ObjectGuid const & guid : looters)
88+ {
89+ if (!lootersStr.empty ())
90+ lootersStr += ' ' ;
91+ lootersStr += std::to_string (guid.GetCounter ());
92+ }
93+
94+ CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement (CHAR_INS_ITEM_BOP_TRADE );
95+ stmt->SetData (0 , mailItem->GetGUID ().GetCounter ());
96+ stmt->SetData (1 , lootersStr);
97+ CharacterDatabase.Execute (stmt);
98+ }
99+
100+ player->SendItemRetrievalMail (mailItem);
101+ }
102+
69103Group::Group () : m_leaderName(" " ), m_groupType(GROUPTYPE_NORMAL ),
70104 m_dungeonDifficulty(DUNGEON_DIFFICULTY_NORMAL ), m_raidDifficulty(RAID_DIFFICULTY_10MAN_NORMAL ),
71105 m_bfGroup(nullptr ), m_bgGroup(nullptr ), m_lootMethod(FREE_FOR_ALL ), m_lootThreshold(ITEM_QUALITY_UNCOMMON ),
@@ -1505,8 +1539,7 @@ void Group::CountTheRoll(Rolls::iterator rollI, Map* allowedMap)
15051539 roll->getLoot ()->NotifyItemRemoved (roll->itemSlot );
15061540 roll->getLoot ()->unlootedCount --;
15071541 player->SendEquipError (msg, nullptr , nullptr , roll->itemid );
1508- if (Item* mailItem = Item::CreateItem (roll->itemid , item->count , player, false , item->randomPropertyId ))
1509- player->SendItemRetrievalMail (mailItem);
1542+ SendRollWonItemViaMail (player, item, roll->itemid );
15101543 }
15111544 else
15121545 {
@@ -1588,8 +1621,7 @@ void Group::CountTheRoll(Rolls::iterator rollI, Map* allowedMap)
15881621 roll->getLoot ()->NotifyItemRemoved (roll->itemSlot );
15891622 roll->getLoot ()->unlootedCount --;
15901623 player->SendEquipError (msg, nullptr , nullptr , roll->itemid );
1591- if (Item* mailItem = Item::CreateItem (roll->itemid , item->count , player, false , item->randomPropertyId ))
1592- player->SendItemRetrievalMail (mailItem);
1624+ SendRollWonItemViaMail (player, item, roll->itemid );
15931625 }
15941626 else
15951627 {
0 commit comments