mirror of
https://github.com/mod-playerbots/mod-playerbots.git
synced 2026-01-13 00:58:33 +00:00
The idea is to centralize the creation, assignment, and management of bot guilds into a single class that can be referenced. The way this is intended to work. when the manager is created, if the config option to delete guilds is set, then it deletes all bot guilds. On startup 1. Load all guild names from database. Shuffle keys for some randomization. 2. Load Guilds from database 3. For existing guilds, identify the guild faction, number of members, and assess if the guild is 'full' based on the number of bots set in config. 4. Determine if the leader of the guild is a real player based on the leader account. 5. Mark any playerbot guild names as not available (false). The validation process (2-5) is set to run once an hour. Guild Creation. Now guild creation occurs on an as needed bases during the initialization process. Previously, all of the guilds would be created at once, and then randomly assigned. When a bot is not in a guild during initialization, it will check if there are any partially filled guilds of that bots faction where the bot can be assigned to. If not, and the cache of bot guilds is less than the set number in config, it will randomly return the available name. This then goes to the CreateGuild function where the core guild manager creates a guild, the guild emblem is set, and the cache updated. If a bot is assigned to guild, but fails to join then it throws an error. Checking for real player guilds function now lives in the guild manager. --------- Co-authored-by: bashermens <31279994+hermensbas@users.noreply.github.com>
457 lines
15 KiB
C++
457 lines
15 KiB
C++
/*
|
|
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU AGPL v3 license, you may redistribute it
|
|
* and/or modify it under version 3 of the License, or (at your option), any later version.
|
|
*/
|
|
|
|
#ifndef _PLAYERBOT_PLAYERbotAICONFIG_H
|
|
#define _PLAYERBOT_PLAYERbotAICONFIG_H
|
|
|
|
#include <mutex>
|
|
#include <unordered_map>
|
|
|
|
#include "Common.h"
|
|
#include "DBCEnums.h"
|
|
#include "SharedDefines.h"
|
|
#include "Talentspec.h"
|
|
|
|
enum class BotCheatMask : uint32
|
|
{
|
|
none = 0,
|
|
taxi = 1,
|
|
gold = 2,
|
|
health = 4,
|
|
mana = 8,
|
|
power = 16,
|
|
raid = 32,
|
|
food = 64,
|
|
maxMask = 128
|
|
};
|
|
|
|
enum class HealingManaEfficiency : uint8
|
|
{
|
|
VERY_LOW = 1,
|
|
LOW = 2,
|
|
MEDIUM = 4,
|
|
HIGH = 8,
|
|
VERY_HIGH = 16,
|
|
SUPERIOR = 32
|
|
};
|
|
|
|
enum NewRpgStatus : int
|
|
{
|
|
RPG_STATUS_START = 0,
|
|
// Going to far away place
|
|
RPG_GO_GRIND = 0,
|
|
RPG_GO_CAMP = 1,
|
|
// Exploring nearby
|
|
RPG_WANDER_RANDOM = 2,
|
|
RPG_WANDER_NPC = 3,
|
|
// Do Quest (based on quest status)
|
|
RPG_DO_QUEST = 4,
|
|
// Travel
|
|
RPG_TRAVEL_FLIGHT = 5,
|
|
// Taking a break
|
|
RPG_REST = 6,
|
|
// Initial status
|
|
RPG_IDLE = 7,
|
|
RPG_STATUS_END = 8
|
|
};
|
|
|
|
#define MAX_SPECNO 20
|
|
|
|
class PlayerbotAIConfig
|
|
{
|
|
public:
|
|
PlayerbotAIConfig(){};
|
|
static PlayerbotAIConfig* instance()
|
|
{
|
|
static PlayerbotAIConfig instance;
|
|
return &instance;
|
|
}
|
|
|
|
bool Initialize();
|
|
bool IsInRandomAccountList(uint32 id);
|
|
bool IsInRandomQuestItemList(uint32 id);
|
|
bool IsPvpProhibited(uint32 zoneId, uint32 areaId);
|
|
bool IsInPvpProhibitedZone(uint32 id);
|
|
bool IsInPvpProhibitedArea(uint32 id);
|
|
|
|
bool enabled;
|
|
bool disabledWithoutRealPlayer;
|
|
bool EnableICCBuffs;
|
|
bool allowAccountBots, allowGuildBots, allowTrustedAccountBots;
|
|
bool randomBotGuildNearby, randomBotInvitePlayer, inviteChat;
|
|
uint32 globalCoolDown, reactDelay, maxWaitForMove, disableMoveSplinePath, maxMovementSearchTime, expireActionTime,
|
|
dispelAuraDuration, passiveDelay, repeatDelay, errorDelay, rpgDelay, sitDelay, returnDelay, lootDelay;
|
|
bool dynamicReactDelay;
|
|
float sightDistance, spellDistance, reactDistance, grindDistance, lootDistance, shootDistance, fleeDistance,
|
|
tooCloseDistance, meleeDistance, followDistance, whisperDistance, contactDistance, aoeRadius, rpgDistance,
|
|
targetPosRecalcDistance, farDistance, healDistance, aggroDistance;
|
|
uint32 criticalHealth, lowHealth, mediumHealth, almostFullHealth;
|
|
uint32 lowMana, mediumMana, highMana;
|
|
bool autoSaveMana;
|
|
uint32 saveManaThreshold;
|
|
bool autoAvoidAoe;
|
|
float maxAoeAvoidRadius;
|
|
std::set<uint32> aoeAvoidSpellWhitelist;
|
|
bool tellWhenAvoidAoe;
|
|
std::set<uint32> disallowedGameObjects;
|
|
|
|
uint32 openGoSpell;
|
|
bool randomBotAutologin;
|
|
bool botAutologin;
|
|
std::string randomBotMapsAsString;
|
|
float probTeleToBankers;
|
|
bool enableWeightTeleToCityBankers;
|
|
int weightTeleToStormwind;
|
|
int weightTeleToIronforge;
|
|
int weightTeleToDarnassus;
|
|
int weightTeleToExodar;
|
|
int weightTeleToOrgrimmar;
|
|
int weightTeleToUndercity;
|
|
int weightTeleToThunderBluff;
|
|
int weightTeleToSilvermoonCity;
|
|
int weightTeleToShattrathCity;
|
|
int weightTeleToDalaran;
|
|
std::vector<uint32> randomBotMaps;
|
|
std::vector<uint32> randomBotQuestItems;
|
|
std::vector<uint32> randomBotAccounts;
|
|
std::vector<uint32> randomBotSpellIds;
|
|
std::vector<uint32> randomBotQuestIds;
|
|
uint32 randomBotTeleportDistance;
|
|
float randomGearLoweringChance;
|
|
bool incrementalGearInit;
|
|
int32 randomGearQualityLimit;
|
|
int32 randomGearScoreLimit;
|
|
float randomBotMinLevelChance, randomBotMaxLevelChance;
|
|
float randomBotRpgChance;
|
|
uint32 minRandomBots, maxRandomBots;
|
|
uint32 randomBotUpdateInterval, randomBotCountChangeMinInterval, randomBotCountChangeMaxInterval;
|
|
uint32 minRandomBotInWorldTime, maxRandomBotInWorldTime;
|
|
uint32 minRandomBotRandomizeTime, maxRandomBotRandomizeTime;
|
|
uint32 minRandomBotChangeStrategyTime, maxRandomBotChangeStrategyTime;
|
|
uint32 minRandomBotReviveTime, maxRandomBotReviveTime;
|
|
uint32 minRandomBotTeleportInterval, maxRandomBotTeleportInterval;
|
|
uint32 permanentlyInWorldTime;
|
|
uint32 minRandomBotPvpTime, maxRandomBotPvpTime;
|
|
uint32 randomBotsPerInterval;
|
|
uint32 minRandomBotsPriceChangeInterval, maxRandomBotsPriceChangeInterval;
|
|
uint32 disabledWithoutRealPlayerLoginDelay, disabledWithoutRealPlayerLogoutDelay;
|
|
bool randomBotJoinLfg;
|
|
|
|
// Buff system
|
|
// Min group size to use Greater buffs (Paladin, Mage, Druid). Default: 3
|
|
int32 minBotsForGreaterBuff;
|
|
// Cooldown (seconds) between reagent-missing RP warnings, per bot & per buff. Default: 30
|
|
int32 rpWarningCooldown;
|
|
|
|
// Professions
|
|
bool enableFishingWithMaster;
|
|
float fishingDistanceFromMaster, fishingDistance, endFishingWithMaster;
|
|
|
|
// chat
|
|
bool randomBotTalk;
|
|
bool randomBotEmote;
|
|
bool randomBotSuggestDungeons;
|
|
bool enableBroadcasts;
|
|
bool enableGreet;
|
|
bool randomBotSayWithoutMaster;
|
|
|
|
uint32 broadcastChanceMaxValue;
|
|
|
|
uint32 broadcastToGuildGlobalChance;
|
|
uint32 broadcastToWorldGlobalChance;
|
|
uint32 broadcastToGeneralGlobalChance;
|
|
uint32 broadcastToTradeGlobalChance;
|
|
uint32 broadcastToLFGGlobalChance;
|
|
uint32 broadcastToLocalDefenseGlobalChance;
|
|
uint32 broadcastToWorldDefenseGlobalChance;
|
|
uint32 broadcastToGuildRecruitmentGlobalChance;
|
|
|
|
uint32 broadcastChanceLootingItemPoor;
|
|
uint32 broadcastChanceLootingItemNormal;
|
|
uint32 broadcastChanceLootingItemUncommon;
|
|
uint32 broadcastChanceLootingItemRare;
|
|
uint32 broadcastChanceLootingItemEpic;
|
|
uint32 broadcastChanceLootingItemLegendary;
|
|
uint32 broadcastChanceLootingItemArtifact;
|
|
|
|
uint32 broadcastChanceQuestAccepted;
|
|
uint32 broadcastChanceQuestUpdateObjectiveCompleted;
|
|
uint32 broadcastChanceQuestUpdateObjectiveProgress;
|
|
uint32 broadcastChanceQuestUpdateFailedTimer;
|
|
uint32 broadcastChanceQuestUpdateComplete;
|
|
uint32 broadcastChanceQuestTurnedIn;
|
|
|
|
uint32 broadcastChanceKillNormal;
|
|
uint32 broadcastChanceKillElite;
|
|
uint32 broadcastChanceKillRareelite;
|
|
uint32 broadcastChanceKillWorldboss;
|
|
uint32 broadcastChanceKillRare;
|
|
uint32 broadcastChanceKillUnknown;
|
|
uint32 broadcastChanceKillPet;
|
|
uint32 broadcastChanceKillPlayer;
|
|
|
|
uint32 broadcastChanceLevelupGeneric;
|
|
uint32 broadcastChanceLevelupTenX;
|
|
uint32 broadcastChanceLevelupMaxLevel;
|
|
|
|
uint32 broadcastChanceSuggestInstance;
|
|
uint32 broadcastChanceSuggestQuest;
|
|
uint32 broadcastChanceSuggestGrindMaterials;
|
|
uint32 broadcastChanceSuggestGrindReputation;
|
|
uint32 broadcastChanceSuggestSell;
|
|
uint32 broadcastChanceSuggestSomething;
|
|
|
|
uint32 broadcastChanceSuggestSomethingToxic;
|
|
|
|
uint32 broadcastChanceSuggestToxicLinks;
|
|
std::string toxicLinksPrefix;
|
|
uint32 toxicLinksRepliesChance;
|
|
|
|
uint32 broadcastChanceSuggestThunderfury;
|
|
uint32 thunderfuryRepliesChance;
|
|
|
|
uint32 broadcastChanceGuildManagement;
|
|
|
|
uint32 guildRepliesRate;
|
|
|
|
bool suggestDungeonsInLowerCaseRandomly;
|
|
|
|
// --
|
|
|
|
bool randomBotJoinBG;
|
|
bool randomBotAutoJoinBG;
|
|
|
|
std::string randomBotAutoJoinICBrackets;
|
|
std::string randomBotAutoJoinEYBrackets;
|
|
std::string randomBotAutoJoinAVBrackets;
|
|
std::string randomBotAutoJoinABBrackets;
|
|
std::string randomBotAutoJoinWSBrackets;
|
|
|
|
uint32 randomBotAutoJoinBGICCount;
|
|
uint32 randomBotAutoJoinBGEYCount;
|
|
uint32 randomBotAutoJoinBGAVCount;
|
|
uint32 randomBotAutoJoinBGABCount;
|
|
uint32 randomBotAutoJoinBGWSCount;
|
|
|
|
uint32 randomBotAutoJoinArenaBracket;
|
|
|
|
uint32 randomBotAutoJoinBGRatedArena2v2Count;
|
|
uint32 randomBotAutoJoinBGRatedArena3v3Count;
|
|
uint32 randomBotAutoJoinBGRatedArena5v5Count;
|
|
|
|
bool randomBotLoginAtStartup;
|
|
uint32 randomBotTeleLowerLevel, randomBotTeleHigherLevel;
|
|
std::map<uint32, std::pair<uint32, uint32>> zoneBrackets;
|
|
bool logInGroupOnly, logValuesPerTick;
|
|
bool fleeingEnabled;
|
|
bool summonAtInnkeepersEnabled;
|
|
std::string combatStrategies, nonCombatStrategies;
|
|
std::string randomBotCombatStrategies, randomBotNonCombatStrategies;
|
|
bool applyInstanceStrategies;
|
|
uint32 randomBotMinLevel, randomBotMaxLevel;
|
|
float randomChangeMultiplier;
|
|
|
|
// std::string premadeLevelSpec[MAX_CLASSES][10][91]; //lvl 10 - 100
|
|
// ClassSpecs classSpecs[MAX_CLASSES];
|
|
|
|
std::string premadeSpecName[MAX_CLASSES][MAX_SPECNO];
|
|
std::string premadeSpecGlyph[MAX_CLASSES][MAX_SPECNO];
|
|
std::vector<uint32> parsedSpecGlyph[MAX_CLASSES][MAX_SPECNO];
|
|
std::string premadeSpecLink[MAX_CLASSES][MAX_SPECNO][MAX_LEVEL];
|
|
std::string premadeHunterPetLink[3][21];
|
|
std::vector<std::vector<uint32>> parsedSpecLinkOrder[MAX_CLASSES][MAX_SPECNO][MAX_LEVEL];
|
|
std::vector<std::vector<uint32>> parsedHunterPetLinkOrder[3][21];
|
|
uint32 randomClassSpecProb[MAX_CLASSES][MAX_SPECNO];
|
|
uint32 randomClassSpecIndex[MAX_CLASSES][MAX_SPECNO];
|
|
|
|
std::string commandPrefix, commandSeparator;
|
|
std::string randomBotAccountPrefix;
|
|
uint32 randomBotAccountCount;
|
|
bool randomBotRandomPassword;
|
|
bool deleteRandomBotAccounts;
|
|
uint32 randomBotGuildCount, randomBotGuildSizeMax;
|
|
bool deleteRandomBotGuilds;
|
|
std::vector<uint32> pvpProhibitedZoneIds;
|
|
std::vector<uint32> pvpProhibitedAreaIds;
|
|
bool fastReactInBG;
|
|
|
|
bool randombotsWalkingRPG;
|
|
bool randombotsWalkingRPGInDoors;
|
|
uint32 minEnchantingBotLevel;
|
|
uint32 limitEnchantExpansion;
|
|
uint32 limitGearExpansion;
|
|
uint32 randombotStartingLevel;
|
|
bool enablePeriodicOnlineOffline;
|
|
float periodicOnlineOfflineRatio;
|
|
bool gearscorecheck;
|
|
bool randomBotPreQuests;
|
|
|
|
bool guildTaskEnabled;
|
|
uint32 minGuildTaskChangeTime, maxGuildTaskChangeTime;
|
|
uint32 minGuildTaskAdvertisementTime, maxGuildTaskAdvertisementTime;
|
|
uint32 minGuildTaskRewardTime, maxGuildTaskRewardTime;
|
|
uint32 guildTaskAdvertCleanupTime;
|
|
uint32 guildTaskKillTaskDistance;
|
|
|
|
uint32 iterationsPerTick;
|
|
|
|
std::mutex m_logMtx;
|
|
std::vector<std::string> tradeActionExcludedPrefixes;
|
|
std::vector<std::string> allowedLogFiles;
|
|
std::unordered_map<std::string, std::pair<FILE*, bool>> logFiles;
|
|
|
|
std::vector<std::string> botCheats;
|
|
uint32 botCheatMask = 0;
|
|
|
|
struct worldBuff
|
|
{
|
|
uint32 spellId;
|
|
uint32 factionId;
|
|
uint32 classId;
|
|
uint32 specId;
|
|
uint32 minLevel;
|
|
uint32 maxLevel;
|
|
};
|
|
|
|
std::vector<worldBuff> worldBuffs;
|
|
|
|
uint32 commandServerPort;
|
|
bool perfMonEnabled;
|
|
bool summonWhenGroup;
|
|
bool randomBotShowHelmet;
|
|
bool randomBotShowCloak;
|
|
bool randomBotFixedLevel;
|
|
bool disableRandomLevels;
|
|
float randomBotXPRate;
|
|
uint32 randomBotAllianceRatio;
|
|
uint32 randomBotHordeRatio;
|
|
bool disableDeathKnightLogin;
|
|
bool limitTalentsExpansion;
|
|
uint32 botActiveAlone;
|
|
uint32 BotActiveAloneForceWhenInRadius;
|
|
bool BotActiveAloneForceWhenInZone;
|
|
bool BotActiveAloneForceWhenInMap;
|
|
bool BotActiveAloneForceWhenIsFriend;
|
|
bool BotActiveAloneForceWhenInGuild;
|
|
bool botActiveAloneSmartScale;
|
|
uint32 botActiveAloneSmartScaleDiffLimitfloor;
|
|
uint32 botActiveAloneSmartScaleDiffLimitCeiling;
|
|
uint32 botActiveAloneSmartScaleWhenMinLevel;
|
|
uint32 botActiveAloneSmartScaleWhenMaxLevel;
|
|
|
|
bool freeMethodLoot;
|
|
int32 lootRollLevel;
|
|
std::string autoPickReward;
|
|
bool autoEquipUpgradeLoot;
|
|
float equipUpgradeThreshold;
|
|
bool twoRoundsGearInit;
|
|
bool syncQuestWithPlayer;
|
|
bool syncQuestForPlayer;
|
|
bool dropObsoleteQuests;
|
|
std::string autoTrainSpells;
|
|
bool autoPickTalents;
|
|
bool autoUpgradeEquip;
|
|
int32 hunterWolfPet;
|
|
int32 defaultPetStance;
|
|
int32 petChatCommandDebug;
|
|
bool autoLearnTrainerSpells;
|
|
bool autoDoQuests;
|
|
bool enableNewRpgStrategy;
|
|
std::unordered_map<NewRpgStatus, uint32> RpgStatusProbWeight;
|
|
bool syncLevelWithPlayers;
|
|
bool autoLearnQuestSpells;
|
|
bool autoTeleportForLevel;
|
|
bool randomBotGroupNearby;
|
|
int32 enableRandomBotTrading;
|
|
uint32 tweakValue; // Debugging config
|
|
|
|
uint32 randomBotArenaTeamCount;
|
|
uint32 randomBotArenaTeamMaxRating;
|
|
uint32 randomBotArenaTeamMinRating;
|
|
uint32 randomBotArenaTeam2v2Count;
|
|
uint32 randomBotArenaTeam3v3Count;
|
|
uint32 randomBotArenaTeam5v5Count;
|
|
bool deleteRandomBotArenaTeams;
|
|
std::vector<uint32> randomBotArenaTeams;
|
|
|
|
uint32 selfBotLevel;
|
|
bool downgradeMaxLevelBot;
|
|
bool equipmentPersistence;
|
|
int32 equipmentPersistenceLevel;
|
|
int32 groupInvitationPermission;
|
|
bool keepAltsInGroup = false;
|
|
bool KeepAltsInGroup() const { return keepAltsInGroup; }
|
|
bool allowSummonInCombat;
|
|
bool allowSummonWhenMasterIsDead;
|
|
bool allowSummonWhenBotIsDead;
|
|
int reviveBotWhenSummoned;
|
|
bool botRepairWhenSummon;
|
|
bool autoInitOnly;
|
|
float autoInitEquipLevelLimitRatio;
|
|
int32 maxAddedBots;
|
|
int32 addClassCommand;
|
|
int32 addClassAccountPoolSize;
|
|
int32 maintenanceCommand;
|
|
bool altMaintenanceAttunementQs,
|
|
altMaintenanceBags,
|
|
altMaintenanceAmmo,
|
|
altMaintenanceFood,
|
|
altMaintenanceReagents,
|
|
altMaintenanceConsumables,
|
|
altMaintenancePotions,
|
|
altMaintenanceTalentTree,
|
|
altMaintenancePet,
|
|
altMaintenancePetTalents,
|
|
altMaintenanceClassSpells,
|
|
altMaintenanceAvailableSpells,
|
|
altMaintenanceSkills,
|
|
altMaintenanceReputation,
|
|
altMaintenanceSpecialSpells,
|
|
altMaintenanceMounts,
|
|
altMaintenanceGlyphs,
|
|
altMaintenanceKeyring,
|
|
altMaintenanceGemsEnchants;
|
|
int32 autoGearCommand, autoGearCommandAltBots, autoGearQualityLimit, autoGearScoreLimit;
|
|
|
|
uint32 useGroundMountAtMinLevel;
|
|
uint32 useFastGroundMountAtMinLevel;
|
|
uint32 useFlyMountAtMinLevel;
|
|
uint32 useFastFlyMountAtMinLevel;
|
|
|
|
// stagger flightpath takeoff
|
|
uint32 delayMin;
|
|
uint32 delayMax;
|
|
uint32 gapMs;
|
|
uint32 gapJitterMs;
|
|
|
|
std::string const GetTimestampStr();
|
|
bool hasLog(std::string const fileName)
|
|
{
|
|
return std::find(allowedLogFiles.begin(), allowedLogFiles.end(), fileName) != allowedLogFiles.end();
|
|
};
|
|
bool openLog(std::string const fileName, char const* mode = "a");
|
|
bool isLogOpen(std::string const fileName)
|
|
{
|
|
auto it = logFiles.find(fileName);
|
|
return it != logFiles.end() && it->second.second;
|
|
}
|
|
void log(std::string const fileName, const char* str, ...);
|
|
|
|
void loadWorldBuff();
|
|
|
|
static std::vector<std::vector<uint32>> ParseTempTalentsOrder(uint32 cls, std::string temp_talents_order);
|
|
static std::vector<std::vector<uint32>> ParseTempPetTalentsOrder(uint32 spec, std::string temp_talents_order);
|
|
|
|
bool restrictHealerDPS = false;
|
|
std::vector<uint32> restrictedHealerDPSMaps;
|
|
bool IsRestrictedHealerDPSMap(uint32 mapId) const;
|
|
|
|
std::vector<uint32> excludedHunterPetFamilies;
|
|
};
|
|
|
|
#define sPlayerbotAIConfig PlayerbotAIConfig::instance()
|
|
|
|
#endif
|