{ "schema": 1, "scope": "bots", "categories": [ { "id": "general", "title": "General" }, { "id": "population", "title": "Population" }, { "id": "login", "title": "Login" }, { "id": "roles", "title": "Roles" }, { "id": "openworld", "title": "Open World" }, { "id": "quests", "title": "Quests" }, { "id": "combat", "title": "Combat" }, { "id": "dungeon", "title": "Dungeon Finder" }, { "id": "battlegrounds", "title": "Battlegrounds" }, { "id": "social", "title": "Social Behavior" }, { "id": "advanced", "title": "Advanced" } ], "settings": [ { "key": "CoaBots.RandomSpawn.DefaultCount", "type": "int", "category": "population", "title": "Bots created per spawn command", "description": "How many bots the spawn command creates when you do not give a number.", "default": 10, "advanced": false, "restartRequired": "world", "dangerous": false, "min": 1, "max": 1000 }, { "key": "CoaBots.RandomSpawn.MaxCount", "type": "int", "category": "population", "title": "Largest single spawn", "description": "Safety limit for one spawn command. Very large batches can freeze the server for a moment, so raise this only when nobody else is playing.", "default": 1000, "advanced": true, "restartRequired": "world", "dangerous": true, "min": 1, "max": 5000 }, { "key": "CoaBots.LeveledSpawn.Brackets", "type": "string", "category": "population", "title": "Level mix of new bots", "description": "How new levelling bots are spread over levels, as ranges with weights (1-20:40 means 40 parts of bots between level 1 and 20).", "default": "1-20:40,21-60:33,61-79:20,80-80:7", "advanced": true, "restartRequired": "world", "dangerous": false }, { "key": "CoaBots.RandomSpawn.AutoLogin", "type": "bool", "category": "population", "title": "Bring new bots online immediately", "description": "Newly created bots log in right away instead of waiting in the database.", "default": true, "advanced": false, "restartRequired": "world", "dangerous": false }, { "key": "CoaBots.RandomSpawn.AccountPrefix", "type": "string", "category": "population", "title": "Bot account name prefix", "description": "Bots live on accounts that start with this name. Changing it makes existing bots stop logging in automatically.", "default": "CoaBotHost", "advanced": true, "restartRequired": "world", "dangerous": true }, { "key": "CoaBots.RandomSpawn.BatchSize", "type": "int", "category": "population", "title": "Bots created per step", "description": "Creation is spread over time to keep the server smooth. Higher values are faster but can cause freezes.", "default": 5, "advanced": true, "restartRequired": "world", "dangerous": true, "min": 1, "max": 50 }, { "key": "CoaBots.RandomSpawn.BatchIntervalMs", "type": "int", "category": "population", "title": "Pause between creation steps", "description": "Time between creation steps. Lower values are faster but can cause freezes.", "default": 500, "advanced": true, "restartRequired": "world", "dangerous": true, "min": 100, "max": 60000, "unit": "ms" }, { "key": "CoaBots.AutoLoginOnStartup", "type": "bool", "category": "login", "title": "Automatic bot login", "description": "Existing bots log themselves in every time the server starts.", "default": false, "advanced": false, "restartRequired": "world", "dangerous": false }, { "key": "CoaBots.AutoLogin.MaxCount", "type": "int", "category": "login", "title": "Maximum bots online", "description": "The most bots that log in automatically at startup.", "default": 800, "advanced": false, "restartRequired": "world", "dangerous": false, "min": 0, "max": 5000 }, { "key": "CoaBots.AutoLogin.BatchSize", "type": "int", "category": "login", "title": "Bots logging in per step", "description": "Logins are spread over time. Higher values bring bots online faster but load the server harder.", "default": 10, "advanced": true, "restartRequired": "world", "dangerous": true, "min": 1, "max": 100 }, { "key": "CoaBots.AutoLogin.BatchIntervalMs", "type": "int", "category": "login", "title": "Pause between login steps", "description": "Time between login steps.", "default": 500, "advanced": true, "restartRequired": "world", "dangerous": true, "min": 100, "max": 60000, "unit": "ms" }, { "key": "CoaBots.SpecBalance.TankTargetPct", "type": "int", "category": "roles", "title": "Tank population target", "description": "Share of bots that should be tanks.", "default": 20, "advanced": false, "restartRequired": "world", "dangerous": false, "min": 0, "max": 50, "unit": "%" }, { "key": "CoaBots.SpecBalance.HealerTargetPct", "type": "int", "category": "roles", "title": "Healer population target", "description": "Share of bots that should be healers.", "default": 20, "advanced": false, "restartRequired": "world", "dangerous": false, "min": 0, "max": 50, "unit": "%" }, { "key": "CoaBots.TalentBuildsPath", "type": "string", "category": "general", "title": "Talent data file", "description": "Where the community talent builds are stored. Leave empty to use the built-in search.", "default": "", "advanced": true, "restartRequired": "world", "dangerous": false }, { "key": "CoaBots.World.Enable", "type": "bool", "category": "openworld", "title": "Bots wander the world", "description": "Idle bots run errands: visit town services, travel to gathering or grinding areas, or wander a little.", "default": true, "advanced": false, "restartRequired": "world", "dangerous": false }, { "key": "CoaBots.WorldBrain.Enable", "type": "bool", "category": "quests", "title": "Questing AI", "description": "Bots pick up and complete quests on their own. When off, bots only gather, fish, grind and wander.", "default": true, "advanced": false, "restartRequired": "world", "dangerous": false }, { "key": "CoaBots.World.ServiceRadius", "type": "int", "category": "openworld", "title": "Town services search radius", "description": "How far a bot looks for vendors and mailboxes.", "default": 200, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 50, "max": 1000, "unit": "yards" }, { "key": "CoaBots.World.AreaRadius", "type": "int", "category": "openworld", "title": "Errand area radius", "description": "How far a bot looks for gathering or grinding areas.", "default": 350, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 50, "max": 2000, "unit": "yards" }, { "key": "CoaBots.World.ThinkIntervalMs", "type": "int", "category": "advanced", "title": "Errand check interval", "description": "How often each bot reconsiders its errand.", "default": 2000, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 500, "max": 60000, "unit": "ms" }, { "key": "CoaBots.World.IdleBeforeErrandMs", "type": "int", "category": "advanced", "title": "Idle time before an errand", "description": "How long a bot must find nothing to do before it starts an errand.", "default": 10000, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 1000, "max": 600000, "unit": "ms" }, { "key": "CoaBots.World.VerboseLog", "type": "bool", "category": "advanced", "title": "Detailed errand logging", "description": "Writes every errand step to the log. Useful for debugging, noisy with many bots.", "default": true, "advanced": true, "restartRequired": "world", "dangerous": false }, { "key": "CoaBots.Combat.VerboseLog", "type": "bool", "category": "advanced", "title": "Detailed combat logging", "description": "Writes combat decisions to the log. Very noisy; turn on only while hunting a specific problem.", "default": false, "advanced": true, "restartRequired": "world", "dangerous": false }, { "key": "CoaBots.Profile.IntentMinMs", "type": "int", "category": "advanced", "title": "Shortest activity", "description": "The shortest time a bot sticks with one kind of activity.", "default": 900000, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 60000, "max": 7200000, "unit": "ms" }, { "key": "CoaBots.Profile.IntentMaxMs", "type": "int", "category": "advanced", "title": "Longest activity", "description": "The longest time a bot sticks with one kind of activity.", "default": 2100000, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 60000, "max": 14400000, "unit": "ms" }, { "key": "CoaBots.Grind.SearchRadius", "type": "int", "category": "openworld", "title": "Grinding search radius", "description": "How far a bot looks for monsters to grind.", "default": 30, "advanced": false, "restartRequired": "world", "dangerous": false, "min": 5, "max": 200, "unit": "yards" }, { "key": "CoaBots.Grind.MaxLevelAbove", "type": "int", "category": "openworld", "title": "Highest monster level to grind", "description": "How many levels above itself a bot will fight while grinding.", "default": 3, "advanced": false, "restartRequired": "world", "dangerous": false, "min": 0, "max": 10, "unit": "levels" }, { "key": "CoaBots.Healer.CriticalHealPct", "type": "int", "category": "combat", "title": "Emergency heal threshold", "description": "Healers switch to their strongest heals when an ally falls below this health.", "default": 50, "advanced": false, "restartRequired": "world", "dangerous": false, "min": 5, "max": 95, "unit": "%" }, { "key": "CoaBots.WorldBrain.SearchRadius", "type": "int", "category": "openworld", "title": "Target search radius", "description": "How far a bot scans for quest targets inside an objective area.", "default": 50, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 10, "max": 300, "unit": "yards" }, { "key": "CoaBots.WorldBrain.EngageRange", "type": "int", "category": "combat", "title": "Engage distance", "description": "Distance at which a bot starts fighting a quest monster.", "default": 28, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 5, "max": 40, "unit": "yards" }, { "key": "CoaBots.WorldBrain.MountDistanceMin", "type": "int", "category": "openworld", "title": "Mount up beyond (min)", "description": "Each bot mounts for trips longer than a personal distance drawn between this and the maximum.", "default": 60, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 10, "max": 500, "unit": "yards" }, { "key": "CoaBots.WorldBrain.MountDistanceMax", "type": "int", "category": "openworld", "title": "Mount up beyond (max)", "description": "Upper end of the personal mount distance.", "default": 95, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 10, "max": 500, "unit": "yards" }, { "key": "CoaBots.WorldBrain.TaxiMinDistance", "type": "int", "category": "openworld", "title": "Use flight paths beyond", "description": "Trips longer than this use a flight path when the bot knows a route.", "default": 900, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 100, "max": 10000, "unit": "yards" }, { "key": "CoaBots.WorldBrain.SessionBreaks", "type": "bool", "category": "openworld", "title": "Take breaks", "description": "Bots alternate questing with a few minutes of town life, like a player would.", "default": true, "advanced": false, "restartRequired": "world", "dangerous": false }, { "key": "CoaBots.WorldBrain.GatherDetours", "type": "bool", "category": "openworld", "title": "Gather nearby herbs and ore", "description": "Gatherers step off their path for a node right next to it.", "default": true, "advanced": false, "restartRequired": "world", "dangerous": false }, { "key": "CoaBots.WorldBrain.MaxActiveQuests", "type": "int", "category": "quests", "title": "Maximum active quests", "description": "How many quests a bot carries at once.", "default": 15, "advanced": false, "restartRequired": "world", "dangerous": false, "min": 1, "max": 25 }, { "key": "CoaBots.WorldBrain.AcceptEliteQuests", "type": "bool", "category": "quests", "title": "Accept elite quests", "description": "Solo bots take on elite quests. Off by default because they usually cannot finish them alone.", "default": false, "advanced": false, "restartRequired": "world", "dangerous": false }, { "key": "CoaBots.WorldBrain.QuestLevelBelow", "type": "int", "category": "quests", "title": "Quests below own level", "description": "How many levels below itself a bot still accepts quests.", "default": 6, "advanced": false, "restartRequired": "world", "dangerous": false, "min": 0, "max": 20, "unit": "levels" }, { "key": "CoaBots.WorldBrain.QuestLevelAbove", "type": "int", "category": "quests", "title": "Quests above own level", "description": "How many levels above itself a bot still accepts quests.", "default": 3, "advanced": false, "restartRequired": "world", "dangerous": false, "min": 0, "max": 10, "unit": "levels" }, { "key": "CoaBots.WorldBrain.MaxMobLevelAbove", "type": "int", "category": "quests", "title": "Highest quest monster level", "description": "How far above its level a quest monster may be.", "default": 3, "advanced": false, "restartRequired": "world", "dangerous": false, "min": 0, "max": 10, "unit": "levels" }, { "key": "CoaBots.WorldBrain.MaxObjectiveDistance", "type": "int", "category": "quests", "title": "Farthest quest objective", "description": "Quests whose objectives are farther than this are not taken.", "default": 3000, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 200, "max": 10000, "unit": "yards" }, { "key": "CoaBots.WorldBrain.GiverSearchRadius", "type": "int", "category": "quests", "title": "Quest giver search radius", "description": "How far a bot looks for quest givers.", "default": 500, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 50, "max": 3000, "unit": "yards" }, { "key": "CoaBots.WorldBrain.MaxBadAreasPerObjective", "type": "int", "category": "quests", "title": "Areas tried per objective", "description": "How many areas a bot gives up on before setting the quest aside.", "default": 3, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 1, "max": 10 }, { "key": "CoaBots.WorldBrain.QuestSuspendMs", "type": "int", "category": "quests", "title": "Set-aside time (short)", "description": "How long a quest is set aside after the bot gives up on it.", "default": 600000, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 60000, "max": 86400000, "unit": "ms" }, { "key": "CoaBots.WorldBrain.QuestSuspendMaxMs", "type": "int", "category": "quests", "title": "Set-aside time (long)", "description": "The longest a quest can stay set aside after repeated failures.", "default": 7200000, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 60000, "max": 86400000, "unit": "ms" }, { "key": "CoaBots.LfgFill.Enable", "type": "bool", "category": "dungeon", "title": "Dungeon Finder bot fill", "description": "When you queue alone for a dungeon, bots fill the missing tank, healer and damage roles.", "default": true, "advanced": false, "restartRequired": "world", "dangerous": false }, { "key": "CoaBots.AutoQueueDungeon.Enable", "type": "bool", "category": "dungeon", "title": "Bots queue for dungeons by themselves", "description": "Experimental: idle tank bots queue for a dungeon on their own and the fill above completes the party.", "default": false, "advanced": true, "restartRequired": "world", "dangerous": true }, { "key": "CoaBots.BGFill.Enable", "type": "bool", "category": "battlegrounds", "title": "Battleground bot fill", "description": "When anyone queues for a battleground, both teams are topped up with bots so the match starts at once.", "default": true, "advanced": false, "restartRequired": "world", "dangerous": false }, { "key": "CoaBots.BGFill.TargetPlayersPerTeam", "type": "int", "category": "battlegrounds", "title": "Battleground team size", "description": "Bots per team to fill up to. 0 means a full team for that battleground.", "default": 0, "advanced": false, "restartRequired": "world", "dangerous": false, "min": 0, "max": 40 }, { "key": "CoaBots.WorldBrain.HelpOthers", "type": "bool", "category": "social", "title": "Bots help nearby players", "description": "A passing bot joins a fight that a friendly player is losing, without taking their loot or credit.", "default": true, "advanced": false, "restartRequired": "world", "dangerous": false }, { "key": "CoaBots.WorldBrain.HelpRadius", "type": "int", "category": "social", "title": "Help distance", "description": "How close a bot must be to step into a fight.", "default": 30, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 5, "max": 100, "unit": "yards" }, { "key": "CoaBots.WorldBrain.HelpHealthPct", "type": "int", "category": "social", "title": "Help below health", "description": "Bots help when the fighting player is below this health.", "default": 40, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 5, "max": 95, "unit": "%" }, { "key": "CoaBots.WorldBrain.ResurrectOthers", "type": "bool", "category": "social", "title": "Bots resurrect fallen players", "description": "Bots that know a resurrection spell revive friendly corpses.", "default": true, "advanced": false, "restartRequired": "world", "dangerous": false }, { "key": "CoaBots.WorldBrain.TemporaryParties", "type": "bool", "category": "social", "title": "Temporary bot parties", "description": "Bots of similar level with the same quest briefly team up.", "default": false, "advanced": false, "restartRequired": "world", "dangerous": false }, { "key": "CoaBots.WorldBrain.PartyMaxSize", "type": "int", "category": "social", "title": "Temporary party size", "description": "Largest temporary party.", "default": 3, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 2, "max": 5 }, { "key": "CoaBots.WorldBrain.PartyRadius", "type": "int", "category": "social", "title": "Party formation distance", "description": "How close bots must be to team up.", "default": 60, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 10, "max": 300, "unit": "yards" }, { "key": "CoaBots.WorldBrain.PartyMinMinutes", "type": "int", "category": "social", "title": "Shortest party time", "description": "Minimum duration of a temporary party.", "default": 5, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 1, "max": 120, "unit": "min" }, { "key": "CoaBots.WorldBrain.PartyMaxMinutes", "type": "int", "category": "social", "title": "Longest party time", "description": "Maximum duration of a temporary party.", "default": 20, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 1, "max": 240, "unit": "min" }, { "key": "CoaBots.WorldBrain.PlannerMinMs", "type": "int", "category": "advanced", "title": "Planner interval (min)", "description": "Shortest time between a bot's planning passes.", "default": 2000, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 500, "max": 60000, "unit": "ms" }, { "key": "CoaBots.WorldBrain.PlannerMaxMs", "type": "int", "category": "advanced", "title": "Planner interval (max)", "description": "Longest time between a bot's planning passes.", "default": 8000, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 500, "max": 120000, "unit": "ms" }, { "key": "CoaBots.WorldBrain.ScanMinMs", "type": "int", "category": "advanced", "title": "Target scan interval (min)", "description": "Shortest time between target scans.", "default": 500, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 100, "max": 10000, "unit": "ms" }, { "key": "CoaBots.WorldBrain.ScanMaxMs", "type": "int", "category": "advanced", "title": "Target scan interval (max)", "description": "Longest time between target scans.", "default": 1500, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 100, "max": 20000, "unit": "ms" }, { "key": "CoaBots.WorldBrain.SearchTimeoutMs", "type": "int", "category": "advanced", "title": "Area search time limit", "description": "How long a bot searches an empty area before trying another.", "default": 35000, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 5000, "max": 600000, "unit": "ms" }, { "key": "CoaBots.WorldBrain.ApproachTimeoutMs", "type": "int", "category": "advanced", "title": "Approach time limit", "description": "How long a bot walks toward a claimed target.", "default": 25000, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 5000, "max": 600000, "unit": "ms" }, { "key": "CoaBots.WorldBrain.TravelTimeoutMs", "type": "int", "category": "advanced", "title": "Travel time limit", "description": "How long a whole trip to an area may take.", "default": 360000, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 30000, "max": 3600000, "unit": "ms" }, { "key": "CoaBots.WorldBrain.Weight.TravelPer100Yards", "type": "int", "category": "advanced", "title": "Preference weight: TravelPer100Yards", "description": "How strongly bots weigh this factor when choosing what to do next. Change only if you know the planner.", "default": 7, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 0, "max": 1000 }, { "key": "CoaBots.WorldBrain.Weight.CrowdPerBot", "type": "int", "category": "advanced", "title": "Preference weight: CrowdPerBot", "description": "How strongly bots weigh this factor when choosing what to do next. Change only if you know the planner.", "default": 6, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 0, "max": 1000 }, { "key": "CoaBots.WorldBrain.Weight.Overlap", "type": "int", "category": "advanced", "title": "Preference weight: Overlap", "description": "How strongly bots weigh this factor when choosing what to do next. Change only if you know the planner.", "default": 35, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 0, "max": 1000 }, { "key": "CoaBots.WorldBrain.Weight.TurnIn", "type": "int", "category": "advanced", "title": "Preference weight: TurnIn", "description": "How strongly bots weigh this factor when choosing what to do next. Change only if you know the planner.", "default": 120, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 0, "max": 1000 }, { "key": "CoaBots.WorldBrain.Weight.Accept", "type": "int", "category": "advanced", "title": "Preference weight: Accept", "description": "How strongly bots weigh this factor when choosing what to do next. Change only if you know the planner.", "default": 55, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 0, "max": 1000 }, { "key": "CoaBots.WorldBrain.Weight.AreaOccupancy", "type": "int", "category": "advanced", "title": "Preference weight: AreaOccupancy", "description": "How strongly bots weigh this factor when choosing what to do next. Change only if you know the planner.", "default": 12, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 0, "max": 1000 }, { "key": "CoaBots.WorldBrain.Weight.TargetReserved", "type": "int", "category": "advanced", "title": "Preference weight: TargetReserved", "description": "How strongly bots weigh this factor when choosing what to do next. Change only if you know the planner.", "default": 200, "advanced": true, "restartRequired": "world", "dangerous": false, "min": 0, "max": 1000 } ] }