aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/SpellInfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Spells/SpellInfo.cpp')
-rw-r--r--src/server/game/Spells/SpellInfo.cpp87
1 files changed, 83 insertions, 4 deletions
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index 7a9ef241ad3..b381249cdcc 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -508,6 +508,7 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster, int32 const* bp, Unit const
value = caster->ApplyEffectModifiers(_spellInfo, _effIndex, value);
// amount multiplication based on caster's level
+/* REVIEW - MERGE <<<<<<< HEAD
if (!_spellInfo->GetSpellScaling() && !basePointsPerLevel && (_spellInfo->Attributes & SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION && _spellInfo->SpellLevel) &&
Effect != SPELL_EFFECT_WEAPON_PERCENT_DAMAGE &&
Effect != SPELL_EFFECT_KNOCK_BACK &&
@@ -519,6 +520,58 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster, int32 const* bp, Unit const
//there are many more: slow speed, -healing pct
value *= 0.25f * exp(caster->getLevel() * (70 - _spellInfo->SpellLevel) / 1000.0f);
//value = int32(value * (int32)getLevel() / (int32)(_spellInfo->spellLevel ? _spellInfo->spellLevel : 1));
+======= */
+ if (!caster->IsControlledByPlayer() &&
+ _spellInfo->SpellLevel && _spellInfo->SpellLevel != caster->getLevel() &&
+ !basePointsPerLevel && (_spellInfo->Attributes & SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION))
+ {
+ bool canEffectScale = false;
+ switch (Effect)
+ {
+ case SPELL_EFFECT_SCHOOL_DAMAGE:
+ case SPELL_EFFECT_DUMMY:
+ case SPELL_EFFECT_POWER_DRAIN:
+ case SPELL_EFFECT_HEALTH_LEECH:
+ case SPELL_EFFECT_HEAL:
+ case SPELL_EFFECT_WEAPON_DAMAGE:
+ case SPELL_EFFECT_POWER_BURN:
+ case SPELL_EFFECT_SCRIPT_EFFECT:
+ case SPELL_EFFECT_NORMALIZED_WEAPON_DMG:
+ case SPELL_EFFECT_FORCE_CAST_WITH_VALUE:
+ case SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE:
+ case SPELL_EFFECT_TRIGGER_MISSILE_SPELL_WITH_VALUE:
+ canEffectScale = true;
+ break;
+ default:
+ break;
+ }
+
+ switch (ApplyAuraName)
+ {
+ case SPELL_AURA_PERIODIC_DAMAGE:
+ case SPELL_AURA_DUMMY:
+ case SPELL_AURA_PERIODIC_HEAL:
+ case SPELL_AURA_DAMAGE_SHIELD:
+ case SPELL_AURA_PROC_TRIGGER_DAMAGE:
+ case SPELL_AURA_PERIODIC_LEECH:
+ case SPELL_AURA_PERIODIC_MANA_LEECH:
+ case SPELL_AURA_SCHOOL_ABSORB:
+ case SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE:
+ canEffectScale = true;
+ break;
+ default:
+ break;
+ }
+
+ if (canEffectScale)
+ {
+ GtNPCManaCostScalerEntry const* spellScaler = sGtNPCManaCostScalerStore.LookupEntry(_spellInfo->SpellLevel - 1);
+ GtNPCManaCostScalerEntry const* casterScaler = sGtNPCManaCostScalerStore.LookupEntry(caster->getLevel() - 1);
+ if (spellScaler && casterScaler)
+ value *= casterScaler->ratio / spellScaler->ratio;
+ }
+ }
+// REVIEW - MERGE >>>>>>> master
}
return int32(value);
@@ -2313,15 +2366,41 @@ int32 SpellInfo::CalcPowerCost(Unit const* caster, SpellSchoolMask schoolMask) c
continue;
powerCost += (*i)->GetAmount();
}
+
// Shiv - costs 20 + weaponSpeed*10 energy (apply only to non-triggered spell with energy cost)
if (AttributesEx4 & SPELL_ATTR4_SPELL_VS_EXTEND_COST)
- powerCost += caster->GetAttackTime(OFF_ATTACK) / 100;
+ {
+ uint32 speed = 0;
+/* REVIEW - MERGE
+ if (SpellShapeshiftEntry const* ss = sSpellShapeshiftStore.LookupEntry(caster->GetShapeshiftForm()))
+ speed = ss->attackSpeed;
+ else
+*/
+ {
+ WeaponAttackType slot = BASE_ATTACK;
+ if (AttributesEx3 & SPELL_ATTR3_REQ_OFFHAND)
+ slot = OFF_ATTACK;
+
+ speed = caster->GetAttackTime(slot);
+ }
+
+ powerCost += speed / 100;
+ }
+
// Apply cost mod by spell
if (Player* modOwner = caster->GetSpellModOwner())
modOwner->ApplySpellMod(Id, SPELLMOD_COST, powerCost);
- if (Attributes & SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION)
- powerCost = int32(powerCost / (1.117f * SpellLevel / caster->getLevel() -0.1327f));
+ if (!caster->IsControlledByPlayer())
+ {
+ if (Attributes & SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION)
+ {
+ GtNPCManaCostScalerEntry const* spellScaler = sGtNPCManaCostScalerStore.LookupEntry(SpellLevel - 1);
+ GtNPCManaCostScalerEntry const* casterScaler = sGtNPCManaCostScalerStore.LookupEntry(caster->getLevel() - 1);
+ if (spellScaler && casterScaler)
+ powerCost *= casterScaler->ratio / spellScaler->ratio;
+ }
+ }
// PCT mod from user auras by spell school and power type
Unit::AuraEffectList const& aurasPct = caster->GetAuraEffectsByType(SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT);
@@ -2611,7 +2690,7 @@ bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const
continue;
// if non-positive trigger cast targeted to positive target this main cast is non-positive
// this will place this spell auras as debuffs
- if (_IsPositiveTarget(spellTriggeredProto->Effects[i].TargetA.GetTarget(), spellTriggeredProto->Effects[i].TargetB.GetTarget()) && !spellTriggeredProto->_IsPositiveEffect(i, true))
+ if (!_IsPositiveTarget(spellTriggeredProto->Effects[i].TargetA.GetTarget(), spellTriggeredProto->Effects[i].TargetB.GetTarget()) && !spellTriggeredProto->_IsPositiveEffect(i, true))
return false;
}
}