Scripts/Icecrown Citadel: Remove Mark of the Fallen Champion when Saurfang dies

Scripts/Icecrown Citadel: Change previous scripts to use BossAI instead of ScriptedAI

--HG--
branch : trunk
This commit is contained in:
Shauren
2010-08-31 21:47:45 +02:00
parent 6048d2ec5e
commit dc2c28985f
6 changed files with 111 additions and 220 deletions

View File

@@ -230,12 +230,12 @@ class boss_deathbringer_saurfang : public CreatureScript
public:
boss_deathbringer_saurfang() : CreatureScript("boss_deathbringer_saurfang") { }
struct boss_deathbringer_saurfangAI : public ScriptedAI
struct boss_deathbringer_saurfangAI : public BossAI
{
boss_deathbringer_saurfangAI(Creature* pCreature) : ScriptedAI(pCreature), summons(pCreature)
boss_deathbringer_saurfangAI(Creature* pCreature) : BossAI(pCreature, DATA_DEATHBRINGER_SAURFANG)
{
ASSERT(instance);
ASSERT(pCreature->GetVehicleKit()); // we dont actually use it, just check if exists
pInstance = pCreature->GetInstanceScript();
bIntroDone = false;
uiFallenChampionCount = 0;
}
@@ -253,10 +253,8 @@ class boss_deathbringer_saurfang : public CreatureScript
me->RemoveAurasDueToSpell(SPELL_BERSERK);
me->RemoveAurasDueToSpell(SPELL_FRENZY);
me->RemoveAurasDueToSpell(SPELL_BLOOD_POWER);
uiFallenChampionCount = 0;
summons.DespawnAll();
if (pInstance)
pInstance->SetData(DATA_DEATHBRINGER_SAURFANG, NOT_STARTED);
instance->SetBossState(DATA_DEATHBRINGER_SAURFANG, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
@@ -268,8 +266,8 @@ class boss_deathbringer_saurfang : public CreatureScript
events.ScheduleEvent(EVENT_BLOOD_NOVA, 17000, 0, PHASE_COMBAT);
events.ScheduleEvent(EVENT_RUNE_OF_BLOOD, 20000, 0, PHASE_COMBAT);
if (pInstance)
pInstance->SetData(DATA_DEATHBRINGER_SAURFANG, IN_PROGRESS);
uiFallenChampionCount = 0;
instance->SetBossState(DATA_DEATHBRINGER_SAURFANG, IN_PROGRESS);
}
void JustDied(Unit* /*killer*/)
@@ -277,12 +275,10 @@ class boss_deathbringer_saurfang : public CreatureScript
DoCastAOE(SPELL_ACHIEVEMENT, true);
DoScriptText(SAY_DEATH, me);
if (pInstance)
{
pInstance->SetData(DATA_DEATHBRINGER_SAURFANG, DONE);
if (Creature* creature = ObjectAccessor::GetCreature(*me, pInstance->GetData64(DATA_SAURFANG_EVENT_NPC)))
creature->AI()->DoAction(ACTION_START_OUTRO);
}
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MARK_OF_THE_FALLEN_CHAMPION);
instance->SetBossState(DATA_DEATHBRINGER_SAURFANG, DONE);
if (Creature* creature = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SAURFANG_EVENT_NPC)))
creature->AI()->DoAction(ACTION_START_OUTRO);
}
void MoveInLineOfSight(Unit* /*who*/)
@@ -307,8 +303,7 @@ class boss_deathbringer_saurfang : public CreatureScript
void JustReachedHome()
{
if(pInstance)
pInstance->SetData(DATA_DEATHBRINGER_SAURFANG, FAIL);
instance->SetBossState(DATA_DEATHBRINGER_SAURFANG, FAIL);
}
void KilledUnit(Unit *victim)
@@ -350,8 +345,7 @@ class boss_deathbringer_saurfang : public CreatureScript
if (type != POINT_MOTION_TYPE && id != POINT_SAURFANG)
return;
if (pInstance)
pInstance->HandleGameObject(pInstance->GetData64(DATA_SAURFANG_DOOR), false);
instance->HandleGameObject(instance->GetData64(GO_SAURFANG_S_DOOR), false);
}
void SpellHitTarget(Unit* target, const SpellEntry* spell)
@@ -468,6 +462,12 @@ class boss_deathbringer_saurfang : public CreatureScript
{
if (action == PHASE_INTRO_A || action == PHASE_INTRO_H)
{
if (GameObject* teleporter = GameObject::GetGameObject(*me, instance->GetData64(GO_SCOURGE_TRANSPORTER_SAURFANG)))
{
instance->HandleGameObject(0, false, teleporter);
teleporter->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
}
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
// controls what events will execute
events.SetPhase(uint32(action));
@@ -504,9 +504,6 @@ class boss_deathbringer_saurfang : public CreatureScript
}
private:
EventMap events;
InstanceScript* pInstance;
SummonList summons;
bool bIntroDone;
bool bFrenzy; // faster than iterating all auras to find Frenzy
uint32 uiFallenChampionCount;
@@ -553,7 +550,7 @@ class npc_high_overlord_saurfang_icc : public CreatureScript
if (pInstance)
{
uiDeathbringerSaurfangGUID = pInstance->GetData64(DATA_DEATHBRINGER_SAURFANG);
pInstance->HandleGameObject(pInstance->GetData64(DATA_SAURFANG_DOOR), true);
pInstance->HandleGameObject(pInstance->GetData64(GO_SAURFANG_S_DOOR), true);
}
if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, uiDeathbringerSaurfangGUID))
deathbringer->AI()->DoAction(PHASE_INTRO_H);
@@ -689,7 +686,7 @@ class npc_high_overlord_saurfang_icc : public CreatureScript
return false;
InstanceScript* pInstance = pCreature->GetInstanceScript();
if (pInstance && pInstance->GetData(DATA_DEATHBRINGER_SAURFANG) != DONE)
if (pInstance && pInstance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE)
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Let it begin...", 631, -ACTION_START_EVENT);
pPlayer->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, pCreature->GetGUID());
@@ -746,7 +743,7 @@ class npc_muradin_bronzebeard_icc : public CreatureScript
if (pInstance)
{
uiDeathbringerSaurfangGUID = pInstance->GetData64(DATA_DEATHBRINGER_SAURFANG);
pInstance->HandleGameObject(pInstance->GetData64(DATA_SAURFANG_DOOR), true);
pInstance->HandleGameObject(pInstance->GetData64(GO_SAURFANG_S_DOOR), true);
}
if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, uiDeathbringerSaurfangGUID))
deathbringer->AI()->DoAction(PHASE_INTRO_A);
@@ -819,7 +816,7 @@ class npc_muradin_bronzebeard_icc : public CreatureScript
return false;
InstanceScript* pInstance = pCreature->GetInstanceScript();
if (pInstance && pInstance->GetData(DATA_DEATHBRINGER_SAURFANG) != DONE)
if (pInstance && pInstance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE)
{
pPlayer->ADD_GOSSIP_ITEM(0, "Let it begin...", 631, -ACTION_START_EVENT+1);
pPlayer->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, pCreature->GetGUID());

