aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-02-08 21:36:31 +0100
committerShauren <shauren.trinity@gmail.com>2022-02-08 21:36:31 +0100
commit8e2d1e328ebec60c76d65651b268ec3ad2ce26fc (patch)
treecebc7c310a12d3983151000e766e96a510a8a2d4 /src
parentd3fc34a203d97ca0aa076bc939286d601629fe70 (diff)
Core/Spells: Pass cast item level to triggered spells
* Fixes value on trinkets like Ignition Mage's Fuse
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Object/Object.cpp3
-rw-r--r--src/server/game/Entities/Player/Player.cpp4
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp3
-rw-r--r--src/server/game/Spells/Spell.cpp19
-rw-r--r--src/server/game/Spells/SpellDefines.h1
-rw-r--r--src/server/game/Spells/SpellEffects.cpp56
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp3
-rw-r--r--src/server/scripts/Spells/spell_item.cpp6
-rw-r--r--src/server/scripts/Spells/spell_quest.cpp3
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