aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp3
-rw-r--r--src/server/game/Entities/Object/Object.cpp2
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp16
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp28
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp20
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.h4
-rw-r--r--src/server/game/Spells/Spell.cpp32
-rw-r--r--src/server/game/Spells/Spell.h2
-rw-r--r--src/server/game/Spells/SpellDefines.h16
-rw-r--r--src/server/game/Spells/SpellEffects.cpp141
-rw-r--r--src/server/scripts/Spells/spell_warlock.cpp2
11 files changed, 170 insertions, 96 deletions
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
index 7e22c4d3a58..55f6cb7f04c 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
@@ -660,7 +660,8 @@ void AreaTrigger::DoActions(Unit* unit)
switch (action.ActionType)
{
case AREATRIGGER_ACTION_CAST:
- caster->CastSpell(unit, action.Param, true);
+ caster->CastSpell(unit, action.Param, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_areaTriggerData->CreatingEffectGUID->IsCast() ? *m_areaTriggerData->CreatingEffectGUID : ObjectGuid::Empty));
break;
case AREATRIGGER_ACTION_ADDAURA:
caster->AddAura(action.Param, unit);
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index ba5573d171b..130f6ffd8d9 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -2638,7 +2638,7 @@ void WorldObject::CastSpell(SpellCastTargets const& targets, uint32 spellId, Cas
return;
}
- Spell* spell = new Spell(this, info, args.TriggerFlags, args.OriginalCaster);
+ Spell* spell = new Spell(this, info, args.TriggerFlags, args.OriginalCaster, args.OriginalCastId);
for (auto const& pair : args.SpellValueOverrides)
spell->SetSpellValue(pair.first, pair.second);
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 6fc02b4f74d..e86156cc3bf 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -1885,7 +1885,7 @@ void Unit::HandleEmoteCommand(uint32 anim_id, Trinity::IteratorPair<int32 const*
uint32 split_absorb = 0;
Unit::DealDamageMods(damageInfo.GetAttacker(), caster, splitDamage, &split_absorb);
- SpellNonMeleeDamage log(damageInfo.GetAttacker(), caster, (*itr)->GetSpellInfo(), (*itr)->GetBase()->GetSpellVisual(), damageInfo.GetSchoolMask(), (*itr)->GetBase()->GetCastGUID());
+ SpellNonMeleeDamage log(damageInfo.GetAttacker(), caster, (*itr)->GetSpellInfo(), (*itr)->GetBase()->GetSpellVisual(), damageInfo.GetSchoolMask(), (*itr)->GetBase()->GetCastId());
CleanDamage cleanDamage = CleanDamage(splitDamage, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
Unit::DealDamage(damageInfo.GetAttacker(), caster, splitDamage, &cleanDamage, DIRECT_DAMAGE, damageInfo.GetSchoolMask(), (*itr)->GetSpellInfo(), false);
log.damage = splitDamage;
@@ -2025,10 +2025,7 @@ void Unit::AttackerStateUpdate(Unit* victim, WeaponAttackType attType, bool extr
}
else
{
- CastSpellExtraArgs args;
- args.TriggerFlags = TRIGGERED_FULL_MASK;
- args.TriggeringAura = meleeAttackAuraEffect;
- CastSpell(victim, meleeAttackSpellId, args);
+ CastSpell(victim, meleeAttackSpellId, meleeAttackAuraEffect);
uint32 hitInfo = HITINFO_AFFECTS_VICTIM | HITINFO_NO_ANIMATION;
if (attType == OFF_ATTACK)
@@ -3370,7 +3367,7 @@ void Unit::_RemoveNoStackAurasDueToAura(Aura* aura)
{
Unit* caster = aura->GetCaster();
if (caster && caster->GetTypeId() == TYPEID_PLAYER)
- Spell::SendCastResult(caster->ToPlayer(), aura->GetSpellInfo(), aura->GetSpellVisual(), aura->GetCastGUID(), SPELL_FAILED_AURA_BOUNCED);
+ Spell::SendCastResult(caster->ToPlayer(), aura->GetSpellInfo(), aura->GetSpellVisual(), aura->GetCastId(), SPELL_FAILED_AURA_BOUNCED);
}
aura->Remove();
@@ -3737,7 +3734,7 @@ void Unit::RemoveAurasDueToSpellBySteal(uint32 spellId, ObjectGuid casterGUID, W
if (aura->IsSingleTarget())
aura->UnregisterSingleTarget();
- AuraCreateInfo createInfo(aura->GetCastGUID(), aura->GetSpellInfo(), aura->GetCastDifficulty(), effMask, unitStealer);
+ AuraCreateInfo createInfo(aura->GetCastId(), aura->GetSpellInfo(), aura->GetCastDifficulty(), effMask, unitStealer);
createInfo
.SetCasterGUID(aura->GetCasterGUID())
.SetBaseAmount(baseDamage);
@@ -9029,10 +9026,7 @@ void Unit::TriggerOnPowerChangeAuras(Powers power, int32 oldVal, int32 newVal)
break;
}
- CastSpellExtraArgs args;
- args.TriggerFlags = TRIGGERED_FULL_MASK;
- args.TriggeringAura = effect;
- CastSpell(this, triggerSpell, args);
+ CastSpell(this, triggerSpell, effect);
}
}
}
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index e52cd9b5181..e4a9c1d1cc8 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -2543,7 +2543,7 @@ void AuraEffect::HandleAuraMounted(AuraApplication const* aurApp, uint8 mode, bo
// cast speed aura
if (mode & AURA_EFFECT_HANDLE_REAL)
if (MountCapabilityEntry const* mountCapability = sMountCapabilityStore.LookupEntry(GetAmount()))
- target->CastSpell(target, mountCapability->ModSpellAuraID, true);
+ target->CastSpell(target, mountCapability->ModSpellAuraID, this);
}
else
{
@@ -4544,14 +4544,14 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool
break;
case 91604: // Restricted Flight Area
if (aurApp->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE)
- target->CastSpell(target, 58601, true);
+ target->CastSpell(target, 58601, this);
break;
}
break;
case SPELLFAMILY_DEATHKNIGHT:
// Summon Gargoyle (Dismiss Gargoyle at remove)
if (GetId() == 61777)
- target->CastSpell(target, GetAmount(), true);
+ target->CastSpell(target, GetAmount(), this);
break;
default:
break;
@@ -4583,7 +4583,8 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool
CastSpellExtraArgs args;
args.TriggerFlags = TRIGGERED_FULL_MASK;
args.OriginalCaster = GetCasterGUID();
- args.CastDifficulty = spell->Difficulty;
+ args.OriginalCastId = GetBase()->GetCastId();
+ args.CastDifficulty = GetBase()->GetCastDifficulty();
for (uint32 i = 0; i < spell->StackAmount; ++i)
caster->CastSpell(target, spell->Id, args);
@@ -4602,7 +4603,8 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool
CastSpellExtraArgs args;
args.TriggerFlags = TRIGGERED_FULL_MASK;
args.OriginalCaster = GetCasterGUID();
- args.CastDifficulty = spell->Difficulty;
+ args.OriginalCastId = GetBase()->GetCastId();
+ args.CastDifficulty = GetBase()->GetCastDifficulty();
for (uint32 i = 0; i < spell->StackAmount; ++i)
caster->CastSpell(target, spell->Id, args);
@@ -4650,7 +4652,7 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool
target->PlayDirectSound(14970, target->ToPlayer());
// continue in 58205
else
- target->CastSpell(target, 58205, true);
+ target->CastSpell(target, 58205, this);
}
break;
// LK Intro VO (2)
@@ -4937,7 +4939,7 @@ void AuraEffect::HandleTriggerSpellOnPowerPercent(AuraApplication const* aurApp,
break;
}
- target->CastSpell(target, triggerSpell, true);
+ target->CastSpell(target, triggerSpell, this);
}
void AuraEffect::HandleTriggerSpellOnPowerAmount(AuraApplication const* aurApp, uint8 mode, bool apply) const
@@ -4965,7 +4967,7 @@ void AuraEffect::HandleTriggerSpellOnPowerAmount(AuraApplication const* aurApp,
break;
}
- target->CastSpell(target, triggerSpell, true);
+ target->CastSpell(target, triggerSpell, this);
}
void AuraEffect::HandleAuraOpenStable(AuraApplication const* aurApp, uint8 mode, bool apply) const
@@ -5338,7 +5340,7 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c
GetCasterGUID().ToString().c_str(), target->GetGUID().ToString().c_str(), damage, GetId(), absorb);
// SendSpellNonMeleeDamageLog expects non-absorbed/non-resisted damage
- SpellNonMeleeDamage log(caster, target, GetSpellInfo(), GetBase()->GetSpellVisual(), GetSpellInfo()->GetSchoolMask(), GetBase()->GetCastGUID());
+ SpellNonMeleeDamage log(caster, target, GetSpellInfo(), GetBase()->GetSpellVisual(), GetSpellInfo()->GetSchoolMask(), GetBase()->GetCastId());
log.damage = damage;
log.originalDamage = dmg;
log.absorb = absorb;
@@ -5616,7 +5618,7 @@ void AuraEffect::HandlePeriodicPowerBurnAuraTick(Unit* target, Unit* caster) con
SpellInfo const* spellProto = GetSpellInfo();
// maybe has to be sent different to client, but not by SMSG_PERIODICAURALOG
- SpellNonMeleeDamage damageInfo(caster, target, spellProto, GetBase()->GetSpellVisual(), spellProto->SchoolMask, GetBase()->GetCastGUID());
+ SpellNonMeleeDamage damageInfo(caster, target, spellProto, GetBase()->GetSpellVisual(), spellProto->SchoolMask, GetBase()->GetCastId());
// no SpellDamageBonus for burn mana
caster->CalculateSpellDamageTaken(&damageInfo, int32(gain * dmgMultiplier), spellProto);
@@ -5714,7 +5716,7 @@ void AuraEffect::HandleProcTriggerDamageAuraProc(AuraApplication* aurApp, ProcEv
return;
}
- SpellNonMeleeDamage damageInfo(target, triggerTarget, GetSpellInfo(), GetBase()->GetSpellVisual(), GetSpellInfo()->SchoolMask, GetBase()->GetCastGUID());
+ SpellNonMeleeDamage damageInfo(target, triggerTarget, GetSpellInfo(), GetBase()->GetSpellVisual(), GetSpellInfo()->SchoolMask, GetBase()->GetCastId());
uint32 damage = target->SpellDamageBonusDone(triggerTarget, GetSpellInfo(), GetAmount(), SPELL_DIRECT_DAMAGE, GetSpellEffectInfo());
damage = triggerTarget->SpellDamageBonusTaken(target, GetSpellInfo(), damage, SPELL_DIRECT_DAMAGE);
target->CalculateSpellDamageTaken(&damageInfo, damage, GetSpellInfo());
@@ -5878,9 +5880,7 @@ void AuraEffect::HandleLinkedSummon(AuraApplication const* aurApp, uint8 mode, b
// on apply cast summon spell
if (apply)
{
- CastSpellExtraArgs args;
- args.TriggerFlags = TRIGGERED_FULL_MASK;
- args.TriggeringAura = this;
+ CastSpellExtraArgs args(this);
args.CastDifficulty = triggerSpellInfo->Difficulty;
target->CastSpell(target, triggerSpellInfo->Id, args);
}
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index 31593ced080..a83e46dbed6 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -233,7 +233,7 @@ void AuraApplication::BuildUpdatePacket(WorldPackets::Spells::AuraInfo& auraInfo
Aura const* aura = GetBase();
WorldPackets::Spells::AuraDataInfo& auraData = auraInfo.AuraData.get();
- auraData.CastID = aura->GetCastGUID();
+ auraData.CastID = aura->GetCastId();
auraData.SpellID = aura->GetId();
auraData.Visual = aura->GetSpellVisual();
auraData.Flags = GetFlags();
@@ -446,7 +446,7 @@ Aura* Aura::Create(AuraCreateInfo& createInfo)
}
Aura::Aura(AuraCreateInfo const& createInfo) :
-m_spellInfo(createInfo._spellInfo), m_castDifficulty(createInfo._castDifficulty), m_castGuid(createInfo._castId), m_casterGuid(createInfo.CasterGUID),
+m_spellInfo(createInfo._spellInfo), m_castDifficulty(createInfo._castDifficulty), m_castId(createInfo._castId), m_casterGuid(createInfo.CasterGUID),
m_castItemGuid(createInfo.CastItemGUID), m_castItemId(createInfo.CastItemId),
m_castItemLevel(createInfo.CastItemLevel), m_spellVisual({ createInfo.Caster ? createInfo.Caster->GetCastSpellXSpellVisualId(createInfo._spellInfo) : createInfo._spellInfo->GetSpellXSpellVisualId(), 0 }),
m_applyTime(GameTime::GetGameTime()), m_owner(createInfo._owner), m_timeCla(0), m_updateTargetMapInterval(0),
@@ -1332,7 +1332,8 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b
else if (itr->second->flags & SPELL_AREA_FLAG_AUTOCAST)
{
if (!target->HasAura(itr->second->spellId))
- target->CastSpell(target, itr->second->spellId, true);
+ target->CastSpell(target, itr->second->spellId, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(GetCastId()));
}
}
}
@@ -1365,7 +1366,8 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b
target->RemoveAurasDueToSpell(-(*itr));
else if (removeMode != AURA_REMOVE_BY_DEATH)
target->CastSpell(target, *itr, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
- .SetOriginalCaster(GetCasterGUID()));
+ .SetOriginalCaster(GetCasterGUID())
+ .SetOriginalCastId(GetCastId()));
}
}
if (std::vector<int32> const* spellTriggered = sSpellMgr->GetSpellLinked(GetId() + SPELL_LINK_AURA))
@@ -1406,11 +1408,13 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b
break;
case 33572: // Gronn Lord's Grasp, becomes stoned
if (GetStackAmount() >= 5 && !target->HasAura(33652))
- target->CastSpell(target, 33652, true);
+ target->CastSpell(target, 33652, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(GetCastId()));
break;
case 50836: //Petrifying Grip, becomes stoned
if (GetStackAmount() >= 5 && !target->HasAura(50812))
- target->CastSpell(target, 50812, true);
+ target->CastSpell(target, 50812, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(GetCastId()));
break;
case 60970: // Heroic Fury (remove Intercept cooldown)
if (target->GetTypeId() == TYPEID_PLAYER)
@@ -1481,6 +1485,7 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b
{
float multiplier = float(aurEff->GetAmount());
CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
+ args.SetOriginalCastId(GetCastId());
args.AddSpellMod(SPELLVALUE_BASE_POINT0, CalculatePct(caster->GetMaxPower(POWER_MANA), multiplier));
caster->CastSpell(caster, 47755, args);
}
@@ -1525,7 +1530,8 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b
if (target->HasAura(70755))
{
if (apply)
- target->CastSpell(target, 71166, true);
+ target->CastSpell(target, 71166, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(GetCastId()));
else
target->RemoveAurasDueToSpell(71166);
}
diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h
index 5a5fdc00544..f298b6a89ee 100644
--- a/src/server/game/Spells/Auras/SpellAuras.h
+++ b/src/server/game/Spells/Auras/SpellAuras.h
@@ -135,7 +135,7 @@ class TC_GAME_API Aura
uint32 GetId() const{ return GetSpellInfo()->Id; }
Difficulty GetCastDifficulty() const { return m_castDifficulty; }
- ObjectGuid GetCastGUID() const { return m_castGuid; }
+ ObjectGuid GetCastId() const { return m_castId; }
ObjectGuid GetCasterGUID() const { return m_casterGuid; }
ObjectGuid GetCastItemGUID() const { return m_castItemGuid; }
uint32 GetCastItemId() const { return m_castItemId; }
@@ -307,7 +307,7 @@ class TC_GAME_API Aura
protected:
SpellInfo const* const m_spellInfo;
Difficulty const m_castDifficulty;
- ObjectGuid const m_castGuid;
+ ObjectGuid const m_castId;
ObjectGuid const m_casterGuid;
ObjectGuid const m_castItemGuid; // it is NOT safe to keep a pointer to the item because it may get deleted
uint32 m_castItemId;
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 7dde366b5bd..7e39f489e6d 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -500,7 +500,8 @@ protected:
Spell* m_Spell;
};
-Spell::Spell(WorldObject* caster, SpellInfo const* info, TriggerCastFlags triggerFlags, ObjectGuid originalCasterGUID) :
+Spell::Spell(WorldObject* caster, SpellInfo const* info, TriggerCastFlags triggerFlags, ObjectGuid originalCasterGUID /*= ObjectGuid::Empty*/,
+ ObjectGuid originalCastId /*= ObjectGuid::Empty*/) :
m_spellInfo(info), m_caster((info->HasAttribute(SPELL_ATTR6_CAST_BY_CHARMER) && caster->GetCharmerOrOwner()) ? caster->GetCharmerOrOwner() : caster),
m_spellValue(new SpellValue(m_spellInfo, caster)), _spellEvent(nullptr)
{
@@ -575,6 +576,7 @@ m_spellValue(new SpellValue(m_spellInfo, caster)), _spellEvent(nullptr)
m_hitMask = 0;
focusObject = nullptr;
m_castId = ObjectGuid::Create<HighGuid::Cast>(SPELL_CAST_SOURCE_NORMAL, m_caster->GetMapId(), m_spellInfo->Id, m_caster->GetMap()->GenerateLowGuid<HighGuid::Cast>());
+ m_originalCastId = originalCastId;
memset(m_misc.Raw.Data, 0, sizeof(m_misc.Raw.Data));
m_SpellVisual.SpellXSpellVisualID = caster->GetCastSpellXSpellVisualId(m_spellInfo);
m_triggeredByAuraSpell = nullptr;
@@ -2626,7 +2628,8 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell)
// Check for SPELL_ATTR7_INTERRUPT_ONLY_NONPLAYER
if (MissCondition == SPELL_MISS_NONE && spell->m_spellInfo->HasAttribute(SPELL_ATTR7_INTERRUPT_ONLY_NONPLAYER) && unit->GetTypeId() != TYPEID_PLAYER)
- caster->CastSpell(unit, SPELL_INTERRUPT_NONPLAYER, true);
+ caster->CastSpell(unit, SPELL_INTERRUPT_NONPLAYER, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(spell->m_castId));
if (_spellHitTarget)
{
@@ -2930,7 +2933,9 @@ void Spell::DoTriggersOnSpellHit(Unit* unit, uint32 effMask)
{
if (CanExecuteTriggersOnHit(effMask, i->triggeredByAura) && roll_chance_i(i->chance))
{
- m_caster->CastSpell(unit, i->triggeredSpell->Id, CastSpellExtraArgs(TRIGGERED_FULL_MASK).SetCastDifficulty(i->triggeredSpell->Difficulty));
+ m_caster->CastSpell(unit, i->triggeredSpell->Id, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId)
+ .SetCastDifficulty(i->triggeredSpell->Difficulty));
TC_LOG_DEBUG("spells", "Spell %d triggered spell %d by SPELL_AURA_ADD_TARGET_TRIGGER aura", m_spellInfo->Id, i->triggeredSpell->Id);
// SPELL_AURA_ADD_TARGET_TRIGGER auras shouldn't trigger auras without duration
@@ -2962,7 +2967,8 @@ void Spell::DoTriggersOnSpellHit(Unit* unit, uint32 effMask)
unit->RemoveAurasDueToSpell(-(*i));
else
unit->CastSpell(unit, *i, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
- .SetOriginalCaster(m_caster->GetGUID()));
+ .SetOriginalCaster(m_caster->GetGUID())
+ .SetOriginalCastId(m_castId));
}
}
}
@@ -3509,7 +3515,8 @@ void Spell::_cast(bool skipCheck)
unitCaster->RemoveAurasDueToSpell(-id);
}
else
- m_caster->CastSpell(m_targets.GetUnitTarget() ? m_targets.GetUnitTarget() : m_caster, id, true);
+ m_caster->CastSpell(m_targets.GetUnitTarget() ? m_targets.GetUnitTarget() : m_caster, id, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
}
}
@@ -5780,7 +5787,8 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint
if (strict) //starting cast, trigger pet stun (cast by pet so it doesn't attack player)
if (Pet* pet = unitCaster->ToPlayer()->GetPet())
pet->CastSpell(pet, 32752, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
- .SetOriginalCaster(pet->GetGUID()));
+ .SetOriginalCaster(pet->GetGUID())
+ .SetOriginalCastId(m_castId));
}
else if (!m_spellInfo->HasAttribute(SPELL_ATTR1_DISMISS_PET))
return SPELL_FAILED_ALREADY_HAVE_SUMMON;
@@ -6810,7 +6818,8 @@ SpellCastResult Spell::CheckItems(uint32* param1 /*= nullptr*/, uint32* param2 /
return SPELL_FAILED_DONT_REPORT;
}
else if (m_spellInfo->GetEffects().size() > EFFECT_1)
- player->CastSpell(player, m_spellInfo->GetEffect(EFFECT_1).CalcValue(), false); // move this to anywhere
+ player->CastSpell(player, m_spellInfo->GetEffect(EFFECT_1).CalcValue(), CastSpellExtraArgs()
+ .SetOriginalCastId(m_castId)); // move this to anywhere
return SPELL_FAILED_DONT_REPORT;
}
}
@@ -8361,6 +8370,15 @@ bool WorldObjectSpellLineTargetCheck::operator()(WorldObject* target) const
} //namespace Trinity
+CastSpellExtraArgs& CastSpellExtraArgs::SetTriggeringAura(AuraEffect const* triggeringAura)
+{
+ TriggeringAura = triggeringAura;
+ if (triggeringAura)
+ OriginalCastId = triggeringAura->GetBase()->GetCastId();
+
+ return *this;
+}
+
SpellCastVisual::operator UF::SpellCastVisual() const
{
UF::SpellCastVisual visual;
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index 7bf1c5ace9e..da84d0e8a48 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -507,7 +507,7 @@ class TC_GAME_API Spell
typedef std::unordered_set<Aura*> UsedSpellMods;
- Spell(WorldObject* caster, SpellInfo const* info, TriggerCastFlags triggerFlags, ObjectGuid originalCasterGUID = ObjectGuid::Empty);
+ Spell(WorldObject* caster, SpellInfo const* info, TriggerCastFlags triggerFlags, ObjectGuid originalCasterGUID = ObjectGuid::Empty, ObjectGuid originalCastId = ObjectGuid::Empty);
~Spell();
void InitExplicitTargets(SpellCastTargets const& targets);
diff --git a/src/server/game/Spells/SpellDefines.h b/src/server/game/Spells/SpellDefines.h
index d26f0e5ab7e..1c291da669e 100644
--- a/src/server/game/Spells/SpellDefines.h
+++ b/src/server/game/Spells/SpellDefines.h
@@ -257,15 +257,16 @@ struct TC_GAME_API CastSpellExtraArgs
CastSpellExtraArgs(bool triggered) : TriggerFlags(triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE) {}
CastSpellExtraArgs(TriggerCastFlags trigger) : TriggerFlags(trigger) {}
CastSpellExtraArgs(Item* item) : TriggerFlags(TRIGGERED_FULL_MASK), CastItem(item) {}
- CastSpellExtraArgs(AuraEffect const* eff) : TriggerFlags(TRIGGERED_FULL_MASK), TriggeringAura(eff) {}
+ CastSpellExtraArgs(AuraEffect const* eff) : TriggerFlags(TRIGGERED_FULL_MASK) { SetTriggeringAura(eff); }
CastSpellExtraArgs(Difficulty castDifficulty) : CastDifficulty(castDifficulty) {}
CastSpellExtraArgs(SpellValueMod mod, int32 val) { SpellValueOverrides.AddMod(mod, val); }
CastSpellExtraArgs& SetTriggerFlags(TriggerCastFlags flag) { TriggerFlags = flag; return *this; }
CastSpellExtraArgs& SetCastItem(Item* item) { CastItem = item; return *this; }
- CastSpellExtraArgs& SetTriggeringAura(AuraEffect const* triggeringAura) { TriggeringAura = triggeringAura; return *this; }
+ CastSpellExtraArgs& SetTriggeringAura(AuraEffect const* triggeringAura);
CastSpellExtraArgs& SetOriginalCaster(ObjectGuid const& guid) { OriginalCaster = guid; return *this; }
CastSpellExtraArgs& SetCastDifficulty(Difficulty castDifficulty) { CastDifficulty = castDifficulty; return *this; }
+ CastSpellExtraArgs& SetOriginalCastId(ObjectGuid const& castId) { OriginalCastId = castId; return *this; }
CastSpellExtraArgs& AddSpellMod(SpellValueMod mod, int32 val) { SpellValueOverrides.AddMod(mod, val); return *this; }
CastSpellExtraArgs& AddSpellBP0(int32 val) { return AddSpellMod(SPELLVALUE_BASE_POINT0, val); } // because i don't want to type SPELLVALUE_BASE_POINT0 300 times
@@ -274,18 +275,19 @@ struct TC_GAME_API CastSpellExtraArgs
AuraEffect const* TriggeringAura = nullptr;
ObjectGuid OriginalCaster = ObjectGuid::Empty;
Difficulty CastDifficulty = Difficulty(0);
+ ObjectGuid OriginalCastId = ObjectGuid::Empty;
struct
{
friend struct CastSpellExtraArgs;
friend class WorldObject;
- private:
- void AddMod(SpellValueMod mod, int32 val) { data.push_back({ mod, val }); }
+ private:
+ void AddMod(SpellValueMod mod, int32 val) { data.push_back({ mod, val }); }
- auto begin() const { return data.cbegin(); }
- auto end() const { return data.cend(); }
+ auto begin() const { return data.cbegin(); }
+ auto end() const { return data.cend(); }
- std::vector<std::pair<SpellValueMod, int32>> data;
+ std::vector<std::pair<SpellValueMod, int32>> data;
} SpellValueOverrides;
};
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index d44352c5cd1..b0157c23d0b 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -622,7 +622,8 @@ void Spell::EffectTriggerSpell()
unitTarget->RemoveAurasByType(SPELL_AURA_MOD_STUN);
// Cast Lesser Invisibility
- unitTarget->CastSpell(unitTarget, 7870, true);
+ unitTarget->CastSpell(unitTarget, 7870, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
return;
}
// Brittle Armor - (need add max stack of 24575 Brittle Armor)
@@ -634,7 +635,8 @@ void Spell::EffectTriggerSpell()
return;
for (uint32 j = 0; j < spell->StackAmount; ++j)
- m_caster->CastSpell(unitTarget, spell->Id, true);
+ m_caster->CastSpell(unitTarget, spell->Id, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
return;
}
// Mercurial Shield - (need add max stack of 26464 Mercurial Shield)
@@ -646,7 +648,8 @@ void Spell::EffectTriggerSpell()
return;
for (uint32 j = 0; j < spell->StackAmount; ++j)
- m_caster->CastSpell(unitTarget, spell->Id, true);
+ m_caster->CastSpell(unitTarget, spell->Id, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
return;
}
}
@@ -688,6 +691,7 @@ void Spell::EffectTriggerSpell()
CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
args.SetOriginalCaster(m_originalCasterGUID);
+ args.SetOriginalCastId(m_castId);
// set basepoints for trigger with value effect
if (effectInfo->Effect == SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE)
for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
@@ -736,6 +740,7 @@ void Spell::EffectTriggerMissileSpell()
CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
args.SetOriginalCaster(m_originalCasterGUID);
+ args.SetOriginalCastId(m_castId);
// set basepoints for trigger with value effect
if (effectInfo->Effect == SPELL_EFFECT_TRIGGER_MISSILE_SPELL_WITH_VALUE)
for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
@@ -777,6 +782,7 @@ void Spell::EffectForceCast()
{
CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
args.SetOriginalCaster(m_originalCasterGUID);
+ args.SetOriginalCastId(m_castId);
args.AddSpellMod(SPELLVALUE_BASE_POINT0, damage);
unitTarget->CastSpell(unitTarget, spellInfo->Id, args);
return;
@@ -788,11 +794,13 @@ void Spell::EffectForceCast()
{
case 72298: // Malleable Goo Summon
unitTarget->CastSpell(unitTarget, spellInfo->Id, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
- .SetOriginalCaster(m_originalCasterGUID));
+ .SetOriginalCaster(m_originalCasterGUID)
+ .SetOriginalCastId(m_castId));
return;
}
CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
+ args.SetOriginalCastId(m_castId);
if (effectInfo->Effect == SPELL_EFFECT_FORCE_CAST_WITH_VALUE)
for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
args.AddSpellMod(SpellValueMod(SPELLVALUE_BASE_POINT0 + i), damage);
@@ -816,7 +824,8 @@ void Spell::EffectTriggerRitualOfSummoning()
finish();
- m_caster->CastSpell(nullptr, spellInfo->Id, false);
+ m_caster->CastSpell(nullptr, spellInfo->Id, CastSpellExtraArgs()
+ .SetOriginalCastId(m_castId));
}
inline void CalculateJumpSpeeds(SpellEffectInfo const* effInfo, float dist, float& speedXY, float& speedZ)
@@ -925,9 +934,11 @@ void Spell::EffectTeleportUnits()
if (r >= 70) // 7/12 success
{
if (r < 100) // 4/12 evil twin
- m_caster->CastSpell(m_caster, 23445, true);
+ m_caster->CastSpell(m_caster, 23445, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
else // 1/12 fire
- m_caster->CastSpell(m_caster, 23449, true);
+ m_caster->CastSpell(m_caster, 23449, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
}
return;
}
@@ -941,36 +952,44 @@ void Spell::EffectTeleportUnits()
{
case 1:
// soul split - evil
- m_caster->CastSpell(m_caster, 36900, true);
+ m_caster->CastSpell(m_caster, 36900, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
break;
case 2:
// soul split - good
- m_caster->CastSpell(m_caster, 36901, true);
+ m_caster->CastSpell(m_caster, 36901, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
break;
case 3:
// Increase the size
- m_caster->CastSpell(m_caster, 36895, true);
+ m_caster->CastSpell(m_caster, 36895, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
break;
case 4:
// Decrease the size
- m_caster->CastSpell(m_caster, 36893, true);
+ m_caster->CastSpell(m_caster, 36893, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
break;
case 5:
// Transform
{
if (m_caster->ToPlayer()->GetTeam() == ALLIANCE)
- m_caster->CastSpell(m_caster, 36897, true);
+ m_caster->CastSpell(m_caster, 36897, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
else
- m_caster->CastSpell(m_caster, 36899, true);
+ m_caster->CastSpell(m_caster, 36899, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
break;
}
case 6:
// chicken
- m_caster->CastSpell(m_caster, 36940, true);
+ m_caster->CastSpell(m_caster, 36940, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
break;
case 7:
// evil twin
- m_caster->CastSpell(m_caster, 23445, true);
+ m_caster->CastSpell(m_caster, 23445, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
break;
}
}
@@ -986,23 +1005,28 @@ void Spell::EffectTeleportUnits()
{
case 1:
// soul split - evil
- m_caster->CastSpell(m_caster, 36900, true);
+ m_caster->CastSpell(m_caster, 36900, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
break;
case 2:
// soul split - good
- m_caster->CastSpell(m_caster, 36901, true);
+ m_caster->CastSpell(m_caster, 36901, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
break;
case 3:
// Increase the size
- m_caster->CastSpell(m_caster, 36895, true);
+ m_caster->CastSpell(m_caster, 36895, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
break;
case 4:
// Transform
{
if (m_caster->ToPlayer()->GetTeam() == ALLIANCE)
- m_caster->CastSpell(m_caster, 36897, true);
+ m_caster->CastSpell(m_caster, 36897, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
else
- m_caster->CastSpell(m_caster, 36899, true);
+ m_caster->CastSpell(m_caster, 36899, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
break;
}
}
@@ -2056,6 +2080,7 @@ void Spell::EffectSummonType()
}
CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
+ args.SetOriginalCastId(m_castId);
// if we have small value, it indicates seat position
if (basePoints > 0 && basePoints < MAX_VEHICLE_SEATS)
@@ -3015,7 +3040,8 @@ void Spell::EffectScriptEffect()
return;
uint32 const spell_id = roll_chance_i(20) ? 8854 : 8855;
- m_caster->CastSpell(m_caster, spell_id, true);
+ m_caster->CastSpell(m_caster, spell_id, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
return;
}
// Brittle Armor - need remove one 24575 Brittle Armor aura
@@ -3049,7 +3075,8 @@ void Spell::EffectScriptEffect()
return;
// Shadow Flame
- m_caster->CastSpell(unitTarget, 22682, true);
+ m_caster->CastSpell(unitTarget, 22682, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
return;
}
// Mirren's Drinking Hat
@@ -3116,7 +3143,8 @@ void Spell::EffectScriptEffect()
if (m_caster->ToPlayer()->GetItemByPos(bag, slot)->GetCount() == 1) m_caster->ToPlayer()->RemoveItem(bag, slot, true);
else m_caster->ToPlayer()->GetItemByPos(bag, slot)->SetCount(m_caster->ToPlayer()->GetItemByPos(bag, slot)->GetCount()-1);
// Spell 42518 (Braufest - Gratisprobe des Braufest herstellen)
- m_caster->CastSpell(m_caster, 42518, true);
+ m_caster->CastSpell(m_caster, 42518, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
return;
}
break;
@@ -3128,7 +3156,8 @@ void Spell::EffectScriptEffect()
//Workaround for Range ... should be global for every ScriptEffect
float radius = effectInfo->CalcRadius();
if (unitTarget && unitTarget->GetTypeId() == TYPEID_PLAYER && unitTarget->GetDistance(m_caster) >= radius && !unitTarget->HasAura(46394) && unitTarget != m_caster)
- unitTarget->CastSpell(unitTarget, 46394, true);
+ unitTarget->CastSpell(unitTarget, 46394, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
break;
}
@@ -3146,7 +3175,8 @@ void Spell::EffectScriptEffect()
case 2: spellId = 46738; break;
case 3: spellId = 46736; break;
}
- unitTarget->CastSpell(unitTarget, spellId, true);
+ unitTarget->CastSpell(unitTarget, spellId, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
break;
}
// 5,000 Gold
@@ -3190,7 +3220,8 @@ void Spell::EffectScriptEffect()
default: return;
}
- unitTarget->CastSpell(unitTarget, iTmpSpellId, true);
+ unitTarget->CastSpell(unitTarget, iTmpSpellId, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
Creature* npc = unitTarget->ToCreature();
npc->LoadEquipment();
return;
@@ -3203,9 +3234,11 @@ void Spell::EffectScriptEffect()
if (!unitTarget)
return;
if (unitTarget->HasAura(51845))
- unitTarget->CastSpell(m_caster, 51856, true);
+ unitTarget->CastSpell(m_caster, 51856, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
else
- m_caster->CastSpell(unitTarget, 51855, true);
+ m_caster->CastSpell(unitTarget, 51855, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
break;
}
// Summon Ghouls On Scarlet Crusade
@@ -3219,7 +3252,8 @@ void Spell::EffectScriptEffect()
for (uint8 i = 0; i < 15; ++i)
{
m_caster->GetRandomPoint(*destTarget, radius, x, y, z);
- m_caster->CastSpell({x, y, z}, 54522, true);
+ m_caster->CastSpell({ x, y, z }, 54522, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
}
break;
}
@@ -3230,11 +3264,13 @@ void Spell::EffectScriptEffect()
return;
case 52479: // Gift of the Harvester
if (unitTarget && unitCaster)
- unitCaster->CastSpell(unitTarget, urand(0, 1) ? damage : 52505, true);
+ unitCaster->CastSpell(unitTarget, urand(0, 1) ? damage : 52505, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
return;
case 53110: // Devour Humanoid
if (unitTarget)
- unitTarget->CastSpell(m_caster, damage, true);
+ unitTarget->CastSpell(m_caster, damage, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
return;
case 57347: // Retrieving (Wintergrasp RP-GG pickup spell)
{
@@ -3266,7 +3302,8 @@ void Spell::EffectScriptEffect()
uint32 questID = m_spellInfo->GetEffect(EFFECT_1).CalcValue();
if (unitTarget->ToPlayer()->GetQuestStatus(questID) == QUEST_STATUS_COMPLETE)
- unitTarget->CastSpell(unitTarget, spellID, true);
+ unitTarget->CastSpell(unitTarget, spellID, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
return;
}
@@ -3278,10 +3315,12 @@ void Spell::EffectScriptEffect()
// return from top
if (unitTarget->ToPlayer()->GetAreaId() == 4637)
- unitTarget->CastSpell(unitTarget, 59316, true);
+ unitTarget->CastSpell(unitTarget, 59316, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
// teleport atop
else
- unitTarget->CastSpell(unitTarget, 59314, true);
+ unitTarget->CastSpell(unitTarget, 59314, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
return;
}
@@ -3297,8 +3336,10 @@ void Spell::EffectScriptEffect()
if (Unit* parent = seat->GetVehicleBase())
{
/// @todo a hack, range = 11, should after some time cast, otherwise too far
- unitCaster->CastSpell(parent, 62496, true);
- unitTarget->CastSpell(parent, damage); // DIFFICULTY_NONE, so effect always valid
+ unitCaster->CastSpell(parent, 62496, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
+ unitTarget->CastSpell(parent, damage, CastSpellExtraArgs()
+ .SetOriginalCastId(m_castId)); // DIFFICULTY_NONE, so effect always valid
}
}
}
@@ -3328,7 +3369,8 @@ void Spell::EffectScriptEffect()
if (Aura* chargesAura = m_caster->ToCreature()->GetAura(59907))
{
m_caster->CastSpell(unitTarget, spell_heal, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
- .SetOriginalCaster(m_caster->ToCreature()->ToTempSummon()->GetSummonerGUID()));
+ .SetOriginalCaster(m_caster->ToCreature()->ToTempSummon()->GetSummonerGUID())
+ .SetOriginalCastId(m_castId));
if (chargesAura->ModCharges(-1))
m_caster->ToCreature()->ToTempSummon()->UnSummon();
}
@@ -3357,6 +3399,7 @@ void Spell::EffectScriptEffect()
if (totem && totem->IsTotem())
{
CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
+ args.SetOriginalCastId(m_castId);
args.AddSpellMod(SPELLVALUE_BASE_POINT0, damage);
m_caster->CastSpell(totem, 55277, args);
}
@@ -3389,8 +3432,10 @@ void Spell::EffectScriptEffect()
45683 // Polymorph
};
- m_caster->CastSpell(m_caster, spellPlayer[urand(0, 4)], true);
- unitTarget->CastSpell(unitTarget, spellTarget[urand(0, 4)], true);
+ m_caster->CastSpell(m_caster, spellPlayer[urand(0, 4)], CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
+ unitTarget->CastSpell(unitTarget, spellTarget[urand(0, 4)], CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
break;
}
}
@@ -3630,7 +3675,8 @@ void Spell::EffectApplyGlyph()
glyphs.push_back(glyphId);
if (GlyphPropertiesEntry const* glyphProperties = sGlyphPropertiesStore.LookupEntry(glyphId))
- player->CastSpell(player, glyphProperties->SpellID, true);
+ player->CastSpell(player, glyphProperties->SpellID, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
WorldPackets::Talent::ActiveGlyphs activeGlyphs;
activeGlyphs.Glyphs.emplace_back(m_misc.SpellId, uint16(glyphId));
@@ -3715,7 +3761,8 @@ void Spell::EffectInebriate()
{
currentDrunk = 100;
if (rand_chance() < 25.0f)
- player->CastSpell(player, 67468, false); // Drunken Vomit
+ player->CastSpell(player, 67468, CastSpellExtraArgs()
+ .SetOriginalCastId(m_castId)); // Drunken Vomit
}
else
currentDrunk += drunkMod;
@@ -3761,6 +3808,7 @@ void Spell::EffectFeedPet()
/// @todo fix crash when a spell has two effects, both pointed at the same item target
CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
+ args.SetOriginalCastId(m_castId);
args.AddSpellMod(SPELLVALUE_BASE_POINT0, pct);
m_caster->CastSpell(pet, effectInfo->TriggerSpell, args);
}
@@ -4136,7 +4184,8 @@ void Spell::EffectCharge()
if (effectInfo->TriggerSpell)
m_caster->CastSpell(unitTarget, effectInfo->TriggerSpell, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
- .SetOriginalCaster(m_originalCasterGUID));
+ .SetOriginalCaster(m_originalCasterGUID)
+ .SetOriginalCastId(m_castId));
}
}
@@ -4165,7 +4214,8 @@ void Spell::EffectChargeDest()
{
if (effectInfo->TriggerSpell)
m_caster->CastSpell(*destTarget, effectInfo->TriggerSpell, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
- .SetOriginalCaster(m_originalCasterGUID));
+ .SetOriginalCaster(m_originalCasterGUID)
+ .SetOriginalCastId(m_castId));
}
}
@@ -4456,6 +4506,7 @@ void Spell::EffectDestroyAllTotems()
if (mana)
{
CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
+ args.SetOriginalCastId(m_castId);
args.AddSpellMod(SPELLVALUE_BASE_POINT0, mana);
unitCaster->CastSpell(unitCaster, 39104, args);
}
@@ -5248,6 +5299,7 @@ void Spell::EffectCastButtons()
CastSpellExtraArgs args;
args.TriggerFlags = TriggerCastFlags(TRIGGERED_IGNORE_GCD | TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_CAST_DIRECTLY | TRIGGERED_DONT_REPORT_CAST_ERROR);
+ args.OriginalCastId = m_castId;
args.CastDifficulty = GetCastDifficulty();
m_caster->CastSpell(m_caster, spellInfo->Id, args);
}
@@ -5325,7 +5377,8 @@ void Spell::EffectSummonRaFFriend()
if (m_caster->GetTypeId() != TYPEID_PLAYER || !unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER)
return;
- m_caster->CastSpell(unitTarget, effectInfo->TriggerSpell, true);
+ m_caster->CastSpell(unitTarget, effectInfo->TriggerSpell, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ .SetOriginalCastId(m_castId));
}
void Spell::EffectUnlockGuildVaultTab()
diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp
index a5728438912..14b9befd46d 100644
--- a/src/server/scripts/Spells/spell_warlock.cpp
+++ b/src/server/scripts/Spells/spell_warlock.cpp
@@ -375,7 +375,7 @@ class spell_warl_health_funnel : public SpellScriptLoader
if (Player* modOwner = caster->GetSpellModOwner())
modOwner->ApplySpellMod(GetSpellInfo(), SpellModOp::PowerCost0, damage);
- SpellNonMeleeDamage damageInfo(caster, caster, GetSpellInfo(), GetAura()->GetSpellVisual(), GetSpellInfo()->SchoolMask, GetAura()->GetCastGUID());
+ SpellNonMeleeDamage damageInfo(caster, caster, GetSpellInfo(), GetAura()->GetSpellVisual(), GetSpellInfo()->SchoolMask, GetAura()->GetCastId());
damageInfo.periodicLog = true;
damageInfo.damage = damage;
caster->DealSpellDamage(&damageInfo, false);