diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 18 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 2 |
4 files changed, 20 insertions, 6 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index ac643a839b0..883adb0747d 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2508,8 +2508,7 @@ void Player::InitStatsForLevel(bool reapplyMods) SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ParryPercentage), 0.0f); SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BlockPercentage), 0.0f); - // Static 30% damage blocked - SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ShieldBlock), 30); + SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ShieldBlock), 0); // Dodge percentage SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::DodgePercentage), 0.0f); @@ -7721,7 +7720,11 @@ void Player::_ApplyItemBonuses(Item* item, uint8 slot, bool apply) } if (uint32 armor = proto->GetArmor(itemLevel)) + { HandleStatFlatModifier(UNIT_MOD_ARMOR, BASE_VALUE, float(armor), apply); + if (proto->GetClass() == ITEM_CLASS_ARMOR && proto->GetSubClass() == ITEM_SUBCLASS_ARMOR_SHIELD) + SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ShieldBlock), apply ? int32(armor * 2.5f) : 0); + } WeaponAttackType attType = GetAttackBySlot(slot, proto->GetInventoryType()); if (attType != MAX_ATTACK && CanUseAttackType(attType)) @@ -26040,6 +26043,17 @@ void Player::ProcessTerrainStatusUpdate(ZLiquidStatus status, Optional<LiquidDat m_MirrorTimerFlags &= ~(UNDERWATER_INWATER | UNDERWATER_INLAVA | UNDERWATER_INSLIME | UNDERWATER_INDARKWATER); } +float Player::GetBlockPercent(uint8 attackerLevel) const +{ + float blockArmor = float(*m_activePlayerData->ShieldBlock); + float armorConstant = sDB2Manager.EvaluateExpectedStat(ExpectedStatType::ArmorConstant, attackerLevel, -2, 0, CLASS_NONE); + + if (!(blockArmor + armorConstant)) + return 0; + + return std::min(blockArmor / (blockArmor + armorConstant), 0.85f); +} + void Player::SetCanParry(bool value) { if (m_canParry == value) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 3d874556160..57aee0bc8d6 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2036,7 +2036,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> int32 CalculateCorpseReclaimDelay(bool load = false) const; void SendCorpseReclaimDelay(uint32 delay) const; - uint32 GetBlockPercent() const override { return m_activePlayerData->ShieldBlock; } + float GetBlockPercent(uint8 attackerLevel) const override; bool CanParry() const { return m_canParry; } void SetCanParry(bool value); bool CanBlock() const { return m_canBlock; } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index b9718b165dd..614b0ce07db 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1363,7 +1363,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam damageInfo->HitInfo |= HITINFO_BLOCK; damageInfo->originalDamage = damageInfo->damage; // 30% damage blocked, double blocked amount if block is critical - damageInfo->blocked_amount = CalculatePct(damageInfo->damage, damageInfo->target->isBlockCritical() ? damageInfo->target->GetBlockPercent() * 2 : damageInfo->target->GetBlockPercent()); + damageInfo->blocked_amount = CalculatePct(damageInfo->damage, damageInfo->target->isBlockCritical() ? damageInfo->target->GetBlockPercent(getLevel()) * 2 : damageInfo->target->GetBlockPercent(getLevel())); damageInfo->damage -= damageInfo->blocked_amount; damageInfo->cleanDamage += damageInfo->blocked_amount; break; @@ -1649,7 +1649,7 @@ uint32 Unit::CalcArmorReducedDamage(Unit* attacker, Unit* victim, const uint32 d // Expansion and ContentTuningID necessary? Does Player get a ContentTuningID too ? float armorConstant = sDB2Manager.EvaluateExpectedStat(ExpectedStatType::ArmorConstant, attackerLevel, -2, 0, Classes(attacker->getClass())); - if (!armorConstant) + if (!(armor + armorConstant)) return damage; float mitigation = std::min(armor / (armor + armorConstant), 0.85f); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 7a9e1cf7ae3..ba8b58e5317 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1233,7 +1233,7 @@ class TC_GAME_API Unit : public WorldObject int32 GetMechanicResistChance(SpellInfo const* spellInfo) const; bool CanUseAttackType(uint8 attacktype) const; - virtual uint32 GetBlockPercent() const { return 30; } + virtual float GetBlockPercent(uint8 /*attackerLevel*/) const { return 30.0f; } float GetWeaponProcChance() const; float GetPPMProcChance(uint32 WeaponSpeed, float PPM, SpellInfo const* spellProto) const; |