Skip to content

Instantly share code, notes, and snippets.

@SkirnirMaNGOS
Created March 10, 2010 19:40
Show Gist options
  • Save SkirnirMaNGOS/328257 to your computer and use it in GitHub Desktop.
Save SkirnirMaNGOS/328257 to your computer and use it in GitHub Desktop.
diff --git a/README.AHBOT b/README.AHBOT
new file mode 100644
index 0000000..dc42018
--- /dev/null
+++ b/README.AHBOT
@@ -0,0 +1,179 @@
+This patch modifies the core so it populates the auction houses with items. It
+makes the game feel a bit more like official. Items and prices are chosen
+randomly based on the parameters you define. If an auction expires, auctions
+are deleted quietly. AHBot will not buy it's own items, and will not receive
+mail from the AH or get returned mail.
+
+===============================================================================
+~~HOW TO CONFIGURE~~
+===============================================================================
+Step 1.) Create a character that you are going to use as the auction house bot
+ character. This character will be the auction's owner for all the
+ items created by the bot.
+Step 2.) Go into the realm database and note the account number for the
+ character.
+Step 3.) Go into the characters database and note the character's GUID.
+Step 4.) Log in at least once with this character.
+ (Do not change the configuration before this)
+Step 5.) Tune the configuration options in the configuration file and the
+ Database.
+
+#These are the settings in the configuration file:
+AuctionHouseBot.EnableSeller = 0
+AuctionHouseBot.EnableBuyer = 0
+AuctionHouseBot.Account = 0
+AuctionHouseBot.GUID = 0
+AuctionHouseBot.VendorItems = 0
+AuctionHouseBot.LootItems = 1
+AuctionHouseBot.OtherItems = 0
+AuctionHouseBot.No_Bind = 1
+AuctionHouseBot.Bind_When_Picked_Up = 0
+AuctionHouseBot.Bind_When_Equipped = 1
+AuctionHouseBot.Bind_When_Use = 1
+AuctionHouseBot.Bind_Quest_Item = 0
+AuctionHouseBot.ItemsPerCycle = 200
+AuctionHouseBot.UseBuyPriceForSeller = 0
+AuctionHouseBot.UseBuyPriceForBuyer = 0
+
+AuctionHouseBot.EnableSeller enables (1) or disables (0) the Seller
+AuctionHouseBot.EnableBuyer enables (1) or disables (0) the Buyer
+AuctionHouseBot.Account is the account number (in realmd->account table) of the player you want to run as the auction bot. Note: a value of 0 will disable the bot.
+AuctionHouseBot.GUID is the GUID (in characters->characters table) of the player you want to run as the auction bot. Note: a value of 0 will disable the bot.
+AuctionHouseBot.VendorItems is a boolean value (0 or 1) that indicates whether to include Vendor only items
+AuctionHouseBot.LootItems is a boolean value (0 or 1) that indicates whether to include Loot/Fish/Skin/etc. only items
+AuctionHouseBot.OtherItems is a boolean value (0 or 1) that indicates whether to include Other items not covered by the first 2
+AuctionHouseBot.No_Bind is a boolean value (0 or 1) that indicates whether to include items with a bonding of 0
+AuctionHouseBot.Bind_When_Picked_Up = is a boolean value (0 or 1) that indicates whether to include items with a bonding of 1
+AuctionHouseBot.Bind_When_Equipped = is a boolean value (0 or 1) that indicates whether to include items with a bonding of 2
+AuctionHouseBot.Bind_When_Use = is a boolean value (0 or 1) that indicates whether to include items with a bonding of 3
+AuctionHouseBot.Bind_Quest_Item = is a boolean value (0 or 1) that indicates whether to include items with a bonding of 4
+AuctionHouseBot.ItemsPerCycle determines how many items are added each time AHBot is run (once per minute, by default)
+AuctionHouseBot.UseBuyPriceForSeller Use SellPrice (0) or BuyPrice (1) for determining prices
+AuctionHouseBot.UseBuyPriceForBuyer Use SellPrice (0) or BuyPrice (1) for determining prices
+
+#These are the settings in the Database:
+#Each Auctionhouse has it's own set of these
+
+MinItems = 0
+#The Minimum number of items you want to keep in the auction houses.
+#(default 0 - minimum will be the same as maximum).
+#If it is higher than the value of the corresponding maxItems setting,
+#it will be set down to match the maxItems setting.
+
+MaxItems = 0
+#The Maximum number of items you want to keep in the auction houses.
+
+MinTime = 8
+#The minimum number of hours for an auction.
+
+MaxTime = 24
+#The maximum number of hours for an auction.
+
+#These must add up to 100 each one is the percentage
+#of the auction items that should be trade goods of
+#that quality. A value of 0 will disable.
+
+PercentGreyTradeGoods = 0
+PercentWhiteTradeGoods = 27
+PercentGreenTradeGoods = 12
+PercentBlueTradeGoods = 10
+PercentPurpleTradeGoods = 1
+PercentOrangeTradeGoods = 0
+PercentYellowTradeGoods = 0
+
+PercentGreyItems = 0
+PercentWhiteItems = 10
+PercentGreenItems = 30
+PercentBlueItems = 8
+PercentPurpleItems = 2
+PercentOrangeItems = 0
+PercentYellowItems = 0
+
+#MinPrice(Color) is the minimum price adjustment for items. For example the default is 150, which means 150%. So if an item vendors for 1g it would go to auction for a minimum of 1.5g.
+#MaxPrice(Color) is the maximum price adjustment for items.
+#MinBidPrice(Color) these two control the starting bid as a percent of the buyout price. For example, if MinBidPrice is 30 and MaxBidPrice is 80 the starting bid for the auction will randomly be between 30-80% of the randomly chosen buyout price.
+#MaxBidPrice(Color) these two control the starting bid as a percent of the buyout price. For example, if MinBidPrice is 30 and MaxBidPrice is 80 the starting bid for the auction will randomly be between 30-80% of the randomly chosen buyout price.
+#MaxStack(Color) is maximum stack size to create for this quality type. A value of zero will disable the maximum stack size for this quality allowing the bot to create stacks (of random size) of items as big as the item type allows.
+
+MinPriceGrey = 100
+MaxPriceGrey = 150
+MinBidPriceGrey = 70
+MaxBidPriceGrey = 100
+MaxStackGrey = 0
+MinPriceWhite = 150
+MaxPriceWhite = 250
+MinBidPriceWhite = 70
+MaxBidPriceWhite = 100
+MaxStackWhite = 0
+MinPriceGreen = 800
+MaxPriceGreen = 1400
+MinBidPriceGreen = 80
+MaxBidPriceGreen = 100
+MaxStackGreen = 3
+MinPriceBlue = 1250
+MaxPriceBlue = 1750
+MinBidPriceBlue = 75
+MaxBidPriceBlue = 100
+MaxStackBlue = 2
+MinPricePurple = 2250
+MaxPricePurple = 4550
+MinBidPricePurple = 80
+MaxBidPricePurple = 100
+MaxStackPurple = 1
+MinPriceOrange = 4250
+MaxPriceOrange = 5550
+MinBidPriceOrange = 80
+MaxBidPriceOrange = 100
+MaxStackOrange = 0
+MinPriceYellow = 5250
+MaxPriceYellow = 6550
+MinBidPriceYellow = 80
+MaxBidPriceYellow = 100
+MaxStackYellow = 0
+
+#These are the multipliers that are applied to the vendor price for an item, that determines if AHBot will buy it or not.
+#1 means AHBot will pay the same as (or less than) a vendor would pay, 2 means up to twice as much, etc.
+
+BuyerPriceGrey = 1
+BuyerPriceWhite = 1
+BuyerPriceGreen = 5
+BuyerPriceBlue = 12
+BuyerPricePurple = 15
+BuyerPriceOrange = 20
+BuyerPriceYellow = 22
+
+#BuyerBiddingInterval is the time (in minutes) between bids.
+#BuyerBidsPerInterval is the number of bids the buyer will make in a cycle
+
+BuyerBiddingInterval = 1
+BuyerBidsPerInterval = 1
+
+
+
+How to use ahcommands from the console (CLI) or in game with GM level 3 players:
+ahbotoptions - will display usage instructions
+ahbotoptions help - will display the list of commands
+
+ahexpire - will expire all the auctions in the requested auction house that were created by AHBot.
+minitems - will set the minimum number of items in the AH before it starts being filled again.
+maxitems - will set the maximum number of items in the AH.
+mintime - will set the minimum time (in hours) for auctions to expire.
+maxtime - will set the maximum time (in hours) for auctions to expire.
+percentages - will set the percentage of each quality in the AH
+minprice - will set the minimum price multiplier for auctions.
+maxprice - will set the maximum price multiplier for auctions.
+minbidprice - will set the minimum starting bid as a percent of the buyout price for auctions.
+maxbidprice - will set the maximum starting bid as a percent of the buyout price for auctions.
+maxstack - will set the maximum number of items in stacks for auctions. 0 will set the maximum to the maximum for that item type.
+buyerprice - will set the bid price multiplier for auctions.
+biddinginterval - will set the number of minutes between bids on auctions.
+bidsperinterval - will set the number of bids to enter per cycle.
+
+The auction house IDs are:
+2 - Alliance
+6 - Horde
+7 - Neutral
+
+AHBot Originally made by Chris K.
+Much thanks to Chris K, grether and Dolomit6!
+AHBot Now includes AHBuyer created by Kerbe as a derivative of AHBot, and later modified by Paradox
diff --git a/sql/characters_auctionhousebot.sql b/sql/characters_auctionhousebot.sql
new file mode 100644
index 0000000..9941816
--- /dev/null
+++ b/sql/characters_auctionhousebot.sql
@@ -0,0 +1,95 @@
+/*
+SQLyog Community Edition- MySQL GUI v6.03
+Host - 5.0.51b-community-nt : Database - characters2
+*********************************************************************
+Server version : 5.0.51b-community-nt
+*/
+
+/*!40101 SET NAMES utf8 */;
+
+/*!40101 SET SQL_MODE=''*/;
+
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+
+/*Table structure for table `auctionhousebot` */
+
+DROP TABLE IF EXISTS `auctionhousebot`;
+CREATE TABLE `auctionhousebot` (
+ `auctionhouse` int(11) NOT NULL default '0' COMMENT 'mapID of the auctionhouse.',
+ `name` char(25) default NULL COMMENT 'Text name of the auctionhouse.',
+ `minitems` int(11) default '0' COMMENT 'This is the minimum number of items you want to keep in the auction house. a 0 here will make it the same as the maximum.',
+ `maxitems` int(11) default '0' COMMENT 'This is the number of items you want to keep in the auction house.',
+ `mintime` int(11) default '8' COMMENT 'Sets the minimum number of hours for an auction.',
+ `maxtime` int(11) default '24' COMMENT 'Sets the maximum number of hours for an auction.',
+ `percentgreytradegoods` int(11) default '0' COMMENT 'Sets the percentage of the Grey Trade Goods auction items',
+ `percentwhitetradegoods` int(11) default '27' COMMENT 'Sets the percentage of the White Trade Goods auction items',
+ `percentgreentradegoods` int(11) default '12' COMMENT 'Sets the percentage of the Green Trade Goods auction items',
+ `percentbluetradegoods` int(11) default '10' COMMENT 'Sets the percentage of the Blue Trade Goods auction items',
+ `percentpurpletradegoods` int(11) default '1' COMMENT 'Sets the percentage of the Purple Trade Goods auction items',
+ `percentorangetradegoods` int(11) default '0' COMMENT 'Sets the percentage of the Orange Trade Goods auction items',
+ `percentyellowtradegoods` int(11) default '0' COMMENT 'Sets the percentage of the Yellow Trade Goods auction items',
+ `percentgreyitems` int(11) default '0' COMMENT 'Sets the percentage of the non trade Grey auction items',
+ `percentwhiteitems` int(11) default '10' COMMENT 'Sets the percentage of the non trade White auction items',
+ `percentgreenitems` int(11) default '30' COMMENT 'Sets the percentage of the non trade Green auction items',
+ `percentblueitems` int(11) default '8' COMMENT 'Sets the percentage of the non trade Blue auction items',
+ `percentpurpleitems` int(11) default '2' COMMENT 'Sets the percentage of the non trade Purple auction items',
+ `percentorangeitems` int(11) default '0' COMMENT 'Sets the percentage of the non trade Orange auction items',
+ `percentyellowitems` int(11) default '0' COMMENT 'Sets the percentage of the non trade Yellow auction items',
+ `minpricegrey` int(11) default '100' COMMENT 'Minimum price of Grey items (percentage).',
+ `maxpricegrey` int(11) default '150' COMMENT 'Maximum price of Grey items (percentage).',
+ `minpricewhite` int(11) default '150' COMMENT 'Minimum price of White items (percentage).',
+ `maxpricewhite` int(11) default '250' COMMENT 'Maximum price of White items (percentage).',
+ `minpricegreen` int(11) default '800' COMMENT 'Minimum price of Green items (percentage).',
+ `maxpricegreen` int(11) default '1400' COMMENT 'Maximum price of Green items (percentage).',
+ `minpriceblue` int(11) default '1250' COMMENT 'Minimum price of Blue items (percentage).',
+ `maxpriceblue` int(11) default '1750' COMMENT 'Maximum price of Blue items (percentage).',
+ `minpricepurple` int(11) default '2250' COMMENT 'Minimum price of Purple items (percentage).',
+ `maxpricepurple` int(11) default '4550' COMMENT 'Maximum price of Purple items (percentage).',
+ `minpriceorange` int(11) default '3250' COMMENT 'Minimum price of Orange items (percentage).',
+ `maxpriceorange` int(11) default '5550' COMMENT 'Maximum price of Orange items (percentage).',
+ `minpriceyellow` int(11) default '5250' COMMENT 'Minimum price of Yellow items (percentage).',
+ `maxpriceyellow` int(11) default '6550' COMMENT 'Maximum price of Yellow items (percentage).',
+ `minbidpricegrey` int(11) default '70' COMMENT 'Starting bid price of Grey items as a percentage of the randomly chosen buyout price. Default: 70',
+ `maxbidpricegrey` int(11) default '100' COMMENT 'Starting bid price of Grey items as a percentage of the randomly chosen buyout price. Default: 100',
+ `minbidpricewhite` int(11) default '70' COMMENT 'Starting bid price of White items as a percentage of the randomly chosen buyout price. Default: 70',
+ `maxbidpricewhite` int(11) default '100' COMMENT 'Starting bid price of White items as a percentage of the randomly chosen buyout price. Default: 100',
+ `minbidpricegreen` int(11) default '80' COMMENT 'Starting bid price of Green items as a percentage of the randomly chosen buyout price. Default: 80',
+ `maxbidpricegreen` int(11) default '100' COMMENT 'Starting bid price of Green items as a percentage of the randomly chosen buyout price. Default: 100',
+ `minbidpriceblue` int(11) default '75' COMMENT 'Starting bid price of Blue items as a percentage of the randomly chosen buyout price. Default: 75',
+ `maxbidpriceblue` int(11) default '100' COMMENT 'Starting bid price of Blue items as a percentage of the randomly chosen buyout price. Default: 100',
+ `minbidpricepurple` int(11) default '80' COMMENT 'Starting bid price of Purple items as a percentage of the randomly chosen buyout price. Default: 80',
+ `maxbidpricepurple` int(11) default '100' COMMENT 'Starting bid price of Purple items as a percentage of the randomly chosen buyout price. Default: 100',
+ `minbidpriceorange` int(11) default '80' COMMENT 'Starting bid price of Orange items as a percentage of the randomly chosen buyout price. Default: 80',
+ `maxbidpriceorange` int(11) default '100' COMMENT 'Starting bid price of Orange items as a percentage of the randomly chosen buyout price. Default: 100',
+ `minbidpriceyellow` int(11) default '80' COMMENT 'Starting bid price of Yellow items as a percentage of the randomly chosen buyout price. Default: 80',
+ `maxbidpriceyellow` int(11) default '100' COMMENT 'Starting bid price of Yellow items as a percentage of the randomly chosen buyout price. Default: 100',
+ `maxstackgrey` int(11) default '0' COMMENT '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.',
+ `maxstackwhite` int(11) default '0' COMMENT '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.',
+ `maxstackgreen` int(11) default '3' COMMENT '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.',
+ `maxstackblue` int(11) default '2' COMMENT '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.',
+ `maxstackpurple` int(11) default '1' COMMENT '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.',
+ `maxstackorange` int(11) default '1' COMMENT '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.',
+ `maxstackyellow` int(11) default '1' COMMENT '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.',
+ `buyerpricegrey` int(11) default '1' COMMENT 'Multiplier to vendorprice when buying grey items from auctionhouse',
+ `buyerpricewhite` int(11) default '1' COMMENT 'Multiplier to vendorprice when buying white items from auctionhouse',
+ `buyerpricegreen` int(11) default '5' COMMENT 'Multiplier to vendorprice when buying green items from auctionhouse',
+ `buyerpriceblue` int(11) default '12' COMMENT 'Multiplier to vendorprice when buying blue items from auctionhouse',
+ `buyerpricepurple` int(11) default '15' COMMENT 'Multiplier to vendorprice when buying purple items from auctionhouse',
+ `buyerpriceorange` int(11) default '20' COMMENT 'Multiplier to vendorprice when buying orange items from auctionhouse',
+ `buyerpriceyellow` int(11) default '22' COMMENT 'Multiplier to vendorprice when buying yellow items from auctionhouse',
+ `buyerbiddinginterval` int(11) default '1' COMMENT 'Interval how frequently AHB bids on each AH. Time in minutes',
+ `buyerbidsperinterval` int(11) default '1' COMMENT 'number of bids to put in per bidding interval',
+ PRIMARY KEY (`auctionhouse`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+/*Data for the table `auctionhousebot` */
+
+insert into `auctionhousebot`(`auctionhouse`,`name`,`minitems`,`maxitems`,`mintime`,`maxtime`,`percentgreytradegoods`,`percentwhitetradegoods`,`percentgreentradegoods`,`percentbluetradegoods`,`percentpurpletradegoods`,`percentorangetradegoods`,`percentyellowtradegoods`,`percentgreyitems`,`percentwhiteitems`,`percentgreenitems`,`percentblueitems`,`percentpurpleitems`,`percentorangeitems`,`percentyellowitems`,`minpricegrey`,`maxpricegrey`,`minpricewhite`,`maxpricewhite`,`minpricegreen`,`maxpricegreen`,`minpriceblue`,`maxpriceblue`,`minpricepurple`,`maxpricepurple`,`minpriceorange`,`maxpriceorange`,`minpriceyellow`,`maxpriceyellow`,`minbidpricegrey`,`maxbidpricegrey`,`minbidpricewhite`,`maxbidpricewhite`,`minbidpricegreen`,`maxbidpricegreen`,`minbidpriceblue`,`maxbidpriceblue`,`minbidpricepurple`,`maxbidpricepurple`,`minbidpriceorange`,`maxbidpriceorange`,`minbidpriceyellow`,`maxbidpriceyellow`,`maxstackgrey`,`maxstackwhite`,`maxstackgreen`,`maxstackblue`,`maxstackpurple`,`maxstackorange`,`maxstackyellow`,`buyerpricegrey`,`buyerpricewhite`,`buyerpricegreen`,`buyerpriceblue`,`buyerpricepurple`,`buyerpriceorange`,`buyerpriceyellow`,`buyerbiddinginterval`,`buyerbidsperinterval`) values
+(2,'Alliance',0,0,8,24,0,27,12,10,1,0,0,0,10,30,8,2,0,0,100,150,150,250,800,1400,1250,1750,2250,4550,3250,5550,5250,6550,70,100,70,100,80,100,75,100,80,100,80,100,80,100,0,0,3,2,1,1,1,1,1,5,12,15,20,22,1,1),
+(6,'Horde',0,0,8,24,0,27,12,10,1,0,0,0,10,30,8,2,0,0,100,150,150,250,800,1400,1250,1750,2250,4550,3250,5550,5250,6550,70,100,70,100,80,100,75,100,80,100,80,100,80,100,0,0,3,2,1,1,1,1,1,5,12,15,20,22,1,1),
+(7,'Neutral',0,0,8,24,0,27,12,10,1,0,0,0,10,30,8,2,0,0,100,150,150,250,800,1400,1250,1750,2250,4550,3250,5550,5250,6550,70,100,70,100,80,100,75,100,80,100,80,100,80,100,0,0,3,2,1,1,1,1,1,5,12,15,20,22,1,1);
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+
diff --git a/src/game/AuctionHouseBot.cpp b/src/game/AuctionHouseBot.cpp
new file mode 100644
index 0000000..dc15373
--- /dev/null
+++ b/src/game/AuctionHouseBot.cpp
@@ -0,0 +1,1487 @@
+#include "AuctionHouseBot.h"
+#include "ObjectMgr.h"
+#include "AuctionHouseMgr.h"
+
+#include "Policies/SingletonImp.h"
+
+INSTANTIATE_SINGLETON_1( AuctionHouseBot );
+
+using namespace std;
+
+AuctionHouseBot::AuctionHouseBot()
+{
+ AHBSeller = 0;
+ AHBBuyer = 0;
+
+ Vendor_Items = 0;
+ Loot_Items = 0;
+ Other_Items = 0;
+
+ No_Bind = 0;
+ Bind_When_Picked_Up = 0;
+ Bind_When_Equipped = 0;
+ Bind_When_Use = 0;
+ Bind_Quest_Item = 0;
+
+ AllianceConfig = AHBConfig(2);
+ HordeConfig = AHBConfig(6);
+ NeutralConfig = AHBConfig(7);
+}
+
+AuctionHouseBot::~AuctionHouseBot()
+{
+
+}
+
+void AuctionHouseBot::addNewAuctions(Player *AHBplayer, AHBConfig *config)
+{
+ if (!AHBSeller)
+ return;
+ AuctionHouseEntry const* ahEntry = sAuctionMgr.GetAuctionHouseEntry(config->GetAHFID());
+ AuctionHouseObject* auctionHouse = sAuctionMgr.GetAuctionsMap(config->GetAHFID());
+ uint32 items = 0;
+ uint32 minItems = config->GetMinItems();
+ uint32 maxItems = config->GetMaxItems();
+ uint32 auctions = auctionHouse->Getcount();
+ uint32 AuctioneerGUID = 0;
+ switch (config->GetAHID()){
+ case 2:
+ AuctioneerGUID = 79707; //Human in stormwind.
+ break;
+ case 6:
+ AuctioneerGUID = 4656; //orc in Orgrimmar
+ break;
+ case 7:
+ AuctioneerGUID = 23442; //goblin in GZ
+ break;
+ default:
+ sLog.outError("GetAHID() - Default switch reached");
+ AuctioneerGUID = 23442; //default to neutral 7
+ break;
+ }
+
+ if (auctions >= minItems)
+ return;
+
+ if (auctions <= maxItems)
+ {
+ if ((maxItems - auctions) > ItemsPerCycle)
+ items = ItemsPerCycle;
+ else
+ items = (maxItems - auctions);
+ }
+ uint32 greyTGcount = config->GetPercents(AHB_GREY_TG);
+ uint32 whiteTGcount = config->GetPercents(AHB_WHITE_TG);
+ uint32 greenTGcount = config->GetPercents(AHB_GREEN_TG);
+ uint32 blueTGcount = config->GetPercents(AHB_BLUE_TG);
+ uint32 purpleTGcount = config->GetPercents(AHB_PURPLE_TG);
+ uint32 orangeTGcount = config->GetPercents(AHB_ORANGE_TG);
+ uint32 yellowTGcount = config->GetPercents(AHB_YELLOW_TG);
+ uint32 greyIcount = config->GetPercents(AHB_GREY_I);
+ uint32 whiteIcount = config->GetPercents(AHB_WHITE_I);
+ uint32 greenIcount = config->GetPercents(AHB_GREEN_I);
+ uint32 blueIcount = config->GetPercents(AHB_BLUE_I);
+ uint32 purpleIcount = config->GetPercents(AHB_PURPLE_I);
+ uint32 orangeIcount = config->GetPercents(AHB_ORANGE_I);
+ uint32 yellowIcount = config->GetPercents(AHB_YELLOW_I);
+ uint32 total = greyTGcount + whiteTGcount + greenTGcount + blueTGcount
+ + purpleTGcount + orangeTGcount + yellowTGcount
+ + whiteIcount + greenIcount + blueIcount + purpleIcount
+ + orangeIcount + yellowIcount;
+
+ uint32 greyTGoods = 0;
+ uint32 whiteTGoods = 0;
+ uint32 greenTGoods = 0;
+ uint32 blueTGoods = 0;
+ uint32 purpleTGoods = 0;
+ uint32 orangeTGoods = 0;
+ uint32 yellowTGoods = 0;
+
+ uint32 greyItems = 0;
+ uint32 whiteItems = 0;
+ uint32 greenItems = 0;
+ uint32 blueItems = 0;
+ uint32 purpleItems = 0;
+ uint32 orangeItems = 0;
+ uint32 yellowItems = 0;
+
+ for (AuctionHouseObject::AuctionEntryMap::const_iterator itr = auctionHouse->GetAuctionsBegin();itr != auctionHouse->GetAuctionsEnd();++itr)
+ {
+ AuctionEntry *Aentry = itr->second;
+ Item *item = sAuctionMgr.GetAItem(Aentry->item_guidlow);
+ if (item)
+ {
+ ItemPrototype const *prototype = item->GetProto();
+ if (prototype)
+ {
+ switch (prototype->Quality)
+ {
+ case 0:
+ if (prototype->Class == ITEM_CLASS_TRADE_GOODS)
+ ++greyTGoods;
+ else
+ ++greyItems;
+ break;
+ case 1:
+ if (prototype->Class == ITEM_CLASS_TRADE_GOODS)
+ ++whiteTGoods;
+ else
+ ++whiteItems;
+ break;
+ case 2:
+ if (prototype->Class == ITEM_CLASS_TRADE_GOODS)
+ ++greenTGoods;
+ else
+ ++greenItems;
+ break;
+ case 3:
+ if (prototype->Class == ITEM_CLASS_TRADE_GOODS)
+ ++blueTGoods;
+ else
+ ++blueItems;
+ break;
+ case 4:
+ if (prototype->Class == ITEM_CLASS_TRADE_GOODS)
+ ++purpleTGoods;
+ else
+ ++purpleItems;
+ break;
+ case 5:
+ if (prototype->Class == ITEM_CLASS_TRADE_GOODS)
+ ++orangeTGoods;
+ else
+ ++orangeItems;
+ break;
+ case 6:
+ if (prototype->Class == ITEM_CLASS_TRADE_GOODS)
+ ++yellowTGoods;
+ else
+ ++yellowItems;
+ break;
+ }
+ }
+ }
+ }
+
+ // only insert a few at a time, so as not to peg the processor
+ for (uint32 cnt = 1;cnt <= items;cnt++)
+ {
+ uint32 itemID = 0;
+ uint32 loopBreaker = 0; // This will prevent endless looping condition where AHBot
+ while (itemID == 0 && loopBreaker < 50) // cannot allocate an item.
+ {
+ uint32 choice = urand(0, 13);
+ switch (choice)
+ {
+ case 0:
+ if ((greyItemsBin.size() > 0) && (greyItems < greyIcount))
+ {
+ itemID = greyItemsBin[urand(0, greyItemsBin.size() - 1)];
+ ++greyItems;
+ }
+ break;
+ case 1:
+ if ((whiteItemsBin.size() > 0) && (whiteItems < whiteIcount))
+ {
+ itemID = whiteItemsBin[urand(0, whiteItemsBin.size() - 1)];
+ ++whiteItems;
+ }
+ break;
+ case 2:
+ if ((greenItemsBin.size() > 0) && (greenItems < greenIcount))
+ {
+ itemID = greenItemsBin[urand(0, greenItemsBin.size() - 1)];
+ ++greenItems;
+ }
+ break;
+ case 3:
+ if ((blueItemsBin.size() > 0) && (blueItems < blueIcount))
+ {
+ itemID = blueItemsBin[urand(0, blueItemsBin.size() - 1)];
+ ++blueItems;
+ }
+ break;
+ case 4:
+ if ((purpleItemsBin.size() > 0) && (purpleItems < purpleIcount))
+ {
+ itemID = purpleItemsBin[urand(0, purpleItemsBin.size() - 1)];
+ ++purpleItems;
+ }
+ break;
+ case 5:
+ if ((orangeItemsBin.size() > 0) && (orangeItems < orangeIcount))
+ {
+ itemID = orangeItemsBin[urand(0, orangeItemsBin.size() - 1)];
+ ++orangeItems;
+ }
+ break;
+ case 6:
+ if ((yellowItemsBin.size() > 0) && (yellowItems < yellowIcount))
+ {
+ itemID = yellowItemsBin[urand(0, yellowItemsBin.size() - 1)];
+ ++yellowItems;
+ }
+ break;
+ case 7:
+ if ((greyTradeGoodsBin.size() > 0) && (greyTGoods < greyTGcount))
+ {
+ itemID = whiteTradeGoodsBin[urand(0, whiteTradeGoodsBin.size() - 1)];
+ ++greyTGoods;
+ }
+ break;
+ case 8:
+ if ((whiteTradeGoodsBin.size() > 0) && (whiteTGoods < whiteTGcount))
+ {
+ itemID = whiteTradeGoodsBin[urand(0, whiteTradeGoodsBin.size() - 1)];
+ ++whiteTGoods;
+ }
+ break;
+ case 9:
+ if ((greenTradeGoodsBin.size() > 0) && (greenTGoods < greenTGcount))
+ {
+ itemID = greenTradeGoodsBin[urand(0, greenTradeGoodsBin.size() - 1)];
+ ++greenTGoods;
+ }
+ break;
+ case 10:
+ if ((blueTradeGoodsBin.size() > 0) && (blueTGoods < blueTGcount))
+ {
+ itemID = blueTradeGoodsBin[urand(0, blueTradeGoodsBin.size() - 1)];
+ ++blueTGoods;
+ }
+ break;
+ case 11:
+ if ((purpleTradeGoodsBin.size() > 0) && (purpleTGoods < purpleTGcount))
+ {
+ itemID = purpleTradeGoodsBin[urand(0, purpleTradeGoodsBin.size() - 1)];
+ ++purpleTGoods;
+ }
+ break;
+ case 12:
+ if ((orangeTradeGoodsBin.size() > 0) && (orangeTGoods < orangeTGcount))
+ {
+ itemID = orangeTradeGoodsBin[urand(0, orangeTradeGoodsBin.size() - 1)];
+ ++orangeTGoods;
+ }
+ break;
+ case 13:
+ if ((yellowTradeGoodsBin.size() > 0) && (yellowTGoods < yellowTGcount))
+ {
+ itemID = yellowTradeGoodsBin[urand(0, yellowTradeGoodsBin.size() - 1)];
+ ++yellowTGoods;
+ }
+ break;
+ default:
+ sLog.outString("AuctionHouseBot: itemID Switch - Default Reached");
+ break;
+ }
+
+ ++loopBreaker;
+ }
+
+ if (itemID == 0)
+ {
+ if (debug_Out)
+ sLog.outString("AuctionHouseBot: Item::CreateItem() - Unable to find item");
+ continue;
+ }
+
+ ItemPrototype const* prototype = sObjectMgr.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;
+ uint32 bidPrice = 0;
+ uint32 stackCount = urand(1, item->GetMaxStackCount());
+
+ switch (SellMethod)
+ {
+ case 0:
+ buyoutPrice = prototype->SellPrice * item->GetCount();
+ break;
+ case 1:
+ buyoutPrice = prototype->BuyPrice * item->GetCount();
+ break;
+ }
+
+ switch (prototype->Quality)
+ {
+ case 0:
+ if (config->GetMaxStack(AHB_GREY) != 0)
+ {
+ stackCount = urand(1, minValue(item->GetMaxStackCount(), config->GetMaxStack(AHB_GREY)));
+ }
+ buyoutPrice *= urand(config->GetMinPrice(AHB_GREY), config->GetMaxPrice(AHB_GREY)) * stackCount;
+ buyoutPrice /= 100;
+ bidPrice = buyoutPrice * urand(config->GetMinBidPrice(AHB_GREY), config->GetMaxBidPrice(AHB_GREY));
+ bidPrice /= 100;
+ break;
+ case 1:
+ if (config->GetMaxStack(AHB_WHITE) != 0)
+ {
+ stackCount = urand(1, minValue(item->GetMaxStackCount(), config->GetMaxStack(AHB_WHITE)));
+ }
+ buyoutPrice *= urand(config->GetMinPrice(AHB_WHITE), config->GetMaxPrice(AHB_WHITE)) * stackCount;
+ buyoutPrice /= 100;
+ bidPrice = buyoutPrice * urand(config->GetMinBidPrice(AHB_WHITE), config->GetMaxBidPrice(AHB_WHITE));
+ bidPrice /= 100;
+ break;
+ case 2:
+ if (config->GetMaxStack(AHB_GREEN) != 0)
+ {
+ stackCount = urand(1, minValue(item->GetMaxStackCount(), config->GetMaxStack(AHB_GREEN)));
+ }
+ buyoutPrice *= urand(config->GetMinPrice(AHB_GREEN), config->GetMaxPrice(AHB_GREEN)) * stackCount;
+ buyoutPrice /= 100;
+ bidPrice = buyoutPrice * urand(config->GetMinBidPrice(AHB_GREEN), config->GetMaxBidPrice(AHB_GREEN));
+ bidPrice /= 100;
+ break;
+ case 3:
+ if (config->GetMaxStack(AHB_BLUE) != 0)
+ {
+ stackCount = urand(1, minValue(item->GetMaxStackCount(), config->GetMaxStack(AHB_BLUE)));
+ }
+ buyoutPrice *= urand(config->GetMinPrice(AHB_BLUE), config->GetMaxPrice(AHB_BLUE)) * stackCount;
+ buyoutPrice /= 100;
+ bidPrice = buyoutPrice * urand(config->GetMinBidPrice(AHB_BLUE), config->GetMaxBidPrice(AHB_BLUE));
+ bidPrice /= 100;
+ break;
+ case 4:
+ if (config->GetMaxStack(AHB_PURPLE) != 0)
+ {
+ stackCount = urand(1, minValue(item->GetMaxStackCount(), config->GetMaxStack(AHB_PURPLE)));
+ }
+ buyoutPrice *= urand(config->GetMinPrice(AHB_PURPLE), config->GetMaxPrice(AHB_PURPLE)) * stackCount;
+ buyoutPrice /= 100;
+ bidPrice = buyoutPrice * urand(config->GetMinBidPrice(AHB_PURPLE), config->GetMaxBidPrice(AHB_PURPLE));
+ bidPrice /= 100;
+ break;
+ case 5:
+ if (config->GetMaxStack(AHB_ORANGE) != 0)
+ {
+ stackCount = urand(1, minValue(item->GetMaxStackCount(), config->GetMaxStack(AHB_ORANGE)));
+ }
+ buyoutPrice *= urand(config->GetMinPrice(AHB_ORANGE), config->GetMaxPrice(AHB_ORANGE)) * stackCount;
+ buyoutPrice /= 100;
+ bidPrice = buyoutPrice * urand(config->GetMinBidPrice(AHB_ORANGE), config->GetMaxBidPrice(AHB_ORANGE));
+ bidPrice /= 100;
+ break;
+ case 6:
+ if (config->GetMaxStack(AHB_YELLOW) != 0)
+ {
+ stackCount = urand(1, minValue(item->GetMaxStackCount(), config->GetMaxStack(AHB_YELLOW)));
+ }
+ buyoutPrice *= urand(config->GetMinPrice(AHB_YELLOW), config->GetMaxPrice(AHB_YELLOW)) * stackCount;
+ buyoutPrice /= 100;
+ bidPrice = buyoutPrice * urand(config->GetMinBidPrice(AHB_YELLOW), config->GetMaxBidPrice(AHB_YELLOW));
+ bidPrice /= 100;
+ break;
+ }
+
+ item->SetCount(stackCount);
+
+ AuctionEntry* auctionEntry = new AuctionEntry;
+ auctionEntry->Id = sObjectMgr.GenerateAuctionID();
+ auctionEntry->auctioneer = AuctioneerGUID;
+ 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->expire_time = (time_t) (urand(config->GetMinTime(), config->GetMaxTime()) * 60 * 60 + time(NULL));
+ auctionEntry->auctionHouseEntry = ahEntry;
+ item->SaveToDB();
+ item->RemoveFromUpdateQueueOf(AHBplayer);
+ sAuctionMgr.AddAItem(item);
+ auctionHouse->AddAuction(auctionEntry);
+ auctionEntry->SaveToDB();
+ }
+}
+
+void AuctionHouseBot::addNewAuctionBuyerBotBid(Player *AHBplayer, AHBConfig *config, WorldSession *session)
+{
+ if (!AHBBuyer)
+ return;
+
+ // Fetches content of selected AH
+ AuctionHouseObject* auctionHouse = sAuctionMgr.GetAuctionsMap(config->GetAHFID());
+ vector<uint32> possibleBids;
+
+ for (AuctionHouseObject::AuctionEntryMap::const_iterator itr = auctionHouse->GetAuctionsBegin();itr != auctionHouse->GetAuctionsEnd();++itr)
+ {
+ // Check if the auction is ours
+ // if it is, we skip this iteration.
+ if (itr->second->owner == AHBplayerGUID)
+ {
+ continue;
+ }
+ // Check that we haven't bidded in this auction already.
+ if (itr->second->bidder != AHBplayerGUID)
+ {
+ uint32 tmpdata = itr->second->Id;
+ possibleBids.push_back(tmpdata);
+ }
+ }
+
+ for (uint32 count = 0;count < config->GetBidsPerInterval();++count)
+ {
+
+ // Do we have anything to bid? If not, stop here.
+ if (possibleBids.empty())
+ {
+ count = config->GetBidsPerInterval();
+ continue;
+ }
+
+ // Choose random auction from possible auctions
+ uint32 vectorPos = urand(0, possibleBids.size() - 1);
+ uint32 auctionID = possibleBids[vectorPos];
+
+ // Erase the auction from the vector to prevent bidding on item in next iteration.
+ vector<uint32>::iterator iter = possibleBids.begin();
+ advance(iter, vectorPos);
+ possibleBids.erase(iter);
+
+ // from auctionhousehandler.cpp, creates auction pointer & player pointer
+ AuctionEntry* auction = auctionHouse->GetAuction(auctionID);
+ if (!auction)
+ {
+ sLog.outError("Item doesn't exists, perhaps bought already?");
+ continue;
+ }
+
+ // get exact item information
+ Item *pItem = sAuctionMgr.GetAItem(auction->item_guidlow);
+ if (!pItem)
+ {
+ sLog.outError("Item doesn't exists, perhaps bought already?");
+ continue;
+ }
+
+ // get item prototype
+ ItemPrototype const* prototype = sObjectMgr.GetItemPrototype(auction->item_template);
+
+ // check which price we have to use, startbid or if it is bidded already
+ if (debug_Out)
+ {
+ sLog.outError("Auction Number: %u", auction->Id);
+ sLog.outError("Item Template: %u", auction->item_template);
+ sLog.outError("Buy Price: %u", prototype->BuyPrice);
+ sLog.outError("Sell Price: %u", prototype->SellPrice);
+ sLog.outError("Quality: %u", prototype->Quality);
+ }
+ uint32 currentprice;
+ if (auction->bid)
+ {
+ currentprice = auction->bid;
+ if (debug_Out)
+ {
+ sLog.outError("Current Price: %u", auction->bid);
+ }
+ }
+ else
+ {
+ currentprice = auction->startbid;
+ if (debug_Out)
+ {
+ sLog.outError("Current Price: %u", auction->startbid);
+ }
+ }
+ uint32 bidprice;
+
+ // Prepare portion from maximum bid
+ uint32 tmprate2 = urand(0, 100);
+ double tmprate = static_cast<double>(tmprate2);
+ if (debug_Out)
+ {
+ sLog.outError("tmprate: %f", tmprate);
+ }
+
+ double bidrate = tmprate / 100;
+ if (debug_Out)
+ {
+ sLog.outError("bidrate: %f", bidrate);
+ }
+
+ long double bidMax = 0;
+
+ // check that bid has acceptable value and take bid based on vendorprice, stacksize and quality
+ switch (BuyMethod)
+ {
+ case 0:
+ switch (prototype->Quality)
+ {
+ case 0:
+ if (currentprice < prototype->SellPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_GREY))
+ {
+ bidMax = prototype->SellPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_GREY);
+ }
+ break;
+ case 1:
+ if (currentprice < prototype->SellPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_WHITE))
+ {
+ bidMax = prototype->SellPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_WHITE);
+ }
+ break;
+ case 2:
+ if (currentprice < prototype->SellPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_GREEN))
+ {
+ bidMax = prototype->SellPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_GREEN);
+ }
+ break;
+ case 3:
+ if (currentprice < prototype->SellPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_BLUE))
+ {
+ bidMax = prototype->SellPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_BLUE);
+ }
+ break;
+ case 4:
+ if (currentprice < prototype->SellPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_PURPLE))
+ {
+ bidMax = prototype->SellPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_PURPLE);
+ }
+ break;
+ case 5:
+ if (currentprice < prototype->SellPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_ORANGE))
+ {
+ bidMax = prototype->SellPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_ORANGE);
+ }
+ break;
+ case 6:
+ if (currentprice < prototype->SellPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_YELLOW))
+ {
+ bidMax = prototype->SellPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_YELLOW);
+ }
+ break;
+ default:
+ // quality is something it shouldn't be, let's get out of here
+ if (debug_Out)
+ {
+ sLog.outError("bidMax(fail): %f", bidMax);
+ }
+ continue;
+ break;
+ }
+ break;
+ case 1:
+ switch (prototype->Quality)
+ {
+ case 0:
+ if (currentprice < prototype->BuyPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_GREY))
+ {
+ bidMax = prototype->BuyPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_GREY);
+ }
+ break;
+ case 1:
+ if (currentprice < prototype->BuyPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_WHITE))
+ {
+ bidMax = prototype->BuyPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_WHITE);
+ }
+ break;
+ case 2:
+ if (currentprice < prototype->BuyPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_GREEN))
+ {
+ bidMax = prototype->BuyPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_GREEN);
+ }
+ break;
+ case 3:
+ if (currentprice < prototype->BuyPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_BLUE))
+ {
+ bidMax = prototype->BuyPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_BLUE);
+ }
+ break;
+ case 4:
+ if (currentprice < prototype->BuyPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_PURPLE))
+ {
+ bidMax = prototype->BuyPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_PURPLE);
+ }
+ break;
+ case 5:
+ if (currentprice < prototype->BuyPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_ORANGE))
+ {
+ bidMax = prototype->BuyPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_ORANGE);
+ }
+ break;
+ case 6:
+ if (currentprice < prototype->BuyPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_YELLOW))
+ {
+ bidMax = prototype->BuyPrice * pItem->GetCount() * config->GetBuyerPrice(AHB_YELLOW);
+ }
+ break;
+ default:
+ // quality is something it shouldn't be, let's get out of here
+ if (debug_Out)
+ {
+ sLog.outError("bidMax(fail): %f", bidMax);
+ }
+ continue;
+ break;
+ }
+ break;
+ }
+
+ if (debug_Out)
+ {
+ sLog.outError("bidMax(succeed): %f", bidMax);
+ }
+
+ // check some special items, and do recalculating to their prices
+ switch (prototype->Class)
+ {
+ // ammo
+ case 6:
+ bidMax = 0;
+ break;
+ default:
+ break;
+ }
+
+ if (bidMax == 0)
+ {
+ // quality check failed to get bidmax, let's get out of here
+ continue;
+ }
+
+ // Calculate our bid
+ long double bidvalue = currentprice + ((bidMax - currentprice) * bidrate);
+ if (debug_Out)
+ {
+ sLog.outError("bidvalue: %f", bidvalue);
+ }
+
+ // Convert to uint32
+ bidprice = static_cast<uint32>(bidvalue);
+ if (debug_Out)
+ {
+ sLog.outError("bidprice: %u", bidprice);
+ }
+
+ // Check our bid is high enough to be valid. If not, correct it to minimum.
+ if ((currentprice + auction->GetAuctionOutBid()) > bidprice)
+ {
+ bidprice = currentprice + auction->GetAuctionOutBid();
+ if (debug_Out)
+ {
+ sLog.outError("bidprice(>): %u", bidprice);
+ }
+ }
+
+ // Check wether we do normal bid, or buyout
+ if ((bidprice < auction->buyout) || (auction->buyout == 0))
+ {
+
+ if (auction->bidder > 0)
+ {
+ if (auction->bidder == AHBplayer->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 = AHBplayer->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 (AHBplayer->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 = AHBplayer->GetGUIDLow();
+ auction->bid = auction->buyout;
+
+ // Send mails to buyer & seller
+ sAuctionMgr.SendAuctionSuccessfulMail(auction);
+ sAuctionMgr.SendAuctionWonMail(auction);
+
+ // Remove item from auctionhouse
+ sAuctionMgr.RemoveAItem(auction->item_guidlow);
+ // Remove auction
+ auctionHouse->RemoveAuction(auction->Id);
+ // Remove from database
+ auction->DeleteFromDB();
+ }
+ }
+}
+
+void AuctionHouseBot::Update()
+{
+ time_t _newrun = time(NULL);
+ if ((!AHBSeller) && (!AHBBuyer))
+ return;
+
+ WorldSession _session(AHBplayerAccount, NULL, SEC_PLAYER, true, 0, LOCALE_enUS);
+ Player _AHBplayer(&_session);
+ _AHBplayer.MinimalLoadFromDB(NULL, AHBplayerGUID);
+ ObjectAccessor::Instance().AddObject(&_AHBplayer);
+
+ // Add New Bids
+ if (!sWorld.getConfig(CONFIG_BOOL_ALLOW_TWO_SIDE_INTERACTION_AUCTION))
+ {
+ addNewAuctions(&_AHBplayer, &AllianceConfig);
+ if (((_newrun - _lastrun_a) > (AllianceConfig.GetBiddingInterval() * 60)) && (AllianceConfig.GetBidsPerInterval() > 0))
+ {
+ addNewAuctionBuyerBotBid(&_AHBplayer, &AllianceConfig, &_session);
+ _lastrun_a = _newrun;
+ }
+
+ addNewAuctions(&_AHBplayer, &HordeConfig);
+ if (((_newrun - _lastrun_h) > (HordeConfig.GetBiddingInterval() *60)) && (HordeConfig.GetBidsPerInterval() > 0))
+ {
+ addNewAuctionBuyerBotBid(&_AHBplayer, &HordeConfig, &_session);
+ _lastrun_h = _newrun;
+ }
+ }
+ addNewAuctions(&_AHBplayer, &NeutralConfig);
+ if (((_newrun - _lastrun_n) > (NeutralConfig.GetBiddingInterval() * 60)) && (NeutralConfig.GetBidsPerInterval() > 0))
+ {
+ addNewAuctionBuyerBotBid(&_AHBplayer, &NeutralConfig, &_session);
+ _lastrun_n = _newrun;
+ }
+
+ ObjectAccessor::Instance().RemoveObject(&_AHBplayer);
+}
+
+void AuctionHouseBot::Initialize()
+{
+ AHBSeller = sConfig.GetBoolDefault("AuctionHouseBot.EnableSeller", 0);
+ AHBBuyer = sConfig.GetBoolDefault("AuctionHouseBot.EnableBuyer", 0);
+ AHBplayerAccount = sConfig.GetIntDefault("AuctionHouseBot.Account", 0);
+ AHBplayerGUID = sConfig.GetIntDefault("AuctionHouseBot.GUID", 0);
+ debug_Out = sConfig.GetIntDefault("AuctionHouseBot.DEBUG", 0);
+ No_Bind = sConfig.GetBoolDefault("AuctionHouseBot.No_Bind", 1);
+ Bind_When_Picked_Up = sConfig.GetBoolDefault("AuctionHouseBot.Bind_When_Picked_Up", 0);
+ Bind_When_Equipped = sConfig.GetBoolDefault("AuctionHouseBot.Bind_When_Equipped", 1);
+ Bind_When_Use = sConfig.GetBoolDefault("AuctionHouseBot.Bind_When_Use", 1);
+ Bind_Quest_Item = sConfig.GetBoolDefault("AuctionHouseBot.Bind_Quest_Item", 0);
+ ItemsPerCycle = sConfig.GetIntDefault("AuctionHouseBot.ItemsPerCycle", 200);
+ SellMethod = sConfig.GetIntDefault("AuctionHouseBot.UseBuyPriceForSeller", 1);
+ BuyMethod = sConfig.GetIntDefault("AuctionHouseBot.UseBuyPriceForBuyer", 0);
+
+ if (!sWorld.getConfig(CONFIG_BOOL_ALLOW_TWO_SIDE_INTERACTION_AUCTION))
+ {
+ LoadValues(&AllianceConfig);
+ LoadValues(&HordeConfig);
+ }
+ LoadValues(&NeutralConfig);
+
+ if (AHBSeller)
+ {
+ Vendor_Items = sConfig.GetBoolDefault("AuctionHouseBot.VendorItems", 0);
+ Loot_Items = sConfig.GetBoolDefault("AuctionHouseBot.LootItems", 1);
+ Other_Items = sConfig.GetBoolDefault("AuctionHouseBot.OtherItems", 0);
+
+ QueryResult* results = (QueryResult*) NULL;
+ char npcQuery[] = "SELECT distinct `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);
+ }
+
+ 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 `milling_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);
+ }
+
+ for (uint32 itemID = 0; itemID < sItemStorage.MaxEntry; itemID++)
+ {
+ ItemPrototype const* prototype = sObjectMgr.GetItemPrototype(itemID);
+
+ if (prototype == NULL)
+ continue;
+
+ switch (prototype->Bonding)
+ {
+ case 0:
+ if (!No_Bind)
+ continue;
+ break;
+ case 1:
+ if (!Bind_When_Picked_Up)
+ continue;
+ break;
+ case 2:
+ if (!Bind_When_Equipped)
+ continue;
+ break;
+ case 3:
+ if (!Bind_When_Use)
+ continue;
+ break;
+ case 4:
+ if (!Bind_Quest_Item)
+ continue;
+ break;
+ default:
+ continue;
+ break;
+ }
+
+ switch (SellMethod)
+ {
+ case 0:
+ if (prototype->SellPrice == 0)
+ continue;
+ break;
+ case 1:
+ if (prototype->BuyPrice == 0)
+ continue;
+ break;
+ }
+
+ if ((prototype->Quality < 0) || (prototype->Quality > 6))
+ continue;
+
+ if (Vendor_Items == 0)
+ {
+ bool isVendorItem = false;
+
+ for (unsigned int i = 0; (i < npcItems.size()) && (!isVendorItem); i++)
+ {
+ if (itemID == npcItems[i])
+ isVendorItem = true;
+ }
+
+ if (isVendorItem)
+ continue;
+ }
+
+ if (Loot_Items == 0)
+ {
+ bool isLootItem = false;
+
+ for (unsigned int i = 0; (i < lootItems.size()) && (!isLootItem); i++)
+ {
+ if (itemID == lootItems[i])
+ isLootItem = true;
+ }
+
+ if (isLootItem)
+ continue;
+ }
+
+ if (Other_Items == 0)
+ {
+ bool isVendorItem = false;
+ bool isLootItem = false;
+
+ for (unsigned int i = 0; (i < npcItems.size()) && (!isVendorItem); i++)
+ {
+ if (itemID == npcItems[i])
+ isVendorItem = true;
+ }
+ for (unsigned int i = 0; (i < lootItems.size()) && (!isLootItem); i++)
+ {
+ if (itemID == lootItems[i])
+ isLootItem = true;
+ }
+ if ((!isLootItem) && (!isVendorItem))
+ continue;
+ }
+
+ switch (prototype->Quality)
+ {
+ case 0:
+ if (prototype->Class == ITEM_CLASS_TRADE_GOODS)
+ greyTradeGoodsBin.push_back(itemID);
+ else
+ greyItemsBin.push_back(itemID);
+ break;
+
+ case 1:
+ if (prototype->Class == ITEM_CLASS_TRADE_GOODS)
+ whiteTradeGoodsBin.push_back(itemID);
+ else
+ whiteItemsBin.push_back(itemID);
+ break;
+
+ case 2:
+ if (prototype->Class == ITEM_CLASS_TRADE_GOODS)
+ greenTradeGoodsBin.push_back(itemID);
+ else
+ greenItemsBin.push_back(itemID);
+ break;
+
+ case 3:
+ if (prototype->Class == ITEM_CLASS_TRADE_GOODS)
+ blueTradeGoodsBin.push_back(itemID);
+ else
+ blueItemsBin.push_back(itemID);
+ break;
+
+ case 4:
+ if (prototype->Class == ITEM_CLASS_TRADE_GOODS)
+ purpleTradeGoodsBin.push_back(itemID);
+ else
+ purpleItemsBin.push_back(itemID);
+ break;
+
+ case 5:
+ if (prototype->Class == ITEM_CLASS_TRADE_GOODS)
+ orangeTradeGoodsBin.push_back(itemID);
+ else
+ orangeItemsBin.push_back(itemID);
+ break;
+
+ case 6:
+ if (prototype->Class == ITEM_CLASS_TRADE_GOODS)
+ yellowTradeGoodsBin.push_back(itemID);
+ else
+ yellowItemsBin.push_back(itemID);
+ break;
+ }
+ }
+
+ if (
+ (greyTradeGoodsBin.size() == 0) &&
+ (whiteTradeGoodsBin.size() == 0) &&
+ (greenTradeGoodsBin.size() == 0) &&
+ (blueTradeGoodsBin.size() == 0) &&
+ (purpleTradeGoodsBin.size() == 0) &&
+ (orangeTradeGoodsBin.size() == 0) &&
+ (yellowTradeGoodsBin.size() == 0) &&
+ (greyItemsBin.size() == 0) &&
+ (whiteItemsBin.size() == 0) &&
+ (greenItemsBin.size() == 0) &&
+ (blueItemsBin.size() == 0) &&
+ (purpleItemsBin.size() == 0) &&
+ (orangeItemsBin.size() == 0) &&
+ (yellowItemsBin.size() == 0)
+ )
+ {
+ sLog.outString("AuctionHouseBot: No items");
+ AHBSeller = 0;
+ }
+
+ sLog.outString("AuctionHouseBot:");
+ sLog.outString("loaded %d grey trade goods", greyTradeGoodsBin.size());
+ sLog.outString("loaded %d white trade goods", whiteTradeGoodsBin.size());
+ sLog.outString("loaded %d green trade goods", greenTradeGoodsBin.size());
+ sLog.outString("loaded %d blue trade goods", blueTradeGoodsBin.size());
+ sLog.outString("loaded %d purple trade goods", purpleTradeGoodsBin.size());
+ sLog.outString("loaded %d orange trade goods", orangeTradeGoodsBin.size());
+ sLog.outString("loaded %d yellow trade goods", yellowTradeGoodsBin.size());
+ sLog.outString("loaded %d grey items", greyItemsBin.size());
+ sLog.outString("loaded %d white items", whiteItemsBin.size());
+ sLog.outString("loaded %d green items", greenItemsBin.size());
+ sLog.outString("loaded %d blue items", blueItemsBin.size());
+ sLog.outString("loaded %d purple items", purpleItemsBin.size());
+ sLog.outString("loaded %d orange items", orangeItemsBin.size());
+ sLog.outString("loaded %d yellow items", yellowItemsBin.size());
+ }
+ sLog.outString("AuctionHouseBot [AHBot-004-HotFix-07] is now loaded");
+ sLog.outString("AuctionHouseBot updated by Naicisum (original by ChrisK and Paradox)");
+ sLog.outString("AuctionHouseBot now includes AHBuyer by Kerbe and Paradox");
+}
+
+void AuctionHouseBot::Commands(uint32 command, uint32 ahMapID, uint32 col, char* args)
+{
+ AHBConfig *config;
+ switch (ahMapID)
+ {
+ case 2:
+ config = &AllianceConfig;
+ break;
+ case 6:
+ config = &HordeConfig;
+ break;
+ case 7:
+ config = &NeutralConfig;
+ break;
+ }
+ std::string color;
+ switch (col)
+ {
+ case AHB_GREY:
+ color = "grey";
+ break;
+ case AHB_WHITE:
+ color = "white";
+ break;
+ case AHB_GREEN:
+ color = "green";
+ break;
+ case AHB_BLUE:
+ color = "blue";
+ break;
+ case AHB_PURPLE:
+ color = "purple";
+ break;
+ case AHB_ORANGE:
+ color = "orange";
+ break;
+ case AHB_YELLOW:
+ color = "yellow";
+ break;
+ default:
+ break;
+ }
+ switch (command)
+ {
+ case 0: //ahexpire
+ {
+ AuctionHouseObject* auctionHouse = sAuctionMgr.GetAuctionsMap(config->GetAHFID());
+
+ AuctionHouseObject::AuctionEntryMap::iterator itr;
+ itr = auctionHouse->GetAuctionsBegin();
+
+ while (itr != auctionHouse->GetAuctionsEnd())
+ {
+ if (itr->second->owner == AHBplayerGUID)
+ itr->second->expire_time = sWorld.GetGameTime();
+
+ ++itr;
+ }
+ }break;
+ case 1: //min items
+ {
+ char * param1 = strtok(args, " ");
+ uint32 minItems = (uint32) strtoul(param1, NULL, 0);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET minitems = '%u' WHERE auctionhouse = '%u'", minItems, ahMapID);
+ config->SetMinItems(minItems);
+ }break;
+ case 2: //max items
+ {
+ char * param1 = strtok(args, " ");
+ uint32 maxItems = (uint32) strtoul(param1, NULL, 0);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET maxitems = '%u' WHERE auctionhouse = '%u'", maxItems, ahMapID);
+ config->SetMaxItems(maxItems);
+ }break;
+ case 3: //min time
+ {
+ char * param1 = strtok(args, " ");
+ uint32 minTime = (uint32) strtoul(param1, NULL, 0);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET mintime = '%u' WHERE auctionhouse = '%u'", minTime, ahMapID);
+ config->SetMinTime(minTime);
+ }break;
+ case 4: //max time
+ {
+ char * param1 = strtok(args, " ");
+ uint32 maxTime = (uint32) strtoul(param1, NULL, 0);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET maxtime = '%u' WHERE auctionhouse = '%u'", maxTime, ahMapID);
+ config->SetMaxTime(maxTime);
+ }break;
+ case 5: //percentages
+ {
+ char * param1 = strtok(args, " ");
+ char * param2 = strtok(NULL, " ");
+ char * param3 = strtok(NULL, " ");
+ char * param4 = strtok(NULL, " ");
+ char * param5 = strtok(NULL, " ");
+ char * param6 = strtok(NULL, " ");
+ char * param7 = strtok(NULL, " ");
+ char * param8 = strtok(NULL, " ");
+ char * param9 = strtok(NULL, " ");
+ char * param10 = strtok(NULL, " ");
+ char * param11 = strtok(NULL, " ");
+ char * param12 = strtok(NULL, " ");
+ char * param13 = strtok(NULL, " ");
+ char * param14 = strtok(NULL, " ");
+ uint32 greytg = (uint32) strtoul(param1, NULL, 0);
+ uint32 whitetg = (uint32) strtoul(param2, NULL, 0);
+ uint32 greentg = (uint32) strtoul(param3, NULL, 0);
+ uint32 bluetg = (uint32) strtoul(param4, NULL, 0);
+ uint32 purpletg = (uint32) strtoul(param5, NULL, 0);
+ uint32 orangetg = (uint32) strtoul(param6, NULL, 0);
+ uint32 yellowtg = (uint32) strtoul(param7, NULL, 0);
+ uint32 greyi = (uint32) strtoul(param8, NULL, 0);
+ uint32 whitei = (uint32) strtoul(param9, NULL, 0);
+ uint32 greeni = (uint32) strtoul(param10, NULL, 0);
+ uint32 bluei = (uint32) strtoul(param11, NULL, 0);
+ uint32 purplei = (uint32) strtoul(param12, NULL, 0);
+ uint32 orangei = (uint32) strtoul(param13, NULL, 0);
+ uint32 yellowi = (uint32) strtoul(param14, NULL, 0);
+
+ CharacterDatabase.BeginTransaction();
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET percentgreytradegoods = '%u' WHERE auctionhouse = '%u'", greytg, ahMapID);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET percentwhitetradegoods = '%u' WHERE auctionhouse = '%u'", whitetg, ahMapID);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET percentgreentradegoods = '%u' WHERE auctionhouse = '%u'", greentg, ahMapID);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET percentbluetradegoods = '%u' WHERE auctionhouse = '%u'", bluetg, ahMapID);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET percentpurpletradegoods = '%u' WHERE auctionhouse = '%u'", purpletg, ahMapID);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET percentorangetradegoods = '%u' WHERE auctionhouse = '%u'", orangetg, ahMapID);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET percentyellowtradegoods = '%u' WHERE auctionhouse = '%u'", yellowtg, ahMapID);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET percentgreyitems = '%u' WHERE auctionhouse = '%u'", greyi, ahMapID);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET percentwhiteitems = '%u' WHERE auctionhouse = '%u'", whitei, ahMapID);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET percentgreenitems = '%u' WHERE auctionhouse = '%u'", greeni, ahMapID);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET percentblueitems = '%u' WHERE auctionhouse = '%u'", bluei, ahMapID);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET percentpurpleitems = '%u' WHERE auctionhouse = '%u'", purplei, ahMapID);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET percentorangeitems = '%u' WHERE auctionhouse = '%u'", orangei, ahMapID);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET percentyellowitems = '%u' WHERE auctionhouse = '%u'", yellowi, ahMapID);
+ CharacterDatabase.CommitTransaction();
+ config->SetPercentages(greytg, whitetg, greentg, bluetg, purpletg, orangetg, yellowtg, greyi, whitei, greeni, bluei, purplei, orangei, yellowi);
+ }break;
+ case 6: //min prices
+ {
+ char * param1 = strtok(args, " ");
+ uint32 minPrice = (uint32) strtoul(param1, NULL, 0);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET minprice%s = '%u' WHERE auctionhouse = '%u'",color.c_str(), minPrice, ahMapID);
+ config->SetMinPrice(col, minPrice);
+ }break;
+ case 7: //max prices
+ {
+ char * param1 = strtok(args, " ");
+ uint32 maxPrice = (uint32) strtoul(param1, NULL, 0);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET maxprice%s = '%u' WHERE auctionhouse = '%u'",color.c_str(), maxPrice, ahMapID);
+ config->SetMaxPrice(col, maxPrice);
+ }break;
+ case 8: //min bid price
+ {
+ char * param1 = strtok(args, " ");
+ uint32 minBidPrice = (uint32) strtoul(param1, NULL, 0);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET minbidprice%s = '%u' WHERE auctionhouse = '%u'",color.c_str(), minBidPrice, ahMapID);
+ config->SetMinBidPrice(col, minBidPrice);
+ }break;
+ case 9: //max bid price
+ {
+ char * param1 = strtok(args, " ");
+ uint32 maxBidPrice = (uint32) strtoul(param1, NULL, 0);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET maxbidprice%s = '%u' WHERE auctionhouse = '%u'",color.c_str(), maxBidPrice, ahMapID);
+ config->SetMaxBidPrice(col, maxBidPrice);
+ }break;
+ case 10: //max stacks
+ {
+ char * param1 = strtok(args, " ");
+ uint32 maxStack = (uint32) strtoul(param1, NULL, 0);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET maxstack%s = '%u' WHERE auctionhouse = '%u'",color.c_str(), maxStack, ahMapID);
+ config->SetMaxStack(col, maxStack);
+ }break;
+ case 11: //buyer bid prices
+ {
+ char * param1 = strtok(args, " ");
+ uint32 buyerPrice = (uint32) strtoul(param1, NULL, 0);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET buyerprice%s = '%u' WHERE auctionhouse = '%u'",color.c_str(), buyerPrice, ahMapID);
+ config->SetBuyerPrice(col, buyerPrice);
+ }break;
+ case 12: //buyer bidding interval
+ {
+ char * param1 = strtok(args, " ");
+ uint32 bidInterval = (uint32) strtoul(param1, NULL, 0);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET buyerbiddinginterval = '%u' WHERE auctionhouse = '%u'", bidInterval, ahMapID);
+ config->SetBiddingInterval(bidInterval);
+ }break;
+ case 13: //buyer bids per interval
+ {
+ char * param1 = strtok(args, " ");
+ uint32 bidsPerInterval = (uint32) strtoul(param1, NULL, 0);
+ CharacterDatabase.PExecute("UPDATE auctionhousebot SET buyerbidsperinterval = '%u' WHERE auctionhouse = '%u'", bidsPerInterval, ahMapID);
+ config->SetBidsPerInterval(bidsPerInterval);
+ }break;
+ default:
+ break;
+ }
+}
+
+void AuctionHouseBot::LoadValues(AHBConfig *config)
+{
+ if (AHBSeller)
+ {
+ //load min and max items
+ config->SetMinItems(CharacterDatabase.PQuery("SELECT minitems FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ config->SetMaxItems(CharacterDatabase.PQuery("SELECT maxitems FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("minItems = %u", config->GetMinItems());
+ sLog.outError("maxItems = %u", config->GetMaxItems());
+ }
+ //load min and max auction times
+ config->SetMinTime(CharacterDatabase.PQuery("SELECT mintime FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ config->SetMaxTime(CharacterDatabase.PQuery("SELECT maxtime FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("minTime = %u", config->GetMinTime());
+ sLog.outError("maxTime = %u", config->GetMaxTime());
+ }
+ //load percentages
+ uint32 greytg = CharacterDatabase.PQuery("SELECT percentgreytradegoods FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32();
+ uint32 whitetg = CharacterDatabase.PQuery("SELECT percentwhitetradegoods FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32();
+ uint32 greentg = CharacterDatabase.PQuery("SELECT percentgreentradegoods FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32();
+ uint32 bluetg = CharacterDatabase.PQuery("SELECT percentbluetradegoods FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32();
+ uint32 purpletg = CharacterDatabase.PQuery("SELECT percentpurpletradegoods FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32();
+ uint32 orangetg = CharacterDatabase.PQuery("SELECT percentorangetradegoods FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32();
+ uint32 yellowtg = CharacterDatabase.PQuery("SELECT percentyellowtradegoods FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32();
+ uint32 greyi = CharacterDatabase.PQuery("SELECT percentgreyitems FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32();
+ uint32 whitei = CharacterDatabase.PQuery("SELECT percentwhiteitems FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32();
+ uint32 greeni = CharacterDatabase.PQuery("SELECT percentgreenitems FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32();
+ uint32 bluei = CharacterDatabase.PQuery("SELECT percentblueitems FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32();
+ uint32 purplei = CharacterDatabase.PQuery("SELECT percentpurpleitems FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32();
+ uint32 orangei = CharacterDatabase.PQuery("SELECT percentorangeitems FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32();
+ uint32 yellowi = CharacterDatabase.PQuery("SELECT percentyellowitems FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32();
+ config->SetPercentages(greytg, whitetg, greentg, bluetg, purpletg, orangetg, yellowtg, greyi, whitei, greeni, bluei, purplei, orangei, yellowi);
+ if (debug_Out)
+ {
+ sLog.outError("percentGreyTradeGoods = %u", config->GetPercentages(AHB_GREY_TG));
+ sLog.outError("percentWhiteTradeGoods = %u", config->GetPercentages(AHB_WHITE_TG));
+ sLog.outError("percentGreenTradeGoods = %u", config->GetPercentages(AHB_GREEN_TG));
+ sLog.outError("percentBlueTradeGoods = %u", config->GetPercentages(AHB_BLUE_TG));
+ sLog.outError("percentPurpleTradeGoods = %u", config->GetPercentages(AHB_PURPLE_TG));
+ sLog.outError("percentOrangeTradeGoods = %u", config->GetPercentages(AHB_ORANGE_TG));
+ sLog.outError("percentYellowTradeGoods = %u", config->GetPercentages(AHB_YELLOW_TG));
+ sLog.outError("percentGreyItems = %u", config->GetPercentages(AHB_GREY_I));
+ sLog.outError("percentWhiteItems = %u", config->GetPercentages(AHB_WHITE_I));
+ sLog.outError("percentGreenItems = %u", config->GetPercentages(AHB_GREEN_I));
+ sLog.outError("percentBlueItems = %u", config->GetPercentages(AHB_BLUE_I));
+ sLog.outError("percentPurpleItems = %u", config->GetPercentages(AHB_PURPLE_I));
+ sLog.outError("percentOrangeItems = %u", config->GetPercentages(AHB_ORANGE_I));
+ sLog.outError("percentYellowItems = %u", config->GetPercentages(AHB_YELLOW_I));
+ }
+ //load min and max prices
+ config->SetMinPrice(AHB_GREY, CharacterDatabase.PQuery("SELECT minpricegrey FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ config->SetMaxPrice(AHB_GREY, CharacterDatabase.PQuery("SELECT maxpricegrey FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("minPriceGrey = %u", config->GetMinPrice(AHB_GREY));
+ sLog.outError("maxPriceGrey = %u", config->GetMaxPrice(AHB_GREY));
+ }
+ config->SetMinPrice(AHB_WHITE, CharacterDatabase.PQuery("SELECT minpricewhite FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ config->SetMaxPrice(AHB_WHITE, CharacterDatabase.PQuery("SELECT maxpricewhite FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("minPriceWhite = %u", config->GetMinPrice(AHB_WHITE));
+ sLog.outError("maxPriceWhite = %u", config->GetMaxPrice(AHB_WHITE));
+ }
+ config->SetMinPrice(AHB_GREEN, CharacterDatabase.PQuery("SELECT minpricegreen FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ config->SetMaxPrice(AHB_GREEN, CharacterDatabase.PQuery("SELECT maxpricegreen FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("minPriceGreen = %u", config->GetMinPrice(AHB_GREEN));
+ sLog.outError("maxPriceGreen = %u", config->GetMaxPrice(AHB_GREEN));
+ }
+ config->SetMinPrice(AHB_BLUE, CharacterDatabase.PQuery("SELECT minpriceblue FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ config->SetMaxPrice(AHB_BLUE, CharacterDatabase.PQuery("SELECT maxpriceblue FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("minPriceBlue = %u", config->GetMinPrice(AHB_BLUE));
+ sLog.outError("maxPriceBlue = %u", config->GetMaxPrice(AHB_BLUE));
+ }
+ config->SetMinPrice(AHB_PURPLE, CharacterDatabase.PQuery("SELECT minpricepurple FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ config->SetMaxPrice(AHB_PURPLE, CharacterDatabase.PQuery("SELECT maxpricepurple FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("minPricePurple = %u", config->GetMinPrice(AHB_PURPLE));
+ sLog.outError("maxPricePurple = %u", config->GetMaxPrice(AHB_PURPLE));
+ }
+ config->SetMinPrice(AHB_ORANGE, CharacterDatabase.PQuery("SELECT minpriceorange FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ config->SetMaxPrice(AHB_ORANGE, CharacterDatabase.PQuery("SELECT maxpriceorange FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("minPriceOrange = %u", config->GetMinPrice(AHB_ORANGE));
+ sLog.outError("maxPriceOrange = %u", config->GetMaxPrice(AHB_ORANGE));
+ }
+ config->SetMinPrice(AHB_YELLOW, CharacterDatabase.PQuery("SELECT minpriceyellow FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ config->SetMaxPrice(AHB_YELLOW, CharacterDatabase.PQuery("SELECT maxpriceyellow FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("minPriceYellow = %u", config->GetMinPrice(AHB_YELLOW));
+ sLog.outError("maxPriceYellow = %u", config->GetMaxPrice(AHB_YELLOW));
+ }
+ //load min and max bid prices
+ config->SetMinBidPrice(AHB_GREY, CharacterDatabase.PQuery("SELECT minbidpricegrey FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("minBidPriceGrey = %u", config->GetMinBidPrice(AHB_GREY));
+ }
+ config->SetMaxBidPrice(AHB_GREY, CharacterDatabase.PQuery("SELECT maxbidpricegrey FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("maxBidPriceGrey = %u", config->GetMaxBidPrice(AHB_GREY));
+ }
+ config->SetMinBidPrice(AHB_WHITE, CharacterDatabase.PQuery("SELECT minbidpricewhite FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("minBidPriceWhite = %u", config->GetMinBidPrice(AHB_WHITE));
+ }
+ config->SetMaxBidPrice(AHB_WHITE, CharacterDatabase.PQuery("SELECT maxbidpricewhite FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("maxBidPriceWhite = %u", config->GetMaxBidPrice(AHB_WHITE));
+ }
+ config->SetMinBidPrice(AHB_GREEN, CharacterDatabase.PQuery("SELECT minbidpricegreen FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("minBidPriceGreen = %u", config->GetMinBidPrice(AHB_GREEN));
+ }
+ config->SetMaxBidPrice(AHB_GREEN, CharacterDatabase.PQuery("SELECT maxbidpricegreen FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("maxBidPriceGreen = %u", config->GetMaxBidPrice(AHB_GREEN));
+ }
+ config->SetMinBidPrice(AHB_BLUE, CharacterDatabase.PQuery("SELECT minbidpriceblue FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("minBidPriceBlue = %u", config->GetMinBidPrice(AHB_BLUE));
+ }
+ config->SetMaxBidPrice(AHB_BLUE, CharacterDatabase.PQuery("SELECT maxbidpriceblue FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("maxBidPriceBlue = %u", config->GetMinBidPrice(AHB_BLUE));
+ }
+ config->SetMinBidPrice(AHB_PURPLE, CharacterDatabase.PQuery("SELECT minbidpricepurple FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("minBidPricePurple = %u", config->GetMinBidPrice(AHB_PURPLE));
+ }
+ config->SetMaxBidPrice(AHB_PURPLE, CharacterDatabase.PQuery("SELECT maxbidpricepurple FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("maxBidPricePurple = %u", config->GetMaxBidPrice(AHB_PURPLE));
+ }
+ config->SetMinBidPrice(AHB_ORANGE, CharacterDatabase.PQuery("SELECT minbidpriceorange FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("minBidPriceOrange = %u", config->GetMinBidPrice(AHB_ORANGE));
+ }
+ config->SetMaxBidPrice(AHB_ORANGE, CharacterDatabase.PQuery("SELECT maxbidpriceorange FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("maxBidPriceOrange = %u", config->GetMaxBidPrice(AHB_ORANGE));
+ }
+ config->SetMinBidPrice(AHB_YELLOW, CharacterDatabase.PQuery("SELECT minbidpriceyellow FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("minBidPriceYellow = %u", config->GetMinBidPrice(AHB_YELLOW));
+ }
+ config->SetMaxBidPrice(AHB_YELLOW, CharacterDatabase.PQuery("SELECT maxbidpriceyellow FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {sLog.outError("maxBidPriceYellow = %u", config->GetMaxBidPrice(AHB_YELLOW));
+ }
+ //load max stacks
+ config->SetMaxStack(AHB_GREY, CharacterDatabase.PQuery("SELECT maxstackgrey FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("maxStackGrey = %u", config->GetMaxStack(AHB_GREY));
+ }
+ config->SetMaxStack(AHB_WHITE, CharacterDatabase.PQuery("SELECT maxstackwhite FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("maxStackWhite = %u", config->GetMaxStack(AHB_WHITE));
+ }
+ config->SetMaxStack(AHB_GREEN, CharacterDatabase.PQuery("SELECT maxstackgreen FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("maxStackGreen = %u", config->GetMaxStack(AHB_GREEN));
+ }
+ config->SetMaxStack(AHB_BLUE, CharacterDatabase.PQuery("SELECT maxstackblue FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("maxStackBlue = %u", config->GetMaxStack(AHB_BLUE));
+ }
+ config->SetMaxStack(AHB_PURPLE, CharacterDatabase.PQuery("SELECT maxstackpurple FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("maxStackPurple = %u", config->GetMaxStack(AHB_PURPLE));
+ }
+ config->SetMaxStack(AHB_ORANGE, CharacterDatabase.PQuery("SELECT maxstackorange FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("maxStackOrange = %u", config->GetMaxStack(AHB_ORANGE));
+ }
+ config->SetMaxStack(AHB_YELLOW, CharacterDatabase.PQuery("SELECT maxstackyellow FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("maxStackYellow = %u", config->GetMaxStack(AHB_YELLOW));
+ }
+ }
+ if (AHBBuyer)
+ {
+ //load buyer bid prices
+ config->SetBuyerPrice(AHB_GREY, CharacterDatabase.PQuery("SELECT buyerpricegrey FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ config->SetBuyerPrice(AHB_WHITE, CharacterDatabase.PQuery("SELECT buyerpricewhite FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ config->SetBuyerPrice(AHB_GREEN, CharacterDatabase.PQuery("SELECT buyerpricegreen FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ config->SetBuyerPrice(AHB_BLUE, CharacterDatabase.PQuery("SELECT buyerpriceblue FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ config->SetBuyerPrice(AHB_PURPLE, CharacterDatabase.PQuery("SELECT buyerpricepurple FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ config->SetBuyerPrice(AHB_ORANGE, CharacterDatabase.PQuery("SELECT buyerpriceorange FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ config->SetBuyerPrice(AHB_YELLOW, CharacterDatabase.PQuery("SELECT buyerpriceyellow FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("buyerPriceGrey = %u", config->GetBuyerPrice(AHB_GREY));
+ sLog.outError("buyerPriceWhite = %u", config->GetBuyerPrice(AHB_WHITE));
+ sLog.outError("buyerPriceGreen = %u", config->GetBuyerPrice(AHB_GREEN));
+ sLog.outError("buyerPriceBlue = %u", config->GetBuyerPrice(AHB_BLUE));
+ sLog.outError("buyerPricePurple = %u", config->GetBuyerPrice(AHB_PURPLE));
+ sLog.outError("buyerPriceOrange = %u", config->GetBuyerPrice(AHB_ORANGE));
+ sLog.outError("buyerPriceYellow = %u", config->GetBuyerPrice(AHB_YELLOW));
+ }
+ //load bidding interval
+ config->SetBiddingInterval(CharacterDatabase.PQuery("SELECT buyerbiddinginterval FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("buyerBiddingInterval = %u", config->GetBiddingInterval());
+ }
+ //load bids per interval
+ config->SetBidsPerInterval(CharacterDatabase.PQuery("SELECT buyerbidsperinterval FROM auctionhousebot WHERE auctionhouse = %u",config->GetAHID())->Fetch()->GetUInt32());
+ if (debug_Out)
+ {
+ sLog.outError("buyerBidsPerInterval = %u", config->GetBidsPerInterval());
+ }
+ }
+}
diff --git a/src/game/AuctionHouseBot.h b/src/game/AuctionHouseBot.h
new file mode 100644
index 0000000..b5810fa
--- /dev/null
+++ b/src/game/AuctionHouseBot.h
@@ -0,0 +1,979 @@
+#ifndef AUCTION_HOUSE_BOT_H
+#define AUCTION_HOUSE_BOT_H
+
+#include "World.h"
+#include "Config/ConfigEnv.h"
+#include "ace/Vector_T.h"
+
+#define AHB_GREY 0
+#define AHB_WHITE 1
+#define AHB_GREEN 2
+#define AHB_BLUE 3
+#define AHB_PURPLE 4
+#define AHB_ORANGE 5
+#define AHB_YELLOW 6
+#define AHB_GREY_TG 0
+#define AHB_WHITE_TG 1
+#define AHB_GREEN_TG 2
+#define AHB_BLUE_TG 3
+#define AHB_PURPLE_TG 4
+#define AHB_ORANGE_TG 5
+#define AHB_YELLOW_TG 6
+#define AHB_GREY_I 7
+#define AHB_WHITE_I 8
+#define AHB_GREEN_I 9
+#define AHB_BLUE_I 10
+#define AHB_PURPLE_I 11
+#define AHB_ORANGE_I 12
+#define AHB_YELLOW_I 13
+
+class AHBConfig
+{
+private:
+ uint32 AHID;
+ uint32 AHFID;
+ uint32 minItems;
+ uint32 maxItems;
+ uint32 minTime;
+ uint32 maxTime;
+ uint32 percentGreyTradeGoods;
+ uint32 percentWhiteTradeGoods;
+ uint32 percentGreenTradeGoods;
+ uint32 percentBlueTradeGoods;
+ uint32 percentPurpleTradeGoods;
+ uint32 percentOrangeTradeGoods;
+ uint32 percentYellowTradeGoods;
+ uint32 percentGreyItems;
+ uint32 percentWhiteItems;
+ uint32 percentGreenItems;
+ uint32 percentBlueItems;
+ uint32 percentPurpleItems;
+ uint32 percentOrangeItems;
+ uint32 percentYellowItems;
+ uint32 minPriceGrey;
+ uint32 maxPriceGrey;
+ uint32 minBidPriceGrey;
+ uint32 maxBidPriceGrey;
+ uint32 maxStackGrey;
+ uint32 minPriceWhite;
+ uint32 maxPriceWhite;
+ uint32 minBidPriceWhite;
+ uint32 maxBidPriceWhite;
+ uint32 maxStackWhite;
+ uint32 minPriceGreen;
+ uint32 maxPriceGreen;
+ uint32 minBidPriceGreen;
+ uint32 maxBidPriceGreen;
+ uint32 maxStackGreen;
+ uint32 minPriceBlue;
+ uint32 maxPriceBlue;
+ uint32 minBidPriceBlue;
+ uint32 maxBidPriceBlue;
+ uint32 maxStackBlue;
+ uint32 minPricePurple;
+ uint32 maxPricePurple;
+ uint32 minBidPricePurple;
+ uint32 maxBidPricePurple;
+ uint32 maxStackPurple;
+ uint32 minPriceOrange;
+ uint32 maxPriceOrange;
+ uint32 minBidPriceOrange;
+ uint32 maxBidPriceOrange;
+ uint32 maxStackOrange;
+ uint32 minPriceYellow;
+ uint32 maxPriceYellow;
+ uint32 minBidPriceYellow;
+ uint32 maxBidPriceYellow;
+ uint32 maxStackYellow;
+
+ uint32 buyerPriceGrey;
+ uint32 buyerPriceWhite;
+ uint32 buyerPriceGreen;
+ uint32 buyerPriceBlue;
+ uint32 buyerPricePurple;
+ uint32 buyerPriceOrange;
+ uint32 buyerPriceYellow;
+ uint32 buyerBiddingInterval;
+ uint32 buyerBidsPerInterval;
+
+ uint32 greytgp;
+ uint32 whitetgp;
+ uint32 greentgp;
+ uint32 bluetgp;
+ uint32 purpletgp;
+ uint32 orangetgp;
+ uint32 yellowtgp;
+ uint32 greyip;
+ uint32 whiteip;
+ uint32 greenip;
+ uint32 blueip;
+ uint32 purpleip;
+ uint32 orangeip;
+ uint32 yellowip;
+
+public:
+ AHBConfig(uint32 ahid)
+ {
+ AHID = ahid;
+ switch(ahid)
+ {
+ case 2:
+ AHFID = 55;
+ break;
+ case 6:
+ AHFID = 29;
+ break;
+ case 7:
+ AHFID = 120;
+ break;
+ default:
+ AHFID = 120;
+ break;
+ }
+ }
+ AHBConfig()
+ {
+ }
+ uint32 GetAHID()
+ {
+ return AHID;
+ }
+ uint32 GetAHFID()
+ {
+ return AHFID;
+ }
+ void SetMinItems(uint32 value)
+ {
+ minItems = value;
+ }
+ uint32 GetMinItems()
+ {
+ if ((minItems == 0) && (maxItems))
+ return maxItems;
+ else if ((maxItems) && (minItems > maxItems))
+ return maxItems;
+ else
+ return minItems;
+ }
+ void SetMaxItems(uint32 value)
+ {
+ maxItems = value;
+ CalculatePercents();
+ }
+ uint32 GetMaxItems()
+ {
+ return maxItems;
+ }
+ void SetMinTime(uint32 value)
+ {
+ minTime = value;
+ }
+ uint32 GetMinTime()
+ {
+ if (minTime < 1)
+ return 1;
+ else if ((maxTime) && (minTime > maxTime))
+ return maxTime;
+ else
+ return minTime;
+ }
+ void SetMaxTime(uint32 value)
+ {
+ maxTime = value;
+ }
+ uint32 GetMaxTime()
+ {
+ return maxTime;
+ }
+ void SetPercentages(uint32 greytg, uint32 whitetg, uint32 greentg, uint32 bluetg, uint32 purpletg, uint32 orangetg, uint32 yellowtg, uint32 greyi, uint32 whitei, uint32 greeni, uint32 bluei, uint32 purplei, uint32 orangei, uint32 yellowi)
+ {
+ uint32 totalPercent = greytg + whitetg + greentg + bluetg + purpletg + orangetg + yellowtg + greyi + whitei + greeni + bluei + purplei + orangei + yellowi;
+
+ if (totalPercent == 0)
+ {
+ maxItems = 0;
+ }
+ else if (totalPercent != 100)
+ {
+ greytg = 0;
+ whitetg = 27;
+ greentg = 12;
+ bluetg = 10;
+ purpletg = 1;
+ orangetg = 0;
+ yellowtg = 0;
+ greyi = 0;
+ whitei = 10;
+ greeni = 30;
+ bluei = 8;
+ purplei = 2;
+ orangei = 0;
+ yellowi = 0;
+ }
+ percentGreyTradeGoods = greytg;
+ percentWhiteTradeGoods = whitetg;
+ percentGreenTradeGoods = greentg;
+ percentBlueTradeGoods = bluetg;
+ percentPurpleTradeGoods = purpletg;
+ percentOrangeTradeGoods = orangetg;
+ percentYellowTradeGoods = yellowtg;
+ percentGreyItems = greyi;
+ percentWhiteItems = whitei;
+ percentGreenItems = greeni;
+ percentBlueItems = bluei;
+ percentPurpleItems = purplei;
+ percentOrangeItems = orangei;
+ percentYellowItems = yellowi;
+ CalculatePercents();
+ }
+ uint32 GetPercentages(uint32 color)
+ {
+ switch(color)
+ {
+ case AHB_GREY_TG:
+ return percentGreyTradeGoods;
+ break;
+ case AHB_WHITE_TG:
+ return percentWhiteTradeGoods;
+ break;
+ case AHB_GREEN_TG:
+ return percentGreenTradeGoods;
+ break;
+ case AHB_BLUE_TG:
+ return percentBlueTradeGoods;
+ break;
+ case AHB_PURPLE_TG:
+ return percentPurpleTradeGoods;
+ break;
+ case AHB_ORANGE_TG:
+ return percentOrangeTradeGoods;
+ break;
+ case AHB_YELLOW_TG:
+ return percentYellowTradeGoods;
+ break;
+ case AHB_GREY_I:
+ return percentGreyItems;
+ break;
+ case AHB_WHITE_I:
+ return percentWhiteItems;
+ break;
+ case AHB_GREEN_I:
+ return percentGreenItems;
+ break;
+ case AHB_BLUE_I:
+ return percentBlueItems;
+ break;
+ case AHB_PURPLE_I:
+ return percentPurpleItems;
+ break;
+ case AHB_ORANGE_I:
+ return percentOrangeItems;
+ break;
+ case AHB_YELLOW_I:
+ return percentYellowItems;
+ break;
+ default:
+ return 0;
+ break;
+ }
+ }
+ void SetMinPrice(uint32 color, uint32 value)
+ {
+ switch(color)
+ {
+ case AHB_GREY:
+ minPriceGrey = value;
+ break;
+ case AHB_WHITE:
+ minPriceWhite = value;
+ break;
+ case AHB_GREEN:
+ minPriceGreen = value;
+ break;
+ case AHB_BLUE:
+ minPriceBlue = value;
+ break;
+ case AHB_PURPLE:
+ minPricePurple = value;
+ break;
+ case AHB_ORANGE:
+ minPriceOrange = value;
+ break;
+ case AHB_YELLOW:
+ minPriceYellow = value;
+ break;
+ default:
+ break;
+ }
+ }
+ uint32 GetMinPrice(uint32 color)
+ {
+ switch(color)
+ {
+ case AHB_GREY:
+ {
+ if (minPriceGrey == 0)
+ return 100;
+ else if (minPriceGrey > maxPriceGrey)
+ return maxPriceGrey;
+ else
+ return minPriceGrey;
+ break;
+ }
+ case AHB_WHITE:
+ {
+ if (minPriceWhite == 0)
+ return 150;
+ else if (minPriceWhite > maxPriceWhite)
+ return maxPriceWhite;
+ else
+ return minPriceWhite;
+ break;
+ }
+ case AHB_GREEN:
+ {
+ if (minPriceGreen == 0)
+ return 200;
+ else if (minPriceGreen > maxPriceGreen)
+ return maxPriceGreen;
+ else
+ return minPriceGreen;
+ break;
+ }
+ case AHB_BLUE:
+ {
+ if (minPriceBlue == 0)
+ return 250;
+ else if (minPriceBlue > maxPriceBlue)
+ return maxPriceBlue;
+ else
+ return minPriceBlue;
+ break;
+ }
+ case AHB_PURPLE:
+ {
+ if (minPricePurple == 0)
+ return 300;
+ else if (minPricePurple > maxPricePurple)
+ return maxPricePurple;
+ else
+ return minPricePurple;
+ break;
+ }
+ case AHB_ORANGE:
+ {
+ if (minPriceOrange == 0)
+ return 400;
+ else if (minPriceOrange > maxPriceOrange)
+ return maxPriceOrange;
+ else
+ return minPriceOrange;
+ break;
+ }
+ case AHB_YELLOW:
+ {
+ if (minPriceYellow == 0)
+ return 500;
+ else if (minPriceYellow > maxPriceYellow)
+ return maxPriceYellow;
+ else
+ return minPriceYellow;
+ break;
+ }
+ default:
+ {
+ return 0;
+ break;
+ }
+ }
+ }
+ void SetMaxPrice(uint32 color, uint32 value)
+ {
+ switch(color)
+ {
+ case AHB_GREY:
+ maxPriceGrey = value;
+ break;
+ case AHB_WHITE:
+ maxPriceWhite = value;
+ break;
+ case AHB_GREEN:
+ maxPriceGreen = value;
+ break;
+ case AHB_BLUE:
+ maxPriceBlue = value;
+ break;
+ case AHB_PURPLE:
+ maxPricePurple = value;
+ break;
+ case AHB_ORANGE:
+ maxPriceOrange = value;
+ break;
+ case AHB_YELLOW:
+ maxPriceYellow = value;
+ break;
+ default:
+ break;
+ }
+ }
+ uint32 GetMaxPrice(uint32 color)
+ {
+ switch(color)
+ {
+ case AHB_GREY:
+ {
+ if (maxPriceGrey == 0)
+ return 150;
+ else
+ return maxPriceGrey;
+ break;
+ }
+ case AHB_WHITE:
+ {
+ if (maxPriceWhite == 0)
+ return 250;
+ else
+ return maxPriceWhite;
+ break;
+ }
+ case AHB_GREEN:
+ {
+ if (maxPriceGreen == 0)
+ return 300;
+ else
+ return maxPriceGreen;
+ break;
+ }
+ case AHB_BLUE:
+ {
+ if (maxPriceBlue == 0)
+ return 350;
+ else
+ return maxPriceBlue;
+ break;
+ }
+ case AHB_PURPLE:
+ {
+ if (maxPricePurple == 0)
+ return 450;
+ else
+ return maxPricePurple;
+ break;
+ }
+ case AHB_ORANGE:
+ {
+ if (maxPriceOrange == 0)
+ return 550;
+ else
+ return maxPriceOrange;
+ break;
+ }
+ case AHB_YELLOW:
+ {
+ if (maxPriceYellow == 0)
+ return 650;
+ else
+ return maxPriceYellow;
+ break;
+ }
+ default:
+ {
+ return 0;
+ break;
+ }
+ }
+ }
+ void SetMinBidPrice(uint32 color, uint32 value)
+ {
+ switch(color)
+ {
+ case AHB_GREY:
+ minBidPriceGrey = value;
+ break;
+ case AHB_WHITE:
+ minBidPriceWhite = value;
+ break;
+ case AHB_GREEN:
+ minBidPriceGreen = value;
+ break;
+ case AHB_BLUE:
+ minBidPriceBlue = value;
+ break;
+ case AHB_PURPLE:
+ minBidPricePurple = value;
+ break;
+ case AHB_ORANGE:
+ minBidPriceOrange = value;
+ break;
+ case AHB_YELLOW:
+ minBidPriceYellow = value;
+ break;
+ default:
+ break;
+ }
+ }
+ uint32 GetMinBidPrice(uint32 color)
+ {
+ switch(color)
+ {
+ case AHB_GREY:
+ {
+ if (minBidPriceGrey > 100)
+ return 100;
+ else
+ return minBidPriceGrey;
+ break;
+ }
+ case AHB_WHITE:
+ {
+ if (minBidPriceWhite > 100)
+ return 100;
+ else
+ return minBidPriceWhite;
+ break;
+ }
+ case AHB_GREEN:
+ {
+ if (minBidPriceGreen > 100)
+ return 100;
+ else
+ return minBidPriceGreen;
+ break;
+ }
+ case AHB_BLUE:
+ {
+ if (minBidPriceBlue > 100)
+ return 100;
+ else
+ return minBidPriceBlue;
+ break;
+ }
+ case AHB_PURPLE:
+ {
+ if (minBidPricePurple > 100)
+ return 100;
+ else
+ return minBidPricePurple;
+ break;
+ }
+ case AHB_ORANGE:
+ {
+ if (minBidPriceOrange > 100)
+ return 100;
+ else
+ return minBidPriceOrange;
+ break;
+ }
+ case AHB_YELLOW:
+ {
+ if (minBidPriceYellow > 100)
+ return 100;
+ else
+ return minBidPriceYellow;
+ break;
+ }
+ default:
+ {
+ return 0;
+ break;
+ }
+ }
+ }
+ void SetMaxBidPrice(uint32 color, uint32 value)
+ {
+ switch(color)
+ {
+ case AHB_GREY:
+ maxBidPriceGrey = value;
+ break;
+ case AHB_WHITE:
+ maxBidPriceWhite = value;
+ break;
+ case AHB_GREEN:
+ maxBidPriceGreen = value;
+ break;
+ case AHB_BLUE:
+ maxBidPriceBlue = value;
+ break;
+ case AHB_PURPLE:
+ maxBidPricePurple = value;
+ break;
+ case AHB_ORANGE:
+ maxBidPriceOrange = value;
+ break;
+ case AHB_YELLOW:
+ maxBidPriceYellow = value;
+ break;
+ default:
+ break;
+ }
+ }
+ uint32 GetMaxBidPrice(uint32 color)
+ {
+ switch(color)
+ {
+ case AHB_GREY:
+ {
+ if (maxBidPriceGrey > 100)
+ return 100;
+ else
+ return maxBidPriceGrey;
+ break;
+ }
+ case AHB_WHITE:
+ {
+ if (maxBidPriceWhite > 100)
+ return 100;
+ else
+ return maxBidPriceWhite;
+ break;
+ }
+ case AHB_GREEN:
+ {
+ if (maxBidPriceGreen > 100)
+ return 100;
+ else
+ return maxBidPriceGreen;
+ break;
+ }
+ case AHB_BLUE:
+ {
+ if (maxBidPriceBlue > 100)
+ return 100;
+ else
+ return maxBidPriceBlue;
+ break;
+ }
+ case AHB_PURPLE:
+ {
+ if (maxBidPricePurple > 100)
+ return 100;
+ else
+ return maxBidPricePurple;
+ break;
+ }
+ case AHB_ORANGE:
+ {
+ if (maxBidPriceOrange > 100)
+ return 100;
+ else
+ return maxBidPriceOrange;
+ break;
+ }
+ case AHB_YELLOW:
+ {
+ if (maxBidPriceYellow > 100)
+ return 100;
+ else
+ return maxBidPriceYellow;
+ break;
+ }
+ default:
+ {
+ return 0;
+ break;
+ }
+ }
+ }
+ void SetMaxStack(uint32 color, uint32 value)
+ {
+ switch(color)
+ {
+ case AHB_GREY:
+ maxStackGrey = value;
+ break;
+ case AHB_WHITE:
+ maxStackWhite = value;
+ break;
+ case AHB_GREEN:
+ maxStackGreen = value;
+ break;
+ case AHB_BLUE:
+ maxStackBlue = value;
+ break;
+ case AHB_PURPLE:
+ maxStackPurple = value;
+ break;
+ case AHB_ORANGE:
+ maxStackOrange = value;
+ break;
+ case AHB_YELLOW:
+ maxStackYellow = value;
+ break;
+ default:
+ break;
+ }
+ }
+ uint32 GetMaxStack(uint32 color)
+ {
+ switch(color)
+ {
+ case AHB_GREY:
+ {
+ return maxStackGrey;
+ break;
+ }
+ case AHB_WHITE:
+ {
+ return maxStackWhite;
+ break;
+ }
+ case AHB_GREEN:
+ {
+ return maxStackGreen;
+ break;
+ }
+ case AHB_BLUE:
+ {
+ return maxStackBlue;
+ break;
+ }
+ case AHB_PURPLE:
+ {
+ return maxStackPurple;
+ break;
+ }
+ case AHB_ORANGE:
+ {
+ return maxStackOrange;
+ break;
+ }
+ case AHB_YELLOW:
+ {
+ return maxStackYellow;
+ break;
+ }
+ default:
+ {
+ return 0;
+ break;
+ }
+ }
+ }
+ void SetBuyerPrice(uint32 color, uint32 value)
+ {
+ switch(color)
+ {
+ case AHB_GREY:
+ buyerPriceGrey = value;
+ break;
+ case AHB_WHITE:
+ buyerPriceWhite = value;
+ break;
+ case AHB_GREEN:
+ buyerPriceGreen = value;
+ break;
+ case AHB_BLUE:
+ buyerPriceBlue = value;
+ break;
+ case AHB_PURPLE:
+ buyerPricePurple = value;
+ break;
+ case AHB_ORANGE:
+ buyerPriceOrange = value;
+ break;
+ case AHB_YELLOW:
+ buyerPriceYellow = value;
+ break;
+ default:
+ break;
+ }
+ }
+ uint32 GetBuyerPrice(uint32 color)
+ {
+ switch(color)
+ {
+ case AHB_GREY:
+ return buyerPriceGrey;
+ break;
+ case AHB_WHITE:
+ return buyerPriceWhite;
+ break;
+ case AHB_GREEN:
+ return buyerPriceGreen;
+ break;
+ case AHB_BLUE:
+ return buyerPriceBlue;
+ break;
+ case AHB_PURPLE:
+ return buyerPricePurple;
+ break;
+ case AHB_ORANGE:
+ return buyerPriceOrange;
+ break;
+ case AHB_YELLOW:
+ return buyerPriceYellow;
+ break;
+ default:
+ return 0;
+ break;
+ }
+ }
+ void SetBiddingInterval(uint32 value)
+ {
+ buyerBiddingInterval = value;
+ }
+ uint32 GetBiddingInterval()
+ {
+ return buyerBiddingInterval;
+ }
+ void CalculatePercents()
+ {
+ greytgp = (uint32) (((double)percentGreyTradeGoods / 100.0) * maxItems);
+ whitetgp = (uint32) (((double)percentWhiteTradeGoods / 100.0) * maxItems);
+ greentgp = (uint32) (((double)percentGreenTradeGoods / 100.0) * maxItems);
+ bluetgp = (uint32) (((double)percentBlueTradeGoods / 100.0) * maxItems);
+ purpletgp = (uint32) (((double)percentPurpleTradeGoods / 100.0) * maxItems);
+ orangetgp = (uint32) (((double)percentOrangeTradeGoods / 100.0) * maxItems);
+ yellowtgp = (uint32) (((double)percentYellowTradeGoods / 100.0) * maxItems);
+ greyip = (uint32) (((double)percentGreyItems / 100.0) * maxItems);
+ whiteip = (uint32) (((double)percentWhiteItems / 100.0) * maxItems);
+ greenip = (uint32) (((double)percentGreenItems / 100.0) * maxItems);
+ blueip = (uint32) (((double)percentBlueItems / 100.0) * maxItems);
+ purpleip = (uint32) (((double)percentPurpleItems / 100.0) * maxItems);
+ orangeip = (uint32) (((double)percentOrangeItems / 100.0) * maxItems);
+ yellowip = (uint32) (((double)percentYellowItems / 100.0) * maxItems);
+ uint32 total = greytgp + whitetgp + greentgp + bluetgp + purpletgp + orangetgp + yellowtgp + greyip + whiteip + greenip + blueip + purpleip + orangeip + yellowip;
+ int32 diff = (maxItems - total);
+ if (diff < 0)
+ {
+ if ((whiteip - diff) > 0)
+ whiteip -= diff;
+ else if ((greenip - diff) > 0)
+ greenip -= diff;
+ }
+ else if (diff < 0)
+ {
+ whiteip += diff;
+ }
+ }
+ uint32 GetPercents(uint32 color)
+ {
+ switch(color)
+ {
+ case AHB_GREY_TG:
+ return greytgp;
+ break;
+ case AHB_WHITE_TG:
+ return whitetgp;
+ break;
+ case AHB_GREEN_TG:
+ return greentgp;
+ break;
+ case AHB_BLUE_TG:
+ return bluetgp;
+ break;
+ case AHB_PURPLE_TG:
+ return purpletgp;
+ break;
+ case AHB_ORANGE_TG:
+ return orangetgp;
+ break;
+ case AHB_YELLOW_TG:
+ return yellowtgp;
+ break;
+ case AHB_GREY_I:
+ return greyip;
+ break;
+ case AHB_WHITE_I:
+ return whiteip;
+ break;
+ case AHB_GREEN_I:
+ return greenip;
+ break;
+ case AHB_BLUE_I:
+ return blueip;
+ break;
+ case AHB_PURPLE_I:
+ return purpleip;
+ break;
+ case AHB_ORANGE_I:
+ return orangeip;
+ break;
+ case AHB_YELLOW_I:
+ return yellowip;
+ break;
+ default:
+ return 0;
+ break;
+ }
+ }
+ void SetBidsPerInterval(uint32 value)
+ {
+ buyerBidsPerInterval = value;
+ }
+ uint32 GetBidsPerInterval()
+ {
+ return buyerBidsPerInterval;
+ }
+ ~AHBConfig()
+ {
+ }
+};
+
+class AuctionHouseBot
+{
+private:
+ ACE_Vector<uint32> npcItems;
+ ACE_Vector<uint32> lootItems;
+ ACE_Vector<uint32> greyTradeGoodsBin;
+ ACE_Vector<uint32> whiteTradeGoodsBin;
+ ACE_Vector<uint32> greenTradeGoodsBin;
+ ACE_Vector<uint32> blueTradeGoodsBin;
+ ACE_Vector<uint32> purpleTradeGoodsBin;
+ ACE_Vector<uint32> orangeTradeGoodsBin;
+ ACE_Vector<uint32> yellowTradeGoodsBin;
+ ACE_Vector<uint32> greyItemsBin;
+ ACE_Vector<uint32> whiteItemsBin;
+ ACE_Vector<uint32> greenItemsBin;
+ ACE_Vector<uint32> blueItemsBin;
+ ACE_Vector<uint32> purpleItemsBin;
+ ACE_Vector<uint32> orangeItemsBin;
+ ACE_Vector<uint32> yellowItemsBin;
+
+ bool AHBSeller;
+ bool AHBBuyer;
+ bool BuyMethod;
+ bool SellMethod;
+
+ uint32 AHBplayerAccount;
+ uint32 AHBplayerGUID;
+ uint32 ItemsPerCycle;
+
+ bool debug_Out;
+
+ bool Vendor_Items;
+ bool Loot_Items;
+ bool Other_Items;
+
+ bool No_Bind;
+ bool Bind_When_Picked_Up;
+ bool Bind_When_Equipped;
+ bool Bind_When_Use;
+ bool Bind_Quest_Item;
+
+ AHBConfig AllianceConfig;
+ AHBConfig HordeConfig;
+ AHBConfig NeutralConfig;
+
+ time_t _lastrun_a;
+ time_t _lastrun_h;
+ time_t _lastrun_n;
+
+ inline uint32 minValue(uint32 a, uint32 b) { return a <= b ? a : b; };
+ void addNewAuctions(Player *AHBplayer, AHBConfig *config);
+ void addNewAuctionBuyerBotBid(Player *AHBplayer, AHBConfig *config, WorldSession *session);
+
+public:
+ AuctionHouseBot();
+ ~AuctionHouseBot();
+ void Update();
+ void Initialize();
+ void LoadValues(AHBConfig*);
+ void Commands(uint32, uint32, uint32, char*);
+ uint32 GetAHBplayerGUID() { return AHBplayerGUID; };
+};
+
+#define auctionbot MaNGOS::Singleton<AuctionHouseBot>::Instance()
+
+#endif
diff --git a/src/game/AuctionHouseHandler.cpp b/src/game/AuctionHouseHandler.cpp
index 1a8425c..ff3ead8 100644
--- a/src/game/AuctionHouseHandler.cpp
+++ b/src/game/AuctionHouseHandler.cpp
@@ -27,6 +27,7 @@
#include "UpdateMask.h"
#include "AuctionHouseMgr.h"
#include "Util.h"
+#include "AuctionHouseBot.h"
//please DO NOT use iterator++, because it is slower than ++iterator!!!
//post-incrementation is always slower than pre-incrementation !
@@ -120,7 +121,10 @@ void WorldSession::SendAuctionOutbiddedMail(AuctionEntry *auction, uint32 newPri
std::ostringstream msgAuctionOutbiddedSubject;
msgAuctionOutbiddedSubject << auction->item_template << ":0:" << AUCTION_OUTBIDDED;
- if (oldBidder)
+ if (oldBidder && !_player)
+ oldBidder->GetSession()->SendAuctionBidderNotification( auction->GetHouseId(), auction->Id, auctionbot.GetAHBplayerGUID(), newPrice, auction->GetAuctionOutBid(), auction->item_template);
+
+ if (oldBidder && _player)
oldBidder->GetSession()->SendAuctionBidderNotification( auction->GetHouseId(), auction->Id, _player->GetGUID(), newPrice, auction->GetAuctionOutBid(), auction->item_template);
MailDraft(msgAuctionOutbiddedSubject.str())
@@ -250,7 +254,10 @@ void WorldSession::HandleAuctionSellItem( WorldPacket & recv_data )
AuctionEntry *AH = new AuctionEntry;
AH->Id = sObjectMgr.GenerateAuctionID();
- AH->auctioneer = GUID_LOPART(auctioneer);
+ if(sWorld.getConfig(CONFIG_BOOL_ALLOW_TWO_SIDE_INTERACTION_AUCTION))
+ AH->auctioneer = 23442;
+ else
+ AH->auctioneer = GUID_LOPART(auctioneer);
AH->item_guidlow = GUID_LOPART(item);
AH->item_template = it->GetEntry();
AH->owner = pl->GetGUIDLow();
@@ -262,7 +269,7 @@ void WorldSession::HandleAuctionSellItem( WorldPacket & recv_data )
AH->deposit = deposit;
AH->auctionHouseEntry = auctionHouseEntry;
- sLog.outDetail("selling item %u to auctioneer %u with initial bid %u with buyout %u and with time %u (in sec) in auctionhouse %u", GUID_LOPART(item), GUID_LOPART(auctioneer), bid, buyout, auction_time, AH->GetHouseId());
+ sLog.outDetail("selling item %u to auctioneer %u with initial bid %u with buyout %u and with time %u (in sec) in auctionhouse %u", GUID_LOPART(item), AH->auctioneer, bid, buyout, auction_time, AH->GetHouseId());
auctionHouse->AddAuction(AH);
sAuctionMgr.AddAItem(it);
diff --git a/src/game/AuctionHouseMgr.cpp b/src/game/AuctionHouseMgr.cpp
index 4f26b13..809d0ed 100644
--- a/src/game/AuctionHouseMgr.cpp
+++ b/src/game/AuctionHouseMgr.cpp
@@ -468,12 +468,12 @@ void AuctionHouseMgr::Update()
AuctionHouseEntry const* AuctionHouseMgr::GetAuctionHouseEntry(uint32 factionTemplateId)
{
- uint32 houseid = 1; // dwarf auction house (used for normal cut/etc percents)
+ uint32 houseid = 7; // goblin auction house
if(!sWorld.getConfig(CONFIG_BOOL_ALLOW_TWO_SIDE_INTERACTION_AUCTION))
{
//FIXME: found way for proper auctionhouse selection by another way
- // AuctionHo use.dbc have faction field with _player_ factions associated with auction house races.
+ // AuctionHouse.dbc have faction field with _player_ factions associated with auction house races.
// but no easy way convert creature faction to player race faction for specific city
switch(factionTemplateId)
{
diff --git a/src/game/AuctionHouseMgr.h b/src/game/AuctionHouseMgr.h
index 0d1b040..bdccd78 100644
--- a/src/game/AuctionHouseMgr.h
+++ b/src/game/AuctionHouseMgr.h
@@ -84,6 +84,9 @@ class AuctionHouseObject
uint32 Getcount() { return AuctionsMap.size(); }
+ AuctionEntryMap::iterator GetAuctionsBegin() {return AuctionsMap.begin();}
+ AuctionEntryMap::iterator GetAuctionsEnd() {return AuctionsMap.end();}
+
void AddAuction(AuctionEntry *ah)
{
ASSERT( ah );
diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp
index 5111aec..4bb5599 100644
--- a/src/game/Chat.cpp
+++ b/src/game/Chat.cpp
@@ -668,6 +668,7 @@ ChatCommand * ChatHandler::getCommandTable()
{ "cometome", SEC_ADMINISTRATOR, false, &ChatHandler::HandleComeToMeCommand, "", NULL },
{ "damage", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDamageCommand, "", NULL },
{ "combatstop", SEC_GAMEMASTER, false, &ChatHandler::HandleCombatStopCommand, "", NULL },
+ { "ahbotoptions", SEC_ADMINISTRATOR, true, &ChatHandler::HandleAHBotOptionsCommand, "", NULL },
{ "flusharenapoints",SEC_ADMINISTRATOR, false, &ChatHandler::HandleFlushArenaPointsCommand, "", NULL },
{ "repairitems", SEC_GAMEMASTER, true, &ChatHandler::HandleRepairitemsCommand, "", NULL },
{ "waterwalk", SEC_GAMEMASTER, false, &ChatHandler::HandleWaterwalkCommand, "", NULL },
diff --git a/src/game/Chat.h b/src/game/Chat.h
index da0563e..b596260 100644
--- a/src/game/Chat.h
+++ b/src/game/Chat.h
@@ -107,6 +107,7 @@ class ChatHandler
bool HandleAccountSetAddonCommand(const char* args);
bool HandleAccountSetGmLevelCommand(const char* args);
bool HandleAccountSetPasswordCommand(const char* args);
+ bool HandleAHBotOptionsCommand(const char* args);
bool HandleBanAccountCommand(const char* args);
bool HandleBanCharacterCommand(const char* args);
diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp
index e8a3d18..7b5c794 100644
--- a/src/game/Level3.cpp
+++ b/src/game/Level3.cpp
@@ -51,6 +51,477 @@
#include "InstanceData.h"
#include "CreatureEventAIMgr.h"
#include "DBCEnums.h"
+#include "AuctionHouseBot.h"
+
+bool ChatHandler::HandleAHBotOptionsCommand(const char* args)
+{
+ uint32 ahMapID = 0;
+ char * opt = strtok((char*)args, " ");
+ char * ahMapIdStr = strtok(NULL, " ");
+ if (ahMapIdStr)
+ {
+ ahMapID = (uint32) strtoul(ahMapIdStr, NULL, 0);
+ }
+ if (!opt)
+ {
+ PSendSysMessage("Syntax is: ahbotoptions $option $ahMapID (2, 6 or 7) $parameter");
+ PSendSysMessage("Try ahbotoptions help to see a list of options.");
+ return false;
+ }
+ int l = strlen(opt);
+
+ if (strncmp(opt,"help",l) == 0)
+ {
+ PSendSysMessage("AHBot commands:");
+ PSendSysMessage("ahexpire");
+ PSendSysMessage("minitems");
+ PSendSysMessage("maxitems");
+ PSendSysMessage("mintime");
+ PSendSysMessage("maxtime");
+ PSendSysMessage("percentages");
+ PSendSysMessage("minprice");
+ PSendSysMessage("maxprice");
+ PSendSysMessage("minbidprice");
+ PSendSysMessage("maxbidprice");
+ PSendSysMessage("maxstack");
+ PSendSysMessage("buyerprice");
+ PSendSysMessage("bidinterval");
+ PSendSysMessage("bidsperinterval");
+ return true;
+ }
+ else if (strncmp(opt,"ahexpire",l) == 0)
+ {
+ if (!ahMapIdStr)
+ {
+ PSendSysMessage("Syntax is: ahbotoptions ahexpire $ahMapID (2, 6 or 7)");
+ return false;
+ }
+ auctionbot.Commands(0, ahMapID, NULL, NULL);
+ }
+ else if (strncmp(opt,"minitems",l) == 0)
+ {
+ char * param1 = strtok(NULL, " ");
+ if ((!ahMapIdStr) || (!param1))
+ {
+ PSendSysMessage("Syntax is: ahbotoptions minitems $ahMapID (2, 6 or 7) $minItems");
+ return false;
+ }
+ auctionbot.Commands(1, ahMapID, NULL, param1);
+ }
+ else if (strncmp(opt,"maxitems",l) == 0)
+ {
+ char * param1 = strtok(NULL, " ");
+ if ((!ahMapIdStr) || (!param1))
+ {
+ PSendSysMessage("Syntax is: ahbotoptions maxitems $ahMapID (2, 6 or 7) $maxItems");
+ return false;
+ }
+ auctionbot.Commands(2, ahMapID, NULL, param1);
+ }
+ else if (strncmp(opt,"mintime",l) == 0)
+ {
+ char * param1 = strtok(NULL, " ");
+ if ((!ahMapIdStr) || (!param1))
+ {
+ PSendSysMessage("Syntax is: ahbotoptions mintime $ahMapID (2, 6 or 7) $mintime");
+ return false;
+ }
+ auctionbot.Commands(3, ahMapID, NULL, param1);
+ }
+ else if (strncmp(opt,"maxtime",l) == 0)
+ {
+ char * param1 = strtok(NULL, " ");
+ if ((!ahMapIdStr) || (!param1))
+ {
+ PSendSysMessage("Syntax is: ahbotoptions maxtime $ahMapID (2, 6 or 7) $maxtime");
+ return false;
+ }
+ auctionbot.Commands(4, ahMapID, NULL, param1);
+ }
+ else if (strncmp(opt,"percentages",l) == 0)
+ {
+ char * param1 = strtok(NULL, " ");
+ char * param2 = strtok(NULL, " ");
+ char * param3 = strtok(NULL, " ");
+ char * param4 = strtok(NULL, " ");
+ char * param5 = strtok(NULL, " ");
+ char * param6 = strtok(NULL, " ");
+ char * param7 = strtok(NULL, " ");
+ char * param8 = strtok(NULL, " ");
+ char * param9 = strtok(NULL, " ");
+ char * param10 = strtok(NULL, " ");
+ char * param11 = strtok(NULL, " ");
+ char * param12 = strtok(NULL, " ");
+ char * param13 = strtok(NULL, " ");
+ char * param14 = strtok(NULL, " ");
+ if ((!ahMapIdStr) || (!param14))
+ {
+ PSendSysMessage("Syntax is: ahbotoptions percentages $ahMapID (2, 6 or 7) $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14");
+ PSendSysMessage("1 GreyTradeGoods 2 WhiteTradeGoods 3 GreenTradeGoods 4 BlueTradeGoods 5 PurpleTradeGoods");
+ PSendSysMessage("6 OrangeTradeGoods 7 YellowTradeGoods 8 GreyItems 9 WhiteItems 10 GreenItems 11 BlueItems");
+ PSendSysMessage("12 PurpleItems 13 OrangeItems 14 YellowItems");
+ PSendSysMessage("The total must add up to 100%");
+ return false;
+ }
+ uint32 greytg = (uint32) strtoul(param1, NULL, 0);
+ uint32 whitetg = (uint32) strtoul(param2, NULL, 0);
+ uint32 greentg = (uint32) strtoul(param3, NULL, 0);
+ uint32 bluetg = (uint32) strtoul(param3, NULL, 0);
+ uint32 purpletg = (uint32) strtoul(param5, NULL, 0);
+ uint32 orangetg = (uint32) strtoul(param6, NULL, 0);
+ uint32 yellowtg = (uint32) strtoul(param7, NULL, 0);
+ uint32 greyi = (uint32) strtoul(param8, NULL, 0);
+ uint32 whitei = (uint32) strtoul(param9, NULL, 0);
+ uint32 greeni = (uint32) strtoul(param10, NULL, 0);
+ uint32 bluei = (uint32) strtoul(param11, NULL, 0);
+ uint32 purplei = (uint32) strtoul(param12, NULL, 0);
+ uint32 orangei = (uint32) strtoul(param13, NULL, 0);
+ uint32 yellowi = (uint32) strtoul(param14, NULL, 0);
+ uint32 totalPercent = greytg + whitetg + greentg + bluetg + purpletg + orangetg + yellowtg + greyi + whitei + greeni + bluei + purplei + orangei + yellowi;
+ if ((totalPercent == 0) || (totalPercent != 100))
+ {
+ PSendSysMessage("Syntax is: ahbotoptions percentages $ahMapID (2, 6 or 7) $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14");
+ PSendSysMessage("1 GreyTradeGoods 2 WhiteTradeGoods 3 GreenTradeGoods 4 BlueTradeGoods 5 PurpleTradeGoods");
+ PSendSysMessage("6 OrangeTradeGoods 7 YellowTradeGoods 8 GreyItems 9 WhiteItems 10 GreenItems 11 BlueItems");
+ PSendSysMessage("12 PurpleItems 13 OrangeItems 14 YellowItems");
+ PSendSysMessage("The total must add up to 100%");
+ return false;
+ }
+ char param[100];
+ param[0] = '\0';
+ strcat(param, param1);
+ strcat(param, " ");
+ strcat(param, param2);
+ strcat(param, " ");
+ strcat(param, param3);
+ strcat(param, " ");
+ strcat(param, param4);
+ strcat(param, " ");
+ strcat(param, param5);
+ strcat(param, " ");
+ strcat(param, param6);
+ strcat(param, " ");
+ strcat(param, param7);
+ strcat(param, " ");
+ strcat(param, param8);
+ strcat(param, " ");
+ strcat(param, param9);
+ strcat(param, " ");
+ strcat(param, param10);
+ strcat(param, " ");
+ strcat(param, param11);
+ strcat(param, " ");
+ strcat(param, param12);
+ strcat(param, " ");
+ strcat(param, param13);
+ strcat(param, " ");
+ strcat(param, param14);
+ auctionbot.Commands(5, ahMapID, NULL, param);
+ }
+ else if (strncmp(opt,"minprice",l) == 0)
+ {
+ char * param1 = strtok(NULL, " ");
+ char * param2 = strtok(NULL, " ");
+ if ((!ahMapIdStr) || (!param1) || (!param2))
+ {
+ PSendSysMessage("Syntax is: ahbotoptions minprice $ahMapID (2, 6 or 7) $color (grey, white, green, blue, purple, orange or yellow) $price");
+ return false;
+ }
+ if (strncmp(param1,"grey",l) == 0)
+ {
+ auctionbot.Commands(6, ahMapID, AHB_GREY, param2);
+ }
+ else if (strncmp(param1,"white",l) == 0)
+ {
+ auctionbot.Commands(6, ahMapID, AHB_WHITE, param2);
+ }
+ else if (strncmp(param1,"green",l) == 0)
+ {
+ auctionbot.Commands(6, ahMapID, AHB_GREEN, param2);
+ }
+ else if (strncmp(param1,"blue",l) == 0)
+ {
+ auctionbot.Commands(6, ahMapID, AHB_BLUE, param2);
+ }
+ else if (strncmp(param1,"purple",l) == 0)
+ {
+ auctionbot.Commands(6, ahMapID, AHB_PURPLE, param2);
+ }
+ else if (strncmp(param1,"orange",l) == 0)
+ {
+ auctionbot.Commands(6, ahMapID, AHB_ORANGE, param2);
+ }
+ else if (strncmp(param1,"yellow",l) == 0)
+ {
+ auctionbot.Commands(6, ahMapID, AHB_YELLOW, param2);
+ }
+ else
+ {
+ PSendSysMessage("Syntax is: ahbotoptions minprice $ahMapID (2, 6 or 7) $color (grey, white, green, blue, purple, orange or yellow) $price");
+ return false;
+ }
+ }
+ else if (strncmp(opt,"maxprice",l) == 0)
+ {
+ char * param1 = strtok(NULL, " ");
+ char * param2 = strtok(NULL, " ");
+ if ((!ahMapIdStr) || (!param1) || (!param2))
+ {
+ PSendSysMessage("Syntax is: ahbotoptions maxprice $ahMapID (2, 6 or 7) $color (grey, white, green, blue, purple, orange or yellow) $price");
+ return false;
+ }
+ if (strncmp(param1,"grey",l) == 0)
+ {
+ auctionbot.Commands(7, ahMapID, AHB_GREY, param2);
+ }
+ else if (strncmp(param1,"white",l) == 0)
+ {
+ auctionbot.Commands(7, ahMapID, AHB_WHITE, param2);
+ }
+ else if (strncmp(param1,"green",l) == 0)
+ {
+ auctionbot.Commands(7, ahMapID, AHB_GREEN, param2);
+ }
+ else if (strncmp(param1,"blue",l) == 0)
+ {
+ auctionbot.Commands(7, ahMapID, AHB_BLUE, param2);
+ }
+ else if (strncmp(param1,"purple",l) == 0)
+ {
+ auctionbot.Commands(7, ahMapID, AHB_PURPLE, param2);
+ }
+ else if (strncmp(param1,"orange",l) == 0)
+ {
+ auctionbot.Commands(7, ahMapID, AHB_ORANGE, param2);
+ }
+ else if (strncmp(param1,"yellow",l) == 0)
+ {
+ auctionbot.Commands(7, ahMapID, AHB_YELLOW, param2);
+ }
+ else
+ {
+ PSendSysMessage("Syntax is: ahbotoptions maxprice $ahMapID (2, 6 or 7) $color (grey, white, green, blue, purple, orange or yellow) $price");
+ return false;
+ }
+ }
+ else if (strncmp(opt,"minbidprice",l) == 0)
+ {
+ char * param1 = strtok(NULL, " ");
+ char * param2 = strtok(NULL, " ");
+ if ((!ahMapIdStr) || (!param1) || (!param2))
+ {
+ PSendSysMessage("Syntax is: ahbotoptions minbidprice $ahMapID (2, 6 or 7) $color (grey, white, green, blue, purple, orange or yellow) $price");
+ return false;
+ }
+ uint32 minBidPrice = (uint32) strtoul(param2, NULL, 0);
+ if ((minBidPrice < 1) || (minBidPrice > 100))
+ {
+ PSendSysMessage("The min bid price multiplier must be between 1 and 100");
+ return false;
+ }
+ if (strncmp(param1,"grey",l) == 0)
+ {
+ auctionbot.Commands(8, ahMapID, AHB_GREY, param2);
+ }
+ else if (strncmp(param1,"white",l) == 0)
+ {
+ auctionbot.Commands(8, ahMapID, AHB_WHITE, param2);
+ }
+ else if (strncmp(param1,"green",l) == 0)
+ {
+ auctionbot.Commands(8, ahMapID, AHB_GREEN, param2);
+ }
+ else if (strncmp(param1,"blue",l) == 0)
+ {
+ auctionbot.Commands(8, ahMapID, AHB_BLUE, param2);
+ }
+ else if (strncmp(param1,"purple",l) == 0)
+ {
+ auctionbot.Commands(8, ahMapID, AHB_PURPLE, param2);
+ }
+ else if (strncmp(param1,"orange",l) == 0)
+ {
+ auctionbot.Commands(8, ahMapID, AHB_ORANGE, param2);
+ }
+ else if (strncmp(param1,"yellow",l) == 0)
+ {
+ auctionbot.Commands(8, ahMapID, AHB_YELLOW, param2);
+ }
+ else
+ {
+ PSendSysMessage("Syntax is: ahbotoptions minbidprice $ahMapID (2, 6 or 7) $color (grey, white, green, blue, purple, orange or yellow) $price");
+ return false;
+ }
+ }
+ else if (strncmp(opt,"maxbidprice",l) == 0)
+ {
+ char * param1 = strtok(NULL, " ");
+ char * param2 = strtok(NULL, " ");
+ if ((!ahMapIdStr) || (!param1) || (!param2))
+ {
+ PSendSysMessage("Syntax is: ahbotoptions maxbidprice $ahMapID (2, 6 or 7) $color (grey, white, green, blue, purple, orange or yellow) $price");
+ return false;
+ }
+ uint32 maxBidPrice = (uint32) strtoul(param2, NULL, 0);
+ if ((maxBidPrice < 1) || (maxBidPrice > 100))
+ {
+ PSendSysMessage("The max bid price multiplier must be between 1 and 100");
+ return false;
+ }
+ if (strncmp(param1,"grey",l) == 0)
+ {
+ auctionbot.Commands(9, ahMapID, AHB_GREY, param2);
+ }
+ else if (strncmp(param1,"white",l) == 0)
+ {
+ auctionbot.Commands(9, ahMapID, AHB_WHITE, param2);
+ }
+ else if (strncmp(param1,"green",l) == 0)
+ {
+ auctionbot.Commands(9, ahMapID, AHB_GREEN, param2);
+ }
+ else if (strncmp(param1,"blue",l) == 0)
+ {
+ auctionbot.Commands(9, ahMapID, AHB_BLUE, param2);
+ }
+ else if (strncmp(param1,"purple",l) == 0)
+ {
+ auctionbot.Commands(9, ahMapID, AHB_PURPLE, param2);
+ }
+ else if (strncmp(param1,"orange",l) == 0)
+ {
+ auctionbot.Commands(9, ahMapID, AHB_ORANGE, param2);
+ }
+ else if (strncmp(param1,"yellow",l) == 0)
+ {
+ auctionbot.Commands(9, ahMapID, AHB_YELLOW, param2);
+ }
+ else
+ {
+ PSendSysMessage("Syntax is: ahbotoptions max bidprice $ahMapID (2, 6 or 7) $color (grey, white, green, blue, purple, orange or yellow) $price");
+ return false;
+ }
+ }
+ else if (strncmp(opt,"maxstack",l) == 0)
+ {
+ char * param1 = strtok(NULL, " ");
+ char * param2 = strtok(NULL, " ");
+ if ((!ahMapIdStr) || (!param1) || (!param2))
+ {
+ PSendSysMessage("Syntax is: ahbotoptions maxstack $ahMapID (2, 6 or 7) $color (grey, white, green, blue, purple, orange or yellow) $value");
+ return false;
+ }
+ uint32 maxStack = (uint32) strtoul(param2, NULL, 0);
+ if (maxStack < 0)
+ {
+ PSendSysMessage("maxstack can't be a negative number.");
+ return false;
+ }
+ if (strncmp(param1,"grey",l) == 0)
+ {
+ auctionbot.Commands(10, ahMapID, AHB_GREY, param2);
+ }
+ else if (strncmp(param1,"white",l) == 0)
+ {
+ auctionbot.Commands(10, ahMapID, AHB_WHITE, param2);
+ }
+ else if (strncmp(param1,"green",l) == 0)
+ {
+ auctionbot.Commands(10, ahMapID, AHB_GREEN, param2);
+ }
+ else if (strncmp(param1,"blue",l) == 0)
+ {
+ auctionbot.Commands(10, ahMapID, AHB_BLUE, param2);
+ }
+ else if (strncmp(param1,"purple",l) == 0)
+ {
+ auctionbot.Commands(10, ahMapID, AHB_PURPLE, param2);
+ }
+ else if (strncmp(param1,"orange",l) == 0)
+ {
+ auctionbot.Commands(10, ahMapID, AHB_ORANGE, param2);
+ }
+ else if (strncmp(param1,"yellow",l) == 0)
+ {
+ auctionbot.Commands(10, ahMapID, AHB_YELLOW, param2);
+ }
+ else
+ {
+ PSendSysMessage("Syntax is: ahbotoptions maxstack $ahMapID (2, 6 or 7) $color (grey, white, green, blue, purple, orange or yellow) $value");
+ return false;
+ }
+ }
+ else if (strncmp(opt,"buyerprice",l) == 0)
+ {
+ char * param1 = strtok(NULL, " ");
+ char * param2 = strtok(NULL, " ");
+ if ((!ahMapIdStr) || (!param1) || (!param2))
+ {
+ PSendSysMessage("Syntax is: ahbotoptions buyerprice $ahMapID (2, 6 or 7) $color (grey, white, green, blue or purple) $price");
+ return false;
+ }
+ if (strncmp(param1,"grey",l) == 0)
+ {
+ auctionbot.Commands(11, ahMapID, AHB_GREY, param2);
+ }
+ else if (strncmp(param1,"white",l) == 0)
+ {
+ auctionbot.Commands(11, ahMapID, AHB_WHITE, param2);
+ }
+ else if (strncmp(param1,"green",l) == 0)
+ {
+ auctionbot.Commands(11, ahMapID, AHB_GREEN, param2);
+ }
+ else if (strncmp(param1,"blue",l) == 0)
+ {
+ auctionbot.Commands(11, ahMapID, AHB_BLUE, param2);
+ }
+ else if (strncmp(param1,"purple",l) == 0)
+ {
+ auctionbot.Commands(11, ahMapID, AHB_PURPLE, param2);
+ }
+ else if (strncmp(param1,"orange",l) == 0)
+ {
+ auctionbot.Commands(11, ahMapID, AHB_ORANGE, param2);
+ }
+ else if (strncmp(param1,"yellow",l) == 0)
+ {
+ auctionbot.Commands(11, ahMapID, AHB_YELLOW, param2);
+ }
+ else
+ {
+ PSendSysMessage("Syntax is: ahbotoptions buyerprice $ahMapID (2, 6 or 7) $color (grey, white, green, blue or purple) $price");
+ return false;
+ }
+ }
+ else if (strncmp(opt,"bidinterval",l) == 0)
+ {
+ char * param1 = strtok(NULL, " ");
+ if ((!ahMapIdStr) || (!param1))
+ {
+ PSendSysMessage("Syntax is: ahbotoptions bidinterval $ahMapID (2, 6 or 7) $interval(in minutes)");
+ return false;
+ }
+ auctionbot.Commands(12, ahMapID, NULL, param1);
+ }
+ else if (strncmp(opt,"bidsperinterval",l) == 0)
+ {
+ char * param1 = strtok(NULL, " ");
+ if ((!ahMapIdStr) || (!param1))
+ {
+ PSendSysMessage("Syntax is: ahbotoptions bidsperinterval $ahMapID (2, 6 or 7) $bids");
+ return false;
+ }
+ auctionbot.Commands(13, ahMapID, NULL, param1);
+ }
+ else
+ {
+ PSendSysMessage("Syntax is: ahbotoptions $option $ahMapID (2, 6 or 7) $parameter");
+ PSendSysMessage("Try ahbotoptions help to see a list of options.");
+ return false;
+ }
+ return true;
+}
//reload commands
bool ChatHandler::HandleReloadAllCommand(const char*)
diff --git a/src/game/Mail.cpp b/src/game/Mail.cpp
index 67fd342..a4eb237 100644
--- a/src/game/Mail.cpp
+++ b/src/game/Mail.cpp
@@ -37,6 +37,7 @@
#include "UpdateMask.h"
#include "Unit.h"
#include "Language.h"
+#include "AuctionHouseBot.h"
#include "DBCStores.h"
#include "BattleGroundMgr.h"
#include "Item.h"
@@ -1008,7 +1009,14 @@ void MailDraft::SendReturnToSender(uint32 sender_acc, uint32 sender_guid, uint32
uint32 deliver_delay = needItemDelay ? sWorld.getConfig(CONFIG_UINT32_MAIL_DELIVERY_DELAY) : 0;
// will delete item or place to receiver mail list
- SendMailTo(MailReceiver(receiver,receiver_guid), MailSender(MAIL_NORMAL, sender_guid), MAIL_CHECK_MASK_RETURNED, deliver_delay);
+ if (sender_guid == auctionbot.GetAHBplayerGUID())
+ {
+ SendMailTo(MailReceiver(receiver,receiver_guid), MailSender(MAIL_CREATURE, sender_guid), MAIL_CHECK_MASK_RETURNED, deliver_delay);
+ }
+ else
+ {
+ SendMailTo(MailReceiver(receiver,receiver_guid), MailSender(MAIL_NORMAL, sender_guid), MAIL_CHECK_MASK_RETURNED, deliver_delay);
+ }
}
/**
* Sends a mail.
@@ -1022,6 +1030,15 @@ void MailDraft::SendMailTo(MailReceiver const& receiver, MailSender const& sende
{
Player* pReceiver = receiver.GetPlayer(); // can be NULL
+ if (receiver.GetPlayerGUIDLow() == auctionbot.GetAHBplayerGUID())
+ {
+ if (sender.GetMailMessageType() == MAIL_AUCTION && !m_items.empty())
+ {
+ deleteIncludedItems(true);
+ }
+ return;
+ }
+
if (pReceiver)
prepareItems(pReceiver); // generate mail template items
diff --git a/src/game/Makefile.am b/src/game/Makefile.am
index 39d6982..47b3c3b 100644
--- a/src/game/Makefile.am
+++ b/src/game/Makefile.am
@@ -37,6 +37,8 @@ libmangosgame_a_SOURCES = \
ArenaTeam.cpp \
ArenaTeam.h \
ArenaTeamHandler.cpp \
+ AuctionHouseBot.cpp \
+ AuctionHouseBot.h \
AuctionHouseHandler.cpp \
AuctionHouseMgr.cpp \
AuctionHouseMgr.h \
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index 994d669..fd3a14c 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -14529,6 +14529,61 @@ void Player::SendQuestUpdateAddCreatureOrGo( Quest const* pQuest, uint64 guid, u
/*** LOAD SYSTEM ***/
/*********************************************************/
+bool Player::MinimalLoadFromDB( QueryResult *result, uint32 guid )
+{
+ bool delete_result = true;
+ if (!result)
+ {
+ // 0 1 2 3 4 5 6 7 8 9 10 11
+ result = CharacterDatabase.PQuery("SELECT guid, data, name, position_x, position_y, position_z, map, totaltime, leveltime, at_login, zone, level FROM characters WHERE guid = '%u'",guid);
+ if (!result)
+ return false;
+ }
+ else
+ delete_result = false;
+
+ Field *fields = result->Fetch();
+
+ if (!LoadValues( fields[1].GetString()))
+ {
+ sLog.outError("Player #%d have broken data in `data` field. Can't be loaded for character list.",GUID_LOPART(guid));
+ if (delete_result)
+ delete result;
+ return false;
+ }
+
+ // overwrite possible wrong/corrupted guid
+ SetUInt64Value(OBJECT_FIELD_GUID, MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER));
+
+ m_name = fields[2].GetCppString();
+
+ Relocate(fields[3].GetFloat(),fields[4].GetFloat(),fields[5].GetFloat());
+ SetLocationMapId(fields[6].GetUInt32());
+
+ // the instance id is not needed at character enum
+
+ m_Played_time[PLAYED_TIME_TOTAL] = fields[7].GetUInt32();
+ m_Played_time[PLAYED_TIME_LEVEL] = fields[8].GetUInt32();
+
+ m_atLoginFlags = fields[9].GetUInt32();
+
+ // I don't see these used anywhere ..
+ /*_LoadGroup();
+
+ _LoadBoundInstances();*/
+
+ if (delete_result)
+ delete result;
+
+ for (int i = 0; i < PLAYER_SLOTS_COUNT; ++i)
+ m_items[i] = NULL;
+
+ if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST))
+ m_deathState = DEAD;
+
+ return true;
+}
+
void Player::_LoadDeclinedNames(QueryResult* result)
{
if(!result)
diff --git a/src/game/Player.h b/src/game/Player.h
index 75ab413..03cf892 100644
--- a/src/game/Player.h
+++ b/src/game/Player.h
@@ -1423,6 +1423,7 @@ class MANGOS_DLL_SPEC Player : public Unit
bool LoadFromDB(uint32 guid, SqlQueryHolder *holder);
+ bool MinimalLoadFromDB(QueryResult *result, uint32 guid);
static bool LoadValuesArrayFromDB(Tokens& data,uint64 guid);
static uint32 GetUInt32ValueFromArray(Tokens const& data, uint16 index);
static float GetFloatValueFromArray(Tokens const& data, uint16 index);
diff --git a/src/game/World.cpp b/src/game/World.cpp
index ada384d..d067111 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -61,6 +61,7 @@
#include "WaypointManager.h"
#include "GMTicketMgr.h"
#include "Util.h"
+#include "AuctionHouseBot.h"
INSTANTIATE_SINGLETON_1( World );
@@ -1272,6 +1273,9 @@ void World::SetInitialWorldSettings()
uint32 nextGameEvent = sGameEventMgr.Initialize();
m_timers[WUPDATE_EVENTS].SetInterval(nextGameEvent); //depend on next event
+ sLog.outString("Initialize AuctionHouseBot...");
+ auctionbot.Initialize();
+
sLog.outString( "WORLD: World initialized" );
uint32 uStartInterval = getMSTimeDiff(uStartTime, getMSTime());
@@ -1344,6 +1348,7 @@ void World::Update(uint32 diff)
/// <ul><li> Handle auctions when the timer has passed
if (m_timers[WUPDATE_AUCTIONS].Passed())
{
+ auctionbot.Update();
m_timers[WUPDATE_AUCTIONS].Reset();
///- Update mails (return old mails with item, or delete them)
diff --git a/src/mangosd/mangosd.conf.dist.in b/src/mangosd/mangosd.conf.dist.in
index 43e4159..40e29f8 100644
--- a/src/mangosd/mangosd.conf.dist.in
+++ b/src/mangosd/mangosd.conf.dist.in
@@ -1355,6 +1355,7 @@ Network.OutKBuff = -1
Network.OutUBuff = 65536
Network.TcpNodelay = 1
+
###################################################################################################################
# CONSOLE, REMOTE ACCESS AND SOAP
#
@@ -1417,3 +1418,75 @@ SOAP.Enabled = 0
SOAP.IP = 127.0.0.1
SOAP.Port = 7878
+###################################################################################################################
+# AUCTION HOUSE BOT SETTINGS
+#
+# AuctionHouseBot.EnableSeller
+# Enable/Disable the part of AHBot that puts items up for auction
+# Default 0 (disabled)
+#
+# AuctionHouseBot.EnableBuyer
+# Enable/Disable the part of AHBot that buys items from players
+# Default 0 (disabled)
+#
+# 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.VendorItems
+# Include items that can be bought from vendors.
+# Default 0
+#
+# AuctionHouseBot.LootItems
+# Include items that can be looted or fished for.
+# Default 1
+#
+# AuctionHouseBot.OtherItems
+# Include misc. items.
+# Default 0
+#
+# AuctionHouseBot.Bonding_types
+# Indicates which bonding types to allow seller to put up for auction
+# No_Bind
+# Default 1
+# Bind_When_Picked_Up
+# Default 0
+# Bind_When_Equipped
+# Default 1
+# Bind_When_Use
+# Default 1
+# Bind_Quest_Item
+# Default 0
+#
+# AuctionHouseBot.ItemsPerCycle
+# Number of Items to Add/Remove from the AH during mass operations
+# Default 200
+#
+# AuctionHouseBot.UseBuyPriceForSeller
+# Should the Seller use BuyPrice or SellPrice to determine Bid Prices
+# Default 0 (use SellPrice)
+#
+# AuctionHouseBot.UseBuyPriceForBuyer
+# Should the Buyer use BuyPrice or SellPrice to determine Bid Prices
+# Default 0 (use SellPrice)
+#
+# All other settings have been moved to sql
+#
+###################################################################################################################
+
+AuctionHouseBot.EnableSeller = 0
+AuctionHouseBot.EnableBuyer = 0
+AuctionHouseBot.Account = 0
+AuctionHouseBot.GUID = 0
+AuctionHouseBot.VendorItems = 0
+AuctionHouseBot.LootItems = 1
+AuctionHouseBot.OtherItems = 0
+AuctionHouseBot.No_Bind = 1
+AuctionHouseBot.Bind_When_Picked_Up = 0
+AuctionHouseBot.Bind_When_Equipped = 1
+AuctionHouseBot.Bind_When_Use = 1
+AuctionHouseBot.Bind_Quest_Item = 0
+AuctionHouseBot.ItemsPerCycle = 200
+AuctionHouseBot.UseBuyPriceForSeller = 0
+AuctionHouseBot.UseBuyPriceForBuyer = 0
diff --git a/win/VC100/game.vcxproj b/win/VC100/game.vcxproj
index 7f9ba21..30991f6 100644
--- a/win/VC100/game.vcxproj
+++ b/win/VC100/game.vcxproj
@@ -349,6 +349,7 @@
<ClCompile Include="..\..\src\game\AggressorAI.cpp" />
<ClCompile Include="..\..\src\game\ArenaTeam.cpp" />
<ClCompile Include="..\..\src\game\ArenaTeamHandler.cpp" />
+ <ClCompile Include="..\..\src\game\AuctionHouseBot.cpp" />
<ClCompile Include="..\..\src\game\AuctionHouseHandler.cpp" />
<ClCompile Include="..\..\src\game\AuctionHouseMgr.cpp" />
<ClCompile Include="..\..\src\game\Bag.cpp" />
@@ -498,6 +499,7 @@
<ClInclude Include="..\..\src\game\AchievementMgr.h" />
<ClInclude Include="..\..\src\game\AggressorAI.h" />
<ClInclude Include="..\..\src\game\ArenaTeam.h" />
+ <ClInclude Include="..\..\src\game\AuctionHouseBot.h" />
<ClInclude Include="..\..\src\game\AuctionHouseMgr.h" />
<ClInclude Include="..\..\src\game\Bag.h" />
<ClInclude Include="..\..\src\game\BattleGround.h" />
diff --git a/win/VC80/game.vcproj b/win/VC80/game.vcproj
index 49835dc..2968f38 100644
--- a/win/VC80/game.vcproj
+++ b/win/VC80/game.vcproj
@@ -1130,6 +1130,14 @@
>
</File>
<File
+ RelativePath="..\..\src\game\AuctionHouseBot.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\AuctionHouseBot.h"
+ >
+ </File>
+ <File
RelativePath="..\..\src\game\AuctionHouseMgr.cpp"
>
</File>
diff --git a/win/VC90/game.vcproj b/win/VC90/game.vcproj
index d0dea11..848e9bb 100644
--- a/win/VC90/game.vcproj
+++ b/win/VC90/game.vcproj
@@ -1131,6 +1131,14 @@
>
</File>
<File
+ RelativePath="..\..\src\game\AuctionHouseBot.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\AuctionHouseBot.h"
+ >
+ </File>
+ <File
RelativePath="..\..\src\game\AuctionHouseMgr.cpp"
>
</File>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment