aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Server/WorldSocket.cpp14
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp171
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp4
3 files changed, 93 insertions, 96 deletions
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index 3b9749dfd3b..e449f86ffe2 100644
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -77,7 +77,12 @@ void WorldSocket::AsyncReadHeader()
}
else
{
- _socket.close();
+ // _socket.is_open() till returns true even after calling close()
+ try
+ {
+ _socket.close();
+ }
+ catch (std::exception const& /*ex*/) { }
}
});
}
@@ -152,7 +157,12 @@ void WorldSocket::AsyncReadData(size_t dataSize)
}
else
{
- _socket.close();
+ // _socket.is_open() till returns true even after calling close()
+ try
+ {
+ _socket.close();
+ }
+ catch (std::exception const& /*ex*/) {}
}
});
}
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp
index ab142c1375c..d4dc5efb6d5 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp
@@ -17,6 +17,7 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "SpellAuras.h"
#include "SpellScript.h"
#include "ahnkahet.h"
@@ -31,14 +32,16 @@ enum Yells
enum Spells
{
+ // Elder Nadox
SPELL_BROOD_PLAGUE = 56130,
H_SPELL_BROOD_RAGE = 59465,
SPELL_ENRAGE = 26662, // Enraged if too far away from home
SPELL_SUMMON_SWARMERS = 56119, // 2x 30178 -- 2x every 10secs
- SPELL_SUMMON_SWARM_GUARD = 56120, // 1x 30176 -- every 25%
- // Spells Adds
- SPELL_SPRINT = 56354,
- SPELL_GUARDIAN_AURA = 56151
+ SPELL_SUMMON_SWARM_GUARD = 56120, // 1x 30176
+
+ // Adds
+ SPELL_SWARM_BUFF = 56281,
+ SPELL_SPRINT = 56354
};
enum Events
@@ -63,7 +66,7 @@ class boss_elder_nadox : public CreatureScript
void Reset() override
{
_Reset();
- AmountHealthModifier = 1;
+ GuardianSummoned = false;
GuardianDied = false;
}
@@ -128,6 +131,7 @@ class boss_elder_nadox : public CreatureScript
events.ScheduleEvent(EVENT_RAGE, urand(10 * IN_MILLISECONDS, 50 * IN_MILLISECONDS));
break;
case EVENT_SUMMON_SWARMER:
+ /// @todo: summoned by egg
DoCast(me, SPELL_SUMMON_SWARMERS);
if (urand(1, 3) == 3) // 33% chance of dialog
Talk(SAY_EGG_SAC);
@@ -145,19 +149,20 @@ class boss_elder_nadox : public CreatureScript
}
}
- if (me->HealthBelowPct(100 - AmountHealthModifier * 25))
+ if (!GuardianSummoned && me->HealthBelowPct(50))
{
+ /// @todo: summoned by egg
Talk(EMOTE_HATCHES, me);
DoCast(me, SPELL_SUMMON_SWARM_GUARD);
- ++AmountHealthModifier;
+ GuardianSummoned = true;
}
DoMeleeAttackIfReady();
}
private:
+ bool GuardianSummoned;
bool GuardianDied;
- uint8 AmountHealthModifier;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -175,20 +180,10 @@ class npc_ahnkahar_nerubian : public CreatureScript
{
npc_ahnkahar_nerubianAI(Creature* creature) : ScriptedAI(creature) { }
- EventMap events;
-
void Reset() override
{
- if (me->GetEntry() == NPC_AHNKAHAR_GUARDIAN)
- DoCast(me, SPELL_GUARDIAN_AURA, true);
-
- events.ScheduleEvent(EVENT_SPRINT, 13 * IN_MILLISECONDS);
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- if (me->GetEntry() == NPC_AHNKAHAR_GUARDIAN)
- me->RemoveAurasDueToSpell(SPELL_GUARDIAN_AURA);
+ _events.Reset();
+ _events.ScheduleEvent(EVENT_SPRINT, 13 * IN_MILLISECONDS);
}
void UpdateAI(uint32 diff) override
@@ -196,23 +191,27 @@ class npc_ahnkahar_nerubian : public CreatureScript
if (!UpdateVictim())
return;
- events.Update(diff);
+ _events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
- while (uint32 eventId = events.ExecuteEvent())
+ while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
- case EVENT_SPRINT:
- DoCast(me, SPELL_SPRINT);
- events.ScheduleEvent(EVENT_SPRINT, 20 * IN_MILLISECONDS);
- break;
+ case EVENT_SPRINT:
+ DoCast(me, SPELL_SPRINT);
+ _events.ScheduleEvent(EVENT_SPRINT, 20 * IN_MILLISECONDS);
+ break;
}
}
+
DoMeleeAttackIfReady();
}
+
+ private:
+ EventMap _events;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -221,95 +220,81 @@ class npc_ahnkahar_nerubian : public CreatureScript
}
};
-//HACK: No, AI. Replace with proper db content?
-class npc_nadox_eggs : public CreatureScript
+// 56159 - Swarm
+class spell_ahn_kahet_swarm : public SpellScriptLoader
{
-public:
- npc_nadox_eggs() : CreatureScript("npc_nadox_eggs") { }
+ public:
+ spell_ahn_kahet_swarm() : SpellScriptLoader("spell_ahn_kahet_swarm") { }
- struct npc_nadox_eggsAI : public ScriptedAI
- {
- npc_nadox_eggsAI(Creature* creature) : ScriptedAI(creature)
+ class spell_ahn_kahet_swarm_SpellScript : public SpellScript
{
- creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
- }
+ PrepareSpellScript(spell_ahn_kahet_swarm_SpellScript);
- void Reset() override { }
- void EnterCombat(Unit* /*who*/) override { }
- void AttackStart(Unit* /*victim*/) override { }
- void MoveInLineOfSight(Unit* /*who*/) override { }
-
- void UpdateAI(uint32 /*diff*/) override { }
- };
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SWARM_BUFF))
+ return false;
+ return true;
+ }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_nadox_eggsAI(creature);
- }
-};
+ bool Load() override
+ {
+ _targetCount = 0;
+ return true;
+ }
-class GuardianCheck
-{
-public:
- bool operator()(const WorldObject* target) const
- {
- if (target->GetEntry() == NPC_AHNKAHAR_GUARDIAN)
- return true;
-
- return false;
- }
-};
+ void CountTargets(std::list<WorldObject*>& targets)
+ {
+ _targetCount = targets.size();
+ }
-class spell_elder_nadox_guardian : public SpellScriptLoader
-{
-public:
- spell_elder_nadox_guardian() : SpellScriptLoader("spell_elder_nadox_guardian") { }
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ if (_targetCount)
+ {
+ if (Aura* aura = GetCaster()->GetAura(SPELL_SWARM_BUFF))
+ {
+ aura->SetStackAmount(_targetCount);
+ aura->RefreshDuration();
+ }
+ else
+ GetCaster()->CastCustomSpell(SPELL_SWARM_BUFF, SPELLVALUE_AURA_STACK, _targetCount, GetCaster(), TRIGGERED_FULL_MASK);
+ }
+ else
+ GetCaster()->RemoveAurasDueToSpell(SPELL_SWARM_BUFF);
+ }
- class spell_elder_nadox_guardian_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_elder_nadox_guardian_SpellScript);
+ void Register() override
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_ahn_kahet_swarm_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
+ OnEffectHit += SpellEffectFn(spell_ahn_kahet_swarm_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- targets.remove_if(GuardianCheck());
- }
+ private:
+ uint32 _targetCount;
+ };
- void Register() override
+ SpellScript* GetSpellScript() const override
{
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_elder_nadox_guardian_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_elder_nadox_guardian_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ALLY);
+ return new spell_ahn_kahet_swarm_SpellScript();
}
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_elder_nadox_guardian_SpellScript();
- }
};
class achievement_respect_your_elders : public AchievementCriteriaScript
{
-public:
- achievement_respect_your_elders() : AchievementCriteriaScript("achievement_respect_your_elders") { }
-
- bool OnCheck(Player* /*player*/, Unit* target) override
- {
- if (!target)
- return false;
-
- if (Creature* Nadox = target->ToCreature())
- if (Nadox->AI()->GetData(DATA_RESPECT_YOUR_ELDERS))
- return true;
+ public:
+ achievement_respect_your_elders() : AchievementCriteriaScript("achievement_respect_your_elders") { }
- return false;
- }
+ bool OnCheck(Player* /*player*/, Unit* target) override
+ {
+ return target && target->GetAI()->GetData(DATA_RESPECT_YOUR_ELDERS);
+ }
};
void AddSC_boss_elder_nadox()
{
new boss_elder_nadox();
new npc_ahnkahar_nerubian();
- new npc_nadox_eggs();
- new spell_elder_nadox_guardian();
+ new spell_ahn_kahet_swarm();
new achievement_respect_your_elders();
}
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 b40cfe881dc..b4d1ee2f09b 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
@@ -961,9 +961,11 @@ class npc_jaina_or_sylvanas_escape_hor : public CreatureScript
if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE)))
{
+ me->CastSpell(lichking, SPELL_TAUNT_ARTHAS, true);
+ lichking->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
+ lichking->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true);
AttackStart(lichking);
lichking->AI()->AttackStart(me);
- me->CastSpell(lichking, SPELL_TAUNT_ARTHAS, true);
}
me->SetHealth(JAINA_SYLVANAS_MAX_HEALTH);
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER);