diff options
-rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 95 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.h | 27 |
2 files changed, 79 insertions, 43 deletions
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index b9dc74f081f..f7849ca0d7d 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -370,9 +370,9 @@ SpellEffectInfo::SpellEffectInfo(SpellEntry const* /*spellEntry*/, SpellInfo con uint32 _effectScalingId = _effect ? sSpellEffectScallingByEffectId.find(_effect->ID) != sSpellEffectScallingByEffectId.end() ? sSpellEffectScallingByEffectId[_effect->ID] : 0 : 0; SpellEffectScalingEntry const* _effectScalingEntry = sSpellEffectScalingStore.LookupEntry(_effectScalingId); - ScalingMultiplier = _effectScalingEntry ? _effectScalingEntry->Coefficient : 0.0f; - DeltaScalingMultiplier = _effectScalingEntry ? _effectScalingEntry->Variance : 0.0f; - ComboScalingMultiplier = _effectScalingEntry ? _effectScalingEntry->ResourceCoefficient : 0.0f; + Scaling.Coefficient = _effectScalingEntry ? _effectScalingEntry->Coefficient : 0.0f; + Scaling.Variance = _effectScalingEntry ? _effectScalingEntry->Variance : 0.0f; + Scaling.ResourceCoefficient = _effectScalingEntry ? _effectScalingEntry->ResourceCoefficient : 0.0f; } bool SpellEffectInfo::IsEffect() const @@ -438,35 +438,60 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster, int32 const* bp, Unit const float comboDamage = PointsPerResource; // base amount modification based on spell lvl vs caster lvl - if (ScalingMultiplier != 0.0f) + if (Scaling.Coefficient != 0.0f) { - if (caster) + int32 level = _spellInfo->SpellLevel; + if (target && _spellInfo->IsPositiveEffect(EffectIndex) && (Effect == SPELL_EFFECT_APPLY_AURA)) + level = target->getLevel(); + else if (caster) + level = caster->getLevel(); + + if (!(_spellInfo->AttributesEx11 & SPELL_ATTR11_UNK2) && _spellInfo->AttributesEx10 & SPELL_ATTR10_UNK12) + level = _spellInfo->BaseLevel; + + if (_spellInfo->Scaling.MaxScalingLevel && _spellInfo->Scaling.MaxScalingLevel > level) + level = _spellInfo->Scaling.MaxScalingLevel; + + float value = 0.0f; + if (level > 0) { - int32 level = caster->getLevel(); - if (target && _spellInfo->IsPositiveEffect(EffectIndex) && (Effect == SPELL_EFFECT_APPLY_AURA)) - level = target->getLevel(); + if (!_spellInfo->Scaling.Class) + return 0; - if (GtSpellScalingEntry const* gtScaling = sGtSpellScalingStore.EvaluateTable(level - 1, (_spellInfo->ScalingClass != -1 ? _spellInfo->ScalingClass - 1 : MAX_CLASSES - 1))) + if (!_spellInfo->Scaling.ScalesFromItemLevel) { - float multiplier = gtScaling->value; - if (_spellInfo->CastTimeMax > 0 && _spellInfo->CastTimeMaxLevel > level) - multiplier *= float(_spellInfo->CastTimeMin + (level - 1) * (_spellInfo->CastTimeMax - _spellInfo->CastTimeMin) / (_spellInfo->CastTimeMaxLevel - 1)) / float(_spellInfo->CastTimeMax); - if (_spellInfo->CoefLevelBase > level) - multiplier *= (1.0f - _spellInfo->CoefBase) * (float)(level - 1) / (float)(_spellInfo->CoefLevelBase - 1) + _spellInfo->CoefBase; - - float preciseBasePoints = ScalingMultiplier * multiplier; - if (DeltaScalingMultiplier) + if (!(_spellInfo->AttributesEx11 & SPELL_ATTR11_UNK2)) { - float delta = fabs(DeltaScalingMultiplier * ScalingMultiplier * multiplier * 0.5f); - preciseBasePoints += frand(-delta, delta); + if (GtSpellScalingEntry const* gtScaling = sGtSpellScalingStore.EvaluateTable(level - 1, (_spellInfo->Scaling.Class > 0 ? _spellInfo->Scaling.Class - 1 : MAX_CLASSES - 1))) + value = gtScaling->value; } + else + value = GetRandomPropertyPoints(level, ITEM_QUALITY_RARE, INVTYPE_CHEST, 0); + } + else + value = GetRandomPropertyPoints(_spellInfo->Scaling.ScalesFromItemLevel, ITEM_QUALITY_RARE, INVTYPE_CHEST, 0); - basePoints = int32(preciseBasePoints); + if (level < _spellInfo->Scaling.CastTimeMaxLevel && _spellInfo->Scaling.CastTimeMax) + value *= float(_spellInfo->Scaling.CastTimeMin + (level - 1) * (_spellInfo->Scaling.CastTimeMax - _spellInfo->Scaling.CastTimeMin) / (_spellInfo->Scaling.CastTimeMaxLevel - 1)) / float(_spellInfo->Scaling.CastTimeMax); - if (ComboScalingMultiplier) - comboDamage = ComboScalingMultiplier * multiplier; - } + if (level < _spellInfo->Scaling.NerfMaxLevel) + value *= ((((1.0 - _spellInfo->Scaling.NerfFactor) * (level - 1)) / (_spellInfo->Scaling.NerfMaxLevel - 1)) + _spellInfo->Scaling.NerfFactor); } + + value *= Scaling.Coefficient; + if (value != 0.0f && value < 1.0f) + value = 1.0f; + + if (Scaling.Variance) + { + float delta = fabs(Scaling.Variance * value * 0.5f); + value += frand(-delta, delta); + } + + basePoints = int32(value); + + if (Scaling.ResourceCoefficient) + comboDamage = Scaling.ResourceCoefficient * value; } else { @@ -921,12 +946,14 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap effects) // SpellScalingEntry SpellScalingEntry const* _scaling = GetSpellScaling(); - CastTimeMin = _scaling ? _scaling->CastTimeMin : 0; - CastTimeMax = _scaling ?_scaling->CastTimeMax : 0; - CastTimeMaxLevel = _scaling ? _scaling->CastTimeMaxLevel : 0; - ScalingClass = _scaling ? _scaling->ScalingClass : 0; - CoefBase = _scaling ? _scaling->NerfFactor : 0; - CoefLevelBase = _scaling ? _scaling->NerfMaxLevel : 0; + Scaling.CastTimeMin = _scaling ? _scaling->CastTimeMin : 0; + Scaling.CastTimeMax = _scaling ?_scaling->CastTimeMax : 0; + Scaling.CastTimeMaxLevel = _scaling ? _scaling->CastTimeMaxLevel : 0; + Scaling.Class = _scaling ? _scaling->ScalingClass : 0; + Scaling.NerfFactor = _scaling ? _scaling->NerfFactor : 0; + Scaling.NerfMaxLevel = _scaling ? _scaling->NerfMaxLevel : 0; + Scaling.MaxScalingLevel = _scaling ? _scaling->MaxScalingLevel : 0; + Scaling.ScalesFromItemLevel = _scaling ? _scaling->ScalesFromItemLevel : 0; // SpellAuraOptionsEntry SpellAuraOptionsEntry const* _options = GetSpellAuraOptions(); @@ -2368,11 +2395,11 @@ uint32 SpellInfo::CalcCastTime(uint8 level, Spell* spell /*= NULL*/) const level = spell->GetCaster()->getLevel(); // not all spells have cast time index and this is all is pasiive abilities - if (level && CastTimeMax > 0) + if (level && Scaling.CastTimeMax > 0) { - castTime = CastTimeMax; - if (CastTimeMaxLevel > level) - castTime = CastTimeMin + int32(level - 1) * (CastTimeMax - CastTimeMin) / (CastTimeMaxLevel - 1); + castTime = Scaling.CastTimeMax; + if (Scaling.CastTimeMaxLevel > level) + castTime = Scaling.CastTimeMin + int32(level - 1) * (Scaling.CastTimeMax - Scaling.CastTimeMin) / (Scaling.CastTimeMaxLevel - 1); } else if (CastTimeEntry) castTime = CastTimeEntry->CastTime; @@ -2576,7 +2603,7 @@ SpellInfo const* SpellInfo::GetAuraRankForLevel(uint8 level) const (effect->Effect == SPELL_EFFECT_APPLY_AURA || effect->Effect == SPELL_EFFECT_APPLY_AREA_AURA_PARTY || effect->Effect == SPELL_EFFECT_APPLY_AREA_AURA_RAID) && - !effect->ScalingMultiplier) + !effect->Scaling.Coefficient) { needRankSelection = true; break; diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index d787fc8b44e..8003b4bbd2e 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -261,9 +261,12 @@ public: flag128 SpellClassMask; std::list<Condition*>* ImplicitTargetConditions; // SpellScalingEntry - float ScalingMultiplier; - float DeltaScalingMultiplier; - float ComboScalingMultiplier; + struct ScalingInfo + { + float Coefficient; + float Variance; + float ResourceCoefficient; + } Scaling; SpellEffectInfo() : _spellInfo(NULL), EffectIndex(0), Effect(0), ApplyAuraName(0), ApplyAuraPeriod(0), DieSides(0), RealPointsPerLevel(0), BasePoints(0), PointsPerResource(0), Amplitude(0), ChainAmplitude(0), @@ -410,12 +413,18 @@ public: uint32 SpellTotemsId; uint32 SpellMiscId; // SpellScalingEntry - int32 CastTimeMin; - int32 CastTimeMax; - int32 CastTimeMaxLevel; - int32 ScalingClass; - float CoefBase; - int32 CoefLevelBase; + struct ScalingInfo + { + int32 CastTimeMin; + int32 CastTimeMax; + uint32 CastTimeMaxLevel; + int32 Class; + float NerfFactor; + uint32 NerfMaxLevel; + uint32 MaxScalingLevel; + uint32 ScalesFromItemLevel; + } Scaling; + uint32 ExplicitTargetMask; SpellChainNode const* ChainEntry; |