void WorldSession::HandleBlackMarketBidOnItem(WorldPackets::BlackMarket::BlackMarketBidOnItem& blackMarketBidOnItem) { if (!sBlackMarketMgr->IsEnabled()) return; Player* player = GetPlayer(); Creature* unit = player->GetNPCIfCanInteractWith(blackMarketBidOnItem.Guid, UNIT_NPC_FLAG_BLACK_MARKET); if (!unit) { TC_LOG_DEBUG("network", "WORLD: HandleBlackMarketBidOnItem - Unit (GUID: %s) not found or you can't interact with him.", blackMarketBidOnItem.Guid.ToString().c_str()); return; } BlackMarketEntry* entry = sBlackMarketMgr->GetAuctionByID(blackMarketBidOnItem.MarketID); if (!entry) { TC_LOG_DEBUG("network", "WORLD: HandleBlackMarketBidOnItem - Player (%s, name: %s) tried to bid on a nonexistent auction (MarketId: %i).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), blackMarketBidOnItem.MarketID); SendBlackMarketBidOnItemResult(ERR_BMAH_ITEM_NOT_FOUND, blackMarketBidOnItem.MarketID, blackMarketBidOnItem.Item); return; } if (entry->GetBidder() == player->GetGUID().GetCounter()) { TC_LOG_DEBUG("network", "WORLD: HandleBlackMarketBidOnItem - Player (%s, name: %s) tried to place a bid on an item he already bid on. (MarketId: %i).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), blackMarketBidOnItem.MarketID); SendBlackMarketBidOnItemResult(ERR_BMAH_ALREADY_BID, blackMarketBidOnItem.MarketID, blackMarketBidOnItem.Item); return; } if (!entry->ValidateBid(blackMarketBidOnItem.BidAmount)) { TC_LOG_DEBUG("network", "WORLD: HandleBlackMarketBidOnItem - Player (%s, name: %s) tried to place an invalid bid. Amount: %lu (MarketId: %i).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), blackMarketBidOnItem.BidAmount, blackMarketBidOnItem.MarketID); SendBlackMarketBidOnItemResult(ERR_BMAH_HIGHER_BID, blackMarketBidOnItem.MarketID, blackMarketBidOnItem.Item); return; } if (!player->HasEnoughMoney(blackMarketBidOnItem.BidAmount)) { TC_LOG_DEBUG("network", "WORLD: HandleBlackMarketBidOnItem - Player (%s, name: %s) does not have enough money to place bid. (MarketId: %i).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), blackMarketBidOnItem.MarketID); SendBlackMarketBidOnItemResult(ERR_BMAH_NOT_ENOUGH_MONEY, blackMarketBidOnItem.MarketID, blackMarketBidOnItem.Item); return; } if (entry->GetSecondsRemaining() <= 0) { TC_LOG_DEBUG("network", "WORLD: HandleBlackMarketBidOnItem - Player (%s, name: %s) tried to bid on a completed auction. (MarketId: %i).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), blackMarketBidOnItem.MarketID); SendBlackMarketBidOnItemResult(ERR_BMAH_DATABASE_ERROR, blackMarketBidOnItem.MarketID, blackMarketBidOnItem.Item); return; } SQLTransaction trans = CharacterDatabase.BeginTransaction(); sBlackMarketMgr->SendAuctionOutbidMail(entry, trans); entry->PlaceBid(blackMarketBidOnItem.BidAmount, player, trans); CharacterDatabase.CommitTransaction(trans); SendBlackMarketBidOnItemResult(ERR_BMAH_OK, blackMarketBidOnItem.MarketID, blackMarketBidOnItem.Item); }
void BlackMarketMgr::LoadAuctions() { uint32 oldMSTime = getMSTime(); // Clear in case we are reloading if (!_auctions.empty()) { for (BlackMarketEntryMap::iterator itr = _auctions.begin(); itr != _auctions.end(); ++itr) delete itr->second; _auctions.clear(); } PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_BLACKMARKET_AUCTIONS); PreparedQueryResult result = CharacterDatabase.Query(stmt); if (!result) { TC_LOG_INFO("server.loading", ">> Loaded 0 black market auctions. DB table `blackmarket_auctions` is empty."); return; } _lastUpdate = time(nullptr); //Set update time before loading SQLTransaction trans = CharacterDatabase.BeginTransaction(); do { Field* fields = result->Fetch(); BlackMarketEntry* auction = new BlackMarketEntry(); if (!auction->LoadFromDB(fields)) { auction->DeleteFromDB(trans); delete auction; continue; } if (auction->IsCompleted()) { auction->DeleteFromDB(trans); delete auction; continue; } AddAuction(auction); } while (result->NextRow()); CharacterDatabase.CommitTransaction(trans); TC_LOG_INFO("server.loading", ">> Loaded %u black market auctions in %u ms.", uint32(_auctions.size()), GetMSTimeDiffToNow(oldMSTime)); }
void BlackMarketMgr::Update(bool updateTime) { SQLTransaction trans = CharacterDatabase.BeginTransaction(); time_t now = time(nullptr); for (BlackMarketEntryMap::iterator itr = _auctions.begin(); itr != _auctions.end(); ++itr) { BlackMarketEntry* entry = itr->second; if (entry->IsCompleted() && entry->GetBidder()) SendAuctionWonMail(entry, trans); if (updateTime) entry->Update(now); } if (updateTime) _lastUpdate = now; CharacterDatabase.CommitTransaction(trans); }
void BlackMarketMgr::RefreshAuctions() { SQLTransaction trans = CharacterDatabase.BeginTransaction(); // Delete completed auctions for (BlackMarketEntryMap::iterator itr = _auctions.begin(); itr != _auctions.end();) { BlackMarketEntry* entry = itr->second; if (!entry->IsCompleted()) { ++itr; continue; } entry->DeleteFromDB(trans); itr = _auctions.erase(itr); delete entry; } CharacterDatabase.CommitTransaction(trans); trans = CharacterDatabase.BeginTransaction(); std::list<BlackMarketTemplate const*> templates; for (auto const& pair : _templates) { if (GetAuctionByID(pair.second->MarketID)) continue; if (!roll_chance_f(pair.second->Chance)) continue; templates.push_back(pair.second); } Trinity::Containers::RandomResizeList(templates, sWorld->getIntConfig(CONFIG_BLACKMARKET_MAXAUCTIONS)); for (BlackMarketTemplate const* templat : templates) { BlackMarketEntry* entry = new BlackMarketEntry(); entry->Initialize(templat->MarketID, templat->Duration); entry->SaveToDB(trans); AddAuction(entry); } CharacterDatabase.CommitTransaction(trans); Update(true); }