View File

@@ -157,11 +157,11 @@ class boss_lady_deathwhisper : public CreatureScript
public:
boss_lady_deathwhisper() : CreatureScript("boss_lady_deathwhisper") { }
struct boss_lady_deathwhisperAI : public ScriptedAI
struct boss_lady_deathwhisperAI : public BossAI
{
boss_lady_deathwhisperAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me)
boss_lady_deathwhisperAI(Creature* pCreature) : BossAI(pCreature, DATA_LADY_DEATHWHISPER)
{
pInstance = pCreature->GetInstanceScript();
ASSERT(instance);
bIntroDone = false;
uiDominateMindCount = RAID_MODE(0,1,1,3);
}
@@ -179,8 +179,7 @@ class boss_lady_deathwhisper : public CreatureScript
me->RemoveAurasDueToSpell(SPELL_MANA_BARRIER);
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false);
if (pInstance)
pInstance->SetData(DATA_LADY_DEATHWHISPER, NOT_STARTED);
instance->SetBossState(DATA_LADY_DEATHWHISPER, NOT_STARTED);
}
void MoveInLineOfSight(Unit* who)
@@ -229,16 +228,14 @@ class boss_lady_deathwhisper : public CreatureScript
me->RemoveAurasDueToSpell(SPELL_SHADOW_CHANNELING);
DoCast(me, SPELL_MANA_BARRIER, true);
if (pInstance)
pInstance->SetData(DATA_LADY_DEATHWHISPER, IN_PROGRESS);
instance->SetBossState(DATA_LADY_DEATHWHISPER, IN_PROGRESS);
}
void JustDied(Unit* killer)
{
DoScriptText(SAY_DEATH, me);
if (pInstance)
pInstance->SetData(DATA_LADY_DEATHWHISPER, DONE);
instance->SetBossState(DATA_LADY_DEATHWHISPER, DONE);
std::set<uint32> livingAddEntries;
// Full House achievement
@@ -273,8 +270,7 @@ class boss_lady_deathwhisper : public CreatureScript
void JustReachedHome()
{
if(pInstance)
pInstance->SetData(DATA_LADY_DEATHWHISPER, FAIL);
instance->SetBossState(DATA_LADY_DEATHWHISPER, FAIL);
summons.DespawnAll();
}
@@ -337,7 +333,7 @@ class boss_lady_deathwhisper : public CreatureScript
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim() && !(events.GetPhaseMask() & PHASE_INTRO_MASK))
if ((!UpdateVictim() && !(events.GetPhaseMask() & PHASE_INTRO_MASK)) || !CheckInRoom())
return;
events.Update(diff);
@@ -538,12 +534,9 @@ class boss_lady_deathwhisper : public CreatureScript
}
private:
EventMap events;
InstanceScript* pInstance;
bool bIntroDone;
uint32 uiAddWaveCounter;
uint64 uiNextVengefulShadeTarget;
SummonList summons;
std::deque<uint64> reanimationQueue;
uint8 uiDominateMindCount;
};

