diff options
author | Shauren <shauren.trinity@gmail.com> | 2021-10-03 16:36:39 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-10-03 16:36:39 +0200 |
commit | 555b2d40ecc22eb0ea4bf913b534ffa7197fa6fe (patch) | |
tree | 8aa39c7f9314d4958c17c652b15a1f73458682d9 | |
parent | 0146eefee4fb8d72f02dee353af49af740db3973 (diff) |
Core/Spells: Send OriginalCastId in SMSG_SPELL_START and SMSG_SPELL_GO for triggered spells in 'game' project
-rw-r--r-- | src/server/game/Entities/AreaTrigger/AreaTrigger.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 28 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.cpp | 20 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.h | 4 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 32 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/SpellDefines.h | 16 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 141 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_warlock.cpp | 2 |
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); |