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::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); }
AuctionEntry* AuctionHouseObject::AddAuction(AuctionHouseEntry const* auctionHouseEntry, Item* newItem, uint32 etime, uint32 bid, uint32 buyout, uint32 deposit, Player* pl /*= nullptr*/) { uint32 auction_time = uint32(etime * sWorld.getConfig(CONFIG_FLOAT_RATE_AUCTION_TIME)); AuctionEntry* AH = new AuctionEntry; AH->Id = sObjectMgr.GenerateAuctionID(); AH->itemGuidLow = newItem->GetObjectGuid().GetCounter(); AH->itemTemplate = newItem->GetEntry(); AH->itemCount = newItem->GetCount(); AH->itemRandomPropertyId = newItem->GetItemRandomPropertyId(); AH->owner = pl ? pl->GetGUIDLow() : 0; if (pl) Utf8toWStr(pl->GetName(), AH->ownerName); AH->startbid = bid; AH->bidder = 0; AH->bid = 0; AH->buyout = buyout; AH->expireTime = time(nullptr) + auction_time; AH->deposit = deposit; AH->auctionHouseEntry = auctionHouseEntry; AddAuction(AH); sAuctionMgr.AddAItem(newItem); if (pl) pl->MoveItemFromInventory(newItem->GetBagSlot(), newItem->GetSlot(), true); CharacterDatabase.BeginTransaction(); if (pl) newItem->DeleteFromInventoryDB(); newItem->SaveToDB(); AH->SaveToDB(); if (pl) pl->SaveInventoryAndGoldToDB(); CharacterDatabase.CommitTransaction(); return AH; }
void ObjectMgr::LoadAuctions() { QueryResult *result = sDatabase.Query("SELECT COUNT(*) FROM `auctionhouse`"); Field *fields = result->Fetch(); uint32 AuctionCount=fields[0].GetUInt32(); delete result; if(!AuctionCount) return; result = sDatabase.Query( "SELECT `auctioneerguid`,`itemguid`,`itemowner`,`buyoutprice`,`time`,`buyguid`,`lastbid`, `id` FROM `auctionhouse`" ); if( !result ) return; barGoLink bar( AuctionCount ); AuctionEntry *aItem; do { fields = result->Fetch(); bar.step(); aItem = new AuctionEntry; aItem->auctioneer = fields[0].GetUInt32(); aItem->item = fields[1].GetUInt32(); aItem->owner = fields[2].GetUInt32(); aItem->buyout = fields[3].GetUInt32(); aItem->time = fields[4].GetUInt32(); aItem->bidder = fields[5].GetUInt32(); aItem->bid = fields[6].GetUInt32(); aItem->Id = fields[7].GetUInt32(); AddAuction(aItem); } while (result->NextRow()); delete result; sLog.outString(""); sLog.outString( ">> Loaded %u auction items", AuctionCount); sLog.outString(""); }