View File

@@ -78,14 +78,14 @@ class boss_lord_marrowgar : public CreatureScript
public:
boss_lord_marrowgar() : CreatureScript("boss_lord_marrowgar") { }
struct boss_lord_marrowgarAI : public ScriptedAI
struct boss_lord_marrowgarAI : public BossAI
{
boss_lord_marrowgarAI(Creature *pCreature) : ScriptedAI(pCreature)
boss_lord_marrowgarAI(Creature *pCreature) : BossAI(pCreature, DATA_LORD_MARROWGAR)
{
ASSERT(instance);
uiBoneStormDuration = RAID_MODE(20000,30000,20000,30000);
fBaseSpeed = pCreature->GetSpeedRate(MOVE_RUN);
bIntroDone = false;
pInstance = pCreature->GetInstanceScript();
coldflameLastPos.Relocate(pCreature);
}
@@ -100,30 +100,26 @@ class boss_lord_marrowgar : public CreatureScript
events.ScheduleEvent(EVENT_COLDFLAME, urand(10000, 15000));
events.ScheduleEvent(EVENT_WARN_BONE_STORM, urand(35000, 50000));
events.ScheduleEvent(EVENT_ENRAGE, 600000);
if (pInstance)
pInstance->SetData(DATA_LORD_MARROWGAR, NOT_STARTED);
instance->SetBossState(DATA_LORD_MARROWGAR, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
DoScriptText(SAY_AGGRO, me);
if (pInstance)
pInstance->SetData(DATA_LORD_MARROWGAR, IN_PROGRESS);
instance->SetBossState(DATA_LORD_MARROWGAR, IN_PROGRESS);
}
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_DEATH, me);
if (pInstance)
pInstance->SetData(DATA_LORD_MARROWGAR, DONE);
instance->SetBossState(DATA_LORD_MARROWGAR, DONE);
}
void JustReachedHome()
{
if(pInstance)
pInstance->SetData(DATA_LORD_MARROWGAR, FAIL);
instance->SetBossState(DATA_LORD_MARROWGAR, FAIL);
}
void KilledUnit(Unit *victim)
@@ -139,13 +135,11 @@ class boss_lord_marrowgar : public CreatureScript
DoScriptText(SAY_ENTER_ZONE, me);
bIntroDone = true;
}
ScriptedAI::MoveInLineOfSight(who);
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
if (!UpdateVictim() || !CheckInRoom())
return;
events.Update(diff);
@@ -239,9 +233,6 @@ class boss_lord_marrowgar : public CreatureScript
}
private:
EventMap events;
InstanceScript* pInstance;
bool bIntroDone;
uint32 uiBoneStormDuration;
float fBaseSpeed;

