Skip to content

Commit

Permalink
Spell/Mage: Implement m_damageDoneMultiplier and use it for Ice Lance…
Browse files Browse the repository at this point in the history
… frozen bonus
  • Loading branch information
killerwife committed Sep 17, 2023
1 parent eb69dd0 commit 87a3af6
Show file tree
Hide file tree
Showing 6 changed files with 32 additions and 22 deletions.
1 change: 1 addition & 0 deletions sql/scriptdev2/spell.sql
Original file line number Diff line number Diff line change
Expand Up @@ -804,6 +804,7 @@ INSERT INTO spell_scripts(Id, ScriptName) VALUES
(12983,'spell_shatter_mage'),
(12984,'spell_shatter_mage'),
(12985,'spell_shatter_mage'),
(30455,'spell_ice_lance'),
(42208,'spell_blizzard'),
(42209,'spell_blizzard'),
(42210,'spell_blizzard'),
Expand Down
17 changes: 0 additions & 17 deletions src/game/Entities/Unit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7466,23 +7466,6 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellSchoolMask schoolMask, Spel
}
}

// Custom scripted damage
switch (spellInfo->SpellFamilyName)
{
case SPELLFAMILY_MAGE:
{
// Ice Lance
if (spellInfo->SpellIconID == 186)
{
if (victim->isFrozen())
DoneTotalMod *= 3.0f;
}
break;
}
default:
break;
}

// apply ap bonus and benefit affected by spell power implicit coeffs and spell level penalties
DoneTotal = SpellBonusWithCoeffs(spellInfo, DoneTotal, DoneAdvertisedBenefit, 0, damagetype, true);

Expand Down
15 changes: 15 additions & 0 deletions src/game/Spells/Scripts/Scripting/ClassScripts/Mage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,9 +85,24 @@ struct Blizzard : public SpellScript
}
};

// 30455 - Ice Lance
struct IceLance : public SpellScript
{
void OnEffectExecute(Spell* spell, SpellEffectIndex effIdx) const override
{
if (effIdx != EFFECT_INDEX_0)
return;

Unit* target = spell->GetUnitTarget();
if (target->isFrozen()) // does not affect damage taken modifiers per research
spell->SetDamageDoneModifier(3.f, EFFECT_INDEX_0);
}
};

void LoadMageScripts()
{
RegisterSpellScript<ArcaneConcentration>("spell_arcane_concentration");
RegisterSpellScript<ShatterMage>("spell_shatter_mage");
RegisterSpellScript<Blizzard>("spell_blizzard");
RegisterSpellScript<IceLance>("spell_ice_lance");
}
11 changes: 10 additions & 1 deletion src/game/Spells/Spell.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,8 @@ Spell::Spell(WorldObject* caster, SpellEntry const* info, uint32 triggeredFlags,
m_delayAtDamageCount = 0;

m_applyMultiplierMask = 0;
for (float& value : m_damageDoneMultiplier)
value = 1.f;

// Get data for type of attack
m_attackType = GetWeaponAttackType(m_spellInfo);
Expand Down Expand Up @@ -6566,7 +6568,7 @@ SpellCastResult Spell::CheckRange(bool strict)
return SPELL_CAST_OK;
}

int32 Spell::CalculateSpellEffectDamage(Unit* unitTarget, int32 damage)
int32 Spell::CalculateSpellEffectDamage(Unit* unitTarget, int32 damage, float damageDoneMod)
{
// damage bonus (per damage class)
switch (m_spellInfo->DmgClass)
Expand All @@ -6578,6 +6580,7 @@ int32 Spell::CalculateSpellEffectDamage(Unit* unitTarget, int32 damage)
// Calculate damage bonus
if (!m_trueCaster->IsGameObject())
damage = m_caster->MeleeDamageBonusDone(unitTarget, damage, m_attackType, m_spellSchoolMask, m_spellInfo, SPELL_DIRECT_DAMAGE);
damage *= damageDoneMod;
damage = unitTarget->MeleeDamageBonusTaken(m_trueCaster->IsGameObject() ? nullptr : m_caster, damage, m_attackType, m_spellSchoolMask, m_spellInfo, SPELL_DIRECT_DAMAGE);
}
break;
Expand All @@ -6588,6 +6591,7 @@ int32 Spell::CalculateSpellEffectDamage(Unit* unitTarget, int32 damage)
// Calculate damage bonus
if (!m_trueCaster->IsGameObject())
damage = m_caster->SpellDamageBonusDone(unitTarget, m_spellSchoolMask, m_spellInfo, damage, SPELL_DIRECT_DAMAGE);
damage *= damageDoneMod;
damage = unitTarget->SpellDamageBonusTaken(m_trueCaster->IsGameObject() ? nullptr : m_caster, m_spellSchoolMask, m_spellInfo, damage, SPELL_DIRECT_DAMAGE);
}
break;
Expand Down Expand Up @@ -8292,6 +8296,11 @@ void Spell::SetOverridenSpeed(float newSpeed)
m_overridenSpeed = newSpeed;
}

