diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/game/Spells/Spell.cpp | 21 | ||||
| -rw-r--r-- | src/server/game/Spells/Spell.h | 3 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 19 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp | 9 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/zone_borean_tundra.cpp | 199 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/zone_dragonblight.cpp | 6 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/zone_storm_peaks.cpp | 38 |
7 files changed, 92 insertions, 203 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/Ulduar/HallsOfStone/brann_bronzebeard.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp index f9612cf600..54406752f9 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp @@ -549,14 +549,9 @@ public: if (!plr) return; //no target - float speed = 10.0f; - float tooFarAwaySpeed = me->GetDistance(plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ()) / (5000.0f * 0.001f); - if (speed < tooFarAwaySpeed) - speed = tooFarAwaySpeed; + darkMatterTarget->GetMotionMaster()->MovePoint(0, plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ()); - darkMatterTarget->GetMotionMaster()->MovePoint(0, plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ(), FORCED_MOVEMENT_NONE, speed); - - if (darkMatterTarget->GetDistance(plr) < 15.0f) + if (darkMatterTarget->GetDistance(plr) < 5.0f) { events.RescheduleEvent(EVENT_DARK_MATTER_END, 3s); } diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index c4e412fb5c..ec6a55f172 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -562,201 +562,13 @@ private: Position _fezzix; }; -/*###### -## Quest 11590: Abduction -######*/ - -// NPC 25316: Beryl Sorcerer -enum BerylSorcerer +// Spell 45625: - Arcane Chains: Character Force Cast +enum ArcaneChains { - EVENT_FROSTBOLT = 1, - EVENT_ARCANE_CHAINS = 2, - NPC_LIBRARIAN_DONATHAN = 25262, - NPC_CAPTURED_BERLY_SORCERER = 25474, - SPELL_FROSTBOLT = 9672, - SPELL_ARCANE_CHAINS = 45611, SPELL_ARCANE_CHAINS_CHARACTER_FORCE_CAST = 45625, - SPELL_ARCANE_CHAINS_SUMMON_CHAINED_MAGE_HUNTER = 45626, - SPELL_COSMETIC_ENSLAVE_CHAINS_SELF = 45631, - SPELL_ARCANE_CHAINS_CHANNEL_II = 45735 -}; - -class npc_beryl_sorcerer : public CreatureScript -{ -public: - npc_beryl_sorcerer() : CreatureScript("npc_beryl_sorcerer") { } - -struct npc_beryl_sorcererAI : public CreatureAI - { - npc_beryl_sorcererAI(Creature* creature) : CreatureAI(creature) - { - Initialize(); - } - - void Initialize() - { - _playerGUID.Clear(); - _chainsCast = false; - } - - void Reset() override - { - me->SetReactState(REACT_AGGRESSIVE); - Initialize(); - } - - void JustEngagedWith(Unit* who) override - { - if (me->IsValidAttackTarget(who)) - { - AttackStart(who); - } - - _events.ScheduleEvent(EVENT_FROSTBOLT, 3s, 4s); - } - - void SpellHit(Unit* unit, SpellInfo const* spell) override - { - if (spell->Id == SPELL_ARCANE_CHAINS && !_chainsCast) - { - if (Player* player = unit->ToPlayer()) - { - _playerGUID = player->GetGUID(); - _chainsCast = true; - _events.ScheduleEvent(EVENT_ARCANE_CHAINS, 4s); - } - } - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - { - return; - } - - _events.Update(diff); - - if (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_FROSTBOLT: - DoCastVictim(SPELL_FROSTBOLT); - _events.ScheduleEvent(EVENT_FROSTBOLT, 3s, 4s); - break; - case EVENT_ARCANE_CHAINS: - if (me->HasAura(SPELL_ARCANE_CHAINS)) - { - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) - { - me->CastSpell(player, SPELL_ARCANE_CHAINS_CHARACTER_FORCE_CAST, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_AURA_INTERRUPT_FLAGS & ~TRIGGERED_IGNORE_CAST_ITEM)); - player->KilledMonsterCredit(NPC_CAPTURED_BERLY_SORCERER); - me->DisappearAndDie(); - } - } - break; - } - } - DoMeleeAttackIfReady(); - } - - private: - EventMap _events; - ObjectGuid _playerGUID; - bool _chainsCast; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_beryl_sorcererAI(creature); - } -}; - -// NPC 25474: Captured Beryl Sorcerer -enum CapturedBerylSorcerer -{ - EVENT_ADD_ARCANE_CHAINS = 1, - EVENT_FOLLOW_PLAYER = 2 + SPELL_ARCANE_CHAINS_SUMMON_CHAINED_MAGE_HUNTER = 45626 }; -class npc_captured_beryl_sorcerer : public CreatureScript -{ -public: - npc_captured_beryl_sorcerer() : CreatureScript("npc_captured_beryl_sorcerer") {} - - struct npc_captured_beryl_sorcererAI : public FollowerAI - { - npc_captured_beryl_sorcererAI(Creature* creature) : FollowerAI(creature) - { - Initialize(); - } - - void Initialize() - { - me->SetReactState(REACT_PASSIVE); - me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - _events.ScheduleEvent(EVENT_ADD_ARCANE_CHAINS, 0ms); - } - - void Reset() override - { - Initialize(); - } - - void UpdateAI(uint32 diff) override - { - _events.Update(diff); - - if (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_ADD_ARCANE_CHAINS: - if (TempSummon* tempSummon = me->ToTempSummon()) - { - if (Unit* summoner = tempSummon->GetSummonerUnit()) - { - summoner->CastSpell(summoner, SPELL_ARCANE_CHAINS_CHANNEL_II, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_AURA_INTERRUPT_FLAGS & ~TRIGGERED_IGNORE_CAST_ITEM & ~TRIGGERED_IGNORE_POWER_AND_REAGENT_COST & ~TRIGGERED_IGNORE_GCD)); - _events.ScheduleEvent(EVENT_FOLLOW_PLAYER, 1s); - } - } - break; - - case EVENT_FOLLOW_PLAYER: - if (TempSummon* tempSummon = me->ToTempSummon()) - { - if (Player* summoner = tempSummon->GetSummonerUnit()->ToPlayer()) - { - StartFollow(summoner); - } - } - break; - } - } - } - - void MoveInLineOfSight(Unit* who) override - { - FollowerAI::MoveInLineOfSight(who); - - if (who->GetEntry() == NPC_LIBRARIAN_DONATHAN && me->IsWithinDistInMap(who, INTERACTION_DISTANCE)) - { - SetFollowComplete(); - me->DespawnOrUnsummon(); - } - } - private: - EventMap _events; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_captured_beryl_sorcererAI(creature); - } -}; - -// Spell 45625: - Arcane Chains: Character Force Cast class spell_arcane_chains_character_force_cast : public SpellScript { PrepareSpellScript(spell_arcane_chains_character_force_cast); @@ -782,7 +594,8 @@ class spell_arcane_chains_character_force_cast : public SpellScript ######*/ enum ImprisionedBerylSorcerer { - SPELL_NEURAL_NEEDLE = 45634, + SPELL_NEURAL_NEEDLE = 45634, + SPELL_COSMETIC_ENSLAVE_CHAINS_SELF = 45631, NPC_IMPRISONED_BERYL_SORCERER = 25478, @@ -2222,8 +2035,6 @@ void AddSC_borean_tundra() new npc_iruk(); new npc_nerubar_victim(); new npc_lurgglbr(); - new npc_beryl_sorcerer(); - new npc_captured_beryl_sorcerer(); RegisterSpellScript(spell_arcane_chains_character_force_cast); new npc_imprisoned_beryl_sorcerer(); new npc_mootoo_the_younger(); 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); } |
