diff --git a/src/server/apps/worldserver/worldserver.conf.dist b/src/server/apps/worldserver/worldserver.conf.dist index 5cbb2d82b..12fe7bb3f 100644 --- a/src/server/apps/worldserver/worldserver.conf.dist +++ b/src/server/apps/worldserver/worldserver.conf.dist @@ -2106,14 +2106,17 @@ Rate.Loyalty = 1 # Rate.Rest.InGame # Rate.Rest.Offline.InTavernOrCity # Rate.Rest.Offline.InWilderness +# Rate.Rest.MaxBonus # Description: Resting points grow rates. # Default: 1 - (Rate.Rest.InGame) # 1 - (Rate.Rest.Offline.InTavernOrCity) # 1 - (Rate.Rest.Offline.InWilderness) +# 1.5 - (Rate.Rest.MaxBonus) Rate.Rest.InGame = 1 Rate.Rest.Offline.InTavernOrCity = 1 Rate.Rest.Offline.InWilderness = 1 +Rate.Rest.MaxBonus = 1.5 # # Rate.MissChanceMultiplier.Creature diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 887600406..fa38de8ca 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -10228,22 +10228,25 @@ void Player::LeaveAllArenaTeams(ObjectGuid guid) } while (result->NextRow()); } -void Player::SetRestBonus(float rest_bonus_new) +void Player::SetRestBonus(float restBonusNew) { // Prevent resting on max level if (GetLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)) - rest_bonus_new = 0; + restBonusNew = 0; - if (rest_bonus_new < 0) - rest_bonus_new = 0; + if (restBonusNew < 0) + restBonusNew = 0; - float rest_bonus_max = (float)GetUInt32Value(PLAYER_NEXT_LEVEL_XP) * 1.5f / 2; + // Fetch rest bonus multiplier from cached configuration + float restBonusMultiplier = sWorld->getRate(RATE_REST_MAX_BONUS); - if (rest_bonus_new > rest_bonus_max) - _restBonus = rest_bonus_max; + // Calculate rest bonus max using the multiplier + float restBonusMax = (float)GetUInt32Value(PLAYER_NEXT_LEVEL_XP) * restBonusMultiplier / 2; + + if (restBonusNew > restBonusMax) + _restBonus = restBonusMax; else - _restBonus = rest_bonus_new; - + _restBonus = restBonusNew; // update data for client if ((GetsRecruitAFriendBonus(true) && (GetSession()->IsARecruiter() || GetSession()->GetRecruiterId() != 0))) SetByteValue(PLAYER_BYTES_2, 3, REST_STATE_RAF_LINKED); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 525a3ed15..60076e518 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1209,7 +1209,7 @@ public: void RemoveRestState(); uint32 GetXPRestBonus(uint32 xp); [[nodiscard]] float GetRestBonus() const { return _restBonus; } - void SetRestBonus(float rest_bonus_new); + void SetRestBonus(float restBonusNew); [[nodiscard]] bool HasRestFlag(RestFlag restFlag) const { return (_restFlagMask & restFlag) != 0; } void SetRestFlag(RestFlag restFlag, uint32 triggerId = 0); diff --git a/src/server/game/World/IWorld.h b/src/server/game/World/IWorld.h index cfcea0d63..f0300c223 100644 --- a/src/server/game/World/IWorld.h +++ b/src/server/game/World/IWorld.h @@ -501,6 +501,7 @@ enum Rates RATE_REST_INGAME, RATE_REST_OFFLINE_IN_TAVERN_OR_CITY, RATE_REST_OFFLINE_IN_WILDERNESS, + RATE_REST_MAX_BONUS, RATE_DAMAGE_FALL, RATE_AUCTION_TIME, RATE_AUCTION_DEPOSIT, diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 5618ae3f8..499cc018d 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -556,6 +556,7 @@ void World::LoadConfigSettings(bool reload) _rate_values[RATE_REST_INGAME] = sConfigMgr->GetOption("Rate.Rest.InGame", 1.0f); _rate_values[RATE_REST_OFFLINE_IN_TAVERN_OR_CITY] = sConfigMgr->GetOption("Rate.Rest.Offline.InTavernOrCity", 1.0f); _rate_values[RATE_REST_OFFLINE_IN_WILDERNESS] = sConfigMgr->GetOption("Rate.Rest.Offline.InWilderness", 1.0f); + _rate_values[RATE_REST_MAX_BONUS] = sConfigMgr->GetOption("Rate.Rest.MaxBonus", 1.5f); _rate_values[RATE_DAMAGE_FALL] = sConfigMgr->GetOption("Rate.Damage.Fall", 1.0f); _rate_values[RATE_AUCTION_TIME] = sConfigMgr->GetOption("Rate.Auction.Time", 1.0f); _rate_values[RATE_AUCTION_DEPOSIT] = sConfigMgr->GetOption("Rate.Auction.Deposit", 1.0f);