aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/game/AI/CreatureAI.cpp5
-rw-r--r--src/server/game/Combat/CombatManager.cpp9
-rw-r--r--src/server/game/Combat/CombatManager.h1
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp152
4 files changed, 88 insertions, 79 deletions
diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp
index 791c53dba39..6efda122338 100644
--- a/src/server/game/AI/CreatureAI.cpp
+++ b/src/server/game/AI/CreatureAI.cpp
@@ -80,11 +80,10 @@ void CreatureAI::DoZoneInCombat(Creature* creature /*= nullptr*/)
return;
}
- Map::PlayerList const& playerList = map->GetPlayers();
- if (playerList.isEmpty())
+ if (!map->HavePlayers())
return;
- for (auto const& ref : playerList)
+ for (MapReference const& ref : map->GetPlayers())
{
if (Player* player = ref.GetSource())
{
diff --git a/src/server/game/Combat/CombatManager.cpp b/src/server/game/Combat/CombatManager.cpp
index f65b3f410bd..c2eee85f907 100644
--- a/src/server/game/Combat/CombatManager.cpp
+++ b/src/server/game/Combat/CombatManager.cpp
@@ -142,6 +142,15 @@ void CombatManager::Update(uint32 tdiff)
}
}
+bool CombatManager::HasPvECombatWithPlayers() const
+{
+ for (std::pair<ObjectGuid const, CombatReference*> const& reference : _pveRefs)
+ if (reference.second->GetOther(_owner)->GetTypeId() == TYPEID_PLAYER)
+ return true;
+
+ return false;
+}
+
bool CombatManager::HasPvPCombat() const
{
for (auto const& pair : _pvpRefs)
diff --git a/src/server/game/Combat/CombatManager.h b/src/server/game/Combat/CombatManager.h
index 149c1a036ee..de9dd71e7a4 100644
--- a/src/server/game/Combat/CombatManager.h
+++ b/src/server/game/Combat/CombatManager.h
@@ -106,6 +106,7 @@ class TC_GAME_API CombatManager
Unit* GetOwner() const { return _owner; }
bool HasCombat() const { return HasPvECombat() || HasPvPCombat(); }
bool HasPvECombat() const { return !_pveRefs.empty(); }
+ bool HasPvECombatWithPlayers() const;
std::unordered_map<ObjectGuid, CombatReference*> const& GetPvECombatRefs() const { return _pveRefs; }
bool HasPvPCombat() const;
std::unordered_map<ObjectGuid, PvPCombatReference*> const& GetPvPCombatRefs() const { return _pvpRefs; }
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp
index 5882173b95d..5405ff01b28 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp
@@ -111,37 +111,37 @@ enum Spells
enum Events
{
// Valithria Dreamwalker
- EVENT_INTRO_TALK = 1,
- EVENT_BERSERK = 2,
- EVENT_DREAM_PORTAL = 3,
- EVENT_DREAM_SLIP = 4,
+ EVENT_INTRO_TALK = 1,
+ EVENT_BERSERK,
+ EVENT_DREAM_PORTAL,
+ EVENT_DREAM_SLIP,
// The Lich King
- EVENT_GLUTTONOUS_ABOMINATION_SUMMONER = 5,
- EVENT_SUPPRESSER_SUMMONER = 6,
- EVENT_BLISTERING_ZOMBIE_SUMMONER = 7,
- EVENT_RISEN_ARCHMAGE_SUMMONER = 8,
- EVENT_BLAZING_SKELETON_SUMMONER = 9,
+ EVENT_GLUTTONOUS_ABOMINATION_SUMMONER,
+ EVENT_SUPPRESSER_SUMMONER,
+ EVENT_BLISTERING_ZOMBIE_SUMMONER,
+ EVENT_RISEN_ARCHMAGE_SUMMONER,
+ EVENT_BLAZING_SKELETON_SUMMONER,
// Risen Archmage
- EVENT_FROSTBOLT_VOLLEY = 10,
- EVENT_MANA_VOID = 11,
- EVENT_COLUMN_OF_FROST = 12,
+ EVENT_FROSTBOLT_VOLLEY,
+ EVENT_MANA_VOID,
+ EVENT_COLUMN_OF_FROST,
// Blazing Skeleton
- EVENT_FIREBALL = 13,
- EVENT_LEY_WASTE = 14,
+ EVENT_FIREBALL,
+ EVENT_LEY_WASTE,
// Suppresser
- EVENT_SUPPRESSION = 15,
+ EVENT_SUPPRESSION,
// Gluttonous Abomination
- EVENT_GUT_SPRAY = 16,
+ EVENT_GUT_SPRAY,
// Dream Cloud
// Nightmare Cloud
- EVENT_CHECK_PLAYER = 17,
- EVENT_EXPLODE = 18,
+ EVENT_CHECK_PLAYER,
+ EVENT_EXPLODE,
};
enum Misc
@@ -159,9 +159,11 @@ enum Misc
Position const ValithriaSpawnPos = {4210.813f, 2484.443f, 364.9558f, 0.01745329f};
-struct ManaVoidSelector
+struct ValithriaManaVoidSelector
{
- explicit ManaVoidSelector(WorldObject const* source) : _source(source) { }
+ explicit ValithriaManaVoidSelector(WorldObject const* source) : _source(source)
+ {
+ }
bool operator()(Unit* unit) const
{
@@ -171,10 +173,10 @@ struct ManaVoidSelector
WorldObject const* _source;
};
-class DelayedCastEvent : public BasicEvent
+class ValithriaDelayedCastEvent : public BasicEvent
{
public:
- DelayedCastEvent(Creature* trigger, uint32 spellId, ObjectGuid originalCaster, uint32 despawnTime) : _trigger(trigger), _originalCaster(originalCaster), _spellId(spellId), _despawnTime(despawnTime)
+ ValithriaDelayedCastEvent(Creature* trigger, uint32 spellId, ObjectGuid originalCaster, uint32 despawnTime) : _trigger(trigger), _originalCaster(originalCaster), _spellId(spellId), _despawnTime(despawnTime)
{
}
@@ -193,10 +195,10 @@ class DelayedCastEvent : public BasicEvent
uint32 _despawnTime;
};
-class AuraRemoveEvent : public BasicEvent
+class ValithriaAuraRemoveEvent : public BasicEvent
{
public:
- AuraRemoveEvent(Creature* trigger, uint32 spellId) : _trigger(trigger), _spellId(spellId)
+ ValithriaAuraRemoveEvent(Creature* trigger, uint32 spellId) : _trigger(trigger), _spellId(spellId)
{
}
@@ -257,12 +259,13 @@ class ValithriaDespawner : public BasicEvent
class boss_valithria_dreamwalker : public CreatureScript
{
public:
- boss_valithria_dreamwalker() : CreatureScript("boss_valithria_dreamwalker") { }
+ boss_valithria_dreamwalker() : CreatureScript("boss_valithria_dreamwalker")
+ {
+ }
struct boss_valithria_dreamwalkerAI : public ScriptedAI
{
- boss_valithria_dreamwalkerAI(Creature* creature) : ScriptedAI(creature),
- _instance(creature->GetInstanceScript()), _portalCount(RAID_MODE<uint32>(3, 8, 3, 8))
+ boss_valithria_dreamwalkerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), _portalCount(RAID_MODE<uint32>(3, 8, 3, 8))
{
Initialize();
_spawnHealth = me->GetHealth();
@@ -283,8 +286,7 @@ class boss_valithria_dreamwalker : public CreatureScript
if (data->curhealth)
_spawnHealth = data->curhealth;
- if (!me->isDead())
- Reset();
+ ScriptedAI::InitializeAI();
}
void Reset() override
@@ -345,8 +347,10 @@ class boss_valithria_dreamwalker : public CreatureScript
Talk(SAY_VALITHRIA_75_PERCENT);
}
else if (_instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == NOT_STARTED)
+ {
if (Creature* archmage = me->FindNearestCreature(NPC_RISEN_ARCHMAGE, 30.0f))
- archmage->EngageWithTarget(healer); // call JustEngagedWith on one of them, that will make it all start
+ DoZoneInCombat(archmage); // on one of them, that will make it all start
+ }
}
void DamageTaken(Unit* /*attacker*/, uint32& damage) override
@@ -359,7 +363,7 @@ class boss_valithria_dreamwalker : public CreatureScript
Talk(SAY_VALITHRIA_25_PERCENT);
}
- if (damage > me->GetHealth())
+ if (damage >= me->GetHealth())
{
damage = 0;
if (!_justDied)
@@ -396,13 +400,13 @@ class boss_valithria_dreamwalker : public CreatureScript
{
if (summon->GetEntry() == NPC_DREAM_PORTAL_PRE_EFFECT)
{
- summon->m_Events.AddEvent(new DelayedCastEvent(summon, SPELL_SUMMON_DREAM_PORTAL, me->GetGUID(), 6000), summon->m_Events.CalculateTime(15000));
- summon->m_Events.AddEvent(new AuraRemoveEvent(summon, SPELL_DREAM_PORTAL_VISUAL_PRE), summon->m_Events.CalculateTime(15000));
+ summon->m_Events.AddEvent(new ValithriaDelayedCastEvent(summon, SPELL_SUMMON_DREAM_PORTAL, me->GetGUID(), 6000), summon->m_Events.CalculateTime(15000));
+ summon->m_Events.AddEvent(new ValithriaAuraRemoveEvent(summon, SPELL_DREAM_PORTAL_VISUAL_PRE), summon->m_Events.CalculateTime(15000));
}
else if (summon->GetEntry() == NPC_NIGHTMARE_PORTAL_PRE_EFFECT)
{
- summon->m_Events.AddEvent(new DelayedCastEvent(summon, SPELL_SUMMON_NIGHTMARE_PORTAL, me->GetGUID(), 6000), summon->m_Events.CalculateTime(15000));
- summon->m_Events.AddEvent(new AuraRemoveEvent(summon, SPELL_NIGHTMARE_PORTAL_VISUAL_PRE), summon->m_Events.CalculateTime(15000));
+ summon->m_Events.AddEvent(new ValithriaDelayedCastEvent(summon, SPELL_SUMMON_NIGHTMARE_PORTAL, me->GetGUID(), 6000), summon->m_Events.CalculateTime(15000));
+ summon->m_Events.AddEvent(new ValithriaAuraRemoveEvent(summon, SPELL_NIGHTMARE_PORTAL_VISUAL_PRE), summon->m_Events.CalculateTime(15000));
}
}
@@ -447,6 +451,9 @@ class boss_valithria_dreamwalker : public CreatureScript
default:
break;
}
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
}
}
@@ -505,6 +512,9 @@ class npc_green_dragon_combat_trigger : public CreatureScript
void JustEnteredCombat(Unit* target) override
{
+ if (IsEngaged())
+ return;
+
if (!instance->CheckRequiredBosses(DATA_VALITHRIA_DREAMWALKER, target->ToPlayer()))
{
EnterEvadeMode(EVADE_REASON_SEQUENCE_BREAK);
@@ -512,6 +522,8 @@ class npc_green_dragon_combat_trigger : public CreatureScript
return;
}
+ EngagementStart(target);
+
me->setActive(true);
DoZoneInCombat();
instance->SetBossState(DATA_VALITHRIA_DREAMWALKER, IN_PROGRESS);
@@ -563,9 +575,8 @@ class npc_green_dragon_combat_trigger : public CreatureScript
return;
// check if there is any player engaged, if not - evade
- for (auto const& pair : me->GetCombatManager().GetPvECombatRefs())
- if (pair.second->GetOther(me)->GetTypeId() == TYPEID_PLAYER)
- return;
+ if (me->GetCombatManager().HasPvECombatWithPlayers())
+ return;
EnterEvadeMode();
}
@@ -587,8 +598,7 @@ class npc_the_lich_king_controller : public CreatureScript
struct npc_the_lich_king_controllerAI : public ScriptedAI
{
- npc_the_lich_king_controllerAI(Creature* creature) : ScriptedAI(creature),
- _instance(creature->GetInstanceScript())
+ npc_the_lich_king_controllerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
{
}
@@ -626,7 +636,7 @@ class npc_the_lich_king_controller : public CreatureScript
{
// must not be in dream phase
summon->SetPhaseMask((summon->GetPhaseMask() & ~0x10), true);
- summon->AI()->DoZoneInCombat();
+ DoZoneInCombat(summon);
if (summon->GetEntry() != NPC_SUPPRESSER)
if (Unit* target = me->GetCombatManager().GetAnyTarget())
summon->AI()->AttackStart(target);
@@ -664,6 +674,9 @@ class npc_the_lich_king_controller : public CreatureScript
default:
break;
}
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
}
}
@@ -685,15 +698,13 @@ class npc_risen_archmage : public CreatureScript
struct npc_risen_archmageAI : public ScriptedAI
{
- npc_risen_archmageAI(Creature* creature) : ScriptedAI(creature),
- _instance(creature->GetInstanceScript())
+ npc_risen_archmageAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
{
Initialize();
}
void Initialize()
{
- _canCallJustEngagedWith = true;
_isInitialArchmage = false;
}
@@ -711,33 +722,29 @@ class npc_risen_archmage : public CreatureScript
Initialize();
}
- void JustEngagedWith(Unit* target) override
+ void JustEnteredCombat(Unit* who) override
{
+ if (IsEngaged())
+ return;
+
me->InterruptNonMeleeSpells(false);
- if (_isInitialArchmage && _canCallJustEngagedWith)
+
+ EngagementStart(who);
+
+ if (_isInitialArchmage)
{
if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_VALITHRIA_LICH_KING)))
- {
- lichKing->EngageWithTarget(target);
- lichKing->AI()->DoZoneInCombat();
- }
+ DoZoneInCombat(lichKing);
if (Creature* trigger = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_VALITHRIA_TRIGGER)))
- {
- trigger->EngageWithTarget(target);
- trigger->AI()->DoZoneInCombat();
- }
+ DoZoneInCombat(trigger);
}
}
void DoAction(int32 action) override
{
if (action == ACTION_ENTER_COMBAT)
- {
- _canCallJustEngagedWith = false;
DoZoneInCombat();
- _canCallJustEngagedWith = true;
- }
else if (action == ACTION_SETUP_ARCHMAGES)
_isInitialArchmage = true;
}
@@ -747,7 +754,7 @@ class npc_risen_archmage : public CreatureScript
if (summon->GetEntry() == NPC_COLUMN_OF_FROST)
{
summon->CastSpell(summon, SPELL_COLUMN_OF_FROST_AURA, true);
- summon->m_Events.AddEvent(new DelayedCastEvent(summon, SPELL_COLUMN_OF_FROST_DAMAGE, ObjectGuid::Empty, 8000), summon->m_Events.CalculateTime(2000));
+ summon->m_Events.AddEvent(new ValithriaDelayedCastEvent(summon, SPELL_COLUMN_OF_FROST_DAMAGE, ObjectGuid::Empty, 8000), summon->m_Events.CalculateTime(2000));
}
else if (summon->GetEntry() == NPC_MANA_VOID)
{
@@ -778,7 +785,7 @@ class npc_risen_archmage : public CreatureScript
_events.ScheduleEvent(EVENT_FROSTBOLT_VOLLEY, 8s, 15s);
break;
case EVENT_MANA_VOID:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, ManaVoidSelector(me)))
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, ValithriaManaVoidSelector(me)))
DoCast(target, SPELL_MANA_VOID);
_events.ScheduleEvent(EVENT_MANA_VOID, 20s, 25s);
break;
@@ -790,6 +797,9 @@ class npc_risen_archmage : public CreatureScript
default:
break;
}
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
}
DoMeleeAttackIfReady();
@@ -798,7 +808,6 @@ class npc_risen_archmage : public CreatureScript
private:
EventMap _events;
InstanceScript* _instance;
- bool _canCallJustEngagedWith;
bool _isInitialArchmage;
};
@@ -852,6 +861,9 @@ class npc_blazing_skeleton : public CreatureScript
default:
break;
}
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
}
DoMeleeAttackIfReady();
@@ -1036,8 +1048,7 @@ class npc_dream_portal : public CreatureScript
struct npc_dream_portalAI : public CreatureAI
{
- npc_dream_portalAI(Creature* creature) : CreatureAI(creature),
- _used(false)
+ npc_dream_portalAI(Creature* creature) : CreatureAI(creature), _used(false)
{
}
@@ -1077,8 +1088,7 @@ class npc_dream_cloud : public CreatureScript
struct npc_dream_cloudAI : public ScriptedAI
{
- npc_dream_cloudAI(Creature* creature) : ScriptedAI(creature),
- _instance(creature->GetInstanceScript())
+ npc_dream_cloudAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
{
}
@@ -1086,7 +1096,7 @@ class npc_dream_cloud : public CreatureScript
{
_events.Reset();
_events.ScheduleEvent(EVENT_CHECK_PLAYER, 1s);
- me->SetCorpseDelay(0); // remove corpse immediately
+ me->SetCorpseDelay(0); // remove corpse immediately
me->LoadCreaturesAddon();
}
@@ -1173,13 +1183,6 @@ class spell_dreamwalker_decay_periodic_timer : public SpellScriptLoader
{
PrepareAuraScript(spell_dreamwalker_decay_periodic_timer_AuraScript);
- public:
- spell_dreamwalker_decay_periodic_timer_AuraScript()
- {
- _decayRate = 0;
- }
-
- private:
bool Load() override
{
_decayRate = GetId() != SPELL_TIMER_BLAZING_SKELETON ? 1000 : 5000;
@@ -1464,9 +1467,6 @@ class spell_dreamwalker_twisted_nightmares : public SpellScriptLoader
void HandleScript(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
- // impossible with TARGET_UNIT_CASTER
- //if (!GetHitUnit())
- // return;
if (InstanceScript* instance = GetHitUnit()->GetInstanceScript())
GetHitUnit()->CastSpell(nullptr, GetSpellInfo()->Effects[effIndex].TriggerSpell, instance->GetGuidData(DATA_VALITHRIA_DREAMWALKER));