diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index 36f766306..e24d13e20 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -16,6 +16,7 @@ */ #include "Creature.h" +#include "Config.h" #include "Pet.h" #include "Player.h" #include "ScriptMgr.h" @@ -612,6 +613,12 @@ void Player::UpdateBlockPercentage() value += GetTotalAuraModifier(SPELL_AURA_MOD_BLOCK_PERCENT); // Increase from rating value += GetRatingBonusValue(CR_BLOCK); + + if (sConfigMgr->GetOption("Stats.Limits.Enable", false)) + { + value = value > sConfigMgr->GetOption("Stats.Limits.Block", 95.0f) ? sConfigMgr->GetOption("Stats.Limits.Block", 95.0f) : value; + } + value = value < 0.0f ? 0.0f : value; } SetStatFloatValue(PLAYER_BLOCK_PERCENTAGE, value); @@ -646,6 +653,12 @@ void Player::UpdateCritPercentage(WeaponAttackType attType) float value = GetTotalPercentageModValue(modGroup) + GetRatingBonusValue(cr); // Modify crit from weapon skill and maximized defense skill of same level victim difference value += (int32(GetWeaponSkillValue(attType)) - int32(GetMaxSkillValueForLevel())) * 0.04f; + + if (sConfigMgr->GetOption("Stats.Limits.Enable", false)) + { + value = value > sConfigMgr->GetOption("Stats.Limits.Crit", 95.0f) ? sConfigMgr->GetOption("Stats.Limits.Crit", 95.0f) : value; + } + value = value < 0.0f ? 0.0f : value; SetStatFloatValue(index, value); } @@ -741,6 +754,11 @@ void Player::UpdateParryPercentage() m_realParry = m_realParry < 0.0f ? 0.0f : m_realParry; value = std::max(diminishing + nondiminishing, 0.0f); + + if (sConfigMgr->GetOption("Stats.Limits.Enable", false)) + { + value = value > sConfigMgr->GetOption("Stats.Limits.Parry", 95.0f) ? sConfigMgr->GetOption("Stats.Limits.Parry", 95.0f) : value; + } } SetStatFloatValue(PLAYER_PARRY_PERCENTAGE, value); @@ -779,6 +797,11 @@ void Player::UpdateDodgePercentage() m_realDodge = m_realDodge < 0.0f ? 0.0f : m_realDodge; float value = std::max(diminishing + nondiminishing, 0.0f); + if (sConfigMgr->GetOption("Stats.Limits.Enable", false)) + { + value = value > sConfigMgr->GetOption("Stats.Limits.Dodge", 95.0f) ? sConfigMgr->GetOption("Stats.Limits.Dodge", 95.0f) : value; + } + SetStatFloatValue(PLAYER_DODGE_PERCENTAGE, value); } diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 35a83c328..f574a4bf8 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -19,6 +19,7 @@ # GAME MASTER SETTINGS # VISIBILITY AND DISTANCES # SERVER RATES +# STATS LIMITS # AUTO BROADCAST # BATTLEGROUND CONFIG # BATTLEFIELD CONFIG @@ -2536,6 +2537,29 @@ Die.Command.Mode = 1 # ################################################################################################### +################################################################################################### +# STATS LIMITS +# +# Stats.Limits.Enable +# Description: Enable or disable stats system limitations +# Default: 0 - Disabled +# 1 - Enabled + +Stats.Limits.Enable = 0 + +# +# Stats.Limit.[STAT] +# Description: Set percentage limit for dodge, parry, block and crit rating +# Default: 95.0 (95%) + +Stats.Limits.Dodge = 95.0 +Stats.Limits.Parry = 95.0 +Stats.Limits.Block = 95.0 +Stats.Limits.Crit = 95.0 + +# +################################################################################################### + ################################################################################################### # AUTO BROADCAST #