diff options
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; |