void Spell::SetDamageDoneModifier(float mod, SpellEffectIndex effIdx)
{
m_damageDoneMultiplier[effIdx] = mod;
}

void Spell::OnInit()
{
if (SpellScript* script = GetSpellScript())
Expand Down
4 changes: 3 additions & 1 deletion src/game/Spells/Spell.h
Original file line number Diff line number Diff line change
Expand Up @@ -493,7 +493,7 @@ class Spell

int32 CalculateSpellEffectValue(SpellEffectIndex i, Unit* target, bool maximum = false, bool finalUse = true)
{ return m_trueCaster->CalculateSpellEffectValue(target, m_spellInfo, i, &m_currentBasePoints[i], maximum, finalUse); }
int32 CalculateSpellEffectDamage(Unit* unitTarget, int32 damage);
int32 CalculateSpellEffectDamage(Unit* unitTarget, int32 damage, float damageDoneMod);
static uint32 CalculatePowerCost(SpellEntry const* spellInfo, Unit* caster, Spell* spell = nullptr, Item* castItem = nullptr, bool finalUse = false);

bool HaveTargetsForEffect(SpellEffectIndex effect) const;
Expand Down Expand Up @@ -804,6 +804,7 @@ class Spell
// overrides
void SetOverridenSpeed(float newSpeed);
void SetIgnoreRoot(bool state) { m_ignoreRoot = state; }
void SetDamageDoneModifier(float mod, SpellEffectIndex effIdx);
protected:
void SendLoot(ObjectGuid guid, LootType loottype, LockType lockType);
bool IgnoreItemRequirements() const; // some item use spells have unexpected reagent data
Expand Down Expand Up @@ -848,6 +849,7 @@ class Spell
bool m_needSpellLog; // need to send spell log?
uint8 m_applyMultiplierMask; // by effect: damage multiplier needed?
float m_damageMultipliers[3]; // by effect: damage multiplier
float m_damageDoneMultiplier[3];

// Current targets, to be used in SpellEffects (MUST BE USED ONLY IN SPELL EFFECTS)
Unit* unitTarget;
Expand Down
6 changes: 3 additions & 3 deletions src/game/Spells/SpellEffects.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -574,7 +574,7 @@ void Spell::EffectSchoolDMG(SpellEffectIndex eff_idx)
}

if (damage >= 0)
m_damagePerEffect[eff_idx] = CalculateSpellEffectDamage(unitTarget, damage);
m_damagePerEffect[eff_idx] = CalculateSpellEffectDamage(unitTarget, damage, m_damageDoneMultiplier[eff_idx]);
}
}

Expand Down Expand Up @@ -3497,7 +3497,7 @@ void Spell::EffectPowerBurn(SpellEffectIndex eff_idx)

new_damage = int32(new_damage * multiplier);

m_damagePerEffect[eff_idx] = CalculateSpellEffectDamage(unitTarget, new_damage);
m_damagePerEffect[eff_idx] = CalculateSpellEffectDamage(unitTarget, new_damage, m_damageDoneMultiplier[eff_idx]);

// should use here effect POWER_DRAIN because POWER_BURN is not implemented on client
m_spellLog.AddLog(uint32(SPELL_EFFECT_POWER_DRAIN), unitTarget->GetPackGUID(), new_damage, uint32(powertype), multiplier);
Expand Down Expand Up @@ -5735,7 +5735,7 @@ void Spell::EffectWeaponDmg(SpellEffectIndex eff_idx)
bonus = int32(bonus * totalDamagePercentMod);

// prevent negative damage
m_damagePerEffect[eff_idx] = CalculateSpellEffectDamage(unitTarget, bonus);
m_damagePerEffect[eff_idx] = CalculateSpellEffectDamage(unitTarget, bonus, m_damageDoneMultiplier[eff_idx]);

// Hemorrhage
if (m_spellInfo->IsFitToFamily(SPELLFAMILY_ROGUE, uint64(0x0000000002000000)))
Expand Down

0 comments on commit 87a3af6

Please sign in to comment.