aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Entities/Player/Player.cpp17
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp76
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp3
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp3
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp15
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h33
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp146
7 files changed, 270 insertions, 23 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 7e9263b641c..3d7b2cf134b 100755
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -8942,6 +8942,7 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
uint16 NumberOfFields = 0;
uint32 mapid = GetMapId();
OutdoorPvP * pvp = sOutdoorPvPMgr->GetOutdoorPvPToZoneId(zoneid);
+ InstanceScript* instance = GetInstanceScript();
sLog->outDebug(LOG_FILTER_NETWORKIO, "Sending SMSG_INIT_WORLD_STATES to Map: %u, Zone: %u", mapid, zoneid);
@@ -9012,6 +9013,9 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
case 4710:
NumberOfFields = 28;
break;
+ case 4812:
+ NumberOfFields = 13;
+ break;
default:
NumberOfFields = 12;
break;
@@ -9530,6 +9534,19 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
data << uint32(4345) << uint32(1); // 24 unknown
}
break;
+ // Icecrown Citadel
+ case 4812:
+ if (instance && mapid == 631)
+ instance->FillInitialWorldStates(data);
+ else
+ {
+ data << uint32(4903) << uint32(0); // 9 WORLDSTATE_SHOW_TIMER (Blood Quickening weekly)
+ data << uint32(4904) << uint32(30); // 10 WORLDSTATE_EXECUTION_TIME
+ data << uint32(4940) << uint32(0); // 11 WORLDSTATE_SHOW_ATTEMPTS
+ data << uint32(4941) << uint32(50); // 12 WORLDSTATE_ATTEMPTS_REMAINING
+ data << uint32(4942) << uint32(50); // 13 WORLDSTATE_ATTEMPTS_MAX
+ }
+ break;
default:
data << uint32(0x914) << uint32(0x0); // 7
data << uint32(0x913) << uint32(0x0); // 8
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
index 9ddf274ca2f..473b7c96c0d 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
@@ -60,6 +60,7 @@ enum Spells
SPELL_TWILIGHT_BLOODBOLT = 71446,
SPELL_INCITE_TERROR = 73070,
SPELL_BLOODBOLT_WHIRL = 71772,
+ SPELL_ANNIHILATE = 71322,
};
enum Shadowmourne
@@ -82,7 +83,7 @@ static const uint32 vampireAuras[3][MAX_DIFFICULTY] =
#define ESSENCE_OF_BLOOD_QUEEN_PLR RAID_MODE<uint32>(70879,71525,71530,71531)
#define FRENZIED_BLOODTHIRST RAID_MODE<uint32>(70877,71474,70877,71474)
-enum eEvents
+enum Events
{
EVENT_BERSERK = 1,
EVENT_VAMPIRIC_BITE = 2,
@@ -101,15 +102,17 @@ enum eEvents
#define GUID_VAMPIRE 1
-enum ePoints
+enum Points
{
POINT_CENTER = 1,
POINT_AIR = 2,
POINT_GROUND = 3,
+ POINT_MINCHAR = 4,
};
-static const Position centerPos = {4595.7090f, 2769.4190f, 400.6368f, 0.0000f};
-static const Position airPos = {4595.7090f, 2769.4190f, 422.3893f, 0.0000f};
+static const Position centerPos = {4595.7090f, 2769.4190f, 400.6368f, 0.000000f};
+static const Position airPos = {4595.7090f, 2769.4190f, 422.3893f, 0.000000f};
+static const Position mincharPos = {4629.3711f, 2782.6089f, 424.6390f, 0.000000f};
bool IsVampire(Unit const* unit)
{
@@ -152,6 +155,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
me->SetSpeed(MOVE_FLIGHT, 0.642857f, true);
offtank = NULL;
vampires.clear();
+ creditBloodQuickening = false;
}
void EnterCombat(Unit* who)
@@ -170,9 +174,10 @@ class boss_blood_queen_lana_thel : public CreatureScript
DoCast(me, SPELL_SHROUD_OF_SORROW, true);
DoCast(me, SPELL_FRENZIED_BLOODTHIRST_VISUAL, true);
+ creditBloodQuickening = instance->GetData(DATA_BLOOD_QUICKENING_STATE) == IN_PROGRESS;
}
- void JustDied(Unit* /*killer*/)
+ void JustDied(Unit* killer)
{
_JustDied();
Talk(SAY_DEATH);
@@ -185,10 +190,62 @@ class boss_blood_queen_lana_thel : public CreatureScript
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_DUMMY);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_DELIRIOUS_SLASH);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PACT_OF_THE_DARKFALLEN);
+ // Blah, credit the quest
+ if (creditBloodQuickening)
+ {
+ if (Player* plr = killer->ToPlayer())
+ plr->RewardPlayerAndGroupAtEvent(NPC_INFILTRATOR_MINCHAR_BQ, plr);
+ if (Creature* minchar = me->FindNearestCreature(NPC_INFILTRATOR_MINCHAR_BQ, 200.0f))
+ {
+ minchar->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
+ minchar->SetFlying(false);
+ minchar->SendMovementFlagUpdate();
+ minchar->RemoveAllAuras();
+ minchar->GetMotionMaster()->MoveCharge(4629.3711f, 2782.6089f, 401.5301f, SPEED_CHARGE/2.0f);
+ }
+ }
+ }
+
+ void DoAction(const int32 action)
+ {
+ if (action != ACTION_KILL_MINCHAR)
+ return;
+
+ if (instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == IN_PROGRESS)
+ killMinchar = true;
+ else
+ {
+ me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
+ me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, 0x01);
+ me->SetFlying(true);
+ me->SendMovementFlagUpdate();
+ me->GetMotionMaster()->MovePoint(POINT_MINCHAR, mincharPos);
+ }
+ }
+
+ void EnterEvadeMode()
+ {
+ _EnterEvadeMode();
+ if (killMinchar)
+ {
+ me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
+ me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, 0x01);
+ me->SetFlying(true);
+ me->GetMotionMaster()->MovePoint(POINT_MINCHAR, mincharPos);
+ }
+ else
+ {
+ me->GetMotionMaster()->MoveTargetedHome();
+ Reset();
+ }
}
void JustReachedHome()
{
+ me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
+ me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, 0x01);
+ me->SetFlying(false);
+ me->SetReactState(REACT_AGGRESSIVE);
_JustReachedHome();
Talk(SAY_WIPE);
instance->SetBossState(DATA_BLOOD_QUEEN_LANA_THEL, FAIL);
@@ -229,11 +286,17 @@ class boss_blood_queen_lana_thel : public CreatureScript
me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, 0x01);
me->SetFlying(false);
+ me->SendMovementFlagUpdate();
me->SetReactState(REACT_AGGRESSIVE);
if (Unit *victim = me->SelectVictim())
AttackStart(victim);
events.ScheduleEvent(EVENT_BLOOD_MIRROR, 2500, EVENT_GROUP_CANCELLABLE);
break;
+ case POINT_MINCHAR:
+ DoCast(me, SPELL_ANNIHILATE, true);
+ // already in evade mode
+ me->GetMotionMaster()->MoveTargetedHome();
+ Reset();
default:
break;
}
@@ -346,6 +409,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, 0x01);
me->SetFlying(true);
+ me->SendMovementFlagUpdate();
me->GetMotionMaster()->MovePoint(POINT_AIR, airPos);
break;
case EVENT_AIR_FLY_DOWN:
@@ -401,6 +465,8 @@ class boss_blood_queen_lana_thel : public CreatureScript
Player* offtank;
std::set<uint64> vampires;
+ bool creditBloodQuickening;
+ bool killMinchar;
};
CreatureAI* GetAI(Creature* creature) const
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
index 475ce3e8d39..314690d18fd 100755
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
@@ -168,9 +168,6 @@ enum Phases
enum DeprogrammingData
{
- QUEST_DEPROGRAMMING_10 = 24869,
- QUEST_DEPROGRAMMING_25 = 24875,
-
NPC_DARNAVAN_10 = 38472,
NPC_DARNAVAN_25 = 38485,
NPC_DARNAVAN_CREDIT_10 = 39091,
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
index a59f422a76e..3a4cdcb1d9a 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
@@ -1471,6 +1471,9 @@ class at_sindragosa_lair : public AreaTriggerScript
if (!instance->GetData(DATA_SINDRAGOSA_FROSTWYRMS) && instance->GetBossState(DATA_SINDRAGOSA) != DONE)
{
+ if (player->GetMap()->IsHeroic() && !instance->GetData(DATA_HEROIC_ATTEMPTS))
+ return true;
+
player->GetMap()->LoadGrid(SindragosaSpawnPos.GetPositionX(), SindragosaSpawnPos.GetPositionY());
if (Creature* sindragosa = player->GetMap()->SummonCreature(NPC_SINDRAGOSA, SindragosaSpawnPos))
{
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
index 6cf8e170450..a379b800720 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
@@ -644,6 +644,20 @@ class at_icc_shutdown_traps : public AreaTriggerScript
}
};
+class at_icc_start_blood_quickening : public AreaTriggerScript
+{
+ public:
+ at_icc_start_blood_quickening() : AreaTriggerScript("at_icc_start_blood_quickening") { }
+
+ bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/)
+ {
+ if (InstanceScript* instance = player->GetInstanceScript())
+ if (instance->GetData(DATA_BLOOD_QUICKENING_STATE) == NOT_STARTED)
+ instance->SetData(DATA_BLOOD_QUICKENING_STATE, IN_PROGRESS);
+ return true;
+ }
+};
+
void AddSC_icecrown_citadel()
{
new npc_highlord_tirion_fordring_lh();
@@ -654,4 +668,5 @@ void AddSC_icecrown_citadel()
new spell_icc_harvest_blight_specimen();
new at_icc_saurfang_portal();
new at_icc_shutdown_traps();
+ new at_icc_start_blood_quickening();
}
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
index 91210394eb2..76aed7805bb 100755
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
@@ -74,9 +74,12 @@ enum DataTypes
DATA_RIMEFANG = 24,
DATA_COLDFLAME_JETS = 25,
DATA_TEAM_IN_INSTANCE = 26,
+ DATA_BLOOD_QUICKENING_STATE = 27,
+ DATA_HEROIC_ATTEMPTS = 28,
};
#define MAX_ENCOUNTER 12
+#define WEEKLY_NPCS 7
enum CreaturesIds
{
@@ -101,12 +104,14 @@ enum CreaturesIds
NPC_GARROSH_HELLSCREAM = 39372,
NPC_KING_VARIAN_WRYNN = 39371,
- // Weekly questgivers
+ // Weekly quests
NPC_INFILTRATOR_MINCHAR = 38471,
NPC_KOR_KRON_LIEUTENANT = 38491,
NPC_SKYBREAKER_LIEUTENANT = 38492,
NPC_ALCHEMIST_ADRIANNA = 38501,
NPC_ALRIN_THE_AGILE = 38551,
+ NPC_INFILTRATOR_MINCHAR_BQ = 38558,
+ NPC_MINCHAR_BEAM_STALKER = 38557,
NPC_VALITHRIA_DREAMWALKER_QUEST = 38589,
// Lord Marrowgar
@@ -288,11 +293,37 @@ enum SharedActions
ACTION_ROTFACE_DEATH = -366272,
ACTION_CHANGE_PHASE = -366780,
+ // Blood-Queen Lana'thel
+ ACTION_KILL_MINCHAR = -379550,
+
// Sindragosa
ACTION_START_FROSTWYRM = -368530,
ACTION_TRIGGER_ASPHYXIATION = -368531,
};
+enum WeekliesICC
+{
+ QUEST_DEPROGRAMMING_10 = 24869,
+ QUEST_DEPROGRAMMING_25 = 24875,
+ QUEST_SECURING_THE_RAMPARTS_10 = 24870,
+ QUEST_SECURING_THE_RAMPARTS_25 = 24877,
+ QUEST_RESIDUE_RENDEZVOUS_10 = 24873,
+ QUEST_RESIDUE_RENDEZVOUS_25 = 24878,
+ QUEST_BLOOD_QUICKENING_10 = 24874,
+ QUEST_BLOOD_QUICKENING_25 = 24879,
+ QUEST_RESPITE_FOR_A_TORNMENTED_SOUL_10 = 24872,
+ QUEST_RESPITE_FOR_A_TORNMENTED_SOUL_25 = 24880,
+};
+
+enum WorldStatesICC
+{
+ WORLDSTATE_SHOW_TIMER = 4903,
+ WORLDSTATE_EXECUTION_TIME = 4904,
+ WORLDSTATE_SHOW_ATTEMPTS = 4940,
+ WORLDSTATE_ATTEMPTS_REMAINING = 4941,
+ WORLDSTATE_ATTEMPTS_MAX = 4942,
+};
+
// Declaration
extern Position const SindragosaSpawnPos;
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
index 3fd5d911240..bdcc611751d 100755
--- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
@@ -48,17 +48,20 @@ static const DoorData doorData[] =
{0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE} // END
};
+// this doesnt have to only store questgivers, also can be used for related quest spawns
struct WeeklyQuest
{
- uint32 npcStart;
+ uint32 creatureEntry;
uint32 questId[2]; // 10 and 25 man versions
-} WeeklyQuestData[5] =
+} WeeklyQuestData[WEEKLY_NPCS] =
{
- {NPC_INFILTRATOR_MINCHAR, {24869, 24875}}, // Deprogramming
- {NPC_KOR_KRON_LIEUTENANT, {24870, 24877}}, // Securing the Ramparts
- {NPC_ALCHEMIST_ADRIANNA, {24873, 24878}}, // Residue Rendezvous
- {NPC_ALRIN_THE_AGILE, {24874, 24879}}, // Blood Quickening
- {NPC_VALITHRIA_DREAMWALKER_QUEST, {24872, 24880}}, // Respite for a Tormented Soul
+ {NPC_INFILTRATOR_MINCHAR, {QUEST_DEPROGRAMMING_10, QUEST_DEPROGRAMMING_25 }}, // Deprogramming
+ {NPC_KOR_KRON_LIEUTENANT, {QUEST_SECURING_THE_RAMPARTS_10, QUEST_SECURING_THE_RAMPARTS_25 }}, // Securing the Ramparts
+ {NPC_ALCHEMIST_ADRIANNA, {QUEST_RESIDUE_RENDEZVOUS_10, QUEST_RESIDUE_RENDEZVOUS_25 }}, // Residue Rendezvous
+ {NPC_ALRIN_THE_AGILE, {QUEST_BLOOD_QUICKENING_10, QUEST_BLOOD_QUICKENING_25 }}, // Blood Quickening
+ {NPC_INFILTRATOR_MINCHAR_BQ, {QUEST_BLOOD_QUICKENING_10, QUEST_BLOOD_QUICKENING_25 }}, // Blood Quickening
+ {NPC_MINCHAR_BEAM_STALKER, {QUEST_BLOOD_QUICKENING_10, QUEST_BLOOD_QUICKENING_25 }}, // Blood Quickening
+ {NPC_VALITHRIA_DREAMWALKER_QUEST, {QUEST_RESPITE_FOR_A_TORNMENTED_SOUL_10, QUEST_RESPITE_FOR_A_TORNMENTED_SOUL_25}}, // Respite for a Tormented Soul
};
class instance_icecrown_citadel : public InstanceMapScript
@@ -73,6 +76,7 @@ class instance_icecrown_citadel : public InstanceMapScript
SetBossNumber(MAX_ENCOUNTER);
LoadDoorData(doorData);
teamInInstance = 0;
+ heroicAttempts = 50;
ladyDeathwisperElevator = 0;
deathbringerSaurfang = 0;
saurfangDoor = 0;
@@ -103,6 +107,18 @@ class instance_icecrown_citadel : public InstanceMapScript
isNauseaEligible = true;
isOrbWhispererEligible = true;
coldflameJetsState = NOT_STARTED;
+ bloodQuickeningState = NOT_STARTED;
+ bloodQuickeningTimer = 0;
+ bloodQuickeningMinutes = 0;
+ }
+
+ void FillInitialWorldStates(WorldPacket& data)
+ {
+ data << uint32(WORLDSTATE_SHOW_TIMER) << uint32(bloodQuickeningState == IN_PROGRESS);
+ data << uint32(WORLDSTATE_EXECUTION_TIME) << uint32(bloodQuickeningMinutes);
+ data << uint32(WORLDSTATE_SHOW_ATTEMPTS) << uint32(instance->IsHeroic());
+ data << uint32(WORLDSTATE_ATTEMPTS_REMAINING) << uint32(heroicAttempts);
+ data << uint32(WORLDSTATE_ATTEMPTS_MAX) << uint32(50);
}
void OnPlayerEnter(Player* player)
@@ -228,11 +244,13 @@ class instance_icecrown_citadel : public InstanceMapScript
case NPC_KOR_KRON_LIEUTENANT:
case NPC_ALCHEMIST_ADRIANNA:
case NPC_ALRIN_THE_AGILE:
+ case NPC_INFILTRATOR_MINCHAR_BQ:
+ case NPC_MINCHAR_BEAM_STALKER:
case NPC_VALITHRIA_DREAMWALKER_QUEST:
{
- for (uint8 questIndex = 0; questIndex < 5; ++questIndex)
+ for (uint8 questIndex = 0; questIndex < WEEKLY_NPCS; ++questIndex)
{
- if (WeeklyQuestData[questIndex].npcStart == entry)
+ if (WeeklyQuestData[questIndex].creatureEntry == entry)
{
uint8 diffIndex = instance->GetSpawnMode() & 1;
if (!sPoolMgr->IsSpawnedObject<Quest>(WeeklyQuestData[questIndex].questId[diffIndex]))
@@ -396,6 +414,8 @@ class instance_icecrown_citadel : public InstanceMapScript
return coldflameJetsState;
case DATA_TEAM_IN_INSTANCE:
return teamInInstance;
+ case DATA_HEROIC_ATTEMPTS:
+ return heroicAttempts;
default:
break;
}
@@ -512,14 +532,47 @@ class instance_icecrown_citadel : public InstanceMapScript
break;
case DATA_PROFESSOR_PUTRICIDE:
HandleGameObject(plagueSigil, state != DONE);
+ if (instance->IsHeroic())
+ {
+ if (state == FAIL && heroicAttempts)
+ {
+ --heroicAttempts;
+ DoUpdateWorldState(WORLDSTATE_ATTEMPTS_REMAINING, heroicAttempts);
+ if (!heroicAttempts)
+ if (Creature* putricide = instance->GetCreature(professorPutricide))
+ putricide->DespawnOrUnsummon();
+ }
+ }
break;
case DATA_BLOOD_QUEEN_LANA_THEL:
HandleGameObject(bloodwingSigil, state != DONE);
+ if (instance->IsHeroic())
+ {
+ if (state == FAIL && heroicAttempts)
+ {
+ --heroicAttempts;
+ DoUpdateWorldState(WORLDSTATE_ATTEMPTS_REMAINING, heroicAttempts);
+ if (!heroicAttempts)
+ if (Creature* bq = instance->GetCreature(bloodQueenLanaThel))
+ bq->DespawnOrUnsummon();
+ }
+ }
break;
case DATA_VALITHRIA_DREAMWALKER:
break;
case DATA_SINDRAGOSA:
HandleGameObject(frostwingSigil, state != DONE);
+ if (instance->IsHeroic())
+ {
+ if (state == FAIL && heroicAttempts)
+ {
+ --heroicAttempts;
+ DoUpdateWorldState(WORLDSTATE_ATTEMPTS_REMAINING, heroicAttempts);
+ if (!heroicAttempts)
+ if (Creature* sindra = instance->GetCreature(sindragosa))
+ sindra->DespawnOrUnsummon();
+ }
+ }
break;
case DATA_THE_LICH_KING:
break;
@@ -547,6 +600,8 @@ class instance_icecrown_citadel : public InstanceMapScript
isOrbWhispererEligible = data ? true : false;
break;
case DATA_SINDRAGOSA_FROSTWYRMS:
+ if (instance->IsHeroic() && !heroicAttempts)
+ return;
if (data > 1)
frostwyrms = data;
else if (data == 1)
@@ -589,6 +644,31 @@ class instance_icecrown_citadel : public InstanceMapScript
trap->AI()->DoAction(ACTION_STOP_TRAPS);
}
break;
+ case DATA_BLOOD_QUICKENING_STATE:
+ {
+ // 3 is the index of Blood Quickening
+ if (!sPoolMgr->IsSpawnedObject<Quest>(WeeklyQuestData[3].questId[instance->GetSpawnMode() & 1]))
+ break;
+ if (bloodQuickeningState == data)
+ break;
+
+ switch (data)
+ {
+ case IN_PROGRESS:
+ bloodQuickeningTimer = 60000;
+ bloodQuickeningMinutes = 30;
+ DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1);
+ DoUpdateWorldState(WORLDSTATE_EXECUTION_TIME, bloodQuickeningMinutes);
+ break;
+ case DONE:
+ bloodQuickeningTimer = 0;
+ bloodQuickeningMinutes = 0;
+ DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0);
+ break;
+ }
+ bloodQuickeningState = data;
+ break;
+ }
default:
break;
}
@@ -772,7 +852,8 @@ class instance_icecrown_citadel : public InstanceMapScript
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
- saveStream << "I C " << GetBossSaveData() << uint32(coldflameJetsState);
+ saveStream << "I C " << GetBossSaveData() << uint32(coldflameJetsState)
+ << " " << uint32(bloodQuickeningState) << " " << bloodQuickeningMinutes;
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
@@ -804,14 +885,47 @@ class instance_icecrown_citadel : public InstanceMapScript
SetBossState(i, EncounterState(tmpState));
}
- uint32 jets = 0;
- loadStream >> jets;
- coldflameJetsState = jets ? DONE : NOT_STARTED;
- } else OUT_LOAD_INST_DATA_FAIL;
+ uint32 temp = 0;
+ loadStream >> temp;
+ coldflameJetsState = temp ? DONE : NOT_STARTED;
+ temp = 0;
+ loadStream >> temp;
+ bloodQuickeningState = temp ? DONE : NOT_STARTED; // DONE means finished (not success/fail)
+ loadStream >> bloodQuickeningMinutes;
+ }
+ else
+ OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA_COMPLETE;
}
+ void Update(uint32 diff)
+ {
+ if (bloodQuickeningMinutes)
+ {
+ if (bloodQuickeningTimer <= diff)
+ {
+ --bloodQuickeningMinutes;
+ bloodQuickeningTimer = 60000;
+ if (bloodQuickeningMinutes)
+ {
+ DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1);
+ DoUpdateWorldState(WORLDSTATE_EXECUTION_TIME, bloodQuickeningMinutes);
+ }
+ else
+ {
+ bloodQuickeningState = DONE;
+ DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0);
+ if (Creature* bq = instance->GetCreature(bloodQueenLanaThel))
+ bq->AI()->DoAction(ACTION_KILL_MINCHAR);
+ }
+ SaveToDB();
+ }
+ else
+ bloodQuickeningTimer -= diff;
+ }
+ }
+
private:
uint64 ladyDeathwisperElevator;
uint64 deathbringerSaurfang;
@@ -837,10 +951,14 @@ class instance_icecrown_citadel : public InstanceMapScript
uint64 rimefang;
std::set<uint64> coldflameJets;
uint32 teamInInstance;
+ uint32 bloodQuickeningTimer;
+ uint16 heroicAttempts;
uint16 coldflameJetsState;
uint16 frostwyrms;
uint16 spinestalkerTrash;
uint16 rimefangTrash;
+ uint16 bloodQuickeningState;
+ uint16 bloodQuickeningMinutes;
bool isBonedEligible;
bool isOozeDanceEligible;
bool isNauseaEligible;