@@ -63,6 +63,40 @@ Loot* Roll::getLoot()
6363 return getTarget ();
6464}
6565
66+ static void SendRollWonItemViaMail (Player* player, LootItem const * lootItem, uint32 itemId)
67+ {
68+ Item* mailItem = Item::CreateItem (itemId, lootItem->count , player, false , lootItem->randomPropertyId );
69+ if (!mailItem)
70+ return ;
71+
72+ AllowedLooterSet looters = lootItem->GetAllowedLooters ();
73+ ItemTemplate const * proto = mailItem->GetTemplate ();
74+ // Preserve the 2-hour group trade window the item would have had if stored directly.
75+ if (looters.size () > 1 && proto->GetMaxStackSize () == 1 &&
76+ (proto->Bonding == BIND_WHEN_PICKED_UP || proto->Bonding == BIND_QUEST_ITEM ) &&
77+ sWorld ->getBoolConfig (CONFIG_SET_BOP_ITEM_TRADEABLE ))
78+ {
79+ mailItem->SetBinding (true );
80+ mailItem->SetSoulboundTradeable (looters);
81+ mailItem->SetUInt32Value (ITEM_FIELD_CREATE_PLAYED_TIME , player->GetTotalPlayedTime ());
82+
83+ std::string lootersStr;
84+ for (ObjectGuid const & guid : looters)
85+ {
86+ if (!lootersStr.empty ())
87+ lootersStr += ' ' ;
88+ lootersStr += std::to_string (guid.GetCounter ());
89+ }
90+
91+ CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement (CHAR_INS_ITEM_BOP_TRADE );
92+ stmt->SetData (0 , mailItem->GetGUID ().GetCounter ());
93+ stmt->SetData (1 , lootersStr);
94+ CharacterDatabase.Execute (stmt);
95+ }
96+
97+ player->SendItemRetrievalMail (mailItem);
98+ }
99+
66100Group::Group () : m_leaderName(" " ), m_groupType(GROUPTYPE_NORMAL ),
67101 m_dungeonDifficulty(DUNGEON_DIFFICULTY_NORMAL ), m_raidDifficulty(RAID_DIFFICULTY_10MAN_NORMAL ),
68102 m_bfGroup(nullptr ), m_bgGroup(nullptr ), m_lootMethod(FREE_FOR_ALL ), m_lootThreshold(ITEM_QUALITY_UNCOMMON ),
@@ -1497,8 +1531,7 @@ void Group::CountTheRoll(Rolls::iterator rollI, Map* allowedMap)
14971531 roll->getLoot ()->NotifyItemRemoved (roll->itemSlot );
14981532 roll->getLoot ()->unlootedCount --;
14991533 player->SendEquipError (msg, nullptr , nullptr , roll->itemid );
1500- if (Item* mailItem = Item::CreateItem (roll->itemid , item->count , player, false , item->randomPropertyId ))
1501- player->SendItemRetrievalMail (mailItem);
1534+ SendRollWonItemViaMail (player, item, roll->itemid );
15021535 }
15031536 else
15041537 {
@@ -1580,8 +1613,7 @@ void Group::CountTheRoll(Rolls::iterator rollI, Map* allowedMap)
15801613 roll->getLoot ()->NotifyItemRemoved (roll->itemSlot );
15811614 roll->getLoot ()->unlootedCount --;
15821615 player->SendEquipError (msg, nullptr , nullptr , roll->itemid );
1583- if (Item* mailItem = Item::CreateItem (roll->itemid , item->count , player, false , item->randomPropertyId ))
1584- player->SendItemRetrievalMail (mailItem);
1616+ SendRollWonItemViaMail (player, item, roll->itemid );
15851617 }
15861618 else
15871619 {
0 commit comments