diff --git a/README.md b/README.md index 7fea691..ddf9e28 100644 --- a/README.md +++ b/README.md @@ -79,8 +79,8 @@ BotLevelBrackets.LiteDebugMode | Enables lite debug logging for th BotLevelBrackets.CheckFrequency | Frequency (in seconds) at which the bot level distribution check is performed. | 300 | Positive Integer BotLevelBrackets.CheckFlaggedFrequency | Frequency (in seconds) at which the bot level reset is performed for flagged bots that initially failed safety checks. | 15 | Positive Integer BotLevelBrackets.FlaggedProcessLimit | Maximum number of flagged bots to process per pending level change step. | 5 | Positive Integer -BotLevelBrackets.Dynamic.UseDynamicDistribution | Enables dynamic bot distribution: when on, brackets with more real players get a higher share of bots, based on the weight below. | 0 | 0 (off) / 1 (on) -BotLevelBrackets.Dynamic.RealPlayerWeight | Controls how much bots "follow" real player activity when dynamic distribution is enabled. 0.0 = bots always spread evenly; 1.0 = mild effect; higher values = more bots go where players are, but the effect is scaled. | 1.0 | ≥ 0.0 (float) +BotLevelBrackets.Dynamic.UseDynamicDistribution | Enables dynamic bot distribution: when on, brackets with more real players get a higher share of bots in their level bracket, based on the weight below. | 0 | 0 (off) / 1 (on) +BotLevelBrackets.Dynamic.RealPlayerWeight | Controls how much bots "follow" real player activity when dynamic distribution is enabled. 0.0 = bots always spread evenly; 1.0 = minimal effect; 10.0 = heavy effect; higher values = more bots go where players are, but the effect is scaled. | 10.0 | ≥ 0.0 (float) BotLevelBrackets.Dynamic.SyncFactions | Enables synchronized brackets and weighting between Alliance and Horde factions when Dynamic Distribution is also enabled. | 0 | 0 (off) / 1 (on) BotLevelBrackets.IgnoreFriendListed | Ignores bots that are on real players' friend lists from any bracket calculations. | 1 | 0 (off) / 1 (on) BotLevelBrackets.IgnoreGuildBotsWithRealPlayers | Excludes bots in a guild with at least one real (non-bot) player from adjustments. Uses persistent database tracking for both online and offline real players. | 1 | 0 (disabled) / 1 (enabled) diff --git a/conf/mod_player_bot_level_brackets.conf.dist b/conf/mod_player_bot_level_brackets.conf.dist index efa582b..d8ca1ea 100644 --- a/conf/mod_player_bot_level_brackets.conf.dist +++ b/conf/mod_player_bot_level_brackets.conf.dist @@ -85,7 +85,7 @@ BotLevelBrackets.NumRanges = 9 # # BotLevelBrackets.Dynamic.UseDynamicDistribution # Description: Enables dynamic recalculation of bot distribution percentages based on the number of non-bot players -# present in each level bracket. +# present in each level bracket. This overrides any custom brackets in the conf. # Default: 0 (disabled) # Valid values: 0 (off) / 1 (on) BotLevelBrackets.Dynamic.UseDynamicDistribution = 0 @@ -95,7 +95,7 @@ BotLevelBrackets.Dynamic.UseDynamicDistribution = 0 # The higher you set this value, the more bots will move to the same level brackets where real players are found, but the effect is *gentle*, not extreme. # A value of 0.0 means bots always distribute evenly across all brackets, regardless of where players are. The default value of 1.0 gives a mild, balanced effect. # Raising this to 3.0, 5.0, or higher will make bots concentrate more in brackets with real players. -# The value is a multiplier (not a percent): 0.0 = no extra effect, 1.0 = default, 3.0 = stronger, 5.0 = strong but not extreme. +# The value is a multiplier (not a percent): 0.0 = no extra effect, 1.0 = minimal, 3.0 = stronger, 5.0 = strong but not extreme. # Experiment based on your total bot count and real player counts to find a good number for your server. # If you want a large congestion of bots in your level bracket for solo play I recommend 10-15 for RealPlayerWeight. # What to expect: @@ -107,8 +107,8 @@ BotLevelBrackets.Dynamic.UseDynamicDistribution = 0 # Formula (per bracket): # bracket_weight = 1.0 + (RealPlayerWeight × (1 / TotalRealPlayers) × log(1 + RealPlayersInBracket)) # All bracket weights are normalized to total 100%. -# Default: 1.0 -BotLevelBrackets.Dynamic.RealPlayerWeight = 1.0 +# Default: 10.0 +BotLevelBrackets.Dynamic.RealPlayerWeight = 10.0 # # BotLevelBrackets.Dynamic.SyncFactions diff --git a/src/mod-player-bot-level-brackets.cpp b/src/mod-player-bot-level-brackets.cpp index 87dda4b..48ca132 100644 --- a/src/mod-player-bot-level-brackets.cpp +++ b/src/mod-player-bot-level-brackets.cpp @@ -664,6 +664,10 @@ static void AdjustBotToRange(Player* bot, int targetRangeIndex, const LevelRange { lowerBound = 55; } + if (lowerBound > upperBound) + { + return; + } newLevel = urand(lowerBound, upperBound); } else @@ -1361,6 +1365,9 @@ public: applyWeights(g_AllianceLevelRanges, allianceWeights); applyWeights(g_HordeLevelRanges, hordeWeights); + // Ensure brackets respect global min/max levels and percentages sum to 100 + ClampAndBalanceBrackets(); + // Debug output for new bracket percentages after normalization if (g_BotDistFullDebugMode || g_BotDistLiteDebugMode) {