aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/scripts/world_scripts_full.sql5
-rw-r--r--sql/updates/world/2011_03_13_1_world_areatrigger_scripts.sql3
-rw-r--r--sql/updates/world/2011_03_13_1_world_creatures.sql26
-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
10 files changed, 302 insertions, 25 deletions
diff --git a/sql/scripts/world_scripts_full.sql b/sql/scripts/world_scripts_full.sql
index 0e2e07d56ca..d9f43bb12e0 100644
--- a/sql/scripts/world_scripts_full.sql
+++ b/sql/scripts/world_scripts_full.sql
@@ -9,7 +9,7 @@ UPDATE `gameobject_template` SET `ScriptName`='';
UPDATE `outdoorpvp_template` SET `ScriptName`='';
/* AREA TRIGGERS */
-DELETE FROM `areatrigger_scripts` WHERE `entry` IN (822,5284,5285,5286,5287,4871,4872,4873,5108,5332,5338,5334,5340,5369,5423,5633,5604,5698,5649);
+DELETE FROM `areatrigger_scripts` WHERE `entry` IN (822,5284,5285,5286,5287,4871,4872,4873,5108,5332,5338,5334,5340,5369,5423,5633,5604,5698,5649,5729);
DELETE FROM `areatrigger_scripts` WHERE `entry` BETWEEN 1726 AND 1740;
INSERT INTO `areatrigger_scripts` (`entry`,`ScriptName`) VALUES
(822, 'at_map_chamber'),
@@ -45,7 +45,8 @@ INSERT INTO `areatrigger_scripts` (`entry`,`ScriptName`) VALUES
(5633, 'at_tyrannus_event_starter'),
(5604, 'at_sindragosa_lair'),
(5698, 'at_icc_saurfang_portal'),
-(5649, 'at_icc_shutdown_traps');
+(5649, 'at_icc_shutdown_traps'),
+(5729, 'at_icc_start_blood_quickening');
/* WORLD BOSS */
UPDATE `creature_template` SET `ScriptName`='boss_ysondre' WHERE `entry`=14887;
diff --git a/sql/updates/world/2011_03_13_1_world_areatrigger_scripts.sql b/sql/updates/world/2011_03_13_1_world_areatrigger_scripts.sql
new file mode 100644
index 00000000000..098030021ee
--- /dev/null
+++ b/sql/updates/world/2011_03_13_1_world_areatrigger_scripts.sql
@@ -0,0 +1,3 @@
+DELETE FROM `areatrigger_scripts` WHERE `entry`=5729;
+INSERT INTO `areatrigger_scripts` (`entry`,`ScriptName`) VALUES
+(5729,'at_icc_start_blood_quickening');
diff --git a/sql/updates/world/2011_03_13_1_world_creatures.sql b/sql/updates/world/2011_03_13_1_world_creatures.sql
new file mode 100644
index 00000000000..860491ec790
--- /dev/null
+++ b/sql/updates/world/2011_03_13_1_world_creatures.sql
@@ -0,0 +1,26 @@
+UPDATE `creature_template` SET `AIName`='SmartAI',`InhabitType`=7,`flags_extra`=`flags_extra`|128 WHERE `entry`=38557;
+UPDATE `creature_template` SET `InhabitType`=7 WHERE `entry`=38558;
+
+SET @GUID := 137784;
+DELETE FROM `creature` WHERE `guid` BETWEEN @GUID+0 AND @GUID+4;
+INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`DeathState`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES
+(@GUID+0,38558,631,15,1,0,0,4637.27,2786.25,424.639,3.57357,604800,0,0,0,0,0,0,0,0,0), -- Infiltrator Minchar
+(@GUID+1,38557,631,15,1,0,0,4642.60,2771.61,412.227,0.00000,604800,0,0,0,0,0,0,0,0,0), -- left leg
+(@GUID+2,38557,631,15,1,0,0,4630.34,2799.74,412.512,0.00000,604800,0,0,0,0,0,0,0,0,0), -- right leg
+(@GUID+3,38557,631,15,1,0,0,4630.73,2802.02,437.672,0.00000,604800,0,0,0,0,0,0,0,0,0), -- right arm
+(@GUID+4,38557,631,15,1,0,0,4645.42,2771.67,436.146,0.00000,604800,0,0,0,0,0,0,0,0,0); -- left arm
+
+DELETE FROM `smart_scripts` WHERE `entryorguid` BETWEEN -(@GUID+4) AND -(@GUID+1);
+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`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
+(-(@GUID+1),0,0,0,25,0,100,0,0,0,0,0,11,72302,3,0,0,0,0,10,@GUID,0,0,0,0,0,0, 'Minchar Beam Stalker - Channel beam'),
+(-(@GUID+2),0,0,0,25,0,100,0,0,0,0,0,11,72301,3,0,0,0,0,10,@GUID,0,0,0,0,0,0, 'Minchar Beam Stalker - Channel beam'),
+(-(@GUID+3),0,0,0,25,0,100,0,0,0,0,0,11,72304,3,0,0,0,0,10,@GUID,0,0,0,0,0,0, 'Minchar Beam Stalker - Channel beam'),
+(-(@GUID+4),0,0,0,25,0,100,0,0,0,0,0,11,72303,3,0,0,0,0,10,@GUID,0,0,0,0,0,0, 'Minchar Beam Stalker - Channel beam');
+
+DELETE FROM `creature_addon` WHERE `guid`=@GUID;
+INSERT INTO `creature_addon` (`guid`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES
+(@GUID,0,0x03000000,1,427, ''); -- Infiltrator Minchar
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=71322;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(13,0,71322,0,18,1,38558,0,0, '', 'Blood-Queen Lana''thel - Annihilate Minchar');
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;