aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp30
-rw-r--r--src/server/game/Entities/Unit/Unit.h2
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp12
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp4
-rw-r--r--src/server/game/Spells/SpellMgr.cpp41
-rw-r--r--src/server/shared/SharedDefines.h2
-rw-r--r--src/server/shared/enuminfo_SharedDefines.cpp6
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;