diff options
author | Shauren <shauren.trinity@gmail.com> | 2022-02-08 21:36:31 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-02-08 21:36:31 +0100 |
commit | 8e2d1e328ebec60c76d65651b268ec3ad2ce26fc (patch) | |
tree | cebc7c310a12d3983151000e766e96a510a8a2d4 | |
parent | d3fc34a203d97ca0aa076bc939286d601629fe70 (diff) |
Core/Spells: Pass cast item level to triggered spells
* Fixes value on trinkets like Ignition Mage's Fuse
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 19 | ||||
-rw-r--r-- | src/server/game/Spells/SpellDefines.h | 1 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 56 | ||||
-rw-r--r-- | src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp | 3 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_item.cpp | 6 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_quest.cpp | 3 |
9 files changed, 46 insertions, 52 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 5b167621aec..5eadfac5f24 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -2734,6 +2734,9 @@ SpellCastResult WorldObject::CastSpell(CastSpellTargetArg const& targets, uint32 spell->SetSpellValue(pair.first, pair.second); spell->m_CastItem = args.CastItem; + if (args.OriginalCastItemLevel) + spell->m_castItemLevel = *args.OriginalCastItemLevel; + return spell->prepare(*targets.Targets, args.TriggeringAura); } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 0116dea0f61..bc725a0a529 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -8119,8 +8119,8 @@ void Player::ApplyArtifactPowerRank(Item* artifact, ArtifactPowerRankEntry const else if (apply) { CastSpellExtraArgs args; - args.TriggerFlags = TRIGGERED_FULL_MASK; - args.CastItem = artifact; + args.SetTriggerFlags(TRIGGERED_FULL_MASK); + args.SetCastItem(artifact); if (artifactPowerRank->AuraPointsOverride) for (SpellEffectInfo const& spellEffectInfo : spellInfo->GetEffects()) args.AddSpellMod(SpellValueMod(SPELLVALUE_BASE_POINT0 + spellEffectInfo.EffectIndex), artifactPowerRank->AuraPointsOverride); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 1f8799239a0..0b4291f4682 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -5760,7 +5760,7 @@ void AuraEffect::HandleProcTriggerSpellAuraProc(AuraApplication* aurApp, ProcEve if (SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggerSpellId, GetBase()->GetCastDifficulty())) { TC_LOG_DEBUG("spells.aura.effect", "AuraEffect::HandleProcTriggerSpellAuraProc: Triggering spell %u from aura %u proc", triggeredSpellInfo->Id, GetId()); - triggerCaster->CastSpell(triggerTarget, triggeredSpellInfo->Id, this); + triggerCaster->CastSpell(triggerTarget, triggeredSpellInfo->Id, CastSpellExtraArgs(this).SetTriggeringSpell(eventInfo.GetProcSpell())); } else if (triggerSpellId && GetAuraType() != SPELL_AURA_DUMMY) TC_LOG_ERROR("spells.aura.effect.nospell","AuraEffect::HandleProcTriggerSpellAuraProc: Spell %u has non-existent spell %u in EffectTriggered[%d] and is therefore not triggered.", GetId(), triggerSpellId, GetEffIndex()); @@ -5781,6 +5781,7 @@ void AuraEffect::HandleProcTriggerSpellWithValueAuraProc(AuraApplication* aurApp if (SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggerSpellId, GetBase()->GetCastDifficulty())) { CastSpellExtraArgs args(this); + args.SetTriggeringSpell(eventInfo.GetProcSpell()); args.AddSpellMod(SPELLVALUE_BASE_POINT0, GetAmount()); triggerCaster->CastSpell(triggerTarget, triggerSpellId, args); TC_LOG_DEBUG("spells.aura.effect", "AuraEffect::HandleProcTriggerSpellWithValueAuraProc: Triggering spell %u with value %d from aura %u proc", triggeredSpellInfo->Id, GetAmount(), GetId()); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index eaf53def8f4..8afc6d1af6d 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2777,8 +2777,7 @@ 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, CastSpellExtraArgs(TRIGGERED_FULL_MASK) - .SetOriginalCastId(spell->m_castId)); + caster->CastSpell(unit, SPELL_INTERRUPT_NONPLAYER, spell); } if (_spellHitTarget) @@ -3085,7 +3084,7 @@ 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) - .SetOriginalCastId(m_castId) + .SetTriggeringSpell(this) .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); @@ -3119,7 +3118,7 @@ void Spell::DoTriggersOnSpellHit(Unit* unit, uint32 effMask) else unit->CastSpell(unit, *i, CastSpellExtraArgs(TRIGGERED_FULL_MASK) .SetOriginalCaster(m_caster->GetGUID()) - .SetOriginalCastId(m_castId)); + .SetTriggeringSpell(this)); } } } @@ -3669,7 +3668,7 @@ void Spell::_cast(bool skipCheck) } else m_caster->CastSpell(m_targets.GetUnitTarget() ? m_targets.GetUnitTarget() : m_caster, id, CastSpellExtraArgs(TRIGGERED_FULL_MASK) - .SetOriginalCastId(m_castId)); + .SetTriggeringSpell(this)); } } @@ -5996,7 +5995,7 @@ SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32 if (Pet* pet = unitCaster->ToPlayer()->GetPet()) pet->CastSpell(pet, 32752, CastSpellExtraArgs(TRIGGERED_FULL_MASK) .SetOriginalCaster(pet->GetGUID()) - .SetOriginalCastId(m_castId)); + .SetTriggeringSpell(this)); } else if (!m_spellInfo->HasAttribute(SPELL_ATTR1_DISMISS_PET)) return SPELL_FAILED_ALREADY_HAVE_SUMMON; @@ -7188,7 +7187,7 @@ SpellCastResult Spell::CheckItems(int32* param1 /*= nullptr*/, int32* param2 /*= } else if (m_spellInfo->GetEffects().size() > EFFECT_1) player->CastSpell(player, m_spellInfo->GetEffect(EFFECT_1).CalcValue(), CastSpellExtraArgs() - .SetOriginalCastId(m_castId)); // move this to anywhere + .SetTriggeringSpell(this)); // move this to anywhere return SPELL_FAILED_DONT_REPORT; } } @@ -8889,7 +8888,11 @@ CastSpellTargetArg::CastSpellTargetArg(WorldObject* target) CastSpellExtraArgs& CastSpellExtraArgs::SetTriggeringSpell(Spell const* triggeringSpell) { - OriginalCastId = triggeringSpell->m_castId; + if (triggeringSpell) + { + OriginalCastItemLevel = triggeringSpell->m_castItemLevel; + OriginalCastId = triggeringSpell->m_castId; + } return *this; } diff --git a/src/server/game/Spells/SpellDefines.h b/src/server/game/Spells/SpellDefines.h index 23defe8cf26..e9e683d36bc 100644 --- a/src/server/game/Spells/SpellDefines.h +++ b/src/server/game/Spells/SpellDefines.h @@ -459,6 +459,7 @@ struct TC_GAME_API CastSpellExtraArgs ObjectGuid OriginalCaster = ObjectGuid::Empty; Difficulty CastDifficulty = Difficulty(0); ObjectGuid OriginalCastId = ObjectGuid::Empty; + Optional<int32> OriginalCastItemLevel; struct { friend struct CastSpellExtraArgs; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 46e9bc693d8..3afd0a748d2 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -565,8 +565,7 @@ void Spell::EffectTriggerSpell() unitTarget->RemoveAurasByType(SPELL_AURA_MOD_STUN); // Cast Lesser Invisibility - unitTarget->CastSpell(unitTarget, 7870, CastSpellExtraArgs(TRIGGERED_FULL_MASK) - .SetOriginalCastId(m_castId)); + unitTarget->CastSpell(unitTarget, 7870, this); return; } // Brittle Armor - (need add max stack of 24575 Brittle Armor) @@ -578,8 +577,7 @@ void Spell::EffectTriggerSpell() return; for (uint32 j = 0; j < spell->StackAmount; ++j) - m_caster->CastSpell(unitTarget, spell->Id, CastSpellExtraArgs(TRIGGERED_FULL_MASK) - .SetOriginalCastId(m_castId)); + m_caster->CastSpell(unitTarget, spell->Id, this); return; } // Mercurial Shield - (need add max stack of 26464 Mercurial Shield) @@ -591,8 +589,7 @@ void Spell::EffectTriggerSpell() return; for (uint32 j = 0; j < spell->StackAmount; ++j) - m_caster->CastSpell(unitTarget, spell->Id, CastSpellExtraArgs(TRIGGERED_FULL_MASK) - .SetOriginalCastId(m_castId)); + m_caster->CastSpell(unitTarget, spell->Id, this); return; } } @@ -644,7 +641,7 @@ void Spell::EffectTriggerSpell() CastSpellExtraArgs args(TRIGGERED_FULL_MASK); args.SetOriginalCaster(m_originalCasterGUID); - args.SetOriginalCastId(m_castId); + args.SetTriggeringSpell(this); // 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) @@ -701,7 +698,7 @@ void Spell::EffectTriggerMissileSpell() CastSpellExtraArgs args(TRIGGERED_FULL_MASK); args.SetOriginalCaster(m_originalCasterGUID); - args.SetOriginalCastId(m_castId); + args.SetTriggeringSpell(this); // 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) @@ -748,7 +745,7 @@ void Spell::EffectForceCast() { CastSpellExtraArgs args(TRIGGERED_FULL_MASK); args.SetOriginalCaster(m_originalCasterGUID); - args.SetOriginalCastId(m_castId); + args.SetTriggeringSpell(this); args.AddSpellMod(SPELLVALUE_BASE_POINT0, damage); unitTarget->CastSpell(unitTarget, spellInfo->Id, args); return; @@ -761,12 +758,12 @@ void Spell::EffectForceCast() case 72298: // Malleable Goo Summon unitTarget->CastSpell(unitTarget, spellInfo->Id, CastSpellExtraArgs(TRIGGERED_FULL_MASK) .SetOriginalCaster(m_originalCasterGUID) - .SetOriginalCastId(m_castId)); + .SetTriggeringSpell(this)); return; } CastSpellExtraArgs args(TRIGGERED_FULL_MASK); - args.SetOriginalCastId(m_castId); + args.SetTriggeringSpell(this); 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); @@ -797,7 +794,7 @@ void Spell::EffectTriggerRitualOfSummoning() finish(); m_caster->CastSpell(nullptr, spellInfo->Id, CastSpellExtraArgs() - .SetOriginalCastId(m_castId)); + .SetTriggeringSpell(this)); } void Spell::CalculateJumpSpeeds(SpellEffectInfo const* effInfo, float dist, float& speedXY, float& speedZ) @@ -2025,7 +2022,7 @@ void Spell::EffectSummonType() } CastSpellExtraArgs args(TRIGGERED_FULL_MASK); - args.SetOriginalCastId(m_castId); + args.SetTriggeringSpell(this); // if we have small value, it indicates seat position if (basePoints > 0 && basePoints < MAX_VEHICLE_SEATS) @@ -3042,8 +3039,7 @@ void Spell::EffectScriptEffect() return; // Shadow Flame - m_caster->CastSpell(unitTarget, 22682, CastSpellExtraArgs(TRIGGERED_FULL_MASK) - .SetOriginalCastId(m_castId)); + m_caster->CastSpell(unitTarget, 22682, this); return; } // Mug Transformation @@ -3074,8 +3070,7 @@ 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, CastSpellExtraArgs(TRIGGERED_FULL_MASK) - .SetOriginalCastId(m_castId)); + m_caster->CastSpell(m_caster, 42518, this); return; } break; @@ -3087,8 +3082,7 @@ 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, CastSpellExtraArgs(TRIGGERED_FULL_MASK) - .SetOriginalCastId(m_castId)); + unitTarget->CastSpell(unitTarget, 46394, this); break; } @@ -3100,8 +3094,7 @@ void Spell::EffectScriptEffect() float radius = effectInfo->CalcRadius(); for (uint8 i = 0; i < 15; ++i) - m_caster->CastSpell(m_caster->GetRandomPoint(*destTarget, radius), 54522, CastSpellExtraArgs(TRIGGERED_FULL_MASK) - .SetOriginalCastId(m_castId)); + m_caster->CastSpell(m_caster->GetRandomPoint(*destTarget, radius), 54522, this); break; } case 52173: // Coyote Spirit Despawn @@ -3140,10 +3133,9 @@ 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, CastSpellExtraArgs(TRIGGERED_FULL_MASK) - .SetOriginalCastId(m_castId)); + unitCaster->CastSpell(parent, 62496, this); unitTarget->CastSpell(parent, damage, CastSpellExtraArgs() - .SetOriginalCastId(m_castId)); // DIFFICULTY_NONE, so effect always valid + .SetTriggeringSpell(this)); // DIFFICULTY_NONE, so effect always valid } } } @@ -3493,8 +3485,7 @@ void Spell::EffectApplyGlyph() player->RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags2::ChangeGlyph); if (GlyphPropertiesEntry const* glyphProperties = sGlyphPropertiesStore.LookupEntry(glyphId)) - player->CastSpell(player, glyphProperties->SpellID, CastSpellExtraArgs(TRIGGERED_FULL_MASK) - .SetOriginalCastId(m_castId)); + player->CastSpell(player, glyphProperties->SpellID, this); WorldPackets::Talent::ActiveGlyphs activeGlyphs; activeGlyphs.Glyphs.emplace_back(m_misc.SpellId, uint16(glyphId)); @@ -3580,7 +3571,7 @@ void Spell::EffectInebriate() currentDrunk = 100; if (rand_chance() < 25.0f) player->CastSpell(player, 67468, CastSpellExtraArgs() - .SetOriginalCastId(m_castId)); // Drunken Vomit + .SetTriggeringSpell(this)); // Drunken Vomit } else currentDrunk += drunkMod; @@ -3626,7 +3617,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.SetTriggeringSpell(this); args.AddSpellMod(SPELLVALUE_BASE_POINT0, pct); m_caster->CastSpell(pet, effectInfo->TriggerSpell, args); } @@ -4014,7 +4005,7 @@ void Spell::EffectCharge() if (effectInfo->TriggerSpell) m_caster->CastSpell(unitTarget, effectInfo->TriggerSpell, CastSpellExtraArgs(TRIGGERED_FULL_MASK) .SetOriginalCaster(m_originalCasterGUID) - .SetOriginalCastId(m_castId)); + .SetTriggeringSpell(this)); } } @@ -4045,7 +4036,7 @@ void Spell::EffectChargeDest() if (effectInfo->TriggerSpell) m_caster->CastSpell(*destTarget, effectInfo->TriggerSpell, CastSpellExtraArgs(TRIGGERED_FULL_MASK) .SetOriginalCaster(m_originalCasterGUID) - .SetOriginalCastId(m_castId)); + .SetTriggeringSpell(this)); } } @@ -4384,7 +4375,7 @@ void Spell::EffectDestroyAllTotems() if (mana) { CastSpellExtraArgs args(TRIGGERED_FULL_MASK); - args.SetOriginalCastId(m_castId); + args.SetTriggeringSpell(this); args.AddSpellMod(SPELLVALUE_BASE_POINT0, mana); unitCaster->CastSpell(unitCaster, 39104, args); } @@ -5263,8 +5254,7 @@ void Spell::EffectSummonRaFFriend() if (m_caster->GetTypeId() != TYPEID_PLAYER || !unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; - m_caster->CastSpell(unitTarget, effectInfo->TriggerSpell, CastSpellExtraArgs(TRIGGERED_FULL_MASK) - .SetOriginalCastId(m_castId)); + m_caster->CastSpell(unitTarget, effectInfo->TriggerSpell, this); } void Spell::EffectUnlockGuildVaultTab() diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp index 68f79008b5c..a51a990dcd7 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -388,8 +388,7 @@ class spell_death_knight_initiate_visual : public SpellScript default: return; } - target->CastSpell(target, spellId, CastSpellExtraArgs(TRIGGERED_FULL_MASK) - .SetOriginalCastId(GetSpell()->m_castId)); + target->CastSpell(target, spellId, GetSpell()); target->LoadEquipment(); } diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index 6ef83321ce6..a034330a837 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -755,8 +755,7 @@ class spell_item_goblin_weather_machine : public SpellScript uint32 spellId = RAND(SPELL_PERSONALIZED_WEATHER1, SPELL_PERSONALIZED_WEATHER2, SPELL_PERSONALIZED_WEATHER3, SPELL_PERSONALIZED_WEATHER4); - target->CastSpell(target, spellId, CastSpellExtraArgs(TRIGGERED_FULL_MASK) - .SetOriginalCastId(GetSpell()->m_castId)); + target->CastSpell(target, spellId, GetSpell()); } void Register() override @@ -4003,8 +4002,7 @@ class spell_item_mirrens_drinking_hat : public SpellScript } Unit* caster = GetCaster(); - caster->CastSpell(caster, spellId, CastSpellExtraArgs(TRIGGERED_FULL_MASK) - .SetOriginalCastId(GetSpell()->m_castId)); + caster->CastSpell(caster, spellId, GetSpell()); } void Register() override diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp index 698335bbff0..004d83198a9 100644 --- a/src/server/scripts/Spells/spell_quest.cpp +++ b/src/server/scripts/Spells/spell_quest.cpp @@ -105,8 +105,7 @@ class spell_q1846_bending_shinbone : public SpellScript return; uint32 const spellId = roll_chance_i(20) ? SPELL_BENDING_SHINBONE1 : SPELL_BENDING_SHINBONE2; - caster->CastSpell(caster, spellId, CastSpellExtraArgs(TRIGGERED_FULL_MASK) - .SetOriginalCastId(GetSpell()->m_castId)); + caster->CastSpell(caster, spellId, GetSpell()); } void Register() override |