summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/README.md1
-rw-r--r--data/sql/updates/db_world/2025_11_18_00.sql (renamed from data/sql/updates/pending_db_world/rev_1763439814369861000.sql)1
-rw-r--r--data/sql/updates/db_world/2025_11_18_01.sql3
-rw-r--r--data/sql/updates/db_world/2025_11_18_02.sql5
-rw-r--r--data/sql/updates/db_world/2025_11_20_00.sql14
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp4
-rw-r--r--src/server/game/Entities/Player/Player.cpp2
-rw-r--r--src/server/game/Spells/SpellInfoCorrections.cpp7
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/ahnkahet/ahnkahet.h1
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp14
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp158
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp36
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp10
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp357
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp3
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h1
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp20
-rw-r--r--src/server/scripts/Northrend/VioletHold/violet_hold.cpp5
-rw-r--r--src/server/scripts/Northrend/VioletHold/violet_hold.h3
19 files changed, 293 insertions, 352 deletions
diff --git a/.github/README.md b/.github/README.md
index a9fc21a90c..3a9e654d62 100644
--- a/.github/README.md
+++ b/.github/README.md
@@ -4,6 +4,7 @@
[![CodeFactor](https://www.codefactor.io/repository/github/azerothcore/azerothcore-wotlk/badge)](https://www.codefactor.io/repository/github/azerothcore/azerothcore-wotlk)
[![StackOverflow](http://img.shields.io/badge/stackoverflow-azerothcore-blue.svg?logo=stackoverflow)](https://stackoverflow.com/questions/tagged/azerothcore?sort=newest "Ask / browse questions here")
[![Discord](https://img.shields.io/discord/217589275766685707?logo=discord&logoColor=white)](https://discord.gg/gkt4y2x "Our community hub on Discord")
+[![Bounties on BountyHub](https://img.shields.io/badge/Bounties-on%20BountyHub-yellow)](https://www.bountyhub.dev/bounties?repo=azerothcore)
## Build Status
diff --git a/data/sql/updates/pending_db_world/rev_1763439814369861000.sql b/data/sql/updates/db_world/2025_11_18_00.sql
index 3f533d5433..1954dd9011 100644
--- a/data/sql/updates/pending_db_world/rev_1763439814369861000.sql
+++ b/data/sql/updates/db_world/2025_11_18_00.sql
@@ -1,3 +1,4 @@
+-- DB update 2025_11_17_04 -> 2025_11_18_00
--
DELETE FROM `smart_scripts` WHERE (`source_type` = 0) AND (`entryorguid` IN (28732, 28733, 28734));
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
diff --git a/data/sql/updates/db_world/2025_11_18_01.sql b/data/sql/updates/db_world/2025_11_18_01.sql
new file mode 100644
index 0000000000..c9c4296176
--- /dev/null
+++ b/data/sql/updates/db_world/2025_11_18_01.sql
@@ -0,0 +1,3 @@
+-- DB update 2025_11_18_00 -> 2025_11_18_01
+-- despawn on evade
+UPDATE `creature_template` SET `flags_extra` = `flags_extra`|0x80000000 WHERE `entry` IN (26631, 31350);
diff --git a/data/sql/updates/db_world/2025_11_18_02.sql b/data/sql/updates/db_world/2025_11_18_02.sql
new file mode 100644
index 0000000000..15aac3ed2f
--- /dev/null
+++ b/data/sql/updates/db_world/2025_11_18_02.sql
@@ -0,0 +1,5 @@
+-- DB update 2025_11_18_01 -> 2025_11_18_02
+--
+DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 17) AND (`SourceGroup` = 0) AND (`SourceEntry` = 43997) AND (`SourceId` = 0) AND (`ElseGroup` = 0) AND (`ConditionTypeOrReference` = 31) AND (`ConditionTarget` = 1) AND (`ConditionValue1` = 3) AND (`ConditionValue2` = 24533) AND (`ConditionValue3` = 0);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(17, 0, 43997, 0, 0, 31, 1, 3, 24533, 0, 0, 0, 0, '', 'target must be \'Dragonflayer Defender\'');
diff --git a/data/sql/updates/db_world/2025_11_20_00.sql b/data/sql/updates/db_world/2025_11_20_00.sql
new file mode 100644
index 0000000000..9e5bfd9873
--- /dev/null
+++ b/data/sql/updates/db_world/2025_11_20_00.sql
@@ -0,0 +1,14 @@
+-- DB update 2025_11_18_02 -> 2025_11_20_00
+--
+DELETE FROM `creature_summon_groups` WHERE `summonerId` = 29310 AND `summonerType` = 0 AND `groupId` = 2;
+INSERT INTO `creature_summon_groups`(`summonerId`, `summonerType`, `groupId`, `entry`, `position_x`, `position_y`, `position_z`, `orientation`, `summonType`, `summonTime`, `Comment`) VALUES
+(29310, 0, 2, 30111, 434.00433349609375, -702.8974609375, -17.9579715728759765, 3.124139308929443359, 8, 0, 'Jedoga Shadowseeker - Twilight Worshipper'),
+(29310, 0, 2, 30111, 429.734161376953125, -712.18231201171875, -17.9568767547607421, 2.862339973449707031, 8, 0, 'Jedoga Shadowseeker - Twilight Worshipper'),
+(29310, 0, 2, 30111, 388.307830810546875, -766.78399658203125, -17.9607582092285156, 2.094395160675048828, 8, 0, 'Jedoga Shadowseeker - Twilight Worshipper'),
+(29310, 0, 2, 30111, 392.577484130859375, -765.63641357421875, -17.9589138031005859, 2.251474618911743164, 8, 0, 'Jedoga Shadowseeker - Twilight Worshipper'),
+(29310, 0, 2, 30111, 381.83843994140625, -773.3897705078125, -17.9530143737792968, 1.762782573699951171, 8, 0, 'Jedoga Shadowseeker - Twilight Worshipper'),
+(29310, 0, 2, 30111, 439.982635498046875, -699.070068359375, -17.9527797698974609, 3.193952560424804687, 8, 0, 'Jedoga Shadowseeker - Twilight Worshipper'),
+(29310, 0, 2, 30111, 394.354156494140625, -760.810791015625, -17.9546241760253906, 2.443460941314697265, 8, 0, 'Jedoga Shadowseeker - Twilight Worshipper'),
+(29310, 0, 2, 30111, 434.4365234375, -709.4752197265625, -17.961435317993164, 2.94960641860961914, 8, 0, 'Jedoga Shadowseeker - Twilight Worshipper'),
+(29310, 0, 2, 30111, 387.0694580078125, -770.94964599609375, -17.957611083984375, 1.972222089767456054, 8, 0, 'Jedoga Shadowseeker - Twilight Worshipper'),
+(29310, 0, 2, 30111, 427.302093505859375, -717.3992919921875, -17.9517745971679687, 2.705260276794433593, 8, 0, 'Jedoga Shadowseeker - Twilight Worshipper');
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp
index 68d057900b..da6bfb2898 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp
@@ -583,8 +583,8 @@ void BattlegroundEY::FillInitialWorldStates(WorldPackets::WorldState::InitWorldS
packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_EY_DRAENEI_RUINS_HORDE_CONTROL, _capturePointInfo[POINT_DRAENEI_RUINS].IsUnderControl(TEAM_HORDE));
packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_EY_DRAENEI_RUINS_ALLIANCE_CONTROL, _capturePointInfo[POINT_DRAENEI_RUINS].IsUnderControl(TEAM_ALLIANCE));
packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_EY_DRAENEI_RUINS_UNCONTROL, _capturePointInfo[POINT_DRAENEI_RUINS].IsUncontrolled());
- packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_ALLIANCE_CONTROL, _capturePointInfo[POINT_MAGE_TOWER].IsUnderControl(TEAM_HORDE));
- packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_HORDE_CONTROL, _capturePointInfo[POINT_MAGE_TOWER].IsUnderControl(TEAM_ALLIANCE));
+ packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_ALLIANCE_CONTROL, _capturePointInfo[POINT_MAGE_TOWER].IsUnderControl(TEAM_ALLIANCE));
+ packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_HORDE_CONTROL, _capturePointInfo[POINT_MAGE_TOWER].IsUnderControl(TEAM_HORDE));
packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_UNCONTROL, _capturePointInfo[POINT_MAGE_TOWER].IsUncontrolled());
packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_EY_FEL_REAVER_HORDE_CONTROL, _capturePointInfo[POINT_FEL_REAVER].IsUnderControl(TEAM_HORDE));
packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_EY_FEL_REAVER_ALLIANCE_CONTROL, _capturePointInfo[POINT_FEL_REAVER].IsUnderControl(TEAM_ALLIANCE));
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 111392968a..33d73b6e26 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -420,6 +420,8 @@ Player::Player(WorldSession* session): Unit(), m_mover(this)
sScriptMgr->OnConstructPlayer(this);
_expectingChangeTransport = false;
+ _pendingFlightChangeCounter = 0;
+ _mapChangeOrderCounter = 0;
}
Player::~Player()
diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp
index 623c43f1e1..d3322349b4 100644
--- a/src/server/game/Spells/SpellInfoCorrections.cpp
+++ b/src/server/game/Spells/SpellInfoCorrections.cpp
@@ -5131,6 +5131,13 @@ void SpellMgr::LoadSpellInfoCorrections()
spellInfo->ChannelInterruptFlags &= ~AURA_INTERRUPT_FLAG_TURNING;
});
+ // Summon Scourged Captive
+ ApplySpellFix({ 51597 }, [](SpellInfo* spellInfo)
+ {
+ spellInfo->Effects[EFFECT_0].BasePoints = 1;
+ spellInfo->Effects[EFFECT_0].DieSides = 0;
+ });
+
// The Green Tower
ApplySpellFix({ 18097 }, [](SpellInfo* spellInfo)
{
diff --git a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/ahnkahet.h b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/ahnkahet.h
index 8b1dd67366..c2ddd3b7e2 100644
--- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/ahnkahet.h
+++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/ahnkahet.h
@@ -44,6 +44,7 @@ enum AhnKahetCreatures
NPC_AMANITAR = 30258,
// Teldaram and Jedoga encounter related
NPC_JEDOGA_CONTROLLER = 30181,
+ NPC_TWILIGHT_WORSHIPPER = 30111
};
enum AhnkahetSpells
diff --git a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp
index adc26fcc97..6392a738ed 100644
--- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp
@@ -90,6 +90,7 @@ enum SummonGroups
{
SUMMON_GROUP_OOC = 0,
SUMMON_GROUP_OOC_TRIGGERS = 1,
+ SUMMON_GROUP_IC_WORSHIPPERS = 2
};
enum Points
@@ -217,7 +218,7 @@ struct boss_jedoga_shadowseeker : public BossAI
void JustSummoned(Creature* summon) override
{
- if (summon->GetEntry() == NPC_JEDOGA_CONTROLLER)
+ if (summon->EntryEquals(NPC_JEDOGA_CONTROLLER, NPC_TWILIGHT_WORSHIPPER))
{
summons.Summon(summon);
}
@@ -326,6 +327,17 @@ struct boss_jedoga_shadowseeker : public BossAI
_JustEngagedWith();
Talk(SAY_AGGRO);
ReschedulleCombatEvents();
+
+ std::list<TempSummon*> tempSummons;
+ me->SummonCreatureGroup(SUMMON_GROUP_IC_WORSHIPPERS, &tempSummons);
+ if (!tempSummons.empty())
+ {
+ for (TempSummon* summon : tempSummons)
+ {
+ if (summon)
+ summon->SetStandState(UNIT_STAND_STATE_KNEEL);
+ }
+ }
}
void KilledUnit(Unit* who) override
diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp
index 277e951045..36f8b555c4 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp
@@ -47,7 +47,7 @@ enum Spells
SPELL_COPY_OF_SUMMON_MINIONS = 59933,
SPELL_BLIZZARD = 49034,
SPELL_FROSTBOLT = 49037,
- SPELL_TOUCH_OF_MISERY = 50090
+ SPELL_WRATH_OF_MISERY = 50089
};
enum Misc
@@ -56,14 +56,7 @@ enum Misc
NPC_CRYSTAL_HANDLER = 26627,
NPC_SUMMON_CRYSTAL_HANDLER_TARGET = 27583,
- EVENT_SUMMON_FETID_TROLL = 1,
- EVENT_SUMMON_SHADOWCASTER = 2,
- EVENT_SUMMON_HULKING_CORPSE = 3,
- EVENT_SUMMON_CRYSTAL_HANDLER = 4,
- EVENT_CAST_OFFENSIVE_SPELL = 5,
- EVENT_KILL_TALK = 6,
- EVENT_CHECK_PHASE = 7,
- EVENT_SPELL_SUMMON_MINIONS = 8,
+ EVENT_KILL_TALK = 1,
ROOM_RIGHT = 0,
ROOM_LEFT = 1,
@@ -80,9 +73,7 @@ std::unordered_map<uint32, std::tuple <uint32, Position>> const npcSummon =
// 26631
struct boss_novos : public BossAI
{
- boss_novos(Creature* creature) : BossAI(creature, DATA_NOVOS)
- {
- }
+ boss_novos(Creature* creature) : BossAI(creature, DATA_NOVOS) { }
void Reset() override
{
@@ -120,16 +111,73 @@ struct boss_novos : public BossAI
{
Talk(SAY_AGGRO);
BossAI::JustEngagedWith(who);
+ scheduler.ClearValidator();
+
+ ScheduleTimedEvent(3s, [&] {
+ if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET))
+ trigger->CastSpell(trigger, SPELL_SUMMON_FETID_TROLL_CORPSE, true, nullptr, nullptr, me->GetGUID());
+ }, 3s);
+
+ ScheduleTimedEvent(9s, [&] {
+ if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET))
+ trigger->CastSpell(trigger, SPELL_SUMMON_RISEN_SHADOWCASTER, true, nullptr, nullptr, me->GetGUID());
+ }, 10s);
+
+ ScheduleTimedEvent(30s, [&] {
+ if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET))
+ trigger->CastSpell(trigger, SPELL_SUMMON_HULKING_CORPSE, true, nullptr, nullptr, me->GetGUID());
+ }, 30s);
+
+ scheduler.Schedule(70s, [this](TaskContext context) {
+ if (me->HasAura(SPELL_BEAM_CHANNEL))
+ {
+ context.Repeat(2s);
+ return;
+ }
+
+ scheduler.CancelAll();
+
+ me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
+ me->InterruptNonMeleeSpells(false);
+
+ scheduler.SetValidator([this] {
+ return !me->HasUnitState(UNIT_STATE_CASTING);
+ });
+
+ ScheduleTimedEvent(5s, 10s, [&] {
+ DoCastRandomTarget(SPELL_BLIZZARD);
+ }, 12s, 25s);
+
+ ScheduleTimedEvent(5s, 10s, [&] {
+ DoCastRandomTarget(SPELL_WRATH_OF_MISERY);
+ }, 8s, 16s);
+
+ if (IsHeroic())
+ {
+ ScheduleTimedEvent(10s, [&] {
+ DoCastAOE(SPELL_SUMMON_MINIONS);
+ }, 37s, 55s);
+ }
+ });
+
+ for (Seconds timer : { 16s, 32s, 48s, 64s })
+ {
+ me->m_Events.AddEventAtOffset([&] {
+ Talk(SAY_SUMMONING_ADDS);
+ Talk(EMOTE_SUMMONING_ADDS);
+ if (Creature* target = ObjectAccessor::GetCreature(*me, _stage ? _summonTargetLeftGUID : _summonTargetRightGUID))
+ target->CastSpell(target, SPELL_SUMMON_CRYSTAL_HANDLER, true, nullptr, nullptr, me->GetGUID());
+ _stage = _stage ? 0 : 1;
+ }, timer);
+ }
- events.ScheduleEvent(EVENT_SUMMON_FETID_TROLL, 3s);
- events.ScheduleEvent(EVENT_SUMMON_SHADOWCASTER, 9s);
- events.ScheduleEvent(EVENT_SUMMON_HULKING_CORPSE, 30s);
- events.ScheduleEvent(EVENT_SUMMON_CRYSTAL_HANDLER, 20s);
- events.ScheduleEvent(EVENT_CHECK_PHASE, 80s);
+ me->SetGuidValue(UNIT_FIELD_TARGET, ObjectGuid::Empty);
+ me->RemoveAllAuras();
+ me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
- me->CastSpell(me, SPELL_ARCANE_BLAST, true);
- me->CastSpell(me, SPELL_ARCANE_FIELD, true);
- me->CastSpell(me, SPELL_DESPAWN_CRYSTAL_HANDLER, true);
+ DoCastSelf(SPELL_ARCANE_BLAST, true);
+ DoCastSelf(SPELL_ARCANE_FIELD, true);
+ DoCastSelf(SPELL_DESPAWN_CRYSTAL_HANDLER, true);
for (auto& itr : npcSummon)
{
@@ -147,11 +195,6 @@ struct boss_novos : public BossAI
break;
}
}
-
- me->SetGuidValue(UNIT_FIELD_TARGET, ObjectGuid::Empty);
- me->RemoveAllAuras();
- me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
- me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
}
void JustDied(Unit* killer) override
@@ -182,6 +225,9 @@ struct boss_novos : public BossAI
if (summon->GetEntry() == NPC_FETID_TROLL_CORPSE)
summon->GetMotionMaster()->MovePoint(1, -373.56f, -770.86f, 28.59f);
+
+ if (summon->EntryEquals(NPC_CRYSTAL_HANDLER))
+ summon->SetInCombatWithZone();
}
// Phase 2
else if (summon->GetEntry() != NPC_CRYSTAL_CHANNEL_TARGET)
@@ -211,65 +257,11 @@ struct boss_novos : public BossAI
if (!UpdateVictim())
return;
+ scheduler.Update(diff);
events.Update(diff);
- switch (events.ExecuteEvent())
- {
- case EVENT_SUMMON_FETID_TROLL:
- if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET))
- trigger->CastSpell(trigger, SPELL_SUMMON_FETID_TROLL_CORPSE, true, nullptr, nullptr, me->GetGUID());
- events.ScheduleEvent(EVENT_SUMMON_FETID_TROLL, 3s);
- break;
- case EVENT_SUMMON_HULKING_CORPSE:
- if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET))
- trigger->CastSpell(trigger, SPELL_SUMMON_HULKING_CORPSE, true, nullptr, nullptr, me->GetGUID());
- events.ScheduleEvent(EVENT_SUMMON_HULKING_CORPSE, 30s);
- break;
- case EVENT_SUMMON_SHADOWCASTER:
- if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET))
- trigger->CastSpell(trigger, SPELL_SUMMON_RISEN_SHADOWCASTER, true, nullptr, nullptr, me->GetGUID());
- events.ScheduleEvent(EVENT_SUMMON_SHADOWCASTER, 10s);
- break;
- case EVENT_SUMMON_CRYSTAL_HANDLER:
- if (_crystalCounter++ < 4)
- {
- Talk(SAY_SUMMONING_ADDS);
- Talk(EMOTE_SUMMONING_ADDS);
- if (Creature* target = ObjectAccessor::GetCreature(*me, _stage ? _summonTargetLeftGUID : _summonTargetRightGUID))
- target->CastSpell(target, SPELL_SUMMON_CRYSTAL_HANDLER, true, nullptr, nullptr, me->GetGUID());
- _stage = _stage ? 0 : 1;
- events.ScheduleEvent(EVENT_SUMMON_CRYSTAL_HANDLER, 20s);
- }
- break;
- case EVENT_CHECK_PHASE:
- if (me->HasAura(SPELL_BEAM_CHANNEL))
- {
- events.ScheduleEvent(EVENT_CHECK_PHASE, 2s);
- break;
- }
- events.Reset();
- events.ScheduleEvent(EVENT_CAST_OFFENSIVE_SPELL, 3s);
- events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 10s);
- me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
- me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
- me->InterruptNonMeleeSpells(false);
- break;
- case EVENT_CAST_OFFENSIVE_SPELL:
- if (!me->HasUnitState(UNIT_STATE_CASTING))
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
- me->CastSpell(target, RAND(SPELL_BLIZZARD, SPELL_FROSTBOLT, SPELL_TOUCH_OF_MISERY), false);
-
- events.ScheduleEvent(EVENT_CAST_OFFENSIVE_SPELL, 500ms);
- break;
- case EVENT_SPELL_SUMMON_MINIONS:
- if (me->HasUnitState(UNIT_STATE_CASTING))
- {
- me->CastSpell(me, SPELL_SUMMON_MINIONS, false);
- events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 15s);
- break;
- }
- events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 500ms);
- break;
- }
+
+ if (!me->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
+ DoSpellAttackIfReady(SPELL_FROSTBOLT);
}
bool CheckEvadeIfOutOfCombatArea() const override
diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp
index 78e10f8074..1a240ce158 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp
@@ -59,7 +59,6 @@ enum Misc
EVENT_SPELL_EYE_BEAM = 4,
EVENT_SPELL_LIGHTNING_BREATH = 5,
EVENT_SPELL_POISON_CLOUD = 6,
- EVENT_SPELL_TURN_FLESH = 7,
EVENT_TURN_FLESH_REAL = 9,
EVENT_TURN_BONES_REAL = 10,
EVENT_KILL_TALK = 11
@@ -77,9 +76,7 @@ public:
struct boss_tharon_jaAI : public BossAI
{
- boss_tharon_jaAI(Creature* creature) : BossAI(creature, DATA_THARON_JA)
- {
- }
+ boss_tharon_jaAI(Creature* creature) : BossAI(creature, DATA_THARON_JA) { }
void Reset() override
{
@@ -88,15 +85,23 @@ public:
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true);
me->SetDisplayId(me->GetNativeDisplayId());
me->CastSpell(me, SPELL_CLEAR_GIFT, true);
+
+ ScheduleHealthCheckEvent(55, [&] {
+ Talk(SAY_FLESH);
+ me->GetThreatMgr().ResetAllThreat();
+ me->CastSpell((Unit*)nullptr, SPELL_TURN_FLESH, false);
+
+ events.Reset();
+ events.ScheduleEvent(EVENT_TURN_FLESH_REAL, 3s);
+ }, false);
}
void JustEngagedWith(Unit* who) override
{
Talk(SAY_AGGRO);
BossAI::JustEngagedWith(who);
- events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 5s);
- events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, 8s, 10s);
- events.ScheduleEvent(EVENT_SPELL_TURN_FLESH, 1s);
+ events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 13s, 24s);
+ events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, 6s, 29s);
}
void KilledUnit(Unit* /*victim*/) override
@@ -144,24 +149,11 @@ public:
{
case EVENT_SPELL_CURSE_OF_LIFE:
DoCastRandomTarget(SPELL_CURSE_OF_LIFE, 0, 30.0f, false);
- events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 13s);
+ events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 11s, 28s);
break;
case EVENT_SPELL_SHADOW_VOLLEY:
DoCastAOE(SPELL_SHADOW_VOLLEY);
- events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, 9s);
- break;
- case EVENT_SPELL_TURN_FLESH:
- if (me->HealthBelowPct(50))
- {
- Talk(SAY_FLESH);
- me->GetThreatMgr().ResetAllThreat();
- me->CastSpell((Unit*)nullptr, SPELL_TURN_FLESH, false);
-
- events.Reset();
- events.ScheduleEvent(EVENT_TURN_FLESH_REAL, 3s);
- return;
- }
- events.ScheduleEvent(EVENT_SPELL_TURN_FLESH, 1s);
+ events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, 6s, 29s);
break;
case EVENT_TURN_FLESH_REAL:
DoCastSelf(SPELL_DUMMY, true);
diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp
index c75c8966b8..8380f1caae 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp
@@ -130,6 +130,12 @@ public:
if (!UpdateVictim())
return;
+ if (!CheckInRoom())
+ {
+ EnterEvadeMode(EVADE_REASON_BOUNDARY);
+ return;
+ }
+
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
@@ -159,9 +165,9 @@ public:
DoMeleeAttackIfReady();
}
- bool CheckEvadeIfOutOfCombatArea() const override
+ bool CheckInRoom() override
{
- return me->GetHomePosition().GetExactDist2d(me) > 60.0f;
+ return (me->GetPositionY() >= -700.0f && me->GetPositionY() <= -628.0f);
}
private:
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp
index fd998bd7dd..d4b72fcb36 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp
@@ -28,6 +28,7 @@ enum Spells
SPELL_LIGHTNING_SHIELD = 50831,
SPELL_STATIC_CHARGE = 50834,
SPELL_LIGHTNING_RING = 50840,
+ SPELL_LIGHTNING_RING_5S = 51849,
// IRON SLUDGE
SPELL_TOXIC_VOLLEY = 50838,
@@ -41,7 +42,6 @@ enum Spells
enum Npc
{
- NPC_IRON_SLUDGE = 28165, // if 2 ooze then spawn 1 iron_sludge
NPC_DWARFES_FRIENDLY = 27980, //after fix the machine by Brann
NPC_OOZE = 27981, //spawn after killing dwarf
NPC_FORGED_IRON_DWARF = 27982,
@@ -57,15 +57,6 @@ enum Yells
enum Events
{
- // SJONNIR
- EVENT_SHIELD = 1,
- EVENT_CHAIN_LIGHTNING = 2,
- EVENT_STATIC_CHARGE = 3,
- EVENT_LIGHTNING_RING = 4,
- EVENT_CHECK_HEALTH = 5,
- EVENT_SUMMON = 6,
- EVENT_SUMMON_SPEACH = 7,
-
// TRASH
EVENT_MALFORMED_OOZE_CHECK = 10,
EVENT_TOXIC_VOLLEY = 11,
@@ -73,8 +64,11 @@ enum Events
EVENT_FORGED_LIGHTNING_TETHER = 13,
};
-enum Misc
+enum SjonnirMisc
{
+ GROUP_SUMMONS = 1,
+ GROUP_LIGHTNING_RING = 2,
+
POS_GEN_RIGHT = 0,
POS_GEN_LEFT = 1,
POS_ROOM_CENTER = 2,
@@ -83,13 +77,6 @@ enum Misc
ACTION_SLUG_KILLED = 1,
};
-enum SummonPhases
-{
- PHASE_SUMMON_UNFRIENDLY_DWARFES = 0,
- PHASE_SUMMON_OOZE = 1,
- PHASE_SUMMON_FRIENDLY_DWARFES = 2,
-};
-
static Position RoomPosition[] =
{
{1293.0f, 610.0f, 199.3f, 0.0f},
@@ -107,75 +94,135 @@ public:
return GetHallsOfStoneAI<boss_sjonnirAI>(pCreature);
}
- struct boss_sjonnirAI : public ScriptedAI
+ struct boss_sjonnirAI : public BossAI
{
- boss_sjonnirAI(Creature* c) : ScriptedAI(c), summons(me)
- {
- pInstance = c->GetInstanceScript();
- }
+ boss_sjonnirAI(Creature* c) : BossAI(c, BOSS_SJONNIR) { }
- InstanceScript* pInstance;
- EventMap events;
- SummonList summons;
-
- uint8 SummonPhase;
uint8 SlugeCount;
void Reset() override
{
- events.Reset();
- summons.DespawnAll();
-
+ _Reset();
+ scheduler.ClearValidator();
SlugeCount = 0;
- SummonPhase = PHASE_SUMMON_UNFRIENDLY_DWARFES;
+ instance->SetData(DATA_SJONNIR_ACHIEVEMENT, false);
- if (pInstance)
+ if (instance->GetData(BOSS_TRIBUNAL_OF_AGES) == DONE)
{
- pInstance->SetData(BOSS_SJONNIR, NOT_STARTED);
- pInstance->SetData(DATA_SJONNIR_ACHIEVEMENT, false);
+ if (GameObject* console = me->GetMap()->GetGameObject(instance->GetGuidData(GO_SJONNIR_CONSOLE)))
+ console->SetGoState(GO_STATE_READY);
- me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
- if (pInstance->GetData(BOSS_TRIBUNAL_OF_AGES) == DONE)
+ if (Creature* brann = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_BRANN)))
{
- me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
+ brann->setDeathState(DeathState::JustDied);
+ brann->Respawn();
+ brann->AI()->DoAction(ACTION_SJONNIR_WIPE_START);
+ }
+ }
+
+ ScheduleHealthCheckEvent(75, [&] {
+ scheduler.CancelGroup(GROUP_SUMMONS);
+ scheduler.Schedule(1s, GROUP_SUMMONS, [&](TaskContext context) {
+ uint8 Pos = urand(POS_GEN_RIGHT, POS_GEN_LEFT);
+ me->SummonCreature(NPC_FORGED_IRON_TROGG, RoomPosition[Pos].GetPositionX(), RoomPosition[Pos].GetPositionY(), RoomPosition[Pos].GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000);
+ ActivatePipe(Pos);
+ context.Repeat(5s, 7s);
+ });
+ });
+
+ ScheduleHealthCheckEvent(50, [&] {
+ if (Creature* brann = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_BRANN)))
+ brann->AI()->Talk(SAY_BRANN_SPAWN_OOZE);
+
+ scheduler.CancelGroup(GROUP_SUMMONS);
+ scheduler.Schedule(3s, GROUP_SUMMONS, [&](TaskContext context) {
+ uint8 pos = urand(POS_GEN_RIGHT, POS_GEN_LEFT);
+ if (Creature* ooze = me->SummonCreature(NPC_OOZE, RoomPosition[pos], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000))
+ {
+ ActivatePipe(pos);
+ ooze->GetMotionMaster()->MovePoint(0, RoomPosition[POS_ROOM_CENTER].GetPositionX(), RoomPosition[POS_ROOM_CENTER].GetPositionY(), RoomPosition[POS_ROOM_CENTER].GetPositionZ());
+ ooze->SetReactState(REACT_PASSIVE);
+ ooze->SetWalk(true);
+ }
+
+ context.Repeat();
+ });
+ });
- if (GameObject* console = me->GetMap()->GetGameObject( pInstance->GetGuidData(GO_SJONNIR_CONSOLE)))
- console->SetGoState(GO_STATE_READY);
+ ScheduleHealthCheckEvent(25, [&] {
+ if (Creature* brann = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_BRANN)))
+ brann->AI()->Talk(SAY_BRANN_SPAWN_EARTHEN);
- if (Creature* brann = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_BRANN)))
+ scheduler.CancelGroup(GROUP_SUMMONS);
+ scheduler.Schedule(1s, GROUP_SUMMONS, [&](TaskContext context) {
+ for (int i = 0; i < 3; i++)
{
- brann->setDeathState(DeathState::JustDied);
- brann->Respawn();
- brann->AI()->DoAction(ACTION_SJONNIR_WIPE_START);
+ uint8 pos = urand(POS_GEN_RIGHT, POS_GEN_LEFT);
+ if (Creature* dwarf = me->SummonCreature(NPC_DWARFES_FRIENDLY, RoomPosition[pos], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000))
+ {
+ if (Player* plr = SelectTargetFromPlayerList(100.0f))
+ dwarf->SetFaction(plr->GetFaction());
+
+ ActivatePipe(pos);
+ dwarf->AI()->AttackStart(me);
+ }
}
- }
- }
+
+ context.Repeat(10s, 20s);
+ });
+ });
+
+ ScheduleHealthCheckEvent(20, [&] {
+ scheduler.CancelGroup(GROUP_LIGHTNING_RING);
+ DoCastSelf(SPELL_FRENZY, true);
+
+ ScheduleTimedEvent(1s, [&] {
+ DoCastSelf(SPELL_LIGHTNING_RING_5S);
+ }, 11s);
+ });
+ }
+
+ void ScheduleTasks() override
+ {
+ ScheduleTimedEvent(14s, 19s, [&] {
+ DoCastSelf(SPELL_LIGHTNING_SHIELD);
+ }, 14s, 19s);
+
+ ScheduleTimedEvent(6s, 12s, [&] {
+ DoCastVictim(SPELL_CHAIN_LIGHTNING);
+ }, 6s, 12s);
+
+ ScheduleTimedEvent(24s, [&] {
+ DoCastRandomTarget(SPELL_STATIC_CHARGE, 0, 50.0f);
+ }, 20s);
+
+ scheduler.Schedule(30s, GROUP_LIGHTNING_RING, [&](TaskContext context) {
+ DoCastAOE(SPELL_LIGHTNING_RING);
+ context.Repeat(40s);
+ });
+
+ if (Creature* brann = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_BRANN)))
+ brann->AI()->Talk(SAY_BRANN_SPAWN_TROGG, 20s);
+
+ scheduler.Schedule(5s, GROUP_SUMMONS, [&](TaskContext context) {
+ uint8 pos = urand(POS_GEN_RIGHT, POS_GEN_LEFT);
+ me->SummonCreature(NPC_FORGED_IRON_DWARF, RoomPosition[pos], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000);
+ ActivatePipe(pos);
+ context.Repeat(30s);
+ });
}
void JustEngagedWith(Unit* /*who*/) override
{
+ _JustEngagedWith();
Talk(SAY_AGGRO);
- events.ScheduleEvent(EVENT_CHECK_HEALTH, 1s);
- events.ScheduleEvent(EVENT_SHIELD, 14s, 19s);
- events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 6s, 12s);
- events.ScheduleEvent(EVENT_STATIC_CHARGE, 24s);
- events.ScheduleEvent(EVENT_LIGHTNING_RING, 25s, 31s);
- events.ScheduleEvent(EVENT_SUMMON, 20s);
- events.ScheduleEvent(EVENT_SUMMON, 21s + 500ms);
- events.ScheduleEvent(EVENT_SUMMON_SPEACH, 20s);
+ if (GameObject* doors = me->GetMap()->GetGameObject(instance->GetGuidData(GO_SJONNIR_DOOR)))
+ doors->SetGoState(GO_STATE_READY);
- if (pInstance)
- {
- pInstance->SetData(BOSS_SJONNIR, IN_PROGRESS);
-
- if (GameObject* doors = me->GetMap()->GetGameObject(pInstance->GetGuidData(GO_SJONNIR_DOOR)))
- doors->SetGoState(GO_STATE_READY);
-
- if (pInstance->GetData(BOSS_TRIBUNAL_OF_AGES) == DONE)
- if (Creature* brann = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_BRANN)))
- brann->AI()->DoAction(ACTION_START_SJONNIR_FIGHT);
- }
+ if (instance->GetData(BOSS_TRIBUNAL_OF_AGES) == DONE)
+ if (Creature* brann = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_BRANN)))
+ brann->AI()->DoAction(ACTION_START_SJONNIR_FIGHT);
}
void DoAction(int32 param) override
@@ -183,144 +230,20 @@ public:
if (param == ACTION_SLUG_KILLED)
{
SlugeCount++;
- if (SlugeCount >= 5 && pInstance)
- pInstance->SetData(DATA_SJONNIR_ACHIEVEMENT, true);
- }
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- switch (events.ExecuteEvent())
- {
- case EVENT_CHECK_HEALTH:
- {
- if (SummonPhase == PHASE_SUMMON_UNFRIENDLY_DWARFES && HealthBelowPct(50))
- {
- SummonPhase = PHASE_SUMMON_OOZE;
- events.CancelEvent(EVENT_SUMMON);
- events.ScheduleEvent(EVENT_SUMMON, 0ms);
- events.ScheduleEvent(EVENT_SUMMON, 1500ms);
-
- if (pInstance)
- if (Creature* brann = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_BRANN)))
- {
- brann->AI()->Talk(SAY_BRANN_SPAWN_OOZE);
- }
- }
-
- if (HealthBelowPct(20))
- {
- if (Creature* brann = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_BRANN)))
- {
- brann->AI()->Talk(SAY_BRANN_SPAWN_EARTHEN);
- }
- SummonPhase = PHASE_SUMMON_FRIENDLY_DWARFES;
- me->CastSpell(me, SPELL_FRENZY, false);
-
- events.CancelEvent(EVENT_SUMMON);
- events.ScheduleEvent(EVENT_SUMMON, 0ms);
- break;
- }
-
- events.Repeat(1s);
- break;
- }
- case EVENT_SHIELD:
- {
- me->CastSpell(me, SPELL_LIGHTNING_SHIELD, false);
- events.Repeat(14s, 19s);
- break;
- }
- case EVENT_CHAIN_LIGHTNING:
- {
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true, 0))
- me->CastSpell(target, SPELL_CHAIN_LIGHTNING, false);
-
- events.Repeat(6s, 12s);
- break;
- }
- case EVENT_STATIC_CHARGE:
- {
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true, 0))
- me->CastSpell(target, SPELL_STATIC_CHARGE, false);
-
- events.Repeat(20s);
- break;
- }
- case EVENT_LIGHTNING_RING:
- {
- me->CastSpell(me, SPELL_LIGHTNING_RING, false);
- events.Repeat(25s, 31s);
- events.DelayEvents(10s); // Channel duration
- break;
- }
- case EVENT_SUMMON_SPEACH:
- {
- if (Creature* brann = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_BRANN)))
- {
- brann->AI()->Talk(SAY_BRANN_SPAWN_TROGG);
- }
-
- break;
- }
- case EVENT_SUMMON:
- {
- switch (SummonPhase)
- {
- case PHASE_SUMMON_UNFRIENDLY_DWARFES:
- {
- SummonDwarfes(false);
- events.Repeat(20s);
- break;
- }
- case PHASE_SUMMON_OOZE:
- {
- for (uint8 i = POS_GEN_RIGHT; i <= POS_GEN_LEFT; i++)
- {
- if (Creature* ooze = me->SummonCreature(NPC_OOZE, RoomPosition[i].GetPositionX(), RoomPosition[i].GetPositionY(), RoomPosition[i].GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000))
- {
- ActivatePipe(i);
- ooze->GetMotionMaster()->MovePoint(0, RoomPosition[POS_ROOM_CENTER].GetPositionX(), RoomPosition[POS_ROOM_CENTER].GetPositionY(), RoomPosition[POS_ROOM_CENTER].GetPositionZ());
- summons.Summon(ooze);
- }
- }
- events.Repeat(10s);
- break;
- }
- case PHASE_SUMMON_FRIENDLY_DWARFES:
- {
- SummonDwarfes(true);
- break;
- }
- }
- break;
- }
+ if (SlugeCount >= 5)
+ instance->SetData(DATA_SJONNIR_ACHIEVEMENT, true);
}
-
- DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/) override
{
Talk(SAY_DEATH);
+ _JustDied();
+ if (GameObject* sd = me->GetMap()->GetGameObject(instance->GetGuidData(GO_SJONNIR_DOOR)))
+ sd->SetGoState(GO_STATE_ACTIVE);
- summons.DespawnAll();
- if (pInstance)
- {
- pInstance->SetData(BOSS_SJONNIR, DONE);
- if (GameObject* sd = me->GetMap()->GetGameObject(pInstance->GetGuidData(GO_SJONNIR_DOOR)))
- sd->SetGoState(GO_STATE_ACTIVE);
-
- if (Creature* brann = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_BRANN)))
- brann->AI()->DoAction(ACTION_SJONNIR_DEAD);
- }
+ if (Creature* brann = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_BRANN)))
+ brann->AI()->DoAction(ACTION_SJONNIR_DEAD);
}
void KilledUnit(Unit* /*victim*/) override
@@ -333,42 +256,8 @@ public:
void ActivatePipe(uint8 side)
{
- if (pInstance)
- if (GameObject* pipe = me->GetMap()->GetGameObject(pInstance->GetGuidData(side == POS_GEN_RIGHT ? GO_RIGHT_PIPE : GO_LEFT_PIPE)))
- pipe->SendCustomAnim(0);
- }
-
- void SummonDwarfes(bool friendly)
- {
- if (friendly)
- {
- for (int i = 0; i < 3; i++)
- {
- uint8 Pos = urand(POS_GEN_RIGHT, POS_GEN_LEFT);
- if (Creature* dwarf = me->SummonCreature(NPC_DWARFES_FRIENDLY, RoomPosition[Pos].GetPositionX(), RoomPosition[Pos].GetPositionY(), RoomPosition[Pos].GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000))
- {
- if (Player* plr = SelectTargetFromPlayerList(100.0f))
- dwarf->SetFaction(plr->GetFaction());
-
- ActivatePipe(Pos);
- dwarf->AI()->AttackStart(me);
- summons.Summon(dwarf);
- }
- }
- }
- else
- {
- for (int i = 0; i < 2; i++)
- {
- uint8 Pos = urand(POS_GEN_RIGHT, POS_GEN_LEFT);
- if (Creature* dwarf = me->SummonCreature(urand(0, 1) ? NPC_FORGED_IRON_TROGG : NPC_FORGED_IRON_DWARF, RoomPosition[Pos].GetPositionX(), RoomPosition[Pos].GetPositionY(), RoomPosition[Pos].GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000))
- {
- ActivatePipe(Pos);
- dwarf->SetInCombatWithZone();
- summons.Summon(dwarf);
- }
- }
- }
+ if (GameObject* pipe = me->GetMap()->GetGameObject(instance->GetGuidData(side == POS_GEN_RIGHT ? GO_RIGHT_PIPE : GO_LEFT_PIPE)))
+ pipe->SendCustomAnim(0);
}
};
};
@@ -423,8 +312,8 @@ public:
}
void JustDied(Unit* /*killer*/) override
{
- if (InstanceScript* pInstance = me->GetInstanceScript())
- if (Creature* sjonnir = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_SJONNIR)))
+ if (InstanceScript* instance = me->GetInstanceScript())
+ if (Creature* sjonnir = instance->GetCreature(BOSS_SJONNIR))
sjonnir->AI()->DoAction(ACTION_SLUG_KILLED);
}
void UpdateAI(uint32 diff) override
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp
index 31b4a18b37..f9612cf600 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp
@@ -413,6 +413,7 @@ public:
DoCast(me, 58506, false);
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY_UNARMED);
me->SendMovementFlagUpdate();
+ me->SetImmuneToAll(true);
break;
case ACTION_START_SJONNIR_FIGHT:
SetEscortPaused(false);
@@ -886,8 +887,6 @@ void brann_bronzebeard::brann_bronzebeardAI::WaypointReached(uint32 id)
{
pInstance->SetData(BRANN_BRONZEBEARD, 4);
me->ReplaceAllNpcFlags(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER);
- if (Creature* cr = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_SJONNIR)))
- cr->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
me->SetOrientation(3.132660f);
DoCast(me, 58506, false);
me->SendMovementFlagUpdate();
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h
index 9039c0eba9..d45d3009bc 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h
@@ -78,6 +78,7 @@ enum npcs
NPC_ABEDNEUM = 30899,
NPC_SJONNIR = 27978,
NPC_BRANN = 28070,
+ NPC_IRON_SLUDGE = 28165,
ACTION_START_ESCORT_EVENT = 0,
ACTION_START_TRIBUNAL = 1,
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp
index 521c1ba610..c6c8b65ddd 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp
@@ -20,6 +20,18 @@
#include "ScriptedCreature.h"
#include "halls_of_stone.h"
+ObjectData const summonData[] =
+{
+ { NPC_IRON_SLUDGE, BOSS_SJONNIR },
+ { 0, 0 }
+};
+
+ObjectData const creatureData[] =
+{
+ { NPC_SJONNIR, BOSS_SJONNIR },
+ { 0, 0 }
+};
+
class instance_halls_of_stone : public InstanceMapScript
{
public:
@@ -57,6 +69,9 @@ public:
void Initialize() override
{
SetHeaders(DataHeader);
+ SetBossNumber(MAX_ENCOUNTER);
+ LoadObjectData(creatureData, nullptr);
+ LoadSummonData(summonData);
memset(&Encounter, 0, sizeof(Encounter));
brannAchievement = false;
@@ -121,13 +136,12 @@ public:
{
switch (creature->GetEntry())
{
- case NPC_SJONNIR:
- SjonnirGUID = creature->GetGUID();
- break;
case NPC_BRANN:
BrannGUID = creature->GetGUID();
break;
}
+
+ InstanceScript::OnCreatureCreate(creature);
}
ObjectGuid GetGuidData(uint32 id) const override
diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp
index 29398075ad..4d1bc0924f 100644
--- a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp
+++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp
@@ -182,7 +182,7 @@ public:
case EVENT_SUMMON_KEEPER_OR_GUARDIAN:
bKorG = true;
spawned = true;
- if (Creature* c = DoSummon(RAND(NPC_PORTAL_GUARDIAN, NPC_PORTAL_KEEPER), me, 2.0f, 0, TEMPSUMMON_DEAD_DESPAWN))
+ if (Creature* c = DoSummon(RAND(NPC_PORTAL_GUARDIAN, NPC_PORTAL_KEEPER_1, NPC_PORTAL_KEEPER_2), me, 2.0f, 0, TEMPSUMMON_DEAD_DESPAWN))
me->CastSpell(c, SPELL_PORTAL_CHANNEL, false);
events.RescheduleEvent(EVENT_SUMMON_KEEPER_TRASH, 20s);
break;
@@ -220,11 +220,12 @@ public:
if (pInstance)
for (SummonList::iterator itr = listOfMobs.begin(); itr != listOfMobs.end(); ++itr)
if (Creature* c = pInstance->instance->GetCreature(*itr))
- if (c->IsAlive() && (c->GetEntry() == NPC_PORTAL_GUARDIAN || c->GetEntry() == NPC_PORTAL_KEEPER))
+ if (c->IsAlive() && c->EntryEquals(NPC_PORTAL_GUARDIAN, NPC_PORTAL_KEEPER_1, NPC_PORTAL_KEEPER_2))
{
me->CastSpell(c, SPELL_PORTAL_CHANNEL, false);
return;
}
+
Unit::Kill(me, me, false);
}
}
diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.h b/src/server/scripts/Northrend/VioletHold/violet_hold.h
index 229319087a..a21142afd7 100644
--- a/src/server/scripts/Northrend/VioletHold/violet_hold.h
+++ b/src/server/scripts/Northrend/VioletHold/violet_hold.h
@@ -47,7 +47,8 @@ enum Creatures
NPC_CYANIGOSA = 31134,
NPC_PORTAL_GUARDIAN = 30660,
- NPC_PORTAL_KEEPER = 30695,
+ NPC_PORTAL_KEEPER_1 = 30695,
+ NPC_PORTAL_KEEPER_2 = 30893,
NPC_AZURE_INVADER_1 = 30661,
NPC_AZURE_INVADER_2 = 30961,
NPC_AZURE_SPELLBREAKER_1 = 30662,