summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Spells/Spell.cpp21
-rw-r--r--src/server/game/Spells/Spell.h3
-rw-r--r--src/server/game/Spells/SpellEffects.cpp19
-rw-r--r--src/server/scripts/Northrend/zone_dragonblight.cpp6
-rw-r--r--src/server/scripts/Northrend/zone_storm_peaks.cpp38
5 files changed, 85 insertions, 2 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index aad6a4f2d6..24f1c1ad68 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -643,6 +643,8 @@ Spell::Spell(Unit* caster, SpellInfo const* info, TriggerCastFlags triggerFlags,
gameObjTarget = nullptr;
destTarget = nullptr;
damage = 0;
+ m_reflectionTarget = nullptr;
+ m_reflectionTargetGuid.Clear();
effectHandleMode = SPELL_EFFECT_HANDLE_LAUNCH;
m_diminishLevel = DIMINISHING_LEVEL_1;
m_diminishGroup = DIMINISHING_NONE;
@@ -2591,6 +2593,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target)
//Spells with this flag cannot trigger if effect is casted on self
bool canEffectTrigger = !m_spellInfo->HasAttribute(SPELL_ATTR3_SUPPRESS_CASTER_PROCS) && unitTarget->CanProc() && (CanExecuteTriggersOnHit(mask) || missInfo == SPELL_MISS_IMMUNE2);
bool reflectedSpell = missInfo == SPELL_MISS_REFLECT;
+ Unit* reflectionSource = nullptr;
Unit* spellHitTarget = nullptr;
if (missInfo == SPELL_MISS_NONE) // In case spell hit target, do all effect on that target
@@ -2602,6 +2605,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target)
{
spellHitTarget = m_caster;
unitTarget = m_caster;
+ reflectionSource = effectUnit;
if (m_caster->IsCreature())
m_caster->ToCreature()->LowerPlayerDamageReq(target->damage);
}
@@ -2609,7 +2613,24 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target)
if (spellHitTarget)
{
+ if (reflectionSource)
+ {
+ m_reflectionTarget = reflectionSource;
+ m_reflectionTargetGuid = reflectionSource->GetGUID();
+ m_reflectionTargetPosition.Relocate(reflectionSource);
+ }
+ else
+ {
+ m_reflectionTarget = nullptr;
+ m_reflectionTargetGuid.Clear();
+ m_reflectionTargetPosition = Position();
+ }
+
SpellMissInfo missInfo2 = DoSpellHitOnUnit(spellHitTarget, mask, target->scaleAura);
+
+ m_reflectionTarget = nullptr;
+ m_reflectionTargetGuid.Clear();
+ m_reflectionTargetPosition = Position();
if (missInfo2 != SPELL_MISS_NONE)
{
if (missInfo2 != SPELL_MISS_MISS)
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index 331d48997a..0f8cde5d37 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -666,6 +666,9 @@ public:
WorldLocation* destTarget;
int32 damage;
SpellEffectHandleMode effectHandleMode;
+ Unit* m_reflectionTarget;
+ ObjectGuid m_reflectionTargetGuid;
+ Position m_reflectionTargetPosition;
// used in effects handlers
Aura* m_spellAura;
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 8bb4c793ef..3343c70595 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -5013,7 +5013,24 @@ void Spell::EffectKnockBack(SpellEffIndex effIndex)
return;
float x, y;
- if (m_spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_KNOCK_BACK_DEST)
+ Unit* reflectionSource = m_reflectionTarget;
+
+ if (!reflectionSource && !m_reflectionTargetGuid.IsEmpty())
+ {
+ if (Unit* resolvedSource = ObjectAccessor::GetUnit(*m_caster, m_reflectionTargetGuid))
+ reflectionSource = resolvedSource;
+ }
+
+ if (reflectionSource)
+ {
+ reflectionSource->GetPosition(x, y);
+ }
+ else if (!m_reflectionTargetGuid.IsEmpty())
+ {
+ x = m_reflectionTargetPosition.GetPositionX();
+ y = m_reflectionTargetPosition.GetPositionY();
+ }
+ else if (m_spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_KNOCK_BACK_DEST)
{
if (m_targets.HasDst())
destTarget->GetPosition(x, y);
diff --git a/src/server/scripts/Northrend/zone_dragonblight.cpp b/src/server/scripts/Northrend/zone_dragonblight.cpp
index ade76cf5fd..4b0238f3d7 100644
--- a/src/server/scripts/Northrend/zone_dragonblight.cpp
+++ b/src/server/scripts/Northrend/zone_dragonblight.cpp
@@ -789,7 +789,11 @@ class spell_q12237_rescue_villager : public SpellScript
result = SPELL_FAILED_CUSTOM_ERROR;
}
- if (!GetCaster()->FindNearestCreature(NPC_HELPLESS_VILLAGER_A, 5.0f) && !GetCaster()->FindNearestCreature(NPC_HELPLESS_VILLAGER_B, 5.0f))
+ std::list<Creature*> villagers;
+ GetCaster()->GetCreatureListWithEntryInGrid(villagers, { NPC_HELPLESS_VILLAGER_A, NPC_HELPLESS_VILLAGER_B }, 5.0f);
+ villagers.remove_if([](Creature* c) { return !c->IsAlive() || c->HasAura(SPELL_RIDE_VEHICLE); });
+
+ if (villagers.empty())
{
extension = SPELL_CUSTOM_ERROR_MUST_BE_NEAR_HELPLESS_VILLAGER;
result = SPELL_FAILED_CUSTOM_ERROR;
diff --git a/src/server/scripts/Northrend/zone_storm_peaks.cpp b/src/server/scripts/Northrend/zone_storm_peaks.cpp
index e940f83539..5c208f1187 100644
--- a/src/server/scripts/Northrend/zone_storm_peaks.cpp
+++ b/src/server/scripts/Northrend/zone_storm_peaks.cpp
@@ -1166,6 +1166,43 @@ class spell_feed_stormcrest_eagle : public SpellScript
}
};
+enum MammothExplosion
+{
+ SPELL_MAMMOTH_EXPL_1 = 54627,
+ SPELL_MAMMOTH_EXPL_2 = 54628,
+ SPELL_MAMMOTH_EXPL_3 = 54623,
+ SPELL_MAIN_MAMMOTH_MEAT = 57444
+};
+
+// 54581 - Mammoth Explosion Spell Spawner
+class spell_mammoth_explosion : public SpellScript
+{
+ PrepareSpellScript(spell_mammoth_explosion);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_MAMMOTH_EXPL_1, SPELL_MAMMOTH_EXPL_2, SPELL_MAMMOTH_EXPL_3, SPELL_MAIN_MAMMOTH_MEAT });
+ }
+
+ void HandleOnEffectHit(SpellEffIndex /*effIndex*/)
+ {
+ if (Unit* target = GetHitUnit())
+ {
+ for (uint32 spellId : { SPELL_MAMMOTH_EXPL_1, SPELL_MAMMOTH_EXPL_2, SPELL_MAMMOTH_EXPL_3 })
+ target->CastSpell(GetHitUnit(), spellId, true);
+
+ target->CastSpell(GetHitUnit(), SPELL_MAIN_MAMMOTH_MEAT, true);
+
+ target->SetVisible(false);
+ }
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_mammoth_explosion::HandleOnEffectHit, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+};
+
void AddSC_storm_peaks()
{
RegisterCreatureAI(npc_frosthound);
@@ -1183,4 +1220,5 @@ void AddSC_storm_peaks()
new npc_vehicle_d16_propelled_delivery();
RegisterSpellScript(spell_q12823_remove_collapsing_cave_aura);
RegisterSpellScript(spell_feed_stormcrest_eagle);
+ RegisterSpellScript(spell_mammoth_explosion);
}