diff options
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 30 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 12 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 41 | ||||
-rw-r--r-- | src/server/shared/SharedDefines.h | 2 | ||||
-rw-r--r-- | src/server/shared/enuminfo_SharedDefines.cpp | 6 |
7 files changed, 30 insertions, 67 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 0f9250164b4..4d9393f4ee8 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -365,7 +365,7 @@ Unit::Unit(bool isWorldObject) : m_modMeleeHitChance = 0.0f; m_modRangedHitChance = 0.0f; m_modSpellHitChance = 0.0f; - m_baseSpellCritChance = 5; + m_baseSpellCritChance = 5.0f; m_lastManaUse = 0; @@ -7009,17 +7009,28 @@ float Unit::SpellCritChanceDone(SpellInfo const* spellInfo, SpellSchoolMask scho float crit_chance = 0.0f; switch (spellInfo->DmgClass) { + case SPELL_DAMAGE_CLASS_NONE: case SPELL_DAMAGE_CLASS_MAGIC: { - if (schoolMask & SPELL_SCHOOL_MASK_NORMAL) - crit_chance = 0.0f; - // For other schools - else if (GetTypeId() == TYPEID_PLAYER) - crit_chance = GetFloatValue(PLAYER_SPELL_CRIT_PERCENTAGE1 + AsUnderlyingType(GetFirstSchoolInMask(schoolMask))); - else + auto getMagicCritChance = [&] + { + if (IsPlayer()) + return GetFloatValue(PLAYER_SPELL_CRIT_PERCENTAGE1 + AsUnderlyingType(GetFirstSchoolInMask(schoolMask))); + + return m_baseSpellCritChance + GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, schoolMask); + }; + + switch (schoolMask & SPELL_SCHOOL_MASK_NORMAL) { - crit_chance = (float)m_baseSpellCritChance; - crit_chance += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, schoolMask); + case SPELL_SCHOOL_MASK_NORMAL: // physical only + crit_chance = GetUnitCriticalChanceDone(attackType); + break; + case 0: // spell only + crit_chance = getMagicCritChance(); + break; + default: // mix of physical and magic + crit_chance = std::max(getMagicCritChance(), GetUnitCriticalChanceDone(attackType)); + break; } break; } @@ -7030,7 +7041,6 @@ float Unit::SpellCritChanceDone(SpellInfo const* spellInfo, SpellSchoolMask scho crit_chance += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, schoolMask); break; } - case SPELL_DAMAGE_CLASS_NONE: default: return 0.0f; } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 1e2753842f2..7074a6a8058 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1496,7 +1496,7 @@ class TC_GAME_API Unit : public WorldObject float m_modMeleeHitChance; float m_modRangedHitChance; float m_modSpellHitChance; - int32 m_baseSpellCritChance; + float m_baseSpellCritChance; float m_modAttackSpeedPct[MAX_ATTACK]; uint32 m_attackTimer[MAX_ATTACK]; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 2b2a9a841f7..2fec8d0d5bf 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -3871,7 +3871,7 @@ void AuraEffect::HandleModSpellCritChance(AuraApplication const* aurApp, uint8 m if (target->GetTypeId() == TYPEID_PLAYER) target->ToPlayer()->UpdateAllSpellCritChances(); else - target->m_baseSpellCritChance += (apply) ? GetAmount() : -GetAmount(); + target->m_baseSpellCritChance += apply ? GetAmount() : -GetAmount(); } void AuraEffect::HandleModSpellCritChanceShool(AuraApplication const* aurApp, uint8 mode, bool /*apply*/) const @@ -3898,7 +3898,7 @@ void AuraEffect::HandleAuraModCritPct(AuraApplication const* aurApp, uint8 mode, if (target->GetTypeId() != TYPEID_PLAYER) { - target->m_baseSpellCritChance += (apply) ? GetAmount() : -GetAmount(); + target->m_baseSpellCritChance += apply ? GetAmount() : -GetAmount(); return; } @@ -5051,11 +5051,7 @@ void AuraEffect::HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster) { if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? caster : target) { - CastSpellExtraArgs args(this); - if (GetSpellInfo()->HasAttribute(SPELL_ATTR4_INHERIT_CRIT_FROM_AURA)) - args.AddSpellMod(SPELLVALUE_CRIT_CHANCE, int32(GetBase()->GetCritChance() * 100.0f)); // @todo: ugly x100 remove when basepoints are double - - triggerCaster->CastSpell(target, triggerSpellId, args); + triggerCaster->CastSpell(target, triggerSpellId, this); TC_LOG_DEBUG("spells.aura.effect", "AuraEffect::HandlePeriodicTriggerSpellAuraTick: Spell {} Trigger {}", GetId(), triggeredSpellInfo->Id); } } @@ -5079,8 +5075,6 @@ void AuraEffect::HandlePeriodicTriggerSpellWithValueAuraTick(Unit* target, Unit* CastSpellExtraArgs args(this); for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) args.AddSpellMod(SpellValueMod(SPELLVALUE_BASE_POINT0 + i), GetAmount()); - if (GetSpellInfo()->HasAttribute(SPELL_ATTR4_INHERIT_CRIT_FROM_AURA)) - args.AddSpellMod(SPELLVALUE_CRIT_CHANCE, int32(GetBase()->GetCritChance() * 100.0f)); // @todo: ugly x100 remove when basepoints are double triggerCaster->CastSpell(target, triggerSpellId, args); TC_LOG_DEBUG("spells.aura.effect", "AuraEffect::HandlePeriodicTriggerSpellWithValueAuraTick: Spell {} Trigger {}", GetId(), triggeredSpellInfo->Id); diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 1b12ecf3362..2543219d436 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -470,10 +470,6 @@ bool Aura::CanPeriodicTickCrit(Unit const* caster) const if (GetSpellInfo()->HasAttribute(SPELL_ATTR2_CANT_CRIT)) return false; - // need to check this attribute because it's the triggered spell that'll receive the crit chance - if (GetSpellInfo()->HasAttribute(SPELL_ATTR4_INHERIT_CRIT_FROM_AURA)) - return true; - if (caster->HasAuraTypeWithAffectMask(SPELL_AURA_ABILITY_PERIODIC_CRIT, GetSpellInfo())) return true; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 330568bd141..66f690903d4 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -2919,7 +2919,6 @@ void SpellMgr::LoadSpellInfoCustomAttributes() } // remove attribute from spells that can't crit - // and mark triggering spell (instead of triggered spell) for spells with SPELL_ATTR4_INHERIT_CRIT_FROM_AURA for (SpellInfo* spellInfo : mSpellInfoMap) { if (!spellInfo) @@ -2927,28 +2926,6 @@ void SpellMgr::LoadSpellInfoCustomAttributes() if (spellInfo->HasAttribute(SPELL_ATTR2_CANT_CRIT)) spellInfo->AttributesCu &= ~SPELL_ATTR0_CU_CAN_CRIT; - else if (spellInfo->HasAttribute(SPELL_ATTR4_INHERIT_CRIT_FROM_AURA)) - { - bool found = false; - for (SpellEffectInfo const& spellEffectInfo : spellInfo->GetEffects()) - { - switch (spellEffectInfo.ApplyAuraName) - { - case SPELL_AURA_PERIODIC_TRIGGER_SPELL: - case SPELL_AURA_PERIODIC_TRIGGER_SPELL_FROM_CLIENT: - case SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE: - if (SpellInfo* triggerSpell = const_cast<SpellInfo*>(sSpellMgr->GetSpellInfo(spellEffectInfo.TriggerSpell))) - if (triggerSpell->HasAttribute(SPELL_ATTR0_CU_CAN_CRIT)) - found = true; - break; - default: - continue; - } - } - - if (found) - spellInfo->AttributesCu |= SPELL_ATTR0_CU_CAN_CRIT; - } } // add custom attribute to liquid auras @@ -3073,20 +3050,10 @@ void SpellMgr::LoadSpellInfoCorrections() }); } - // Allows those to crit + // this one is here because we have no SP bonus for dmgclass none spell + // but this one should since it's DBC data ApplySpellFix({ - 379, // Earth Shield - 33778, // Lifebloom Final Bloom - 52042, // Healing Stream Totem - // this one is here because we have no SP bonus for dmgclass none spell - // but this one should since it's DBC data, it won't crit because it already has can't crit attr - - 64844, // Divine Hymn - 71607, // Item - Bauble of True Blood 10m - 71646, // Item - Bauble of True Blood 25m - 71610, // Item - Althor's Abacus trigger 10m - 71641 // Item - Althor's Abacus trigger 25m }, [](SpellInfo* spellInfo) { // We need more spells to find a general way (if there is any) @@ -5027,10 +4994,6 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->SpellFamilyFlags[0] |= 0x40; break; } - - // allows those to calculate proper crit chance, that needs to be passed on to triggered spell - if (spellInfo->HasAttribute(SPELL_ATTR4_INHERIT_CRIT_FROM_AURA) && spellInfo->DmgClass == SPELL_DAMAGE_CLASS_NONE) - spellInfo->DmgClass = SPELL_DAMAGE_CLASS_MAGIC; } if (SummonPropertiesEntry* properties = const_cast<SummonPropertiesEntry*>(sSummonPropertiesStore.LookupEntry(121))) diff --git a/src/server/shared/SharedDefines.h b/src/server/shared/SharedDefines.h index f23b5ee486b..a26fa70e95c 100644 --- a/src/server/shared/SharedDefines.h +++ b/src/server/shared/SharedDefines.h @@ -578,7 +578,7 @@ enum SpellAttr4 : uint32 SPELL_ATTR4_UNK24 = 0x01000000, // TITLE Unknown attribute 24@Attr4 DESCRIPTION Shoot-type spell? SPELL_ATTR4_IS_PET_SCALING = 0x02000000, // TITLE Pet Scaling aura SPELL_ATTR4_CAST_ONLY_IN_OUTLAND = 0x04000000, // TITLE Only in Outland/Northrend - SPELL_ATTR4_INHERIT_CRIT_FROM_AURA = 0x08000000, // TITLE Inherit critical chance from triggering aura + SPELL_ATTR4_FORCE_DISPLAY_CASTBAR = 0x08000000, // TITLE Force Display Castbar SPELL_ATTR4_UNK28 = 0x10000000, // TITLE Unknown attribute 28@Attr4 SPELL_ATTR4_UNK29 = 0x20000000, // TITLE Unknown attribute 29@Attr4 SPELL_ATTR4_UNK30 = 0x40000000, // TITLE Unknown attribute 30@Attr4 diff --git a/src/server/shared/enuminfo_SharedDefines.cpp b/src/server/shared/enuminfo_SharedDefines.cpp index bfb9ed34875..db473c9cc24 100644 --- a/src/server/shared/enuminfo_SharedDefines.cpp +++ b/src/server/shared/enuminfo_SharedDefines.cpp @@ -811,7 +811,7 @@ TC_API_EXPORT EnumText EnumUtils<SpellAttr4>::ToString(SpellAttr4 value) case SPELL_ATTR4_UNK24: return { "SPELL_ATTR4_UNK24", "Unknown attribute 24@Attr4", "Shoot-type spell?" }; case SPELL_ATTR4_IS_PET_SCALING: return { "SPELL_ATTR4_IS_PET_SCALING", "Pet Scaling aura", "" }; case SPELL_ATTR4_CAST_ONLY_IN_OUTLAND: return { "SPELL_ATTR4_CAST_ONLY_IN_OUTLAND", "Only in Outland/Northrend", "" }; - case SPELL_ATTR4_INHERIT_CRIT_FROM_AURA: return { "SPELL_ATTR4_INHERIT_CRIT_FROM_AURA", "Inherit critical chance from triggering aura", "" }; + case SPELL_ATTR4_FORCE_DISPLAY_CASTBAR: return { "SPELL_ATTR4_FORCE_DISPLAY_CASTBAR", "Force Display Castbar", "" }; case SPELL_ATTR4_UNK28: return { "SPELL_ATTR4_UNK28", "Unknown attribute 28@Attr4", "" }; case SPELL_ATTR4_UNK29: return { "SPELL_ATTR4_UNK29", "Unknown attribute 29@Attr4", "" }; case SPELL_ATTR4_UNK30: return { "SPELL_ATTR4_UNK30", "Unknown attribute 30@Attr4", "" }; @@ -855,7 +855,7 @@ TC_API_EXPORT SpellAttr4 EnumUtils<SpellAttr4>::FromIndex(size_t index) case 24: return SPELL_ATTR4_UNK24; case 25: return SPELL_ATTR4_IS_PET_SCALING; case 26: return SPELL_ATTR4_CAST_ONLY_IN_OUTLAND; - case 27: return SPELL_ATTR4_INHERIT_CRIT_FROM_AURA; + case 27: return SPELL_ATTR4_FORCE_DISPLAY_CASTBAR; case 28: return SPELL_ATTR4_UNK28; case 29: return SPELL_ATTR4_UNK29; case 30: return SPELL_ATTR4_UNK30; @@ -896,7 +896,7 @@ TC_API_EXPORT size_t EnumUtils<SpellAttr4>::ToIndex(SpellAttr4 value) case SPELL_ATTR4_UNK24: return 24; case SPELL_ATTR4_IS_PET_SCALING: return 25; case SPELL_ATTR4_CAST_ONLY_IN_OUTLAND: return 26; - case SPELL_ATTR4_INHERIT_CRIT_FROM_AURA: return 27; + case SPELL_ATTR4_FORCE_DISPLAY_CASTBAR: return 27; case SPELL_ATTR4_UNK28: return 28; case SPELL_ATTR4_UNK29: return 29; case SPELL_ATTR4_UNK30: return 30; |