summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-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/EasternKingdoms/Karazhan/karazhan.cpp25
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp6
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp9
-rw-r--r--src/server/scripts/Northrend/zone_borean_tundra.cpp199
-rw-r--r--src/server/scripts/Northrend/zone_dragonblight.cpp6
-rw-r--r--src/server/scripts/Northrend/zone_storm_peaks.cpp38
9 files changed, 104 insertions, 222 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/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
index bfe5e6db10..484a0ada74 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
@@ -218,29 +218,22 @@ public:
switch (m_uiEventId)
{
case EVENT_OZ:
- if (OzDialogue[count].textid)
- text = OzDialogue[count].textid;
- if (OzDialogue[count].timer)
- TalkTimer = OzDialogue[count].timer;
+ text = OzDialogue[count].textid;
+ TalkTimer = OzDialogue[count].timer;
break;
-
case EVENT_HOOD:
- if (HoodDialogue[count].textid)
- text = HoodDialogue[count].textid;
- if (HoodDialogue[count].timer)
- TalkTimer = HoodDialogue[count].timer;
+ text = HoodDialogue[count].textid;
+ TalkTimer = HoodDialogue[count].timer;
break;
-
case EVENT_RAJ:
- if (RAJDialogue[count].textid)
- text = RAJDialogue[count].textid;
- if (RAJDialogue[count].timer)
- TalkTimer = RAJDialogue[count].timer;
+ text = RAJDialogue[count].textid;
+ TalkTimer = RAJDialogue[count].timer;
break;
+ default:
+ return;
}
- if (text)
- CreatureAI::Talk(text);
+ CreatureAI::Talk(text);
}
void PrepareEncounter()
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
index 9d44e3b25a..43547fcf0c 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
@@ -1950,14 +1950,14 @@ public:
currentStopPoint = 0;
events.Reset();
}
- void DoAction(int32 actionId) override
+ void DoAction(int32 actionId) override
{
switch (actionId)
{
case ACTION_START_INTRO:
events.ScheduleEvent(EVENT_LK_SAY_AGGRO, 0ms);
- events.ScheduleEvent(EVENT_LK_BATTLE_1, 2s +500ms);
+ events.ScheduleEvent(EVENT_LK_BATTLE_1, 2s + 500ms);
events.ScheduleEvent(EVENT_LK_BATTLE_2, 3s);
events.ScheduleEvent(me->GetEntry() == NPC_JAINA_PART2 ? EVENT_JAINA_IMMOBILIZE_LK : EVENT_SYLVANAS_IMMOBILIZE_JUMP, 9s);
break;
@@ -1989,7 +1989,7 @@ public:
path.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()));
for (uint8 i = WP_STOP[currentStopPoint - 1] + (currentStopPoint == 1 ? 0 : 1); i <= WP_STOP[currentStopPoint]; ++i)
path.push_back(G3D::Vector3(PathWaypoints[i].GetPositionX(), PathWaypoints[i].GetPositionY(), PathWaypoints[i].GetPositionZ()));
- me->GetMotionMaster()->MoveSplinePath(&path);
+ me->GetMotionMaster()->MoveSplinePath(&path, FORCED_MOVEMENT_RUN);
}
void MovementInform(uint32 type, uint32 /*id*/) override
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);
}