void AhBot::Answer(int auction, Category* category, ItemBag* inAuctionItems) { AuctionHouseEntry const* ahEntry = sAuctionHouseStore.LookupEntry(auctionIds[auction]); if(!ahEntry) return; AuctionHouseObject* auctionHouse = sAuctionMgr.GetAuctionsMap(ahEntry); AuctionHouseObject::AuctionEntryMap const& auctionEntryMap = auctionHouse->GetAuctions(); int64 availableMoney = GetAvailableMoney(auctionIds[auction]); vector<AuctionEntry*> entries; for (AuctionHouseObject::AuctionEntryMap::const_iterator itr = auctionEntryMap.begin(); itr != auctionEntryMap.end(); ++itr) entries.push_back(itr->second); Shuffle(entries); for (vector<AuctionEntry*>::iterator itr = entries.begin(); itr != entries.end(); ++itr) { AuctionEntry *entry = *itr; if (entry->owner == player->GetGUIDLow() || entry->bidder == player->GetGUIDLow()) continue; if (urand(0, 100) > sAhBotConfig.buyProbability * 100) continue; Item *item = sAuctionMgr.GetAItem(entry->itemGuidLow); if (!item) continue; uint32 price = category->GetPricingStrategy()->GetBuyPrice(item->GetProto(), auctionIds[auction]); if (!price || !item->GetCount()) continue; uint32 bidPrice = item->GetCount() * price; uint32 buyoutPrice = item->GetCount() * urand(price, 4 * price / 3); uint32 curPrice = entry->bid; if (!curPrice) curPrice = entry->startbid; if (!curPrice) curPrice = entry->buyout; if (curPrice > buyoutPrice) continue; if (availableMoney < curPrice) continue; if (entry->bidder && entry->bidder != player->GetGUIDLow()) player->GetSession()->SendAuctionOutbiddedMail(entry); entry->bidder = player->GetGUIDLow(); entry->bid = curPrice + urand(1, 1 + bidPrice / 10); availableMoney -= curPrice; updateMarketPrice(item->GetProto()->ItemId, entry->buyout / item->GetCount(), auctionIds[auction]); if (entry->buyout && (entry->bid >= entry->buyout || 100 * (entry->buyout - entry->bid) / price < 25)) { entry->bid = entry->buyout; entry->AuctionBidWinning(NULL); sLog.outString("AhBot won %s in auction %d for %d", item->GetProto()->Name1, auctionIds[auction], entry->buyout); } else { CharacterDatabase.PExecute("UPDATE auction SET buyguid = '%u',lastbid = '%u' WHERE id = '%u'", entry->bidder, entry->bid, entry->Id); sLog.outString("AhBot placed bid %d for %s in auction %d", entry->bid, item->GetProto()->Name1, auctionIds[auction]); } } }