Index: src/game/AuctionHouse.cpp =================================================================== --- src/game/AuctionHouse.cpp (revision 5734) +++ src/game/AuctionHouse.cpp (working copy) @@ -22,6 +22,7 @@ #include "Log.h" #include "World.h" #include "ObjectMgr.h" +#include "Config/ConfigEnv.h" #include "Player.h" #include "UpdateMask.h" #include "AuctionHouseObject.h" @@ -168,7 +169,10 @@ std::ostringstream msgAuctionOutbiddedSubject; msgAuctionOutbiddedSubject << auction->item_template << ":0:" << AUCTION_OUTBIDDED; - if (oldBidder) + if (oldBidder && !_player) + oldBidder->GetSession()->SendAuctionBidderNotification( auction->location, auction->Id, sConfig.GetIntDefault("AuctionHouseBotBuyer.GUID", 0), newPrice, objmgr.GetAuctionOutBid(auction->bid), auction->item_template); + + if (oldBidder && _player) oldBidder->GetSession()->SendAuctionBidderNotification( auction->location, auction->Id, _player->GetGUID(), newPrice, objmgr.GetAuctionOutBid(auction->bid), auction->item_template); WorldSession::SendMailTo(oldBidder, MAIL_AUCTION, MAIL_STATIONERY_AUCTION, auction->location, auction->bidder, msgAuctionOutbiddedSubject.str(), 0, NULL, auction->bid, 0, NOT_READ); Index: src/game/AuctionHouseBot.cpp =================================================================== --- src/game/AuctionHouseBot.cpp (revision 0) +++ src/game/AuctionHouseBot.cpp (revision 0) @@ -0,0 +1,697 @@ +#include "AuctionHouseBot.h" +#include "Bag.h" +#include "Config/ConfigEnv.h" +#include "Database/DatabaseEnv.h" +#include "Item.h" +#include "Log.h" +#include "ObjectMgr.h" +#include "Player.h" +#include "World.h" +#include "WorldSession.h" +#include + +using namespace std; + +//#define NO_VENDOR_ITEMS +#define ONLY_LOOT_ITEMS + +static vector whiteTradeGoods; +static vector greenTradeGoods; +static vector blueTradeGoods; +static vector purpleTradeGoods; +static vector whiteItems; +static vector greenItems; +static vector blueItems; +static vector purpleItems; + +static uint32 AHBplayerAccount = 0; +static uint32 AHBplayerGUID = 0; +static uint32 noMail = 0; +static uint32 numAllianceItems = 0; +static uint32 numMinAllianceItems = 0; +static uint32 numHordeItems = 0; +static uint32 numMinHordeItems = 0; +static uint32 numNeutralItems = 0; +static uint32 numMinNeutralItems = 0; +static uint32 minTime = 0; +static uint32 maxTime = 0; +static uint32 percentWhiteTradeGoods = 0; +static uint32 percentGreenTradeGoods = 0; +static uint32 percentBlueTradeGoods = 0; +static uint32 percentPurpleTradeGoods = 0; +static uint32 percentWhiteItems = 0; +static uint32 percentGreenItems = 0; +static uint32 percentBlueItems = 0; +static uint32 percentPurpleItems = 0; +static uint32 minPriceWhite = 0; +static uint32 maxPriceWhite = 0; +static uint32 bidPriceWhite = 0; +static uint32 maxStackWhite = 0; +static uint32 minPriceGreen = 0; +static uint32 maxPriceGreen = 0; +static uint32 bidPriceGreen = 0; +static uint32 maxStackGreen = 0; +static uint32 minPriceBlue = 0; +static uint32 maxPriceBlue = 0; +static uint32 bidPriceBlue = 0; +static uint32 maxStackBlue = 0; +static uint32 minPricePurple = 0; +static uint32 maxPricePurple = 0; +static uint32 bidPricePurple = 0; +static uint32 maxStackPurple = 0; + +/////////////////////////////////////////////////////////////////////////////// +// +/////////////////////////////////////////////////////////////////////////////// +uint32 AuctionHouseBotNoMail() +{ + return noMail != 0 ? AHBplayerGUID : 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// +/////////////////////////////////////////////////////////////////////////////// +static inline uint32 minValue(uint32 a, uint32 b) +{ + return a <= b ? a : b; +} + +/////////////////////////////////////////////////////////////////////////////// +// +/////////////////////////////////////////////////////////////////////////////// +static void deleteOldAuctions(uint32 ahMapID) +{ + AuctionHouseObject* auctionHouse = objmgr.GetAuctionsMap(ahMapID); + + AuctionHouseObject::AuctionEntryMap::iterator itr; + itr = auctionHouse->GetAuctionsBegin(); + + while (itr != auctionHouse->GetAuctionsEnd()) + { + AuctionHouseObject::AuctionEntryMap::iterator tmp = itr; + ++itr; + + if (tmp->second->owner != AHBplayerGUID) + continue; + + if (tmp->second->bidder != 0) + continue; + + if (tmp->second->time > sWorld.GetGameTime()) + continue; + + // quietly delete the item and auction... + + Item* item = objmgr.GetAItem(tmp->second->item_guidlow); + if (item != NULL) + { + objmgr.RemoveAItem(tmp->second->item_guidlow); + item->DeleteFromDB(); + delete item; + } + else + { + sLog.outString("AuctionHouseBot: " + "clearing auction for non-existant item_guidlow (%d)", + tmp->second->item_guidlow); + } + + CharacterDatabase.PExecute("DELETE FROM `auctionhouse` WHERE `id` = '%u'", + tmp->second->Id); + AuctionEntry* auctionEntry = tmp->second; + auctionHouse->RemoveAuction(auctionEntry->Id); + delete auctionEntry; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// +/////////////////////////////////////////////////////////////////////////////// +static void addNewAuctions(uint32 ahMapID, uint32 maxAuctions, uint32 minAuctions, Player *AHBplayer) +{ + AuctionHouseObject* auctionHouse = objmgr.GetAuctionsMap(ahMapID); + + if (auctionHouse->Getcount() > minAuctions) + return; + + uint32 whiteTradeGoodsBin = percentWhiteTradeGoods; + uint32 greenTradeGoodsBin = percentGreenTradeGoods + whiteTradeGoodsBin; + uint32 blueTradeGoodsBin = percentBlueTradeGoods + greenTradeGoodsBin; + uint32 purpleTradeGoodsBin = percentPurpleTradeGoods + blueTradeGoodsBin; + uint32 whiteItemBin = percentWhiteItems + purpleTradeGoodsBin; + uint32 greenItemBin = percentGreenItems + whiteItemBin; + uint32 blueItemBin = percentBlueItems + greenItemBin; + uint32 purpleItemBin = percentPurpleItems + blueItemBin; + + // only insert 100 at a time, so as not to peg the processor + for (uint32 count = 0; + (count < 100) && (auctionHouse->Getcount() < maxAuctions); + count++) + { + uint32 itemID = purpleItems[urand(0, purpleItems.size() - 1)]; + uint32 value = urand(1, 100); + + if (value <= blueItemBin) + itemID = blueItems[urand(0, blueItems.size() - 1)]; + + if (value <= greenItemBin) + itemID = greenItems[urand(0, greenItems.size() - 1)]; + + if (value <= whiteItemBin) + itemID = whiteItems[urand(0, whiteItems.size() - 1)]; + + if (value <= purpleTradeGoodsBin) + itemID = purpleTradeGoods[urand(0, purpleTradeGoods.size() - 1)]; + + if (value <= blueTradeGoodsBin) + itemID = blueTradeGoods[urand(0, blueTradeGoods.size() - 1)]; + + if (value <= greenTradeGoodsBin) + itemID = greenTradeGoods[urand(0, greenTradeGoods.size() - 1)]; + + if (value <= whiteTradeGoodsBin) + itemID = whiteTradeGoods[urand(0, whiteTradeGoods.size() - 1)]; + + ItemPrototype const* prototype = objmgr.GetItemPrototype(itemID); + if (prototype == NULL) + { + sLog.outString("AuctionHouseBot: Huh?!?! prototype == NULL"); + continue; + } + + Item* item = Item::CreateItem(itemID, 1, AHBplayer); + item->AddToUpdateQueueOf(AHBplayer); + if (item == NULL) + { + sLog.outString("AuctionHouseBot: Item::CreateItem() returned NULL"); + break; + } + + uint32 randomPropertyId = Item::GenerateItemRandomPropertyId(itemID); + if (randomPropertyId != 0) + item->SetItemRandomProperties(randomPropertyId); + + uint32 buyoutPrice = prototype->BuyPrice * item->GetCount(); + uint32 bidPrice = 0; + uint32 stackCount = urand(1, item->GetMaxStackCount()); + + switch (prototype->Quality) + { + case 1: + if (maxStackWhite != 0) + { + stackCount = urand(1, minValue(item->GetMaxStackCount(), + maxStackWhite)); + } + + buyoutPrice *= urand(minPriceWhite, maxPriceWhite) * stackCount; + buyoutPrice /= 100; + bidPrice = buyoutPrice * bidPriceWhite; + bidPrice /= 100; + + break; + + case 2: + if (maxStackGreen != 0) + { + stackCount = urand(1, minValue(item->GetMaxStackCount(), + maxStackGreen)); + } + + buyoutPrice *= urand(minPriceGreen, maxPriceGreen) * stackCount; + buyoutPrice /= 100; + bidPrice = buyoutPrice * bidPriceGreen; + bidPrice /= 100; + + break; + + case 3: + if (maxStackBlue != 0) + { + stackCount = urand(1, minValue(item->GetMaxStackCount(), + maxStackBlue)); + } + + buyoutPrice *= urand(minPriceBlue, maxPriceBlue) * stackCount; + buyoutPrice /= 100; + bidPrice = buyoutPrice * bidPriceBlue; + bidPrice /= 100; + + break; + + case 4: + if (maxStackPurple != 0) + { + stackCount = urand(1, minValue(item->GetMaxStackCount(), + maxStackPurple)); + } + + buyoutPrice *= urand(minPricePurple, maxPricePurple) * stackCount; + buyoutPrice /= 100; + bidPrice = buyoutPrice * bidPricePurple; + bidPrice /= 100; + + break; + } + + item->SetCount(stackCount); + + AuctionEntry* auctionEntry = new AuctionEntry; + auctionEntry->Id = objmgr.GenerateAuctionID(); + auctionEntry->auctioneer = 0; + auctionEntry->item_guidlow = item->GetGUIDLow(); + auctionEntry->item_template = item->GetEntry(); + auctionEntry->owner = AHBplayer->GetGUIDLow(); + auctionEntry->startbid = bidPrice; + auctionEntry->buyout = buyoutPrice; + auctionEntry->bidder = 0; + auctionEntry->bid = 0; + auctionEntry->deposit = 0; + auctionEntry->location = ahMapID; + auctionEntry->time = (time_t) (urand(minTime, maxTime) * 60 * 60 + + time(NULL)); + + item->SaveToDB(); + item->RemoveFromUpdateQueueOf(AHBplayer); + objmgr.AddAItem(item); + auctionHouse->AddAuction(auctionEntry); + + CharacterDatabase.PExecute("INSERT INTO `auctionhouse` (`id`," + "`auctioneerguid`,`itemguid`,`item_template`," + "`itemowner`,`buyoutprice`,`time`,`buyguid`," + "`lastbid`,`startbid`,`deposit`,`location`) " + "VALUES ('%u', '%u', '%u', '%u', '%u', '%u', " + "'" I64FMTD "', '%u', '%u', '%u', '%u', '%u')", + auctionEntry->Id, + auctionEntry->auctioneer, + auctionEntry->item_guidlow, + auctionEntry->item_template, + auctionEntry->owner, + auctionEntry->buyout, + (uint64) auctionEntry->time, + auctionEntry->bidder, + auctionEntry->bid, + auctionEntry->startbid, + auctionEntry->deposit, + auctionEntry->location); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// +/////////////////////////////////////////////////////////////////////////////// +void AuctionHouseBot() +{ + if ((AHBplayerAccount == 0) || (AHBplayerGUID == 0)) + return; + + WorldSession _session(AHBplayerAccount, NULL, 0, true, 0, LOCALE_ENG); + Player _AHBplayer(&_session); + _AHBplayer.MinimalLoadFromDB(NULL, AHBplayerGUID); + ObjectAccessor::Instance().AddObject(&_AHBplayer); + + deleteOldAuctions(2); + deleteOldAuctions(6); + deleteOldAuctions(7); + + addNewAuctions(2, numAllianceItems, numMinAllianceItems, &_AHBplayer); + addNewAuctions(6, numHordeItems, numMinHordeItems, &_AHBplayer); + addNewAuctions(7, numNeutralItems, numMinNeutralItems, &_AHBplayer); + + ObjectAccessor::Instance().RemoveObject(&_AHBplayer); +} +/////////////////////////////////////////////////////////////////////////////// +// +/////////////////////////////////////////////////////////////////////////////// +void AuctionHouseBotInit() +{ + AHBplayerAccount = sConfig.GetIntDefault("AuctionHouseBot.Account", 0); + AHBplayerGUID = sConfig.GetIntDefault("AuctionHouseBot.GUID", 0); + + if ((AHBplayerAccount == 0) || (AHBplayerGUID == 0)) + { + sLog.outString("AuctionHouseBot disabled"); + return; + } + + noMail = sConfig.GetIntDefault("AuctionHouseBot.NoMail", 0); + + numAllianceItems = sConfig.GetIntDefault("AuctionHouseBot.AllianceItems", 0); + numMinAllianceItems = sConfig.GetIntDefault("AuctionHouseBot.MinAllianceItems", -1); + numHordeItems = sConfig.GetIntDefault("AuctionHouseBot.HordeItems", 0); + numMinHordeItems = sConfig.GetIntDefault("AuctionHouseBot.MinHordeItems", -1); + numNeutralItems = sConfig.GetIntDefault("AuctionHouseBot.NeutralItems", 0); + numMinNeutralItems = sConfig.GetIntDefault("AuctionHouseBot.MinNeutralItems", -1); + + if (numMinAllianceItems < 0) + numMinAllianceItems = numAllianceItems; + + if (numMinHordeItems < 0) + numMinHordeItems = numHordeItems; + + if (numMinNeutralItems < 0) + numMinNeutralItems = numNeutralItems; + + if (numMinAllianceItems > numAllianceItems) + numMinAllianceItems = numAllianceItems; + + if (numMinHordeItems > numHordeItems) + numMinHordeItems = numHordeItems; + + if (numMinNeutralItems > numNeutralItems) + numMinNeutralItems = numNeutralItems; + + minTime = sConfig.GetIntDefault("AuctionHouseBot.MinTime", 8); + maxTime = sConfig.GetIntDefault("AuctionHouseBot.MaxTime", 24); + + if (minTime < 1) + minTime = 1; + + if (maxTime > 24) + maxTime = 24; + + if (minTime > maxTime) + minTime = maxTime; + + percentWhiteTradeGoods = sConfig.GetIntDefault("AuctionHouseBot." + "PercentWhiteTradeGoods", + 27); + percentGreenTradeGoods = sConfig.GetIntDefault("AuctionHouseBot." + "PercentGreenTradeGoods", + 12); + percentBlueTradeGoods = sConfig.GetIntDefault("AuctionHouseBot." + "PercentBlueTradeGoods", + 10); + percentPurpleTradeGoods = sConfig.GetIntDefault("AuctionHouseBot." + "PercentPurpleTradeGoods", + 1); + percentWhiteItems = sConfig.GetIntDefault("AuctionHouseBot." + "PercentWhiteItems", + 10); + percentGreenItems = sConfig.GetIntDefault("AuctionHouseBot." + "PercentGreenItems", + 30); + percentBlueItems = sConfig.GetIntDefault("AuctionHouseBot." + "PercentBlueItems", + 8); + percentPurpleItems = sConfig.GetIntDefault("AuctionHouseBot." + "PercentPurpleItems", + 2); + + uint32 totalPercent = percentWhiteTradeGoods + percentGreenTradeGoods + + percentBlueTradeGoods + percentPurpleTradeGoods + + percentWhiteItems + percentGreenItems + + percentBlueItems + percentPurpleItems; + + if (totalPercent == 0) + { + numAllianceItems = 0; + numHordeItems = 0; + numNeutralItems = 0; + } + else if (totalPercent != 100) + { + double scale = (double) 100 / (double) totalPercent; + + percentPurpleItems = (uint32) (scale * (double) percentPurpleItems); + percentBlueItems = (uint32) (scale * (double) percentBlueItems); + percentGreenItems = (uint32) (scale * (double) percentGreenItems); + percentWhiteItems = (uint32) (scale * (double) percentWhiteItems); + percentPurpleTradeGoods = (uint32) (scale * + (double) percentPurpleTradeGoods); + percentBlueTradeGoods = (uint32) (scale * + (double) percentBlueTradeGoods); + percentGreenTradeGoods = (uint32) (scale * + (double) percentGreenTradeGoods); + percentWhiteTradeGoods = 100 - + percentGreenTradeGoods - + percentBlueTradeGoods - + percentPurpleTradeGoods - + percentWhiteItems - + percentGreenItems - + percentBlueItems - + percentPurpleItems; + + sLog.outString("AuctionHouseBot:"); + sLog.outString("sum of item percentages not equal to 100, adjusting..."); + sLog.outString("AuctionHouseBot.PercentWhiteTradeGoods = %d", + percentWhiteTradeGoods); + sLog.outString("AuctionHouseBot.PercentGreenTradeGoods = %d", + percentGreenTradeGoods); + sLog.outString("AuctionHouseBot.PercentBlueTradeGoods = %d", + percentBlueTradeGoods); + sLog.outString("AuctionHouseBot.PercentPurpleTradeGoods = %d", + percentPurpleTradeGoods); + sLog.outString("AuctionHouseBot.PercentWhiteItems = %d", + percentWhiteItems); + sLog.outString("AuctionHouseBot.PercentGreenItems = %d", + percentGreenItems); + sLog.outString("AuctionHouseBot.PercentBlueItems = %d", + percentBlueItems); + sLog.outString("AuctionHouseBot.PercentPurpleItems = %d", + percentPurpleItems); + } + + minPriceWhite = sConfig.GetIntDefault("AuctionHouseBot.MinPriceWhite", + 150); + maxPriceWhite = sConfig.GetIntDefault("AuctionHouseBot.MaxPriceWhite", + 250); + + if (minPriceWhite == 0) + minPriceWhite = 1; + + if (maxPriceWhite == 0) + maxPriceWhite = 1; + + if (minPriceWhite > maxPriceWhite) + minPriceWhite = maxPriceWhite; + + bidPriceWhite = sConfig.GetIntDefault("AuctionHouseBot.BidPriceWhite", + 100); + if (bidPriceWhite > 100) + bidPriceWhite = 100; + + maxStackWhite = sConfig.GetIntDefault("AuctionHouseBot.MaxStackWhite", 0); + + minPriceGreen = sConfig.GetIntDefault("AuctionHouseBot.MinPriceGreen", + 200); + maxPriceGreen = sConfig.GetIntDefault("AuctionHouseBot.MaxPriceGreen", + 300); + + if (minPriceGreen == 0) + minPriceGreen = 1; + + if (maxPriceGreen == 0) + maxPriceGreen = 1; + + if (minPriceGreen > maxPriceGreen) + minPriceGreen = maxPriceGreen; + + bidPriceGreen = sConfig.GetIntDefault("AuctionHouseBot.BidPriceGreen", + 100); + if (bidPriceGreen > 100) + bidPriceGreen = 100; + + maxStackGreen = sConfig.GetIntDefault("AuctionHouseBot.MaxStackGreen", 0); + + minPriceBlue = sConfig.GetIntDefault("AuctionHouseBot.MinPriceBlue", + 250); + maxPriceBlue = sConfig.GetIntDefault("AuctionHouseBot.MaxPriceBlue", + 350); + + if (minPriceBlue == 0) + minPriceBlue = 1; + + if (maxPriceBlue == 0) + maxPriceBlue = 1; + + if (minPriceBlue > maxPriceBlue) + minPriceBlue = maxPriceBlue; + + bidPriceBlue = sConfig.GetIntDefault("AuctionHouseBot.BidPriceBlue", + 100); + if (bidPriceBlue > 100) + bidPriceBlue = 100; + + maxStackBlue = sConfig.GetIntDefault("AuctionHouseBot.MaxStackBlue", 0); + + minPricePurple = sConfig.GetIntDefault("AuctionHouseBot.MinPricePurple", + 300); + maxPricePurple = sConfig.GetIntDefault("AuctionHouseBot.MaxPricePurple", + 450); + + if (minPricePurple == 0) + minPricePurple = 1; + + if (maxPricePurple == 0) + maxPricePurple = 1; + + if (minPricePurple > maxPricePurple) + minPricePurple = maxPricePurple; + + bidPricePurple = sConfig.GetIntDefault("AuctionHouseBot.BidPricePurple", + 100); + if (bidPricePurple > 100) + bidPricePurple = 100; + + maxStackPurple = sConfig.GetIntDefault("AuctionHouseBot.MaxStackPurple", 0); + + QueryResult* results = (QueryResult*) NULL; + +#ifdef NO_VENDOR_ITEMS + vector npcItems; + + char npcQuery[] = "SELECT `item` FROM `npc_vendor`"; + + results = WorldDatabase.PQuery(npcQuery); + if (results != NULL) + { + do + { + Field* fields = results->Fetch(); + npcItems.push_back(fields[0].GetUInt32()); + + } while (results->NextRow()); + + delete results; + } + else + { + sLog.outString("AuctionHouseBot: \"%s\" failed", npcQuery); + } +#endif + +#ifdef ONLY_LOOT_ITEMS + vector lootItems; + + char lootQuery[] = "SELECT `item` FROM `creature_loot_template` UNION " + "SELECT `item` FROM `disenchant_loot_template` UNION " + "SELECT `item` FROM `fishing_loot_template` UNION " + "SELECT `item` FROM `gameobject_loot_template` UNION " + "SELECT `item` FROM `item_loot_template` UNION " + "SELECT `item` FROM `pickpocketing_loot_template` UNION " + "SELECT `item` FROM `prospecting_loot_template` UNION " + "SELECT `item` FROM `skinning_loot_template`"; + + results = WorldDatabase.PQuery(lootQuery); + if (results != NULL) + { + do + { + Field* fields = results->Fetch(); + lootItems.push_back(fields[0].GetUInt32()); + + } while (results->NextRow()); + + delete results; + } + else + { + sLog.outString("AuctionHouseBot: \"%s\" failed", lootQuery); + } +#endif + + for (uint32 itemID = 0; itemID < sItemStorage.MaxEntry; itemID++) + { + ItemPrototype const* prototype = objmgr.GetItemPrototype(itemID); + + if (prototype == NULL) + continue; + + if ((prototype->Bonding != NO_BIND) && + (prototype->Bonding != BIND_WHEN_EQUIPED)) + { + continue; + } + + if (prototype->BuyPrice == 0) + continue; + + if ((prototype->Quality < 1) || (prototype->Quality > 4)) + continue; + +#ifdef NO_VENDOR_ITEMS + bool isVendorItem = false; + + for (unsigned int i = 0; (i < npcItems.size()) && (!isVendorItem); i++) + { + if (itemID == npcItems[i]) + isVendorItem = true; + } + + if (isVendorItem) + continue; +#endif + +#ifdef ONLY_LOOT_ITEMS + bool isLootItem = false; + + for (unsigned int i = 0; (i < lootItems.size()) && (!isLootItem); i++) + { + if (itemID == lootItems[i]) + isLootItem = true; + } + + if (!isLootItem) + continue; +#endif + + switch (prototype->Quality) + { + case 1: + if (prototype->Class == ITEM_CLASS_TRADE_GOODS) + whiteTradeGoods.push_back(itemID); + else + whiteItems.push_back(itemID); + break; + + case 2: + if (prototype->Class == ITEM_CLASS_TRADE_GOODS) + greenTradeGoods.push_back(itemID); + else + greenItems.push_back(itemID); + break; + + case 3: + if (prototype->Class == ITEM_CLASS_TRADE_GOODS) + blueTradeGoods.push_back(itemID); + else + blueItems.push_back(itemID); + break; + + case 4: + if (prototype->Class == ITEM_CLASS_TRADE_GOODS) + purpleTradeGoods.push_back(itemID); + else + purpleItems.push_back(itemID); + break; + } + } + + if ((whiteTradeGoods.size() == 0) || + (greenTradeGoods.size() == 0) || + (blueTradeGoods.size() == 0) || + (purpleTradeGoods.size() == 0) || + (whiteItems.size() == 0) || + (greenItems.size() == 0) || + (blueItems.size() == 0) || + (purpleItems.size() == 0)) + { + sLog.outString("AuctionHouseBot: not loaded DB error?"); + AHBplayerAccount = 0; + AHBplayerGUID = 0; + return; + } + + sLog.outString("AuctionHouseBot:"); + sLog.outString("loaded %d white trade goods", whiteTradeGoods.size()); + sLog.outString("loaded %d green trade goods", greenTradeGoods.size()); + sLog.outString("loaded %d blue trade goods", blueTradeGoods.size()); + sLog.outString("loaded %d purple trade goods", purpleTradeGoods.size()); + sLog.outString("loaded %d white items", whiteItems.size()); + sLog.outString("loaded %d green items", greenItems.size()); + sLog.outString("loaded %d blue items", blueItems.size()); + sLog.outString("loaded %d purple items", purpleItems.size()); + sLog.outString("AuctionHouseBot v5.8.5734 by |Paradox| (original by ChrisK) has been loaded."); + +} Index: src/game/AuctionHouseBot.h =================================================================== --- src/game/AuctionHouseBot.h (revision 0) +++ src/game/AuctionHouseBot.h (revision 0) @@ -0,0 +1,10 @@ +#ifndef AUCTION_HOUSE_BOT_H +#define AUCTION_HOUSE_BOT_H + +#include "Common.h" + +uint32 AuctionHouseBotNoMail(); +void AuctionHouseBot(); +void AuctionHouseBotInit(); + +#endif Index: src/game/AuctionHouseBuyer.cpp =================================================================== --- src/game/AuctionHouseBuyer.cpp (revision 0) +++ src/game/AuctionHouseBuyer.cpp (revision 0) @@ -0,0 +1,294 @@ +#include "AuctionHouseBuyer.h" +#include "Bag.h" +#include "Config/ConfigEnv.h" +#include "Database/DatabaseEnv.h" +#include "Item.h" +#include "Log.h" +#include "ObjectMgr.h" +#include "Player.h" +#include "World.h" +#include "WorldSession.h" +#include "time.h" +#include +#include + +using namespace std; + +static uint32 _BuyerPlayerAccount = 0; +static uint32 _BuyerPlayerGUID = 0; +static uint32 _BuyerNoMail = 0; +static uint32 _AHBotGUID = 0; + +static uint32 _BuyerBidPriceGrey = 0; +static uint32 _BuyerBidPriceWhite = 0; +static uint32 _BuyerBidPriceGreen = 0; +static uint32 _BuyerBidPriceBlue = 0; +static uint32 _BuyerBidPricePurple = 0; + +static uint32 _BuyerBiddingInterval = 60; +static bool _BuyerNoBidAHbotBids = false; + +time_t _lastrun; +/////////////////////////////////////////////////////////////////////////////// +// +/////////////////////////////////////////////////////////////////////////////// +uint32 AuctionHouseBuyerBotNoMail() +{ + return _BuyerNoMail != 0 ? _BuyerPlayerGUID : 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// +/////////////////////////////////////////////////////////////////////////////// +static void addNewAuctionBuyerBotBid(uint32 ahMapID, WorldSession *session) +{ + + // Fetches content of selected AH + AuctionHouseObject* auctionHouse = objmgr.GetAuctionsMap(ahMapID); + AuctionHouseObject::AuctionEntryMap::iterator itr; + + itr = auctionHouse->GetAuctionsBegin(); + vector possibleBids; + + while (itr != auctionHouse->GetAuctionsEnd()) + { + AuctionHouseObject::AuctionEntryMap::iterator tmp = itr; + ++itr; + // Check if we want to bid ahbot auctions. If not (true), and owner is ahbot + // we skip this iteration. + if(_BuyerNoBidAHbotBids && tmp->second->owner == _AHBotGUID) + { + continue; + } + // Check that we haven't bidded in this auction already. + if(tmp->second->bidder != _BuyerPlayerGUID) + { + uint32 tmpdata= tmp->second->Id; + possibleBids.push_back(tmpdata); + } + } + + // Do we have anything to bid? If not, stop here. + if(possibleBids.empty()) + { + return; + } + + // Choose random auction from possible auctions + uint32 auctionID = possibleBids[urand(0, possibleBids.size() - 1)]; + + // from auctionhouse.cpp, creates auction pointer & player pointer + AuctionEntry* auction = auctionHouse->GetAuction(auctionID); + Player* pl = objmgr.GetPlayer(MAKE_NEW_GUID(_BuyerPlayerGUID,0,HIGHGUID_PLAYER)); + + // get exact item information + Item *pItem = objmgr.GetAItem(auction->item_guidlow); + if (!pItem) + { + sLog.outError("Item doesn't exists, perhaps bought already?"); + return; + } + + // get item prototype + ItemPrototype const* prototype = objmgr.GetItemPrototype(auction->item_template); + + // check which price we have to use, startbid or if it is bidded already + uint32 currentprice; + if(auction->bid) + { + currentprice = auction->bid; + } + else + { + currentprice = auction->startbid; + } + + uint32 bidprice; + + // Prepare portion from maximum bid + uint32 tmprate2 = urand(0, 100); + double tmprate = static_cast(tmprate2); + double bidrate = tmprate / 100; + long double bidMax = 0; + + // check that bid has acceptable value and take bid based on vendorprice, stacksize and quality + switch (prototype->Quality) + { + case 0: + if(currentprice < prototype->BuyPrice * pItem->GetCount() * _BuyerBidPriceGrey) + { + bidMax = prototype->BuyPrice * pItem->GetCount() * _BuyerBidPriceGrey; + } + break; + case 1: + if(currentprice < prototype->BuyPrice * pItem->GetCount() * _BuyerBidPriceWhite) + { + bidMax = prototype->BuyPrice * pItem->GetCount() * _BuyerBidPriceWhite; + } + break; + case 2: + if(currentprice < prototype->BuyPrice * pItem->GetCount() * _BuyerBidPriceGreen) + { + bidMax = prototype->BuyPrice * pItem->GetCount() * _BuyerBidPriceGreen; + } + break; + case 3: + if(currentprice < prototype->BuyPrice * pItem->GetCount() * _BuyerBidPriceBlue) + { + bidMax = prototype->BuyPrice * pItem->GetCount() * _BuyerBidPriceBlue; + } + break; + case 4: + if(currentprice < prototype->BuyPrice * pItem->GetCount() * _BuyerBidPricePurple) + { + bidMax = prototype->BuyPrice * pItem->GetCount() * _BuyerBidPricePurple; + } + break; + default: + // quality is something it shouldn't be, let's get out of here + return; + break; + } + + if(bidMax == 0) + { + // quality check failed to get bidmax, let's get out of here + return; + } + + // Calculate our bid + long double bidvalue = currentprice + ( (bidMax - currentprice) * bidrate); + // Convert to uint32 + bidprice = static_cast(bidvalue); + + // Check our bid is high enough to be valid. If not, correct it to minimum. + if((currentprice + objmgr.GetAuctionOutBid(currentprice)) > bidprice) + { + bidprice = currentprice + objmgr.GetAuctionOutBid(currentprice); + } + + // Check wether we do normal bid, or buyout + if ((bidprice < auction->buyout) || (auction->buyout == 0)) + { + if (auction->bidder > 0) + { + if ( auction->bidder == pl->GetGUIDLow() ) + { + //pl->ModifyMoney( -int32(price - auction->bid)); + } + else + { + // mail to last bidder and return money + session->SendAuctionOutbiddedMail( auction , bidprice ); + //pl->ModifyMoney( -int32(price) ); + } + } + + auction->bidder = pl->GetGUIDLow(); + auction->bid = bidprice; + + // Saving auction into database + CharacterDatabase.PExecute("UPDATE auctionhouse SET buyguid = '%u',lastbid = '%u' WHERE id = '%u'", auction->bidder, auction->bid, auction->Id); + } + else + { + //buyout + if (pl->GetGUIDLow() == auction->bidder ) + { + //pl->ModifyMoney(-int32(auction->buyout - auction->bid)); + } + else + { + //pl->ModifyMoney(-int32(auction->buyout)); + if ( auction->bidder ) + { + session->SendAuctionOutbiddedMail( auction, auction->buyout ); + } + } + auction->bidder = pl->GetGUIDLow(); + auction->bid = auction->buyout; + + // Send mails to buyer & seller + objmgr.SendAuctionSuccessfulMail( auction ); + objmgr.SendAuctionWonMail( auction ); + + // Remove item from auctionhouse + objmgr.RemoveAItem(auction->item_guidlow); + // Remove auction + auctionHouse->RemoveAuction(auction->Id); + // Remove from database + CharacterDatabase.PExecute("DELETE FROM auctionhouse WHERE id = '%u'",auction->Id); + + delete auction; + } +} +/////////////////////////////////////////////////////////////////////////////// +// +/////////////////////////////////////////////////////////////////////////////// +void AuctionHouseBuyerBot() +{ + if ((_BuyerPlayerAccount == 0) || (_BuyerPlayerGUID == 0)) + return; + + time_t _newrun = time(NULL); + if( (_newrun - _lastrun) > _BuyerBiddingInterval) + { + _lastrun = _newrun; + + WorldSession _session(_BuyerPlayerAccount, NULL, 0, true, 0, LOCALE_ENG); + //Player Buyerplayer(&_session); + //Buyerplayer.MinimalLoadFromDB(NULL, _BuyerPlayerGUID); + //ObjectAccessor::Instance().AddObject(&Buyerplayer); + + addNewAuctionBuyerBotBid(2, &_session); + addNewAuctionBuyerBotBid(6, &_session); + addNewAuctionBuyerBotBid(7, &_session); + + //ObjectAccessor::Instance().RemoveObject(&Buyerplayer); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// +/////////////////////////////////////////////////////////////////////////////// +void AuctionHouseBuyerBotInit() +{ + _BuyerPlayerAccount = sConfig.GetIntDefault("AuctionHouseBotBuyer.Account", 0); + _BuyerPlayerGUID = sConfig.GetIntDefault("AuctionHouseBotBuyer.GUID", 0); + + if ((_BuyerPlayerAccount == 0) || (_BuyerPlayerGUID == 0)) + { + sLog.outString("AuctionHouseBotBuyer disabled"); + return; + } + + _AHBotGUID = sConfig.GetIntDefault("AuctionHouseBot.GUID", 0); + + if (_AHBotGUID == 0) + { + sLog.outString("AuctionHouseBot disabled or not installed"); + } + + _BuyerNoMail = sConfig.GetIntDefault("AuctionHouseBotBuyer.NoMail", 0); + + _BuyerBidPriceGrey = sConfig.GetIntDefault("AuctionHouseBotBuyer.BuyerPriceGrey", + 0); + + _BuyerBidPriceWhite = sConfig.GetIntDefault("AuctionHouseBotBuyer.BuyerPriceWhite", + 2); + + _BuyerBidPriceGreen = sConfig.GetIntDefault("AuctionHouseBotBuyer.BuyerPriceGreen", + 3); + + _BuyerBidPriceBlue = sConfig.GetIntDefault("AuctionHouseBotBuyer.BuyerPriceBlue", + 4); + + _BuyerBidPricePurple = sConfig.GetIntDefault("AuctionHouseBotBuyer.BuyerPricePurple", + 5); + + _BuyerBiddingInterval = sConfig.GetIntDefault("AuctionHouseBotBuyer.BiddingInterval", 60); + + _BuyerNoBidAHbotBids = sConfig.GetIntDefault("AuctionHouseBotBuyer.NoAHbotBidding", 0); + + sLog.outString("AuctionHouseBotBuyer v0.5.0.5734 by |Paradox| (original by Kerbe) has been loaded."); +} Index: src/game/AuctionHouseBuyer.h =================================================================== --- src/game/AuctionHouseBuyer.h (revision 0) +++ src/game/AuctionHouseBuyer.h (revision 0) @@ -0,0 +1,10 @@ +#ifndef AUCTION_HOUSE_BUYER_H +#define AUCTION_HOUSE_BUYER_H + +#include "Common.h" + +uint32 AuctionHouseBuyerBotNoMail(); +void AuctionHouseBuyerBot(); +void AuctionHouseBuyerBotInit(); + +#endif Index: src/game/Chat.cpp =================================================================== --- src/game/Chat.cpp (revision 5734) +++ src/game/Chat.cpp (working copy) @@ -282,6 +282,8 @@ { "npcinfoset", SEC_ADMINISTRATOR, &ChatHandler::HandleNpcInfoSetCommand, "", NULL }, { "addvendoritem", SEC_GAMEMASTER, &ChatHandler::HandleAddVendorItemCommand, "", NULL }, { "delvendoritem", SEC_GAMEMASTER, &ChatHandler::HandleDelVendorItemCommand, "", NULL }, + { "ahexpire", SEC_ADMINISTRATOR, &ChatHandler::HandleAHExpireCommand, "", NULL }, + { "ahdelete", SEC_ADMINISTRATOR, &ChatHandler::HandleAHDeleteCommand, "", NULL }, { "itemmove", SEC_GAMEMASTER, &ChatHandler::HandleItemMoveCommand, "", NULL }, { "kick", SEC_GAMEMASTER, &ChatHandler::HandleKickPlayerCommand, "", NULL }, { "learn", SEC_MODERATOR, NULL, "", learnCommandTable }, Index: src/game/Chat.h =================================================================== --- src/game/Chat.h (revision 5734) +++ src/game/Chat.h (working copy) @@ -315,6 +315,8 @@ bool HandleLookupQuestCommand(const char* args); bool HandleLookupCreatureCommand(const char* args); bool HandleLookupObjectCommand(const char* args); + bool HandleAHExpireCommand(const char * args); + bool HandleAHDeleteCommand(const char * args); bool HandlePasswordCommand(const char* args); bool HandleLockAccountCommand(const char* args); bool HandleRespawnCommand(const char* args); Index: src/game/Level0.cpp =================================================================== --- src/game/Level0.cpp (revision 5734) +++ src/game/Level0.cpp (working copy) @@ -113,6 +113,9 @@ SendSysMessage(LANG_AVIABLE_CMD); + uint32 c = 0; + char a[1024] = ""; + for(uint32 i = 0; table[i].Name != NULL; i++) { if(*args && !hasStringAbbr(table[i].Name, (char*)args)) @@ -121,9 +124,19 @@ if(m_session->GetSecurity() < table[i].SecurityLevel) continue; - SendSysMessage(table[i].Name); + sprintf(a, "%s%s, ", a, table[i].Name); + c++; + if (c >= 10) { + SendSysMessage(a); + sprintf(a, ""); + c = 0; + } + // SendSysMessage(table[i].Name); + } - + if (c > 0) { + SendSysMessage(a); + } return true; } Index: src/game/Level3.cpp =================================================================== --- src/game/Level3.cpp (revision 5734) +++ src/game/Level3.cpp (working copy) @@ -4312,6 +4312,92 @@ return true; } +bool ChatHandler::HandleAHExpireCommand(const char* args) +{ + if (args == NULL) + return false; + + char* ahMapIdStr = strtok((char*) args, " "); + char* playerGuidStr = strtok(NULL, " "); + + if ((ahMapIdStr == NULL) || (playerGuidStr == NULL)) + return false; + + uint32 ahMapID = (uint32) strtoul(ahMapIdStr, NULL, 0); + uint32 playerGUID = (uint32) strtoul(playerGuidStr, NULL, 0); + + AuctionHouseObject* auctionHouse = objmgr.GetAuctionsMap(ahMapID); + + if (auctionHouse == NULL) + return false; + + AuctionHouseObject::AuctionEntryMap::iterator itr; + itr = auctionHouse->GetAuctionsBegin(); + + while (itr != auctionHouse->GetAuctionsEnd()) + { + if (itr->second->owner == playerGUID) + itr->second->time = sWorld.GetGameTime(); + + ++itr; + } + + return true; +} + +bool ChatHandler::HandleAHDeleteCommand(const char* args) +{ + if (args == NULL) + return false; + + char* ahMapIdStr = strtok((char*) args, " "); + char* playerGuidStr = strtok(NULL, " "); + + if ((ahMapIdStr == NULL) || (playerGuidStr == NULL)) + return false; + + uint32 ahMapID = (uint32) strtoul(ahMapIdStr, NULL, 0); + uint32 playerGUID = (uint32) strtoul(playerGuidStr, NULL, 0); + + AuctionHouseObject* auctionHouse = objmgr.GetAuctionsMap(ahMapID); + + if (auctionHouse == NULL) + return false; + + AuctionHouseObject::AuctionEntryMap::iterator itr; + itr = auctionHouse->GetAuctionsBegin(); + + while (itr != auctionHouse->GetAuctionsEnd()) + { + AuctionHouseObject::AuctionEntryMap::iterator tmp = itr; + ++itr; + + if (tmp->second->owner != playerGUID) + continue; + + Item* item = objmgr.GetAItem(tmp->second->item_guidlow); + if (item != NULL) + { + objmgr.RemoveAItem(tmp->second->item_guidlow); + item->DeleteFromDB(); + delete item; + } + else + { + sLog.outString("ahdelete: " + "clearing auction for non-existant item_guidlow (%d)", + tmp->second->item_guidlow); + } + + CharacterDatabase.PExecute("DELETE FROM `auctionhouse` WHERE `id` = '%u'", + tmp->second->Id); + auctionHouse->RemoveAuction(tmp->second->Id); + delete tmp->second; + } + + return true; +} + bool ChatHandler::HandleBanListCommand(const char* args) { loginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate"); Index: src/game/Makefile.am =================================================================== --- src/game/Makefile.am (revision 5734) +++ src/game/Makefile.am (working copy) @@ -38,10 +38,14 @@ ArenaTeam.cpp \ ArenaTeam.h \ ArenaTeamHandler.cpp \ + AuctionHouseBot.cpp \ + AuctionHouseBot.h \ AuctionHouse.cpp \ AuctionHouseObject.h \ Bag.cpp \ Bag.h \ + AuctionHouseBuyer.cpp \ + AuctionHouseBuyer.h \ BattleGround.cpp \ BattleGroundAA.cpp \ BattleGroundAB.cpp \ Index: src/game/ObjectMgr.cpp =================================================================== --- src/game/ObjectMgr.cpp (revision 5734) +++ src/game/ObjectMgr.cpp (working copy) @@ -20,6 +20,7 @@ #include "Database/DatabaseEnv.h" #include "Database/SQLStorage.h" +#include "AuctionHouseBot.h" #include "Log.h" #include "MapManager.h" #include "ObjectMgr.h" @@ -32,6 +33,7 @@ #include "ArenaTeam.h" #include "Transports.h" #include "ProgressBar.h" +#include "AuctionHouseBuyer.h" #include "Policies/SingletonImp.h" #include "Language.h" #include "GameEvent.h" @@ -244,6 +246,9 @@ //does not clear ram void ObjectMgr::SendAuctionWonMail( AuctionEntry *auction ) { + if (auction->bidder == AuctionHouseBuyerBotNoMail()) + return; + Item *pItem = objmgr.GetAItem(auction->item_guidlow); if(!pItem) return; @@ -334,6 +339,9 @@ //call this method to send mail to auction owner, when auction is successful, it does not clear ram void ObjectMgr::SendAuctionSuccessfulMail( AuctionEntry * auction ) { + if (auction->owner == AuctionHouseBotNoMail()) + return; + Item *pItem = objmgr.GetAItem(auction->item_guidlow); if(!pItem) return; Index: src/game/Player.cpp =================================================================== --- src/game/Player.cpp (revision 5734) +++ src/game/Player.cpp (working copy) @@ -534,6 +534,7 @@ // set starting level SetUInt32Value( UNIT_FIELD_LEVEL, sWorld.getConfig(CONFIG_START_PLAYER_LEVEL) ); + SetUInt32Value( PLAYER_FIELD_COINAGE, sWorld.getConfig(CONFIG_START_PLAYER_MONEY) * 10000 ); // Played time m_Last_tick = time(NULL); Index: src/game/World.cpp =================================================================== --- src/game/World.cpp (revision 5734) +++ src/game/World.cpp (working copy) @@ -35,10 +35,12 @@ #include "World.h" #include "ObjectMgr.h" #include "SpellMgr.h" +#include "AuctionHouseBuyer.h" #include "Chat.h" #include "Database/DBCStores.h" #include "LootMgr.h" #include "ItemEnchantmentMgr.h" +#include "AuctionHouseBot.h" #include "MapManager.h" #include "ScriptCalls.h" #include "CreatureAIRegistry.h" @@ -431,6 +433,17 @@ sLog.outError("StartPlayerLevel (%i) must be in range 1..MaxPlayerLevel(%u). Set to %u.",m_configs[CONFIG_START_PLAYER_LEVEL],m_configs[CONFIG_MAX_PLAYER_LEVEL],m_configs[CONFIG_MAX_PLAYER_LEVEL]); m_configs[CONFIG_START_PLAYER_LEVEL] = m_configs[CONFIG_MAX_PLAYER_LEVEL]; } + m_configs[CONFIG_START_PLAYER_MONEY] = sConfig.GetIntDefault("StartPlayerMoney", 1); + if(m_configs[CONFIG_START_PLAYER_MONEY] < 0) + { + sLog.outError("StartPlayerMoney (%i) must be a positive number. Set to 0.",m_configs[CONFIG_START_PLAYER_MONEY]); + m_configs[CONFIG_START_PLAYER_MONEY] = 0; + } + else if(m_configs[CONFIG_START_PLAYER_MONEY] > 214748) + { + sLog.outError("StartPlayerMoney (%i) must be in range 0..MaxPlayerMoney(%u). Set to %u.",m_configs[CONFIG_START_PLAYER_MONEY],214748,214748); + m_configs[CONFIG_START_PLAYER_MONEY] = 214748; + } m_configs[CONFIG_INSTANCE_IGNORE_LEVEL] = sConfig.GetBoolDefault("Instance.IgnoreLevel", false); m_configs[CONFIG_INSTANCE_IGNORE_RAID] = sConfig.GetBoolDefault("Instance.IgnoreRaid", false); m_configs[CONFIG_BATTLEGROUND_CAST_DESERTER] = sConfig.GetBoolDefault("Battleground.CastDeserter", true); @@ -857,10 +870,14 @@ sLog.outString("Calculate next daily quest reset time..." ); InitDailyQuestResetTime(); + AuctionHouseBuyerBotInit(); + sLog.outString("Starting Game Event system..." ); uint32 nextGameEvent = gameeventmgr.Initialize(); m_timers[WUPDATE_EVENTS].SetInterval(nextGameEvent); //depend on next event + AuctionHouseBotInit(); + sLog.outString( "WORLD: World initialized" ); } @@ -912,11 +929,15 @@ m_NextDailyQuestReset += 24*HOUR; } + ///
  • Handle auctions when the timer has passed if (m_timers[WUPDATE_AUCTIONS].Passed()) { + AuctionHouseBot(); m_timers[WUPDATE_AUCTIONS].Reset(); + AuctionHouseBuyerBot(); + ///- Update mails (return old mails with item, or delete them) //(tested... works on win) if (++mail_timer > mail_timer_expires) Index: src/game/World.h =================================================================== --- src/game/World.h (revision 5734) +++ src/game/World.h (working copy) @@ -82,6 +82,7 @@ CONFIG_ALLOW_TWO_SIDE_ADD_FRIEND, CONFIG_MAX_PLAYER_LEVEL, CONFIG_START_PLAYER_LEVEL, + CONFIG_START_PLAYER_MONEY, CONFIG_INSTANCE_IGNORE_LEVEL, CONFIG_INSTANCE_IGNORE_RAID, CONFIG_BATTLEGROUND_CAST_DESERTER, Index: src/mangosd/CliRunnable.cpp =================================================================== --- src/mangosd/CliRunnable.cpp (revision 5734) +++ src/mangosd/CliRunnable.cpp (working copy) @@ -68,6 +68,8 @@ void CliSend(char*,pPrintf); void CliPLimit(char*,pPrintf); void CliSetPassword(char*,pPrintf); +void CliHandleAHExpireCommand(char*,pPrintf); +void CliHandleAHDeleteCommand(char*,pPrintf); /// Table of known commands const CliCommand Commands[]= { @@ -98,11 +100,86 @@ {"saveall", &CliSave,"Save all players"}, {"send", &CliSend,"Send message to a player"}, {"tele", &CliTele,"Teleport player to location"}, + {"ahexpire", &CliHandleAHExpireCommand,"Expire all auctions from AuctionBot character"}, + {"ahdelete", &CliHandleAHDeleteCommand,"Delete all auctions from AuctionBot character"}, {"plimit", &CliPLimit,"Show or set player login limitations"} }; /// \todo Need some pragma pack? Else explain why in a comment. #define CliTotalCmds sizeof(Commands)/sizeof(CliCommand) +void CliHandleAHExpireCommand(char*command,pPrintf zprintf) +{ + char * ahMapIdStr = strtok(command, " "); + char * playerGuidStr = strtok(NULL, " "); + if(!ahMapIdStr || !playerGuidStr) + { + zprintf("Syntax is: ahexpire $ahMapID (2, 6 or 7) $playerGUID\r\n"); + return; + } + uint32 ahMapID = (uint32) strtoul(ahMapIdStr, NULL, 0); + uint32 playerGUID = (uint32) strtoul(playerGuidStr, NULL, 0); + + AuctionHouseObject* auctionHouse = objmgr.GetAuctionsMap(ahMapID); + + AuctionHouseObject::AuctionEntryMap::iterator itr; + itr = auctionHouse->GetAuctionsBegin(); + + while (itr != auctionHouse->GetAuctionsEnd()) + { + if (itr->second->owner == playerGUID) + itr->second->time = sWorld.GetGameTime(); + + ++itr; + } + +} + +void CliHandleAHDeleteCommand(char*command,pPrintf zprintf) +{ + char * ahMapIdStr = strtok(command, " "); + char * playerGuidStr = strtok(NULL, " "); + if(!ahMapIdStr || !playerGuidStr) + { + zprintf("Syntax is: ahdelete $ahMapID (2, 6 or 7) $playerGUID\r\n"); + return; + } + uint32 ahMapID = (uint32) strtoul(ahMapIdStr, NULL, 0); + uint32 playerGUID = (uint32) strtoul(playerGuidStr, NULL, 0); + + AuctionHouseObject* auctionHouse = objmgr.GetAuctionsMap(ahMapID); + + AuctionHouseObject::AuctionEntryMap::iterator itr; + itr = auctionHouse->GetAuctionsBegin(); + + while (itr != auctionHouse->GetAuctionsEnd()) + { + AuctionHouseObject::AuctionEntryMap::iterator tmp = itr; + ++itr; + + if (tmp->second->owner != playerGUID) + continue; + + Item* item = objmgr.GetAItem(tmp->second->item_guidlow); + if (item != NULL) + { + objmgr.RemoveAItem(tmp->second->item_guidlow); + item->DeleteFromDB(); + delete item; + } + else + { + sLog.outString("ahdelete: " + "clearing auction for non-existant item_guidlow (%d)", + tmp->second->item_guidlow); + } + + CharacterDatabase.PExecute("DELETE FROM `auctionhouse` WHERE `id` = '%u'", + tmp->second->Id); + auctionHouse->RemoveAuction(tmp->second->Id); + delete tmp->second; + } + +} /// Create a character dump file void CliWritePlayerDump(char*command,pPrintf zprintf) { Index: src/mangosd/mangosd.conf.in =================================================================== --- src/mangosd/mangosd.conf.in (revision 5734) +++ src/mangosd/mangosd.conf.in (working copy) @@ -300,6 +300,11 @@ # Staring level that have character at creating (in range 1 to MaxPlayerLevel) # Default: 1 # +# StartPlayerMoney +# Starting money in Gold that have character at creating (in range 0 to 214748) +# Todo: Break this up by copper silver and gold +# Default: 0 +# # ActivateWeather # Activate weather system # Default: 1 (true) @@ -378,6 +383,7 @@ DBC.Locale = 255 MaxPlayerLevel = 70 StartPlayerLevel = 1 +StartPlayerMoney = 0 ActivateWeather = 1 Battleground.CastDeserter = 1 CastUnstuck = 1 @@ -754,3 +760,207 @@ Ra.Port = 3443 Ra.MinLevel = 3 Ra.Secure = 1 + +################################################################################################################### +# AUCTION HOUSE BOT SETTINGS +# +# Auction House Bot character data +# AuctionHouseBot.Account is the account number (in realmd->account table) of the player you want to run as the auction bot. +# AuctionHouseBot.GUID is the GUID (in characters->characters table) of the player you want to run as the auction bot. +# Default: 0 (Auction House Bot disabled) +# +# AuctionHouseBot.NoMail +# This is a flag to disable mail for successfull auctions. +# A value of 0 will allow mail for successful auctions to be sent, which is the default. +# Non-zero (e.g. AuctionHouseBot.NoMail = 1) will stop successful auction mail. +# Default: 0 (Send auction successful mail) +# +# AuctionHouseBot.AllianceItems +# This is the number of items you want to keep in the Alliance auction house. +# AuctionHouseBot.HordeItems +# This is the number of items you want to keep in the Horde auction house. +# AuctionHouseBot.NeutralItems +# This is the number of items you want to keep in the Neutral auction house. +# Default: 0 (No items generated) +# Note: If you enable AllowTwoSide.Interaction.Trade, ALL auction houses are linked to the neutral auction house. +# +# AuctionHouseBot.MinAllianceItems +# This is the minimum number of items you want to keep in the Alliance auction house. +# AuctionHouseBot.MinHordeItems +# This is the minimum number of items you want to keep in the Horde auction house. +# AuctionHouseBot.MinNeutralItems +# This is the minimum number of items you want to keep in the Neutral auction house. +# Default: -1 (minimum will be the same as maximum) +# +# AuctionHouseBot.MinTime +# Sets the minimum number of hours for an auction. +# Default: 8 +# +# AuctionHouseBot.MaxTime +# Sets the maximum number of hours for an auction. +# Default: 24 +# +# Item distribution +# Sets the percentage of the auction items that should be trade goods of white quality. +# A value of 0 will disable. +# AuctionHouseBot.PercentWhiteTradeGoods +# Sets the percentage of the White Trade Goods auction items +# Default: 30 +# AuctionHouseBot.PercentGreenTradeGoods +# Sets the percentage of the Green Trade Goods auction items +# Default: 13 +# AuctionHouseBot.PercentBlueTradeGoods +# Sets the percentage of the Blue Trade Goods auction items +# Default: 9 +# AuctionHouseBot.PercentPurpleTradeGoods +# Sets the percentage of the Purple Trade Goods auction items +# Default: 1 +# Note: All of the above values (AuctionHouseBot Percent TradeGoods) must add together to make 100 percent. +# +# AuctionHouseBot.PercentWhiteItems +# Sets the percentage of the non trade White auction items +# Default: 6 +# AuctionHouseBot.PercentGreenItems +# Sets the percentage of the non trade Green auction items +# Default: 30 +# AuctionHouseBot.PercentBlueItems +# Sets the percentage of the non trade Blue auction items +# Default: 9 +# AuctionHouseBot.PercentPurpleItems +# Sets the percentage of the non trade Purple auction items +# Default: 2 +# Note: All of the above values (AuctionHouseBot Percent Items) must add together to make 100 percent. +# +# Minimum and maximim price mark-up for items. Percentage of vendor sale price. +# Example: If a vendor would sell an item for 1g and MinPrice = 150 and MaxPrice = 250, +# then that item would be randomly priced between 1g 50s and 2g 50s. +# AuctionHouseBot.MinPriceWhite +# Minimum price of White items. +# Default: 150 +# AuctionHouseBot.MaxPriceWhite +# Maximum price of White items. +# Default: 250 +# AuctionHouseBot.MinPriceGreen +# Minimum price of Green items. +# Default: 200 +# AuctionHouseBot.MaxPriceGreen +# Maximum price of Green items. +# Default: 300 +# AuctionHouseBot.MinPriceBlue +# Minimum price of Blue items. +# Default: 250 +# AuctionHouseBot.MaxPriceBlue +# Maximum price of Blue items. +# Default: 350 +# AuctionHouseBot.MinPricePurple +# Minimum price of Purple items. +# Default: 300 +# AuctionHouseBot.MaxPricePurple +# Maximum price of Purple items. +# Default: 450 +# +# AuctionHouseBot.BidPrice +# Starting bid price as a percentage of the randomly chosen buyout price +# AuctionHouseBot.BidPriceWhite +# Default: 100 (Bid and buyout price the same) +# AuctionHouseBot.BidPriceGreen +# Default: 100 (Bid and buyout price the same) +# AuctionHouseBot.BidPriceBlue +# Default: 100 (Bid and buyout price the same) +# +AuctionHouseBot.BidPricePurple +# Default: 100 (Bid and buyout price the same) +# +# AuctionHouseBot.MaxStack +# Stack size limits for item qualities - a value of 0 will disable a maximum stack size for that quality, +# which will allow the bot to create items in stack as large as the item allows. +# AuctionHouseBot.MaxStackWhite +# Default: 0 +# AuctionHouseBot.MaxStackGreen +# Default: 3 +# AuctionHouseBot.MaxStackBlue +# Default: 2 +# AuctionHouseBot.MaxStackPurple +# Default: 1 +# +################################################################################################################### + +AuctionHouseBot.Account = 0 +AuctionHouseBot.GUID = 0 +AuctionHouseBot.NoMail = 0 +AuctionHouseBot.AllianceItems = 0 +AuctionHouseBot.HordeItems = 0 +AuctionHouseBot.NeutralItems = 0 +AuctionHouseBot.MinAllianceItems = -1 +AuctionHouseBot.MinHordeItems = -1 +AuctionHouseBot.MinNeutralItems = -1 +AuctionHouseBot.MinTime = 8 +AuctionHouseBot.MaxTime = 24 +AuctionHouseBot.PercentWhiteTradeGoods = 30 +AuctionHouseBot.PercentGreenTradeGoods = 13 +AuctionHouseBot.PercentBlueTradeGoods = 9 +AuctionHouseBot.PercentPurpleTradeGoods = 1 +AuctionHouseBot.PercentWhiteItems = 6 +AuctionHouseBot.PercentGreenItems = 30 +AuctionHouseBot.PercentBlueItems = 9 +AuctionHouseBot.PercentPurpleItems = 2 +AuctionHouseBot.MinPriceWhite = 150 +AuctionHouseBot.MaxPriceWhite = 250 +AuctionHouseBot.MinPriceGreen = 200 +AuctionHouseBot.MaxPriceGreen = 300 +AuctionHouseBot.MinPriceBlue = 250 +AuctionHouseBot.MaxPriceBlue = 350 +AuctionHouseBot.MinPricePurple = 300 +AuctionHouseBot.MaxPricePurple = 450 +AuctionHouseBot.BidPriceWhite = 100 +AuctionHouseBot.BidPriceGreen = 100 +AuctionHouseBot.BidPriceBlue = 100 +AuctionHouseBot.BidPricePurple = 100 +AuctionHouseBot.MaxStackWhite = 0 +AuctionHouseBot.MaxStackGreen = 3 +AuctionHouseBot.MaxStackBlue = 2 +AuctionHouseBot.MaxStackPurple = 1 + +############################################################################### +# AUCTION HOUSE BOT BUYER OPTIONS +# +# AuctionHouseBotBuyer.Account +# Account of buyerbot +# +# AuctionHouseBotBuyer.GUID +# GUID of buyer character +# +# AuctionHouseBotBuyer.NoMail +# Do we send mail to AHB. Default is no. +# +# AuctionHouseBotBuyer.BuyerPriceWhite +# Multiplier to vendorprice when buying white items from auctionhouse +# +# AuctionHouseBotBuyer.BuyerPriceGreen +# Multiplier to vendorprice when buying green items from auctionhouse +# +# AuctionHouseBotBuyer.BuyerPriceBlue +# Multiplier to vendorprice when buying blue items from auctionhouse +# +# AuctionHouseBotBuyer.BuyerPricePurple +# Multiplier to vendorprice when buying purple items from auctionhouse +# +# AuctionHouseBotBuyer.BiddingInterval +# Interval how frequently AHB bids on each AH. Time in seconds +# +# AuctionHouseBotBuyer.NoAHbotBidding +# Stop bidding on AHBot bids in auctionhouses. Default is no. +# 1 (true) (no AHBot auctions are bid) +# Default: 0 (false)(also AHBot auctions are bid) +# +############################################################################### + +AuctionHouseBotBuyer.Account = 0 +AuctionHouseBotBuyer.GUID = 0 +AuctionHouseBotBuyer.NoMail = 1 +AuctionHouseBotBuyer.BuyerPriceGrey = 0 +AuctionHouseBotBuyer.BuyerPriceWhite = 2 +AuctionHouseBotBuyer.BuyerPriceGreen = 3 +AuctionHouseBotBuyer.BuyerPriceBlue = 4 +AuctionHouseBotBuyer.BuyerPricePurple = 5 +AuctionHouseBotBuyer.BiddingInterval = 60 +AuctionHouseBotBuyer.NoAHbotBidding = 0 Index: win/VC71/game.vcproj =================================================================== --- win/VC71/game.vcproj (revision 5734) +++ win/VC71/game.vcproj (working copy) @@ -457,6 +457,12 @@ RelativePath="..\..\src\game\ArenaTeam.h"> + + + + + + + + + + + + @@ -795,6 +803,12 @@ > + + + + Index: win/VC90/game.vcproj =================================================================== --- win/VC90/game.vcproj (revision 5734) +++ win/VC90/game.vcproj (working copy) @@ -788,6 +788,22 @@ > + + + + + + + +