aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2011-04-16 14:05:20 +0200
committerShauren <shauren.trinity@gmail.com>2011-04-16 14:05:20 +0200
commitc1e8eefd74e10ec22bad4997baa5400a5c6f1791 (patch)
tree05836b95bb0199ffedee129d0e1c041936647b15 /src
parenteb0c1bdff0140045b7e22218876b435248a7f1b9 (diff)
Scripts/Icecrown Citadel:
Prevented spawning Rotting Frost Giant if the related weekly quest is not active Added more strict checks for Sindragosa event
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp31
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h4
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp121
3 files changed, 112 insertions, 44 deletions
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
index fd320e8483e..31afa119143 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
@@ -233,13 +233,15 @@ class boss_sindragosa : public CreatureScript
Talk(SAY_KILL);
}
- void DoAction(const int32 action)
+ void DoAction(int32 const action)
{
if (action == ACTION_START_FROSTWYRM)
{
instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, 255);
if (me->isDead())
return;
+
+ me->setActive(true);
me->SetSpeed(MOVE_FLIGHT, 4.0f);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
float moveTime = me->GetExactDist(&SindragosaFlyPos)/(me->GetSpeed(MOVE_FLIGHT)*0.001f);
@@ -361,7 +363,7 @@ class boss_sindragosa : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 const diff)
{
if (!UpdateVictim() || !CheckInRoom())
return;
@@ -492,7 +494,7 @@ class npc_ice_tomb : public CreatureScript
me->SetReactState(REACT_PASSIVE);
}
- void SetGUID(const uint64& guid, int32 type/* = 0 */)
+ void SetGUID(uint64 const& guid, int32 type/* = 0 */)
{
if (type == DATA_TRAPPED_PLAYER)
{
@@ -501,7 +503,7 @@ class npc_ice_tomb : public CreatureScript
}
}
- void DoAction(const int32 action)
+ void DoAction(int32 const action)
{
if (action == ACTION_TRIGGER_ASPHYXIATION)
if (Player* player = ObjectAccessor::GetPlayer(*me, trappedPlayer))
@@ -520,7 +522,7 @@ class npc_ice_tomb : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 const diff)
{
if (!trappedPlayer)
return;
@@ -590,13 +592,15 @@ class npc_spinestalker : public CreatureScript
instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, 0);
}
- void DoAction(const int32 action)
+ void DoAction(int32 const action)
{
if (action == ACTION_START_FROSTWYRM)
{
instance->SetData(DATA_SPINESTALKER, 255);
if (me->isDead())
return;
+
+ me->setActive(true);
me->SetSpeed(MOVE_FLIGHT, 2.0f);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
float moveTime = me->GetExactDist(&SpinestalkerFlyPos)/(me->GetSpeed(MOVE_FLIGHT)*0.001f);
@@ -613,13 +617,14 @@ class npc_spinestalker : public CreatureScript
if (type != POINT_MOTION_TYPE || point != POINT_FROSTWYRM_LAND)
return;
+ me->setActive(false);
me->SetFlying(false);
me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
me->SetHomePosition(SpinestalkerLandPos);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 const diff)
{
if (!UpdateVictim())
return;
@@ -702,13 +707,15 @@ class npc_rimefang : public CreatureScript
instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, 0);
}
- void DoAction(const int32 action)
+ void DoAction(int32 const action)
{
if (action == ACTION_START_FROSTWYRM)
{
instance->SetData(DATA_RIMEFANG, 255);
if (me->isDead())
return;
+
+ me->setActive(true);
me->SetSpeed(MOVE_FLIGHT, 2.0f);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
float moveTime = me->GetExactDist(&RimefangFlyPos)/(me->GetSpeed(MOVE_FLIGHT)*0.001f);
@@ -725,6 +732,7 @@ class npc_rimefang : public CreatureScript
if (type != POINT_MOTION_TYPE || point != POINT_FROSTWYRM_LAND)
return;
+ me->setActive(false);
me->SetFlying(false);
me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
me->SetHomePosition(RimefangLandPos);
@@ -736,7 +744,7 @@ class npc_rimefang : public CreatureScript
DoCast(me, SPELL_FROST_AURA_RIMEFANG, true);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 const diff)
{
if (!UpdateVictim())
return;
@@ -866,7 +874,7 @@ class npc_sindragosa_trash : public CreatureScript
return 0;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 const diff)
{
if (!UpdateVictim())
return;
@@ -1417,10 +1425,7 @@ class at_sindragosa_lair : public AreaTriggerScript
player->GetMap()->LoadGrid(SindragosaSpawnPos.GetPositionX(), SindragosaSpawnPos.GetPositionY());
if (Creature* sindragosa = player->GetMap()->SummonCreature(NPC_SINDRAGOSA, SindragosaSpawnPos))
- {
- sindragosa->setActive(true);
sindragosa->AI()->DoAction(ACTION_START_FROSTWYRM);
- }
}
}
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
index 4fd10463dcc..f46de1a6cd7 100755
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
@@ -25,7 +25,7 @@
#define ICCScriptName "instance_icecrown_citadel"
uint32 const EncounterCount = 12;
-uint32 const WeeklyNPCs = 7;
+uint32 const WeeklyNPCs = 9;
uint32 const MaxHeroicAttempts = 50;
// Defined in boss_sindragosa.cpp
extern Position const SindragosaSpawnPos;
@@ -115,6 +115,8 @@ enum CreaturesIds
NPC_INFILTRATOR_MINCHAR = 38471,
NPC_KOR_KRON_LIEUTENANT = 38491,
NPC_SKYBREAKER_LIEUTENANT = 38492,
+ NPC_ROTTING_FROST_GIANT_10 = 38490,
+ NPC_ROTTING_FROST_GIANT_25 = 38494,
NPC_ALCHEMIST_ADRIANNA = 38501,
NPC_ALRIN_THE_AGILE = 38551,
NPC_INFILTRATOR_MINCHAR_BQ = 38558,
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
index 512ee9950c3..8add43dfd62 100755
--- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
@@ -23,7 +23,7 @@
#include "PoolMgr.h"
#include "icecrown_citadel.h"
-static const DoorData doorData[] =
+DoorData const doorData[] =
{
{GO_LORD_MARROWGAR_S_ENTRANCE, DATA_LORD_MARROWGAR, DOOR_TYPE_ROOM, BOUNDARY_N },
{GO_ICEWALL, DATA_LORD_MARROWGAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
@@ -53,10 +53,15 @@ struct WeeklyQuest
{
uint32 creatureEntry;
uint32 questId[2]; // 10 and 25 man versions
-} WeeklyQuestData[WeeklyNPCs] =
+};
+
+// when changing the content, remember to update SetData, DATA_BLOOD_QUICKENING_STATE case for NPC_ALRIN_THE_AGILE index
+WeeklyQuest const WeeklyQuestData[WeeklyNPCs] =
{
{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_ROTTING_FROST_GIANT_10, {QUEST_SECURING_THE_RAMPARTS_10, QUEST_SECURING_THE_RAMPARTS_25 }}, // Securing the Ramparts
+ {NPC_ROTTING_FROST_GIANT_25, {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
@@ -478,11 +483,13 @@ class instance_icecrown_citadel : public InstanceMapScript
case DATA_LADY_DEATHWHISPER:
SetBossState(DATA_GUNSHIP_EVENT, state); // TEMP HACK UNTIL GUNSHIP SCRIPTED
if (state == DONE)
+ {
if (GameObject* elevator = instance->GetGameObject(ladyDeathwisperElevator))
{
elevator->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
elevator->SetGoState(GO_STATE_READY);
}
+ }
break;
case DATA_DEATHBRINGER_SAURFANG:
switch (state)
@@ -602,40 +609,89 @@ class instance_icecrown_citadel : public InstanceMapScript
isOrbWhispererEligible = data ? true : false;
break;
case DATA_SINDRAGOSA_FROSTWYRMS:
+ {
+ if (frostwyrms == 255)
+ return;
+
if (instance->IsHeroic() && !heroicAttempts)
return;
- if (data > 1)
- frostwyrms = data;
- else if (data == 1)
- ++frostwyrms;
- else if (!data && !--frostwyrms && GetBossState(DATA_SINDRAGOSA) != DONE)
+
+ if (GetBossState(DATA_SINDRAGOSA) != DONE)
+ return;
+
+ switch (data)
{
- instance->LoadGrid(SindragosaSpawnPos.GetPositionX(), SindragosaSpawnPos.GetPositionY());
- if (Creature* boss = instance->SummonCreature(NPC_SINDRAGOSA, SindragosaSpawnPos))
- {
- boss->setActive(true);
- boss->AI()->DoAction(ACTION_START_FROSTWYRM);
- }
+ case 0:
+ if (frostwyrms)
+ {
+ --frostwyrms;
+ if (!frostwyrms)
+ {
+ instance->LoadGrid(SindragosaSpawnPos.GetPositionX(), SindragosaSpawnPos.GetPositionY());
+ if (Creature* boss = instance->SummonCreature(NPC_SINDRAGOSA, SindragosaSpawnPos))
+ boss->AI()->DoAction(ACTION_START_FROSTWYRM);
+ }
+ }
+ break;
+ case 1:
+ ++frostwyrms;
+ break;
+ default:
+ frostwyrms = data;
+ break;
}
break;
+ }
case DATA_SPINESTALKER:
- if (data > 1)
- spinestalkerTrash = data;
- else if (data == 1)
- ++spinestalkerTrash;
- else if (!data && !--spinestalkerTrash)
- if (Creature* spinestalk = instance->GetCreature(spinestalker))
- spinestalk->AI()->DoAction(ACTION_START_FROSTWYRM);
+ {
+ if (spinestalkerTrash == 255)
+ return;
+
+ switch (data)
+ {
+ case 0:
+ if (spinestalkerTrash)
+ {
+ --spinestalkerTrash;
+ if (!spinestalkerTrash)
+ if (Creature* spinestalk = instance->GetCreature(spinestalker))
+ spinestalk->AI()->DoAction(ACTION_START_FROSTWYRM);
+ }
+ break;
+ case 1:
+ ++spinestalkerTrash;
+ break;
+ default:
+ spinestalkerTrash = data;
+ break;
+ }
break;
+ }
case DATA_RIMEFANG:
- if (data > 1)
- rimefangTrash = data;
- else if (data == 1)
- ++rimefangTrash;
- else if (!data && !--rimefangTrash)
- if (Creature* rime = instance->GetCreature(rimefang))
- rime->AI()->DoAction(ACTION_START_FROSTWYRM);
+ {
+ if (rimefangTrash == 255)
+ return;
+
+ switch (data)
+ {
+ case 0:
+ if (rimefangTrash)
+ {
+ --rimefangTrash;
+ if (!rimefangTrash)
+ if (Creature* rime = instance->GetCreature(rimefang))
+ rime->AI()->DoAction(ACTION_START_FROSTWYRM);
+ }
+ break;
+ case 1:
+ ++rimefangTrash;
+ break;
+ default:
+ rimefangTrash = data;
+ break;
+ }
break;
+ }
case DATA_COLDFLAME_JETS:
coldflameJetsState = data;
if (coldflameJetsState == DONE)
@@ -648,12 +704,14 @@ class instance_icecrown_citadel : public InstanceMapScript
break;
case DATA_BLOOD_QUICKENING_STATE:
{
- // 3 is the index of Blood Quickening
- if (!sPoolMgr->IsSpawnedObject<Quest>(WeeklyQuestData[3].questId[instance->GetSpawnMode() & 1]))
- break;
+ // skip if nothing changes
if (bloodQuickeningState == data)
break;
+ // 5 is the index of Blood Quickening
+ if (!sPoolMgr->IsSpawnedObject<Quest>(WeeklyQuestData[5].questId[instance->GetSpawnMode() & 1]))
+ break;
+
switch (data)
{
case IN_PROGRESS:
@@ -667,7 +725,10 @@ class instance_icecrown_citadel : public InstanceMapScript
bloodQuickeningMinutes = 0;
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0);
break;
+ default:
+ break;
}
+
bloodQuickeningState = data;
SaveToDB();
break;