diff options
author | funjoker <torti-esser@web.de> | 2016-05-03 14:09:57 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2016-05-03 14:09:57 +0200 |
commit | 7eab3d37160b1092413a8fa1df73b5d5679ee2b8 (patch) | |
tree | 25cda270e83c995edae7a3cbdceba11ca48bfe03 /src | |
parent | 8e84cd760a3485a1011567486644e7b7ba9c0cc3 (diff) |
Core/Units: Updated armor damage reduction calculation
Merge #17069
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/DataStores/DBCStores.cpp | 2 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCStores.h | 1 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCStructure.h | 6 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCfmt.h | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 29 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 4 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_misc.cpp | 2 |
8 files changed, 27 insertions, 20 deletions
diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index 921db480853..0f16acb3df3 100644 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -158,6 +158,7 @@ DBCStorage<WorldMapAreaEntry> sWorldMapAreaStore(WorldMapAreafmt); DBCStorage<WorldMapTransformsEntry> sWorldMapTransformsStore(WorldMapTransformsfmt); DBCStorage<WorldSafeLocsEntry> sWorldSafeLocsStore(WorldSafeLocsfmt); +GameTable<GtArmorMitigationByLvlEntry> sGtArmorMitigationByLvlStore(GtArmorMitigationByLvlfmt); GameTable<GtBarberShopCostBaseEntry> sGtBarberShopCostBaseStore(GtBarberShopCostBasefmt); GameTable<GtChanceToMeleeCritBaseEntry> sGtChanceToMeleeCritBaseStore(GtChanceToMeleeCritBasefmt); GameTable<GtChanceToMeleeCritEntry> sGtChanceToMeleeCritStore(GtChanceToMeleeCritfmt); @@ -507,6 +508,7 @@ void LoadGameTables(const std::string& dataPath, uint32 defaultLocale) #define LOAD_GT(tableName, store, file) LoadGameTable(bad_dbc_files, tableName, store, dbcPath, file) + LOAD_GT("ArmorMitigationByLvl", sGtArmorMitigationByLvlStore, "gtArmorMitigationByLvl.dbc"); // 21463 LOAD_GT("BarberShopCostBase", sGtBarberShopCostBaseStore, "gtBarberShopCostBase.dbc"); // 20444 LOAD_GT("CombatRatings", sGtCombatRatingsStore, "gtCombatRatings.dbc"); // 20444 LOAD_GT("ChanceToMeleeCritBase", sGtChanceToMeleeCritBaseStore, "gtChanceToMeleeCritBase.dbc"); // 20444 diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h index 7c7647dd4d9..0d162cec961 100644 --- a/src/server/game/DataStores/DBCStores.h +++ b/src/server/game/DataStores/DBCStores.h @@ -207,6 +207,7 @@ TC_GAME_API extern DBCStorage<VehicleSeatEntry> sVehicleSeatStor TC_GAME_API extern DBCStorage<WMOAreaTableEntry> sWMOAreaTableStore; TC_GAME_API extern DBCStorage<WorldSafeLocsEntry> sWorldSafeLocsStore; +TC_GAME_API extern GameTable<GtArmorMitigationByLvlEntry> sGtArmorMitigationByLvlStore; TC_GAME_API extern GameTable<GtBarberShopCostBaseEntry> sGtBarberShopCostBaseStore; TC_GAME_API extern GameTable<GtChanceToMeleeCritBaseEntry> sGtChanceToMeleeCritBaseStore; TC_GAME_API extern GameTable<GtChanceToMeleeCritEntry> sGtChanceToMeleeCritStore; diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 4f5f162b33e..5eed5ca0b6d 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -515,6 +515,12 @@ struct GlyphPropertiesEntry //uint32 GlyphExclusiveCategoryID; // 4 }; +struct GtArmorMitigationByLvlEntry +{ + //uint32 level; + float KFactor; +}; + struct GtBarberShopCostBaseEntry { //uint32 level; diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index 16f5383c343..171eec94266 100644 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -49,6 +49,7 @@ char const FactionTemplatefmt[] = "niiiiiiiiiiiii"; char const GameObjectDisplayInfofmt[] = "nixxxxxxxxxxffffffxxx"; char const GemPropertiesfmt[] = "nixxii"; char const GlyphPropertiesfmt[] = "niiix"; +char const GtArmorMitigationByLvlfmt[] = "xf"; char const GtBarberShopCostBasefmt[] = "xf"; char const GtCombatRatingsfmt[] = "xf"; char const GtOCTHpPerStaminafmt[] = "df"; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 46fce40bc0d..c77e3785924 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1001,7 +1001,7 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 dama if (!spellInfo->HasAttribute(SPELL_ATTR4_FIXED_DAMAGE)) { if (IsDamageReducedByArmor(damageSchoolMask, spellInfo)) - damage = CalcArmorReducedDamage(victim, damage, spellInfo, attackType); + damage = CalcArmorReducedDamage(damageInfo->attacker, victim, damage, spellInfo, attackType); bool blocked = false; // Per-school calc @@ -1182,7 +1182,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam // Calculate armor reduction if (IsDamageReducedByArmor((SpellSchoolMask)(damageInfo->damageSchoolMask))) { - damageInfo->damage = CalcArmorReducedDamage(damageInfo->target, damage, NULL, damageInfo->attackType); + damageInfo->damage = CalcArmorReducedDamage(damageInfo->attacker, damageInfo->target, damage, NULL, damageInfo->attackType); damageInfo->cleanDamage += damage - damageInfo->damage; } else @@ -1473,7 +1473,7 @@ bool Unit::IsDamageReducedByArmor(SpellSchoolMask schoolMask, SpellInfo const* s return true; } -uint32 Unit::CalcArmorReducedDamage(Unit* victim, const uint32 damage, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/) +uint32 Unit::CalcArmorReducedDamage(Unit* attacker, Unit* victim, const uint32 damage, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/) { float armor = float(victim->GetArmor()); @@ -1516,22 +1516,19 @@ uint32 Unit::CalcArmorReducedDamage(Unit* victim, const uint32 damage, SpellInfo armor -= std::min(armorPen, maxArmorPen); } - if (armor < 0.0f) - armor = 0.0f; + if (G3D::fuzzyLe(armor, 0.0f)) + return damage; - float levelModifier = getLevel(); - if (levelModifier > 59) - levelModifier = levelModifier + 4.5f * (levelModifier - 59); + uint8 attackerLevel = attacker->getLevel(); + if (attackerLevel > sGtArmorMitigationByLvlStore.GetTableRowCount()) + attackerLevel = sGtArmorMitigationByLvlStore.GetTableRowCount(); - float tmpvalue = 0.1f * armor / (8.5f * levelModifier + 40); - tmpvalue = tmpvalue / (1.0f + tmpvalue); + GtArmorMitigationByLvlEntry const* ambl = sGtArmorMitigationByLvlStore.EvaluateTable(attackerLevel - 1, 0); + if (!ambl) + return damage; - if (tmpvalue < 0.0f) - tmpvalue = 0.0f; - if (tmpvalue > 0.75f) - tmpvalue = 0.75f; - - return std::max<uint32>(uint32(damage * (1.0f - tmpvalue)), 1); + float mitigation = std::min(armor / (armor + ambl->KFactor), 0.85f); + return std::max<uint32>(damage * (1.0f - mitigation), 1); } uint32 Unit::CalcSpellResistance(Unit* victim, SpellSchoolMask schoolMask, SpellInfo const* spellInfo) const diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 5eddf7cc6b5..76df842862e 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -2079,7 +2079,7 @@ class TC_GAME_API Unit : public WorldObject virtual bool IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) const; // redefined in Creature bool IsDamageReducedByArmor(SpellSchoolMask damageSchoolMask, SpellInfo const* spellInfo = NULL, uint8 effIndex = MAX_SPELL_EFFECTS); - uint32 CalcArmorReducedDamage(Unit* victim, const uint32 damage, SpellInfo const* spellInfo, WeaponAttackType attackType = MAX_ATTACK); + uint32 CalcArmorReducedDamage(Unit* attacker, Unit* victim, const uint32 damage, SpellInfo const* spellInfo, WeaponAttackType attackType = MAX_ATTACK); uint32 CalcSpellResistance(Unit* victim, SpellSchoolMask schoolMask, SpellInfo const* spellInfo) const; void CalcAbsorbResist(Unit* victim, SpellSchoolMask schoolMask, DamageEffectType damagetype, uint32 const damage, uint32* absorb, uint32* resist, SpellInfo const* spellInfo = NULL); void CalcHealAbsorb(Unit* victim, SpellInfo const* spellInfo, uint32& healAmount, uint32& absorb); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 78caf1ca816..87e3cc1bfc1 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -5975,7 +5975,7 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const // Calculate armor mitigation if (caster->IsDamageReducedByArmor(GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), GetEffIndex())) { - uint32 damageReductedArmor = caster->CalcArmorReducedDamage(target, damage, GetSpellInfo()); + uint32 damageReductedArmor = caster->CalcArmorReducedDamage(caster, target, damage, GetSpellInfo()); cleanDamage.mitigated_damage += damage - damageReductedArmor; damage = damageReductedArmor; } @@ -6110,7 +6110,7 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c // Calculate armor mitigation if (caster->IsDamageReducedByArmor(GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), GetEffIndex())) { - uint32 damageReductedArmor = caster->CalcArmorReducedDamage(target, damage, GetSpellInfo()); + uint32 damageReductedArmor = caster->CalcArmorReducedDamage(caster, target, damage, GetSpellInfo()); cleanDamage.mitigated_damage += damage - damageReductedArmor; damage = damageReductedArmor; } diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 874c6b9ff51..7ad80352995 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -2321,7 +2321,7 @@ public: SpellSchoolMask schoolmask = SpellSchoolMask(1 << school); if (handler->GetSession()->GetPlayer()->IsDamageReducedByArmor(schoolmask)) - damage = handler->GetSession()->GetPlayer()->CalcArmorReducedDamage(target, damage, NULL, BASE_ATTACK); + damage = handler->GetSession()->GetPlayer()->CalcArmorReducedDamage(handler->GetSession()->GetPlayer(), target, damage, NULL, BASE_ATTACK); char* spellStr = strtok((char*)NULL, " "); |