mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 15:40:45 +01:00
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:
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user