mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/Players: Corrected shield block value calculations
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user