From b6b0eced74676816ae41d46ddb0ae7fa74068d3f Mon Sep 17 00:00:00 2001 From: Traesh Date: Sat, 6 Sep 2025 23:05:02 +0200 Subject: Core/Spells: Implemented setting spell to cast on arrival from SPELL_EFFECT_JUMP_CHARGE in database (#30210) --- src/server/game/Globals/ObjectMgr.cpp | 13 +++++++++++-- src/server/game/Movement/MovementDefines.h | 1 + src/server/game/Spells/SpellEffects.cpp | 5 +++-- 3 files changed, 15 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 8f858b9ffd1..dfb0beeb00e 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -12027,8 +12027,8 @@ void ObjectMgr::LoadJumpChargeParams() // need for reload case _jumpChargeParams.clear(); - // 0 1 2 3 4 5 6 - QueryResult result = WorldDatabase.Query("SELECT id, speed, treatSpeedAsMoveTimeSeconds, jumpGravity, spellVisualId, progressCurveId, parabolicCurveId FROM jump_charge_params"); + // 0 1 2 3 4 5 6 7 + QueryResult result = WorldDatabase.Query("SELECT id, speed, treatSpeedAsMoveTimeSeconds, jumpGravity, spellVisualId, progressCurveId, parabolicCurveId, triggerSpellId FROM jump_charge_params"); if (!result) { return; @@ -12045,6 +12045,7 @@ void ObjectMgr::LoadJumpChargeParams() Optional spellVisualId = fields[4].GetInt32OrNull(); Optional progressCurveId = fields[5].GetInt32OrNull(); Optional parabolicCurveId = fields[6].GetInt32OrNull(); + Optional triggerSpellId = fields[7].GetInt32OrNull(); if (speed <= 0.0f) { @@ -12081,6 +12082,13 @@ void ObjectMgr::LoadJumpChargeParams() parabolicCurveId.reset(); } + if (triggerSpellId && !sSpellMgr->GetSpellInfo(*triggerSpellId, DIFFICULTY_NONE)) + { + TC_LOG_DEBUG("sql.sql", "Table `jump_charge_params` references non-existing trigger spell id: {} for id {}, ignored.", + *triggerSpellId, id); + triggerSpellId.reset(); + } + JumpChargeParams& params = _jumpChargeParams[id]; params.Speed = speed; params.TreatSpeedAsMoveTimeSeconds = treatSpeedAsMoveTimeSeconds; @@ -12088,6 +12096,7 @@ void ObjectMgr::LoadJumpChargeParams() params.SpellVisualId = spellVisualId; params.ProgressCurveId = progressCurveId; params.ParabolicCurveId = parabolicCurveId; + params.TriggerSpellId = triggerSpellId; } while (result->NextRow()); diff --git a/src/server/game/Movement/MovementDefines.h b/src/server/game/Movement/MovementDefines.h index 837cb7d81b2..af51de795c9 100644 --- a/src/server/game/Movement/MovementDefines.h +++ b/src/server/game/Movement/MovementDefines.h @@ -153,6 +153,7 @@ struct JumpChargeParams Optional SpellVisualId; Optional ProgressCurveId; Optional ParabolicCurveId; + Optional TriggerSpellId; }; using MovementFacingTarget = std::variant; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index da0fd7be46c..01cf68b89c2 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -5865,10 +5865,11 @@ void Spell::EffectJumpCharge() } Optional arrivalCast; - if (effectInfo->TriggerSpell) + if (effectInfo->TriggerSpell || params->TriggerSpellId) { arrivalCast.emplace(); - arrivalCast->SpellId = effectInfo->TriggerSpell; + arrivalCast->SpellId = params->TriggerSpellId ? *params->TriggerSpellId : effectInfo->TriggerSpell; + arrivalCast->Target = unitTarget ? unitTarget->GetGUID() : ObjectGuid::Empty; } Optional effectExtra; -- cgit v1.2.3