mangos/src/game/AuctionHouseBot/AuctionHouseBot.h
Antz 89e63f3eee
Happy New Year 2022 from everyone at getMangos.eu 🎉
Signed-off-by: Antz <antz@cix.co.uk>
2022-01-01 00:17:57 +00:00

534 lines
19 KiB
C++

/**
* MaNGOS is a full featured server for World of Warcraft, supporting
* the following clients: 1.12.x, 2.4.3, 3.3.5a, 4.3.4a and 5.4.8
*
* Copyright (C) 2005-2022 MaNGOS <https://getmangos.eu>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
* and lore are copyrighted by Blizzard Entertainment, Inc.
*/
#ifndef AUCTION_HOUSE_BOT_H
#define AUCTION_HOUSE_BOT_H
#include "Config/Config.h"
#include "AuctionHouseMgr.h"
#include "SharedDefines.h"
#include "Item.h"
/**
* This is the AuctionHouseBot and it is used to make less populated servers
* appear more populated than they actually are by having auctions created by
* the mangos daemon itself instead of by players.
*
* This bot can both create auctions and buyout/bid on auctions to create a feel
* of a very active AH. The key classes for creating and buying auctions are
* \ref AuctionBotBuyer for buying and \ref AuctionBotSeller for selling.
*
* \todo Describe more of how it all works, ie algorithms etc.
*/
/** \addtogroup auctionbot
* @{
* \file
*/
/**
* @brief shadow of ItemQualities with skipped ITEM_QUALITY_HEIRLOOM, anything after ITEM_QUALITY_ARTIFACT(6) in fact
*
*/
enum AuctionQuality
{
AUCTION_QUALITY_GREY = ITEM_QUALITY_POOR,
AUCTION_QUALITY_WHITE = ITEM_QUALITY_NORMAL,
AUCTION_QUALITY_GREEN = ITEM_QUALITY_UNCOMMON,
AUCTION_QUALITY_BLUE = ITEM_QUALITY_RARE,
AUCTION_QUALITY_PURPLE = ITEM_QUALITY_EPIC,
AUCTION_QUALITY_ORANGE = ITEM_QUALITY_LEGENDARY,
AUCTION_QUALITY_YELLOW = ITEM_QUALITY_ARTIFACT
};
#define MAX_AUCTION_QUALITY 7
/**
* @brief
*
*/
enum AuctionBotConfigUInt32Values
{
CONFIG_UINT32_AHBOT_MAXTIME,
CONFIG_UINT32_AHBOT_MINTIME,
CONFIG_UINT32_AHBOT_ITEMS_PER_CYCLE_BOOST,
CONFIG_UINT32_AHBOT_ITEMS_PER_CYCLE_NORMAL,
CONFIG_UINT32_AHBOT_ALLIANCE_ITEM_AMOUNT_RATIO,
CONFIG_UINT32_AHBOT_HORDE_ITEM_AMOUNT_RATIO,
CONFIG_UINT32_AHBOT_NEUTRAL_ITEM_AMOUNT_RATIO,
CONFIG_UINT32_AHBOT_ITEM_MIN_ITEM_LEVEL,
CONFIG_UINT32_AHBOT_ITEM_MAX_ITEM_LEVEL,
CONFIG_UINT32_AHBOT_ITEM_MIN_REQ_LEVEL,
CONFIG_UINT32_AHBOT_ITEM_MAX_REQ_LEVEL,
CONFIG_UINT32_AHBOT_ITEM_MIN_SKILL_RANK,
CONFIG_UINT32_AHBOT_ITEM_MAX_SKILL_RANK,
CONFIG_UINT32_AHBOT_ITEM_GREY_AMOUNT,
CONFIG_UINT32_AHBOT_ITEM_WHITE_AMOUNT,
CONFIG_UINT32_AHBOT_ITEM_GREEN_AMOUNT,
CONFIG_UINT32_AHBOT_ITEM_BLUE_AMOUNT,
CONFIG_UINT32_AHBOT_ITEM_PURPLE_AMOUNT,
CONFIG_UINT32_AHBOT_ITEM_ORANGE_AMOUNT,
CONFIG_UINT32_AHBOT_ITEM_YELLOW_AMOUNT,
CONFIG_UINT32_AHBOT_CLASS_CONSUMABLE_AMOUNT,
CONFIG_UINT32_AHBOT_CLASS_CONTAINER_AMOUNT,
CONFIG_UINT32_AHBOT_CLASS_WEAPON_AMOUNT,
CONFIG_UINT32_AHBOT_CLASS_GEM_AMOUNT,
CONFIG_UINT32_AHBOT_CLASS_ARMOR_AMOUNT,
CONFIG_UINT32_AHBOT_CLASS_REAGENT_AMOUNT,
CONFIG_UINT32_AHBOT_CLASS_PROJECTILE_AMOUNT,
CONFIG_UINT32_AHBOT_CLASS_TRADEGOOD_AMOUNT,
CONFIG_UINT32_AHBOT_CLASS_GENERIC_AMOUNT,
CONFIG_UINT32_AHBOT_CLASS_RECIPE_AMOUNT,
CONFIG_UINT32_AHBOT_CLASS_QUIVER_AMOUNT,
CONFIG_UINT32_AHBOT_CLASS_QUEST_AMOUNT,
CONFIG_UINT32_AHBOT_CLASS_KEY_AMOUNT,
CONFIG_UINT32_AHBOT_CLASS_MISC_AMOUNT,
CONFIG_UINT32_AHBOT_CLASS_GLYPH_AMOUNT,
CONFIG_UINT32_AHBOT_ALLIANCE_PRICE_RATIO,
CONFIG_UINT32_AHBOT_HORDE_PRICE_RATIO,
CONFIG_UINT32_AHBOT_NEUTRAL_PRICE_RATIO,
CONFIG_UINT32_AHBOT_BUYER_CHANCE_RATIO_ALLIANCE,
CONFIG_UINT32_AHBOT_BUYER_CHANCE_RATIO_HORDE,
CONFIG_UINT32_AHBOT_BUYER_CHANCE_RATIO_NEUTRAL,
CONFIG_UINT32_AHBOT_BUYER_RECHECK_INTERVAL,
CONFIG_UINT32_AHBOT_CLASS_MISC_MOUNT_MIN_REQ_LEVEL,
CONFIG_UINT32_AHBOT_CLASS_MISC_MOUNT_MAX_REQ_LEVEL,
CONFIG_UINT32_AHBOT_CLASS_MISC_MOUNT_MIN_SKILL_RANK,
CONFIG_UINT32_AHBOT_CLASS_MISC_MOUNT_MAX_SKILL_RANK,
CONFIG_UINT32_AHBOT_CLASS_GLYPH_MIN_REQ_LEVEL,
CONFIG_UINT32_AHBOT_CLASS_GLYPH_MAX_REQ_LEVEL,
CONFIG_UINT32_AHBOT_CLASS_GLYPH_MIN_ITEM_LEVEL,
CONFIG_UINT32_AHBOT_CLASS_GLYPH_MAX_ITEM_LEVEL,
CONFIG_UINT32_AHBOT_CLASS_TRADEGOOD_MIN_ITEM_LEVEL,
CONFIG_UINT32_AHBOT_CLASS_TRADEGOOD_MAX_ITEM_LEVEL,
CONFIG_UINT32_AHBOT_CLASS_CONTAINER_MIN_ITEM_LEVEL,
CONFIG_UINT32_AHBOT_CLASS_CONTAINER_MAX_ITEM_LEVEL,
CONFIG_UINT32_AHBOT_UINT32_COUNT
};
/**
* @brief
*
*/
enum AuctionBotConfigBoolValues
{
CONFIG_BOOL_AHBOT_BUYER_ALLIANCE_ENABLED,
CONFIG_BOOL_AHBOT_BUYER_HORDE_ENABLED,
CONFIG_BOOL_AHBOT_BUYER_NEUTRAL_ENABLED,
CONFIG_BOOL_AHBOT_ITEMS_VENDOR,
CONFIG_BOOL_AHBOT_ITEMS_LOOT,
CONFIG_BOOL_AHBOT_ITEMS_MISC,
CONFIG_BOOL_AHBOT_BIND_NO,
CONFIG_BOOL_AHBOT_BIND_PICKUP,
CONFIG_BOOL_AHBOT_BIND_EQUIP,
CONFIG_BOOL_AHBOT_BIND_USE,
CONFIG_BOOL_AHBOT_BIND_QUEST,
CONFIG_BOOL_AHBOT_BUYPRICE_SELLER,
CONFIG_BOOL_AHBOT_BUYPRICE_BUYER,
CONFIG_BOOL_AHBOT_DEBUG_SELLER,
CONFIG_BOOL_AHBOT_DEBUG_BUYER,
CONFIG_BOOL_AHBOT_SELLER_ENABLED,
CONFIG_BOOL_AHBOT_BUYER_ENABLED,
CONFIG_BOOL_AHBOT_LOCKBOX_ENABLED,
CONFIG_UINT32_AHBOT_BOOL_COUNT
};
/**
* @brief All basic config data used by other AHBot classes for self-configure.
*
*/
class AuctionBotConfig
{
public:
/**
* @brief
*
*/
AuctionBotConfig();
/**
* @brief
*
* @param filename
*/
void SetConfigFileName(char const* filename) { m_configFileName = filename; }
/**
* @brief
*
* @return bool
*/
bool Initialize();
/**
* @brief
*
* @return const char
*/
const char* GetAHBotIncludes() const { return m_AHBotIncludes.c_str(); }
/**
* @brief
*
* @return const char
*/
const char* GetAHBotExcludes() const { return m_AHBotExcludes.c_str(); }
/**
* @brief
*
* @return uint32 - AH Bot ID
*/
uint32 GetAHBotId() const { return m_BotId; }
/**
* @brief
*
* @param index
* @return uint32
*/
uint32 getConfig(AuctionBotConfigUInt32Values index) const { return m_configUint32Values[index]; }
/**
* @brief
*
* @param index
* @return bool
*/
bool getConfig(AuctionBotConfigBoolValues index) const { return m_configBoolValues[index]; }
/**
* @brief
*
* @param index
* @param value
*/
void setConfig(AuctionBotConfigBoolValues index, bool value) { m_configBoolValues[index] = value; }
/**
* @brief
*
* @param index
* @param value
*/
void setConfig(AuctionBotConfigUInt32Values index, uint32 value) { m_configUint32Values[index] = value; }
/**
* @brief Gets the ratio of items to sell for a given auctionhouse type
*
* @param houseType Type of the house.
* @return uint32 a value between 0 and 10000 probably representing 0%-100%
*/
uint32 getConfigItemAmountRatio(AuctionHouseType houseType) const;
/**
* @brief Gets if a buyer is enabled for the given auctionhouse type
*
* @param houseType Type of the house, ie: alliance/horde/neutral
* @return bool true if a buyer is enabled, false otherwise
*/
bool getConfigBuyerEnabled(AuctionHouseType houseType) const;
/**
* @brief Gets the ratio for the amount of items of a certain quality to be sold
*
* @param quality quality of the item you want to know the ratio for
* @return uint32 probably a value between 0 and 10000 representing 0%-100% as the config values seem to be capped at this
*/
uint32 getConfigItemQualityAmount(AuctionQuality quality) const;
/**
* @brief
*
* @return uint32
*/
uint32 GetItemPerCycleBoost() const { return m_ItemsPerCycleBoost; }
/**
* @brief
*
* @return uint32
*/
uint32 GetItemPerCycleNormal() const { return m_ItemsPerCycleNormal; }
/**
* @brief Reloads the AhBot config.
*
* @return bool true if the config was successfully reloaded, false otherwise
*/
bool Reload();
/**
* @brief Gets the name of the item class.
*
* @param itemclass class of the item you want to lookup name for
* @return const char a string describing the name of the item class
* \see ItemClass
*/
static char const* GetItemClassName(ItemClass itemclass);
/**
* @brief Does the same thing as \ref AuctionBotConfig::GetItemClassName converts a enum
* value to a readable string
*
* @param houseType the housetype you would like to "translate"
* @return const char the string representation of the num value
*/
static char const* GetHouseTypeName(AuctionHouseType houseType);
private:
std::string m_configFileName; /**< TODO */
std::string m_AHBotIncludes; /**< TODO */
std::string m_AHBotExcludes; /**< TODO */
Config m_AhBotCfg; /**< TODO */
uint32 m_ItemsPerCycleBoost; /**< TODO */
uint32 m_ItemsPerCycleNormal; /**< TODO */
uint32 m_BotId;
uint32 m_configUint32Values[CONFIG_UINT32_AHBOT_UINT32_COUNT]; /**< TODO */
bool m_configBoolValues[CONFIG_UINT32_AHBOT_BOOL_COUNT]; /**< TODO */
/**
* @brief
*
* @param AHBotIncludes
*/
void SetAHBotIncludes(const std::string& AHBotIncludes) { m_AHBotIncludes = AHBotIncludes; }
/**
* @brief
*
* @param AHBotExcludes
*/
void SetAHBotExcludes(const std::string& AHBotExcludes) { m_AHBotExcludes = AHBotExcludes; }
/**
* @brief
*
* @param AHBot Character Name
*/
void SetAHBotId(const std::string& BotCharName);
/**
* @brief Sets a certain config value to the given default value
*
* @param index index to set
* @param fieldname name of the field to set, ie: how it is represented in the config file
* @param defvalue the default value for the field
*/
void setConfig(AuctionBotConfigUInt32Values index, char const* fieldname, uint32 defvalue);
/**
* @brief Sets a certain config value to given default value and a max it can have that it will cap at
*
* @param index index to set
* @param fieldname name of the field to set, ie: how it is represented in the config file
* @param defvalue the default value for the field
* @param maxvalue the maximum value this config can have
*/
void setConfigMax(AuctionBotConfigUInt32Values index, char const* fieldname, uint32 defvalue, uint32 maxvalue);
/**
* @brief Sets a certain config value to given default value and a max it can have that it will cap at
*
* @param index index to set
* @param fieldname name of the field to set, ie: how it is represented in the config file
* @param defvalue the default value for the field
* @param minvalue the minimal value this config can have
* @param maxvalue the maximum value this config can have
*/
void setConfigMinMax(AuctionBotConfigUInt32Values index, char const* fieldname, uint32 defvalue, uint32 minvalue, uint32 maxvalue);
/**
* @brief Sets a certain config value to the given default value
*
* @param index index to set
* @param fieldname name of the field to set, ie: how it is represented in the config file
* @param defvalue the default value for this field
*/
void setConfig(AuctionBotConfigBoolValues index, char const* fieldname, bool defvalue);
/**
* @brief Retrieves the configuration for the \ref AuctionHouseBot from a configuration file.
*
*/
void GetConfigFromFile();
};
#define sAuctionBotConfig MaNGOS::Singleton<AuctionBotConfig>::Instance()
/**
* @brief This is the base interface for the \ref AuctionBotSeller and \ref AuctionBotBuyer classes
* which in itself only provides the possibility to use dynamic_cast in some of the
* \ref AuctionHouseBot methods, ie: \ref AuctionHouseBot::SetItemsRatio uses it to cast it's
* member AuctionHouseBot::m_Seller to a \ref AuctionBotSeller.
*
*/
class AuctionBotAgent
{
public:
/**
* @brief
*
*/
AuctionBotAgent() {}
/**
* @brief
*
*/
virtual ~AuctionBotAgent() {}
public:
/**
* @brief Initializes this agent/bot and makes sure that there's anything to actually do for it.
* If there's not it will return false and there's really no interest in keeping it for
* the moment, otherwise returns true and has atleast one active house where it will do
* business.
*
* @return bool true if we intialized with at least one auction house to do business in, false otherwise
*/
virtual bool Initialize() = 0;
/**
* @brief This method updates what's going on on the AH for the bots, ie: if this is called for the
* \ref AuctionBotBuyer it will place bids on items etc if there's a config file for it. If
* the \ref AuctionBotSeller is called instead it would put up some new items if there's a
* config file for it.
*
* @param houseType the house type we should work with while updating
* @return bool true if any update was actually done, ie: we put some items up/bought some, false otherwise
*/
virtual bool Update(AuctionHouseType houseType) = 0;
};
/**
* @brief Structure used in \ref AuctionHouseBot::PrepareStatusInfos to show how many items there
* are in each auction house and how many of each quality there are that were created by
* one of the 2 agents \ref AuctionBotBuyer and \ref AuctionBotSeller
* \see AuctionQuality
*
*/
struct AuctionHouseBotStatusInfoPerType
{
uint32 ItemsCount; /**< How many items there are totally in this AH */
uint32 QualityInfo[MAX_AUCTION_QUALITY]; /**< How many items of each quality there are */
};
/**
* @brief Used to get an array with all possible Action Houses, ie: neutral,ally,horde.
*
*/
typedef AuctionHouseBotStatusInfoPerType AuctionHouseBotStatusInfo[MAX_AUCTION_HOUSE_TYPE];
/**
* @brief This class handle both Selling and Buying method
* (holder of AuctionBotBuyer and AuctionBotSeller objects)
* (Taken from comments in source)
*
* \todo Better description here perhaps
*/
class AuctionHouseBot
{
public:
/**
* @brief Initializes a new instance of the \ref AuctionHouseBot class.
*
*/
AuctionHouseBot();
/**
* @brief Finalizes an instance of the \ref AuctionHouseBot class.
*
*/
~AuctionHouseBot();
/**
* @brief Updates the \ref AuctionHouseBot by checking if either the \ref AuctionBotSeller or
* \ref AuctionBotBuyer wants to sell/buy anything and in that case lets one of them do
* that and the other one will have to wait until the next call to \ref AuctionHouseBot::Update
*
*/
void Update();
/**
* @brief Initializes this instance.
*
*/
void Initialize();
// Followed method is mainly used by level3.cpp for ingame/console command
/**
* @brief Sets the items ratio which probably decides how many items should
* appear in each of the auction houses
*
* @param al The alliance house ratio
* @param ho The horde house ratio
* @param ne The neutral house ratio
*/
void SetItemsRatio(uint32 al, uint32 ho, uint32 ne);
/**
* @brief Sets the items ratio for a specific house, like \ref AuctionHouseBot::SetItemsRatio but
* only for one house.
*
* @param house The house
* @param val The new ratio
*/
void SetItemsRatioForHouse(AuctionHouseType house, uint32 val);
/**
* @brief Sets the items amount.
*
* @param (vals)[] The vals.
*/
void SetItemsAmount(uint32(&vals) [MAX_AUCTION_QUALITY]);
/**
* @brief Changes the ratio for how often a certain quality of items should show up at the
* AH. A specialised version of \ref AuctionHouseBot::SetItemsAmount
*
* @param quality quality of the items you want to change the ratio for
* @param val the new ratio you want as a value between 0-10000 probably representing 0%-100%
* \see AuctionQuality
*/
void SetItemsAmountForQuality(AuctionQuality quality, uint32 val);
/**
* @brief Reloads all the configurations, for the AH bot and for both \ref AuctionBotBuyer and
* \ref AuctionBotSeller and ourselves
*
* @return bool true if it went well, false otherwise
*/
bool ReloadAllConfig();
/**
* @brief Expires all the items currently created by the AH bot and they'll be replaced later on
* again. If parameter all is false only auctions without a bid are removed.
*
* @param all Whether to expire all auctions or only those without a bid
*/
void Rebuild(bool all);
/**
* @brief Fills a status info structure with data about how many items of each there
* currently are in the auction house that the auction bot has created
*
* @param statusInfo the structure to fill with data
*/
void PrepareStatusInfos(AuctionHouseBotStatusInfo& statusInfo);
private:
/**
* @brief Initializes the agents, ie: the \ref AuctionBotBuyer and \ref AuctionBotSeller
*
*/
void InitializeAgents();
AuctionBotAgent* m_Buyer; /**< The buyer (\ref AuctionBotBuyer) for this \ref AuctionHouseBot */
AuctionBotAgent* m_Seller; /**< The seller (\ref AuctionBotSeller) for this \ref AuctionHouseBot */
uint32 m_OperationSelector; /**< 0..2*MAX_AUCTION_HOUSE_TYPE-1 */
};
///Convenience to easily access the singleton for the \ref AuctionHouseBot
#define sAuctionBot MaNGOS::Singleton<AuctionHouseBot>::Instance()
/** @} */
#endif