diff options
Diffstat (limited to 'src/server/game/AuctionHouse/AuctionHouseMgr.cpp')
-rw-r--r-- | src/server/game/AuctionHouse/AuctionHouseMgr.cpp | 118 |
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; |