View File

@@ -39,9 +39,9 @@ enum eData
DATA_SINDRAGOSA = 10,
DATA_THE_LICH_KING = 11,
COMMAND_FAIL_BONED,
DATA_SAURFANG_EVENT_NPC,
DATA_SAURFANG_DOOR,
DATA_SAURFANG_EVENT_NPC = 12,
COMMAND_FAIL_BONED = 13,
};
#define MAX_ENCOUNTER 12
@@ -73,17 +73,17 @@ enum eCreatures
enum eGameobjects
{
DOODAD_ICECROWN_ICEWALL02 = 201910,
ICEWALL = 201911,
LORD_MARROWGAR_S_ENTRANCE = 201857,
ORATORY_OF_THE_DAMNED_ENTRANCE = 201563,
LADY_DEATHWHISPER_ELEVATOR = 202220,
SAURFANG_S_DOOR = 201825,
DEATHBRINGER_S_CACHE_10N = 202239,
DEATHBRINGER_S_CACHE_25N = 202240,
DEATHBRINGER_S_CACHE_10H = 202238,
DEATHBRINGER_S_CACHE_25H = 202241,
SCOURGE_TRANSPORTER_SAURFANG = 202244,
GO_DOODAD_ICECROWN_ICEWALL02 = 201910,
GO_ICEWALL = 201911,
GO_LORD_MARROWGAR_S_ENTRANCE = 201857,
GO_ORATORY_OF_THE_DAMNED_ENTRANCE = 201563,
GO_LADY_DEATHWHISPER_ELEVATOR = 202220,
GO_SAURFANG_S_DOOR = 201825,
GO_DEATHBRINGER_S_CACHE_10N = 202239,
GO_DEATHBRINGER_S_CACHE_25N = 202240,
GO_DEATHBRINGER_S_CACHE_10H = 202238,
GO_DEATHBRINGER_S_CACHE_25H = 202241,
GO_SCOURGE_TRANSPORTER_SAURFANG = 202244,
};
enum eAchievementCriteria

View File

