mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/Spells: Pass cast item level to triggered spells
* Fixes value on trinkets like Ignition Mage's Fuse
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user