diff --git a/Playerbot-configuration.md b/Playerbot-configuration.md new file mode 100644 index 0000000..ba3a54d --- /dev/null +++ b/Playerbot-configuration.md @@ -0,0 +1,241 @@ +## Random bots activity profiles. +Before going into the configuration options we need explain the logic abit. Every update tick of the server its calculated whether a bot can +or can't be active. An active bots takes and eats alot more resources then an idle bot. + +The following logic is applied to determine whether a bot is active or not, applied in the explained order. + +``` +1. NOT ACTIVE: When server just started and the server update is smaller then (max amount of bots * 0.12 seconds) +2. ALWAYS ACTIVE: When bot is in battleground, instance or raid. +3. ALWAYS ACTIVE: When in combat and not in party (defend urself) +4. ALWAYS ACTIVE: If bot zone has a real players +5. ALWAYS ACTIVE: When the bots is a member of a guild with real players +6. ALWAYS ACTIVE: Has real player as master +7. ALWAYS ACTIVE: if grouped and the leader is a real player +8. ALWAYS ACTIVE: if in battleground queue +9. ALWAYS ACTIVE: if looking for group +10. ALWAYS ACTIVE: If bot has a real player within the radius 300 yards +11. ALWAYS ACTIVE: When bot is on a friendlist of a online real player +12. ALWAYS ACTIVE: When bot has more then 10 other bots within the sightDistance, force to spread out +``` +These rules will always be applied regardless what value you have configured **'AiPlayerbot.BotActiveAlone'**. + +*** + +All remaining situations e.g. bots in zones or maps without real players, empty server etc will be configured +based on the **'AiPlayerbot.BotActiveAlone'** value. That value basically means that the bot has about +% chance to get active for only a few seconds. Unless in those few seconds one of the above rules +is triggered then it possible might remain active longer. + +Then **'AiPlayerbot.botActiveAloneSmartScale'** basically auto scale the activity percentages +based on the latency, relative to the configured value of **'AiPlayerbot.BotActiveAlone'**. And only when in +the bots is the level scope of the configured values of: +* **'AiPlayerbot.botActiveAloneSmartScaleWhenMinLevel'** +* **'AiPlayerbot.botActiveAloneSmartScaleWhenMinLevel'** + +*** + +#### 1. best performance with high bot count. +My personal preference is that i keep my bots idle when i am not in the zone or map, which is applied with the following config +and in this specific requirement it doesnt rlly matter autoscale is on or off but i leave it on. + +``` +AiPlayerbot.BotActiveAlone = 10 +AiPlayerbot.botActiveAloneSmartScale = 1 +AiPlayerbot.botActiveAloneSmartScaleWhenMinLevel = 1 +AiPlayerbot.botActiveAloneSmartScaleWhenMaxLevel = 80 +``` + +#### 2. Default; best effort to enforce 100% acitivity but auto adjust when needed +(prolly best profile with a server with more real players spread over different zones and maps). +When you want all bots active in all situations but you want to server to compensate the bot +acitivity based on your latency then use (basically best effort for 100%) : +``` +AiPlayerbot.BotActiveAlone = 100 +AiPlayerbot.botActiveAloneSmartScale = 1 +AiPlayerbot.botActiveAloneSmartScaleWhenMinLevel = 1 +AiPlayerbot.botActiveAloneSmartScaleWhenMaxLevel = 80 +``` + +#### 3. All bots active regardless your latency and performance impact. +``` +AiPlayerbot.BotActiveAlone = 100 +AiPlayerbot.botActiveAloneSmartScale = 0 +AiPlayerbot.botActiveAloneSmartScaleWhenMinLevel = 1 +AiPlayerbot.botActiveAloneSmartScaleWhenMaxLevel = 80 +``` + +#### 4. All bots active and only apply autoscale on a level range (e.g. high levels) +``` +AiPlayerbot.BotActiveAlone = 100 +AiPlayerbot.botActiveAloneSmartScale = 1 +AiPlayerbot.botActiveAloneSmartScaleWhenMinLevel = 75 +AiPlayerbot.botActiveAloneSmartScaleWhenMaxLevel = 80 +``` + +*** + +#### Check profile and performance +Use the command '.server info' to see your latencies. The general latenciesshould be under 70-80 and the percentiles maxed out around +100, 120, 150. And verify how quick a bot executes your command. It should be pretty much instant. If not to should choose a different profile +and/or lower your bot amount. + +If dont use the performance checks it might result into strange and incorrect bot behaviours and/or huge amount of memory footprint growth in +a relative short time (OOM) + +##### Reference +I use profile 1 with 5000 bots on amd 5700x (6 cores), linux, 20GB with the following result: + +![image](https://github.com/user-attachments/assets/6760feaf-3dc7-4d7a-9534-d4183ff43284) + + +## Recommended hardware +``` +Memory + minimal: 16GB + preferable: 32GB or more +CPU cores: + minimal: 4 cores + preferable: 6 or more cores +CPU speed: + minimal: 3000mhz + preferable: 4400mhz or more +``` + +## Recommended config +worldserver.conf +```bash +# bots might not pickup quests in certain condidations +Quests.IgnoreAutoAccept = 1 + +# performance +PreloadAllNonInstancedMapGrids = 0 +SetAllCreaturesWithWaypointMovementActive = 0 +DontCacheRandomMovementPaths = 0 +MapUpdate.Threads = 4 or 6 +MapUpdateInterval = 10 +MinWorldUpdateTime = 1 + +# no player limit for the bots +PlayerLimit = 0 + +# prevent buggy situations +LeaveGroupOnLogout.Enabled = 1 +``` + +playerbots.conf +```bash + + +#------------------------------------------------------------------- +# general +#------------------------------------------------------------------- +AiPlayerbot.Enabled = 1 +AiPlayerbot.DeleteRandomBotAccounts = 0 +AiPlayerbot.RandomBotAccountPrefix = "rndbot" + +#------------------------------------------------------------------- +# randombots +# - RandomBotMaps: 0=Eastern Kingdoms, 1=Kalimdor, 530=Outland, 571=Northrend +#------------------------------------------------------------------- +AiPlayerbot.RandomBotMinLevel = 1 +AiPlayerbot.RandomBotMaxLevel = 80 +AiPlayerbot.AutoTeleportForLevel = 1 +AiPlayerbot.RandomBotMaps = 0,1,530,571 +AiPlayerbot.ProbTeleToBankers = 0.25 +AiPlayerbot.RandomBotMaxLevelChance = 0.01 +AiPlayerbot.RandomBotFixedLevel = 0 +AiPlayerbot.DisableRandomLevels = 0 +AiPlayerbot.RandombotStartingLevel = 5 +AiPlayerbot.SyncLevelWithPlayers = 0 +AiPlayerbot.DisableDeathKnightLogin = 1 +AiPlayerbot.SyncQuestWithPlayer = 1 +AiPlayerbot.AutoDoQuests = 1 + + +#------------------------------------------------------------------- +# command (gear: 1 = normal, 2 = uncommon, 3 = rare, 4 = epic, 5 = legendary) +#------------------------------------------------------------------- +AiPlayerbot.AutoGearQualityLimit = 4 +AiPlayerbot.AutoGearCommand = 1 +AiPlayerbot.MaintenanceCommand = 1 +AiPlayerbot.AllowPlayerBots = 1 +AiPlayerbot.AllowGuildBots = 1 + +#------------------------------------------------------------------- +# chat and broadcast (default; RepeatDelay = 2000) +#------------------------------------------------------------------- +#AiPlayerbot.RepeatDelay = 2000 +AiPlayerbot.EnableBroadcasts = 0 +AiPlayerbot.RandomBotTalk = 0 +AiPlayerbot.RandomBotEmote = 0 +AiPlayerbot.RandomBotSuggestDungeons = 0 +AiPlayerbot.EnableGreet = 0 +AiPlayerbot.ToxicLinksRepliesChance = 0 +AiPlayerbot.ThunderfuryRepliesChance = 0 +AiPlayerbot.GuildRepliesRate = 0 +AIPlayerbot.GuildFeedback = 0 +AiPlayerbot.RandomBotSayWithoutMaster = 0 + + +#------------------------------------------------------------------- +# intervals +#------------------------------------------------------------------- +AiPlayerbot.RandomBotUpdateInterval = 20 +AiPlayerbot.RandomBotCountChangeMinInterval = 1800 +AiPlayerbot.RandomBotCountChangeMaxInterval = 7200 +AiPlayerbot.MinRandomBotInWorldTime = 3600 +AiPlayerbot.MaxRandomBotInWorldTime = 1209600 +AiPlayerbot.MinRandomBotRandomizeTime = 7200 +AiPlayerbot.MaxRandomBotRandomizeTime = 1209600 +AiPlayerbot.RandomBotsPerInterval = 60 +AiPlayerbot.MinRandomBotReviveTime = 60 +AiPlayerbot.MaxRandomBotReviveTime = 300 +AiPlayerbot.MinRandomBotTeleportInterval = 3600 +AiPlayerbot.MaxRandomBotTeleportInterval = 18000 +AiPlayerbot.RandomBotInWorldWithRotationDisabled = 31104000 + + +#------------------------------------------------------------------- +# distance +#------------------------------------------------------------------- +AiPlayerbot.FarDistance = 20.0 +AiPlayerbot.SightDistance = 75.0 +AiPlayerbot.SpellDistance = 28.5 +AiPlayerbot.ShootDistance = 26.0 +AiPlayerbot.ReactDistance = 150.0 +AiPlayerbot.GrindDistance = 75.0 +AiPlayerbot.HealDistance = 38.5 +AiPlayerbot.LootDistance = 25.0 +AiPlayerbot.FleeDistance = 8.0 +AiPlayerbot.TooCloseDistance = 5.0 +AiPlayerbot.MeleeDistance = 1.5 +AiPlayerbot.FollowDistance = 1.5 +AiPlayerbot.WhisperDistance = 6000.0 +AiPlayerbot.ContactDistance = 0.5 +AiPlayerbot.AoeRadius = 10 +AiPlayerbot.RpgDistance = 200 +AiPlayerbot.AggroDistance = 22 + + +#------------------------------------------------------------------- +# performance related +#------------------------------------------------------------------- +AiPlayerbot.BotActiveAlone = 10 (either use 10% or 100% anything is between is kinda useless) +AiPlayerbot.botActiveAloneSmartScale = 1 +AiPlayerbot.botActiveAloneSmartScaleWhenMinLevel = 1 +AiPlayerbot.botActiveAloneSmartScaleWhenMaxLevel = 80 + +PlayerbotsDatabase.WorkerThreads = 1 +PlayerbotsDatabase.SynchThreads = 2 +``` + +## Memory footprint +With too many bots the memory footprint wil grow rather quickly, even with good latency numbers +the bots can get out of sync with the world. Find good balance between your hardware and the +configured amount of (random/alt) bots. + +Until fixed if ever, restart your server every x hours depending on your configuration, hardware, player base/usage. + +e.g. with a cronjob +..