@@ -43,17 +43,17 @@ class icecrown_citadel_teleport : public GameObjectScript
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to Light's Hammer.", GOSSIP_SENDER_ICC_PORT, LIGHT_S_HAMMER_TELEPORT);
if (InstanceScript* pInstance = go->GetInstanceScript())
{
if (pInstance->GetData(DATA_LORD_MARROWGAR) == DONE)
if (pInstance->GetBossState(DATA_LORD_MARROWGAR) == DONE)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Oratory of the Damned.", GOSSIP_SENDER_ICC_PORT, ORATORY_OF_THE_DAMNED_TELEPORT);
if (pInstance->GetData(DATA_LADY_DEATHWHISPER) == DONE)
if (pInstance->GetBossState(DATA_LADY_DEATHWHISPER) == DONE)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Rampart of Skulls.", GOSSIP_SENDER_ICC_PORT, RAMPART_OF_SKULLS_TELEPORT);
if (pInstance->GetData(DATA_GUNSHIP_EVENT) == DONE)
if (pInstance->GetBossState(DATA_GUNSHIP_EVENT) == DONE)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Deathbringer's Rise.", GOSSIP_SENDER_ICC_PORT, DEATHBRINGER_S_RISE_TELEPORT);
if (pInstance->GetData(DATA_DEATHBRINGER_SAURFANG) == DONE)
if (pInstance->GetBossState(DATA_DEATHBRINGER_SAURFANG) == DONE)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Upper Spire.", GOSSIP_SENDER_ICC_PORT, UPPER_SPIRE_TELEPORT);
if (pInstance->GetData(DATA_VALITHRIA_DREAMWALKER) == DONE)
if (pInstance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == DONE)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Sindragosa's Lair", GOSSIP_SENDER_ICC_PORT, SINDRAGOSA_S_LAIR_TELEPORT);
if (pInstance->GetData(DATA_PROFESSOR_PUTRICIDE) == DONE && pInstance->GetData(DATA_BLOOD_QUEEN_LANA_THEL) == DONE && pInstance->GetData(DATA_SINDRAGOSA) == DONE)
if (pInstance->GetBossState(DATA_PROFESSOR_PUTRICIDE) == DONE && pInstance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == DONE && pInstance->GetBossState(DATA_SINDRAGOSA) == DONE)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to The Frozen Throne", GOSSIP_SENDER_ICC_PORT, FROZEN_THRONE_TELEPORT);
}
@@ -63,6 +63,7 @@ class icecrown_citadel_teleport : public GameObjectScript
bool OnGossipSelect(Player* player, GameObject* /*go*/, uint32 sender, uint32 action)
{
player->PlayerTalkClass->ClearMenus();
player->CLOSE_GOSSIP_MENU();
SpellEntry const* spell = sSpellStore.LookupEntry(action);
if (!spell)

View File

@@ -19,6 +19,15 @@
#include "ScriptPCH.h"
#include "icecrown_citadel.h"
static const DoorData doorData[8] =
{
{GO_LORD_MARROWGAR_S_ENTRANCE, DATA_LORD_MARROWGAR, DOOR_TYPE_ROOM, BOUNDARY_N },
{GO_ICEWALL, DATA_LORD_MARROWGAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
{GO_DOODAD_ICECROWN_ICEWALL02, DATA_LORD_MARROWGAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
{GO_ORATORY_OF_THE_DAMNED_ENTRANCE, DATA_LADY_DEATHWHISPER, DOOR_TYPE_ROOM, BOUNDARY_N },
{0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE} // END
};
class instance_icecrown_citadel : public InstanceMapScript
{
public:
@@ -28,11 +37,9 @@ class instance_icecrown_citadel : public InstanceMapScript
{
instance_icecrown_citadel_InstanceMapScript(InstanceMap* pMap) : InstanceScript(pMap)
{
memset(uiEncounterState, 0, MAX_ENCOUNTER*sizeof(uint32));
memset(uiIcewall, 0, 2*sizeof(uint32));
uiMarrowgarEntrance = 0;
SetBossNumber(MAX_ENCOUNTER);
LoadDoorData(doorData);
uiLadyDeathwisperElevator = 0;
uiOratoryDoor = 0;
uiDeathbringerSaurfang = 0;
uiSaurfangDoor = 0;
uiSaurfangEventNPC = 0;
@@ -41,15 +48,6 @@ class instance_icecrown_citadel : public InstanceMapScript
isBonedEligible = false;
}
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (uiEncounterState[i] == IN_PROGRESS)
return true;
return false;
}
void OnCreatureCreate(Creature* creature, bool /*add*/)
{
Map::PlayerList const &players = instance->GetPlayers();
@@ -82,84 +80,41 @@ class instance_icecrown_citadel : public InstanceMapScript
}
}
void OnGameObjectCreate(GameObject* pGo, bool /*add*/)
void OnGameObjectCreate(GameObject* pGo, bool add)
{
switch (pGo->GetEntry())
{
case DOODAD_ICECROWN_ICEWALL02:
uiIcewall[0] = pGo->GetGUID();
if (GetData(DATA_LORD_MARROWGAR) == DONE)
HandleGameObject(uiIcewall[0], true, pGo);
case GO_DOODAD_ICECROWN_ICEWALL02:
case GO_ICEWALL:
case GO_LORD_MARROWGAR_S_ENTRANCE:
case GO_ORATORY_OF_THE_DAMNED_ENTRANCE:
AddDoor(pGo, add);
break;
case ICEWALL:
uiIcewall[1] = pGo->GetGUID();
if (GetData(DATA_LORD_MARROWGAR) == DONE)
HandleGameObject(uiIcewall[1], true, pGo);
break;
case LORD_MARROWGAR_S_ENTRANCE:
uiMarrowgarEntrance = pGo->GetGUID();
if (GetData(DATA_LORD_MARROWGAR) == DONE)
HandleGameObject(uiMarrowgarEntrance, true, pGo);
break;
case ORATORY_OF_THE_DAMNED_ENTRANCE:
uiOratoryDoor = pGo->GetGUID();
if (GetData(DATA_LADY_DEATHWHISPER) == DONE)
HandleGameObject(uiOratoryDoor, true, pGo);
break;
case LADY_DEATHWHISPER_ELEVATOR:
case GO_LADY_DEATHWHISPER_ELEVATOR:
uiLadyDeathwisperElevator = pGo->GetGUID();
if (GetData(DATA_LADY_DEATHWHISPER) == DONE)
if (GetBossState(DATA_LADY_DEATHWHISPER) == DONE)
{
pGo->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
pGo->SetGoState(GO_STATE_READY);
}
break;
case SAURFANG_S_DOOR:
case GO_SAURFANG_S_DOOR:
uiSaurfangDoor = pGo->GetGUID();
break;
case DEATHBRINGER_S_CACHE_10N:
case DEATHBRINGER_S_CACHE_25N:
case DEATHBRINGER_S_CACHE_10H:
case DEATHBRINGER_S_CACHE_25H:
case GO_DEATHBRINGER_S_CACHE_10N:
case GO_DEATHBRINGER_S_CACHE_25N:
case GO_DEATHBRINGER_S_CACHE_10H:
case GO_DEATHBRINGER_S_CACHE_25H:
uiDeathbringersCache = pGo->GetGUID();
break;
case SCOURGE_TRANSPORTER_SAURFANG:
case GO_SCOURGE_TRANSPORTER_SAURFANG:
uiSaurfangTeleport = pGo->GetGUID();
if (GetData(DATA_DEATHBRINGER_SAURFANG) == DONE)
{
HandleGameObject(uiSaurfangTeleport, true, pGo);
pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
}
break;
default:
break;
}
}
uint32 GetData(uint32 type)
{
switch (type)
{
case DATA_LORD_MARROWGAR:
case DATA_LADY_DEATHWHISPER:
case DATA_GUNSHIP_EVENT:
case DATA_DEATHBRINGER_SAURFANG:
case DATA_FESTERGUT:
case DATA_ROTFACE:
case DATA_PROFESSOR_PUTRICIDE:
case DATA_BLOOD_PRINCE_COUNCIL:
case DATA_BLOOD_QUEEN_LANA_THEL:
case DATA_VALITHRIA_DREAMWALKER:
case DATA_SINDRAGOSA:
case DATA_THE_LICH_KING:
return uiEncounterState[type];
default:
break;
}
return 0;
}
uint64 GetData64(uint32 type)
{
switch (type)
@@ -168,8 +123,10 @@ class instance_icecrown_citadel : public InstanceMapScript
return uiDeathbringerSaurfang;
case DATA_SAURFANG_EVENT_NPC:
return uiSaurfangEventNPC;
case DATA_SAURFANG_DOOR:
case GO_SAURFANG_S_DOOR:
return uiSaurfangDoor;
case GO_SCOURGE_TRANSPORTER_SAURFANG:
return uiSaurfangTeleport;
default:
break;
}
@@ -177,66 +134,27 @@ class instance_icecrown_citadel : public InstanceMapScript
return 0;
}
void SetData(uint32 type, uint32 data)
bool SetBossState(uint32 type, EncounterState state)
{
if (!InstanceScript::SetBossState(type, state))
return false;
switch (type)
{
case DATA_LORD_MARROWGAR:
uiEncounterState[type] = data;
switch (data)
{
case DONE:
HandleGameObject(uiIcewall[0], true);
HandleGameObject(uiIcewall[1], true);
HandleGameObject(uiMarrowgarEntrance, true);
break;
case NOT_STARTED:
HandleGameObject(uiIcewall[0], false);
HandleGameObject(uiIcewall[1], false);
HandleGameObject(uiMarrowgarEntrance, true);
break;
case IN_PROGRESS:
HandleGameObject(uiMarrowgarEntrance, false);
break;
default:
break;
}
break;
case DATA_LADY_DEATHWHISPER:
uiEncounterState[type] = data;
switch (data)
{
case DONE:
// TEMPORARY, SKIP GUNSHIP
uiEncounterState[DATA_GUNSHIP_EVENT] = DONE;
HandleGameObject(uiOratoryDoor, true);
if (GameObject* elevator = instance->GetGameObject(uiLadyDeathwisperElevator))
{
elevator->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
elevator->SetGoState(GO_STATE_READY);
}
break;
case IN_PROGRESS:
HandleGameObject(uiOratoryDoor, false);
break;
case NOT_STARTED:
HandleGameObject(uiOratoryDoor, true);
break;
default:
break;
}
break;
case DATA_GUNSHIP_EVENT:
uiEncounterState[type] = data;
SetBossState(DATA_GUNSHIP_EVENT, state); // TEMP HACK UNTIL GUNSHIP SCRIPTED
if (state == DONE)
if (GameObject* elevator = instance->GetGameObject(uiLadyDeathwisperElevator))
{
elevator->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
elevator->SetGoState(GO_STATE_READY);
}
break;
case DATA_DEATHBRINGER_SAURFANG:
uiEncounterState[type] = data;
switch (data)
switch (state)
{
case DONE:
if (GameObject* lootCache = instance->GetGameObject(uiDeathbringersCache))
if (!lootCache->isSpawned())
lootCache->SetRespawnTime(7*DAY);
DoRespawnGameObject(uiDeathbringersCache, 7*DAY);
case NOT_STARTED:
if (GameObject* teleporter = instance->GetGameObject(uiSaurfangTeleport))
{
@@ -244,13 +162,6 @@ class instance_icecrown_citadel : public InstanceMapScript
teleporter->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
}
break;
case IN_PROGRESS:
if (GameObject* teleporter = instance->GetGameObject(uiSaurfangTeleport))
{
HandleGameObject(uiSaurfangTeleport, false, teleporter);
teleporter->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
}
break;
default:
break;
}
@@ -263,18 +174,22 @@ class instance_icecrown_citadel : public InstanceMapScript
case DATA_VALITHRIA_DREAMWALKER:
case DATA_SINDRAGOSA:
case DATA_THE_LICH_KING:
uiEncounterState[type] = data;
break;
}
return true;
}
void SetData(uint32 type, uint32 data)
{
switch (type)
{
case COMMAND_FAIL_BONED:
isBonedEligible = data ? true : false;
break;
default:
break;
}
if (data == DONE && type < MAX_ENCOUNTER)
SaveToDB();
}
bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/)
@@ -298,9 +213,7 @@ class instance_icecrown_citadel : public InstanceMapScript
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "I C ";
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
saveStream << uiEncounterState[i] << " ";
saveStream << "I C " << GetBossSaveData();
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
@@ -327,9 +240,9 @@ class instance_icecrown_citadel : public InstanceMapScript
{
uint32 tmpState;
loadStream >> tmpState;
if (tmpState == IN_PROGRESS)
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
tmpState = NOT_STARTED;
uiEncounterState[i] = tmpState;
SetBossState(i, EncounterState(tmpState));
}
} else OUT_LOAD_INST_DATA_FAIL;
@@ -337,11 +250,7 @@ class instance_icecrown_citadel : public InstanceMapScript
}
private:
uint32 uiEncounterState[MAX_ENCOUNTER];
uint64 uiIcewall[2];
uint64 uiMarrowgarEntrance;
uint64 uiLadyDeathwisperElevator;
uint64 uiOratoryDoor;
uint64 uiDeathbringerSaurfang;
uint64 uiSaurfangDoor;
uint64 uiSaurfangEventNPC; // Muradin Bronzebeard or High Overlord Saurfang