diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index f2c9dcb7d..4cb7877f0 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3004,19 +3004,21 @@ SpellMissInfo Unit::MagicSpellHitResult(Unit* victim, SpellInfo const* spellInfo } SpellSchoolMask schoolMask = spellInfo->GetSchoolMask(); - // PvP - PvE spell misschances per leveldif > 2 - int32 lchance = victim->GetTypeId() == TYPEID_PLAYER ? 7 : 11; int32 thisLevel = getLevelForTarget(victim); if (GetTypeId() == TYPEID_UNIT && ToCreature()->IsTrigger()) thisLevel = std::max(thisLevel, spellInfo->SpellLevel); - int32 leveldif = int32(victim->getLevelForTarget(this)) - thisLevel; + int32 levelDiff = int32(victim->getLevelForTarget(this)) - thisLevel; + + int32 MISS_CHANCE_MULTIPLIER = sWorld->getRate( + victim->GetTypeId() == TYPEID_PLAYER + ? RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER + : RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE + ); // Base hit chance from attacker and victim levels - int32 modHitChance; - if (leveldif < 3) - modHitChance = 96 - leveldif; - else - modHitChance = 94 - (leveldif - 2) * lchance; + int32 modHitChance = levelDiff < 3 + ? 96 - levelDiff + : 94 - (levelDiff - 2) * MISS_CHANCE_MULTIPLIER; // Spellmod from SPELLMOD_RESIST_MISS_CHANCE if (Player* modOwner = GetSpellModOwner()) diff --git a/src/server/game/World/IWorld.h b/src/server/game/World/IWorld.h index a8f9eadf7..75a9f6c92 100644 --- a/src/server/game/World/IWorld.h +++ b/src/server/game/World/IWorld.h @@ -486,6 +486,8 @@ enum Rates RATE_DURABILITY_LOSS_ABSORB, RATE_DURABILITY_LOSS_BLOCK, RATE_MOVESPEED, + RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE, + RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER, MAX_RATES }; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index e61ed76fc..4d25276e6 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -566,6 +566,10 @@ void World::LoadConfigSettings(bool reload) rate_values[RATE_HONOR] = sConfigMgr->GetOption("Rate.Honor", 1.0f); rate_values[RATE_ARENA_POINTS] = sConfigMgr->GetOption("Rate.ArenaPoints", 1.0f); rate_values[RATE_INSTANCE_RESET_TIME] = sConfigMgr->GetOption("Rate.InstanceResetTime", 1.0f); + + rate_values[RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE] = sConfigMgr->GetOption("Rate.MissChanceMultiplier.TargetCreature", 11.0f); + rate_values[RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER] = sConfigMgr->GetOption("Rate.MissChanceMultiplier.TargetPlayer", 7.0f); + rate_values[RATE_TALENT] = sConfigMgr->GetOption("Rate.Talent", 1.0f); if (rate_values[RATE_TALENT] < 0.0f) { diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index f3ff64001..737c2e3e3 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -2543,6 +2543,25 @@ Death.Bones.BattlegroundOrArena = 1 Die.Command.Mode = 1 +# Rate.MissChanceMultiplier.Creature +# Rate.MissChanceMultiplier.Player +# +# Description: When the target is 3 or more level higher than the player, +# the chance to hit is determined by the formula: 94 - (levelDiff - 2) * Rate.MissChanceMultiplier +# The higher the Rate.MissChanceMultiplier constant, the higher is the chance to miss. +# +# Note: this does not affect when the player is less than 3 levels different than the target, +# where this (linear) formula is used instead to calculate the hit chance: 96 - levelDiff. +# +# Example: if you want the chance to keep growing linearly, use 1. +# +# Default: Rate.MissChanceMultiplier.TargetCreature = 11 +# Rate.MissChanceMultiplier.TargetPlayer = 7 +# + +Rate.MissChanceMultiplier.TargetCreature = 11 +Rate.MissChanceMultiplier.TargetPlayer = 7 + # ###################################################################################################