aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/AuctionHouse/AuctionHouseMgr.cpp')
-rw-r--r--src/server/game/AuctionHouse/AuctionHouseMgr.cpp118
1 files changed, 60 insertions, 58 deletions
diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
index 6ea09711667..5065bd23ffb 100644
--- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
+++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
@@ -87,8 +87,8 @@ uint32 AuctionHouseMgr::GetAuctionDeposit(AuctionHouseEntry const* entry, uint32
//does not clear ram
void AuctionHouseMgr::SendAuctionWonMail(AuctionEntry* auction, SQLTransaction& trans)
{
- Item* pItem = GetAItem(auction->itemGUIDLow);
- if (!pItem)
+ Item* item = GetAItem(auction->itemGUIDLow);
+ if (!item)
return;
uint32 bidderAccId = 0;
@@ -123,7 +123,7 @@ void AuctionHouseMgr::SendAuctionWonMail(AuctionEntry* auction, SQLTransaction&
uint32 ownerAccId = ObjectMgr::GetPlayerAccountIdByGUID(ownerGuid);
sLog->outCommand(bidderAccId, "GM %s (Account: %u) won item in auction: %s (Entry: %u Count: %u) and pay money: %u. Original owner %s (Account: %u)",
- bidderName.c_str(), bidderAccId, pItem->GetTemplate()->GetDefaultLocaleName(), pItem->GetEntry(), pItem->GetCount(), auction->bid, ownerName.c_str(), ownerAccId);
+ bidderName.c_str(), bidderAccId, item->GetTemplate()->GetDefaultLocaleName(), item->GetEntry(), item->GetCount(), auction->bid, ownerName.c_str(), ownerAccId);
}
// receiver exist
@@ -133,18 +133,18 @@ void AuctionHouseMgr::SendAuctionWonMail(AuctionEntry* auction, SQLTransaction&
// owner in `data` will set at mail receive and item extracting
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ITEM_OWNER);
stmt->setUInt64(0, auction->bidder);
- stmt->setUInt64(1, pItem->GetGUID().GetCounter());
+ stmt->setUInt64(1, item->GetGUID().GetCounter());
trans->Append(stmt);
if (bidder)
{
- bidder->GetSession()->SendAuctionBidderNotification(auction->GetHouseId(), auction->Id, bidderGuid, 0, 0, auction->itemEntry);
+ bidder->GetSession()->SendAuctionWonNotification(auction, item);
// FIXME: for offline player need also
bidder->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS, 1);
}
MailDraft(auction->BuildAuctionMailSubject(AUCTION_WON), AuctionEntry::BuildAuctionMailBody(auction->owner, auction->bid, auction->buyout, 0, 0))
- .AddItem(pItem)
+ .AddItem(item)
.SendMailTo(trans, MailReceiver(bidder, auction->bidder), auction, MAIL_CHECK_MASK_COPIED);
}
else
@@ -171,18 +171,20 @@ void AuctionHouseMgr::SendAuctionSuccessfulMail(AuctionEntry* auction, SQLTransa
ObjectGuid owner_guid = ObjectGuid::Create<HighGuid::Player>(auction->owner);
Player* owner = ObjectAccessor::FindConnectedPlayer(owner_guid);
uint32 owner_accId = ObjectMgr::GetPlayerAccountIdByGUID(owner_guid);
+ Item* item = GetAItem(auction->itemGUIDLow);
+
// owner exist
if (owner || owner_accId)
{
uint32 profit = auction->bid + auction->deposit - auction->GetAuctionCut();
//FIXME: what do if owner offline
- if (owner)
+ if (owner && item)
{
owner->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS, profit);
owner->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD, auction->bid);
//send auction owner notification, bidder must be current!
- owner->GetSession()->SendAuctionOwnerNotification(auction);
+ owner->GetSession()->SendAuctionClosedNotification(auction, (float)sWorld->getIntConfig(CONFIG_MAIL_DELIVERY_DELAY), true, item);
}
MailDraft(auction->BuildAuctionMailSubject(AUCTION_SUCCESSFUL), AuctionEntry::BuildAuctionMailBody(auction->bidder, auction->bid, auction->buyout, auction->deposit, auction->GetAuctionCut()))
@@ -195,8 +197,8 @@ void AuctionHouseMgr::SendAuctionSuccessfulMail(AuctionEntry* auction, SQLTransa
void AuctionHouseMgr::SendAuctionExpiredMail(AuctionEntry* auction, SQLTransaction& trans)
{
//return an item in auction to its owner by mail
- Item* pItem = GetAItem(auction->itemGUIDLow);
- if (!pItem)
+ Item* item = GetAItem(auction->itemGUIDLow);
+ if (!item)
return;
ObjectGuid owner_guid = ObjectGuid::Create<HighGuid::Player>(auction->owner);
@@ -206,10 +208,10 @@ void AuctionHouseMgr::SendAuctionExpiredMail(AuctionEntry* auction, SQLTransacti
if (owner || owner_accId)
{
if (owner)
- owner->GetSession()->SendAuctionOwnerNotification(auction);
+ owner->GetSession()->SendAuctionClosedNotification(auction, 0.0f, false, item);
MailDraft(auction->BuildAuctionMailSubject(AUCTION_EXPIRED), AuctionEntry::BuildAuctionMailBody(0, 0, auction->buyout, auction->deposit, 0))
- .AddItem(pItem)
+ .AddItem(item)
.SendMailTo(trans, MailReceiver(owner, auction->owner), auction, MAIL_CHECK_MASK_COPIED, 0);
}
else
@@ -220,7 +222,7 @@ void AuctionHouseMgr::SendAuctionExpiredMail(AuctionEntry* auction, SQLTransacti
}
//this function sends mail to old bidder
-void AuctionHouseMgr::SendAuctionOutbiddedMail(AuctionEntry* auction, uint32 newPrice, Player* newBidder, SQLTransaction& trans)
+void AuctionHouseMgr::SendAuctionOutbiddedMail(AuctionEntry* auction, uint32 /*newPrice*/, Player* /*newBidder*/, SQLTransaction& trans)
{
ObjectGuid oldBidder_guid = ObjectGuid::Create<HighGuid::Player>(auction->bidder);
Player* oldBidder = ObjectAccessor::FindConnectedPlayer(oldBidder_guid);
@@ -229,11 +231,13 @@ void AuctionHouseMgr::SendAuctionOutbiddedMail(AuctionEntry* auction, uint32 new
if (!oldBidder)
oldBidder_accId = ObjectMgr::GetPlayerAccountIdByGUID(oldBidder_guid);
+ Item* item = GetAItem(auction->itemGUIDLow);
+
// old bidder exist
if (oldBidder || oldBidder_accId)
{
- if (oldBidder && newBidder)
- oldBidder->GetSession()->SendAuctionBidderNotification(auction->GetHouseId(), auction->Id, newBidder->GetGUID(), newPrice, auction->GetAuctionOutBid(), auction->itemEntry);
+ if (oldBidder && item)
+ oldBidder->GetSession()->SendAuctionOutBidNotification(auction, item);
MailDraft(auction->BuildAuctionMailSubject(AUCTION_OUTBIDDED), AuctionEntry::BuildAuctionMailBody(auction->owner, auction->bid, auction->buyout, auction->deposit, auction->GetAuctionCut()))
.AddMoney(auction->bid)
@@ -242,18 +246,16 @@ void AuctionHouseMgr::SendAuctionOutbiddedMail(AuctionEntry* auction, uint32 new
}
//this function sends mail, when auction is cancelled to old bidder
-void AuctionHouseMgr::SendAuctionCancelledToBidderMail(AuctionEntry* auction, SQLTransaction& trans, Item* item)
+void AuctionHouseMgr::SendAuctionCancelledToBidderMail(AuctionEntry* auction, SQLTransaction& trans)
{
ObjectGuid bidder_guid = ObjectGuid::Create<HighGuid::Player>(auction->bidder);
Player* bidder = ObjectAccessor::FindConnectedPlayer(bidder_guid);
uint32 bidder_accId = 0;
+
if (!bidder)
bidder_accId = ObjectMgr::GetPlayerAccountIdByGUID(bidder_guid);
- if (bidder)
- bidder->GetSession()->SendAuctionRemovedNotification(auction->Id, auction->itemEntry, item->GetItemRandomPropertyId());
-
// bidder exist
if (bidder || bidder_accId)
MailDraft(auction->BuildAuctionMailSubject(AUCTION_CANCELLED_TO_BIDDER), AuctionEntry::BuildAuctionMailBody(auction->owner, auction->bid, auction->buyout, auction->deposit, 0))
@@ -452,7 +454,6 @@ void AuctionHouseObject::Update()
if (AuctionsMap.empty())
return;
-
SQLTransaction trans = CharacterDatabase.BeginTransaction();
for (AuctionEntryMap::iterator it = AuctionsMap.begin(); it != AuctionsMap.end();)
@@ -494,40 +495,35 @@ void AuctionHouseObject::Update()
CharacterDatabase.CommitTransaction(trans);
}
-void AuctionHouseObject::BuildListBidderItems(WorldPacket& data, Player* player, uint32& count, uint32& totalcount)
+void AuctionHouseObject::BuildListBidderItems(WorldPackets::AuctionHouse::AuctionListBidderItemsResult& packet, Player* player, uint32& totalcount)
{
for (AuctionEntryMap::const_iterator itr = AuctionsMap.begin(); itr != AuctionsMap.end(); ++itr)
{
AuctionEntry* Aentry = itr->second;
if (Aentry && Aentry->bidder == player->GetGUID().GetCounter())
{
- if (itr->second->BuildAuctionInfo(data))
- ++count;
-
+ itr->second->BuildAuctionInfo(packet.Items, false);
++totalcount;
}
}
}
-void AuctionHouseObject::BuildListOwnerItems(WorldPacket& data, Player* player, uint32& count, uint32& totalcount)
+void AuctionHouseObject::BuildListOwnerItems(WorldPackets::AuctionHouse::AuctionListOwnerItemsResult& packet, Player* player, uint32& totalcount)
{
for (AuctionEntryMap::const_iterator itr = AuctionsMap.begin(); itr != AuctionsMap.end(); ++itr)
{
AuctionEntry* Aentry = itr->second;
if (Aentry && Aentry->owner == player->GetGUID().GetCounter())
{
- if (Aentry->BuildAuctionInfo(data))
- ++count;
-
+ Aentry->BuildAuctionInfo(packet.Items, false);
++totalcount;
}
}
}
-void AuctionHouseObject::BuildListAuctionItems(WorldPacket& data, Player* player,
+void AuctionHouseObject::BuildListAuctionItems(WorldPackets::AuctionHouse::AuctionListItemsResult& packet, Player* player,
std::wstring const& wsearchedname, uint32 listfrom, uint8 levelmin, uint8 levelmax, uint8 usable,
- uint32 inventoryType, uint32 itemClass, uint32 itemSubClass, uint32 quality,
- uint32& count, uint32& totalcount)
+ uint32 inventoryType, uint32 itemClass, uint32 itemSubClass, uint32 quality, uint32& totalcount)
{
time_t curTime = sWorld->GetGameTime();
@@ -612,48 +608,53 @@ void AuctionHouseObject::BuildListAuctionItems(WorldPacket& data, Player* player
}
// Add the item if no search term or if entered search term was found
- if (count < 50 && totalcount >= listfrom)
- {
- ++count;
- Aentry->BuildAuctionInfo(data);
- }
+ if (packet.Items.size() < 50 && totalcount >= listfrom)
+ Aentry->BuildAuctionInfo(packet.Items, true);
+
++totalcount;
}
}
//this function inserts to WorldPacket auction's data
-bool AuctionEntry::BuildAuctionInfo(WorldPacket& data) const
+void AuctionEntry::BuildAuctionInfo(std::vector<WorldPackets::AuctionHouse::AuctionItem>& items, bool listAuctionItems) const
{
Item* item = sAuctionMgr->GetAItem(itemGUIDLow);
if (!item)
{
TC_LOG_ERROR("misc", "AuctionEntry::BuildAuctionInfo: Auction %u has a non-existent item: " UI64FMTD, Id, itemGUIDLow);
- return false;
+ return;
}
- data << uint32(Id);
- data << uint32(item->GetEntry());
- for (uint8 i = 0; i < PROP_ENCHANTMENT_SLOT_0; ++i) // PROP_ENCHANTMENT_SLOT_0 = 10
+ WorldPackets::AuctionHouse::AuctionItem auctionItem;
+
+ auctionItem.AuctionItemID = Id;
+ auctionItem.Item.Initalize(item);
+ auctionItem.BuyoutPrice = buyout;
+ auctionItem.CensorBidInfo = false;
+ auctionItem.CensorServerSideInfo = listAuctionItems;
+ auctionItem.Charges = item->GetSpellCharges();
+ auctionItem.Count = item->GetCount();
+ auctionItem.DeleteReason = 0; // Always 0 ?
+ auctionItem.DurationLeft = (expire_time - time(NULL)) * IN_MILLISECONDS;
+ auctionItem.EndTime = expire_time;
+ auctionItem.Flags = 0; // todo
+ auctionItem.ItemGuid = item->GetGUID();
+ auctionItem.MinBid = startbid;
+ auctionItem.Owner = ObjectGuid::Create<HighGuid::Player>(owner);
+ auctionItem.OwnerAccountID = ObjectGuid::Create<HighGuid::WowAccount>(ObjectMgr::GetPlayerAccountIdByGUID(auctionItem.Owner));
+ auctionItem.MinIncrement = bidder ? GetAuctionOutBid() : 0;
+ auctionItem.Bidder = bidder ? ObjectGuid::Create<HighGuid::Player>(bidder) : ObjectGuid::Empty;
+ auctionItem.BidAmount = bidder ? bid : 0;
+
+ for (uint8 i = 0; i < MAX_INSPECTED_ENCHANTMENT_SLOT; i++)
{
- data << uint32(item->GetEnchantmentId(EnchantmentSlot(i)));
- data << uint32(item->GetEnchantmentDuration(EnchantmentSlot(i)));
- data << uint32(item->GetEnchantmentCharges(EnchantmentSlot(i)));
+ if (!item->GetEnchantmentId((EnchantmentSlot) i))
+ continue;
+
+ auctionItem.Enchantments.emplace_back(item->GetEnchantmentId((EnchantmentSlot) i), item->GetEnchantmentDuration((EnchantmentSlot) i), item->GetEnchantmentCharges((EnchantmentSlot) i), i);
}
- data << int32(item->GetItemRandomPropertyId()); // Random item property id
- data << uint32(item->GetItemSuffixFactor()); // SuffixFactor
- data << uint32(item->GetCount()); // item->count
- data << uint32(item->GetSpellCharges()); // item->charge FFFFFFF
- data << uint32(0); // Unknown
- data << uint64(owner); // Auction->owner
- data << uint64(startbid); // Auction->startbid (not sure if useful)
- data << uint64(bid ? GetAuctionOutBid() : 0);
- // Minimal outbid
- data << uint64(buyout); // Auction->buyout
- data << uint32((expire_time - time(NULL)) * IN_MILLISECONDS); // time left
- data << uint64(bidder); // auction->bidder current
- data << uint64(bid); // current bid
- return true;
+ items.emplace_back(auctionItem);
}
uint32 AuctionEntry::GetAuctionCut() const
@@ -738,6 +739,7 @@ bool AuctionEntry::LoadFromDB(Field* fields)
}
return true;
}
+
std::string AuctionEntry::BuildAuctionMailSubject(MailAuctionAnswers response) const
{
std::ostringstream strm;