diff options
Diffstat (limited to 'src')
3 files changed, 137 insertions, 9 deletions
diff --git a/src/bindings/scripts/scripts/eastern_kingdoms/shadowfang_keep/instance_shadowfang_keep.cpp b/src/bindings/scripts/scripts/eastern_kingdoms/shadowfang_keep/instance_shadowfang_keep.cpp index 097a5209671..e74e049779b 100644 --- a/src/bindings/scripts/scripts/eastern_kingdoms/shadowfang_keep/instance_shadowfang_keep.cpp +++ b/src/bindings/scripts/scripts/eastern_kingdoms/shadowfang_keep/instance_shadowfang_keep.cpp @@ -30,15 +30,28 @@ enum eEnums { SAY_BOSS_DIE_AD = -1033007, SAY_BOSS_DIE_AS = -1033008, + SAY_ARCHMAGE = -1033009, NPC_ASH = 3850, NPC_ADA = 3849, + NPC_ARCHMAGE_ARUGAL = 4275, + NPC_ARUGAL_VOIDWALKER = 4627, GO_COURTYARD_DOOR = 18895, //door to open when talking to NPC's GO_SORCERER_DOOR = 18972, //door to open when Fenrus the Devourer - GO_ARUGAL_DOOR = 18971 //door to open when Wolf Master Nandos + GO_ARUGAL_DOOR = 18971, //door to open when Wolf Master Nandos + + SPELL_ASHCROMBE_TELEPORT = 15742 }; +const Position SpawnLocation[] = +{ + {-148.199,2165.647,128.448,1.026}, + {-153.110,2168.620,128.448,1.026}, + {-145.905,2180.520,128.448,4.183}, + {-140.794,2178.037,128.448,4.090}, + {-138.640,2170.159,136.577,2.737} +}; struct TRINITY_DLL_DECL instance_shadowfang_keep : public ScriptedInstance { instance_shadowfang_keep(Map* pMap) : ScriptedInstance(pMap) {Initialize();}; @@ -48,21 +61,29 @@ struct TRINITY_DLL_DECL instance_shadowfang_keep : public ScriptedInstance uint64 uiAshGUID; uint64 uiAdaGUID; + uint64 uiArchmageArugalGUID; uint64 DoorCourtyardGUID; uint64 DoorSorcererGUID; uint64 DoorArugalGUID; + uint8 uiPhase; + uint8 uiTimer; + void Initialize() { memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); uiAshGUID = 0; uiAdaGUID = 0; + uiArchmageArugalGUID = 0; DoorCourtyardGUID = 0; DoorSorcererGUID = 0; DoorArugalGUID = 0; + + uiPhase = 0; + uiTimer = 0; } void OnCreatureCreate(Creature* pCreature, bool add) @@ -71,6 +92,7 @@ struct TRINITY_DLL_DECL instance_shadowfang_keep : public ScriptedInstance { case NPC_ASH: uiAshGUID = pCreature->GetGUID(); break; case NPC_ADA: uiAdaGUID = pCreature->GetGUID(); break; + case NPC_ARCHMAGE_ARUGAL: uiArchmageArugalGUID = pCreature->GetGUID(); break; } } @@ -123,8 +145,16 @@ struct TRINITY_DLL_DECL instance_shadowfang_keep : public ScriptedInstance m_auiEncounter[1] = data; break; case TYPE_FENRUS: - if (data == DONE) - DoUseDoorOrButton(DoorSorcererGUID); + switch(data) + { + case DONE: + uiTimer = 1000; + uiPhase = 1; + break; + case 7: + DoUseDoorOrButton(DoorSorcererGUID); + break; + } m_auiEncounter[2] = data; break; case TYPE_NANDOS: @@ -190,6 +220,45 @@ struct TRINITY_DLL_DECL instance_shadowfang_keep : public ScriptedInstance OUT_LOAD_INST_DATA_COMPLETE; } + + void Update(uint32 uiDiff) + { + if (GetData(TYPE_FENRUS) != DONE) + return; + + Creature* pArchmage = instance->GetCreature(uiArchmageArugalGUID); + Creature* pSummon = NULL; + + if (!pArchmage || !pArchmage->isAlive()) + return; + + if (uiPhase) + { + if (uiTimer <= uiDiff) + { + switch(uiPhase) + { + case 1: + pSummon = pArchmage->SummonCreature(pArchmage->GetEntry(),SpawnLocation[4],TEMPSUMMON_TIMED_DESPAWN,10000); + pSummon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); + pSummon->SetReactState(REACT_DEFENSIVE); + pSummon->CastSpell(pSummon,SPELL_ASHCROMBE_TELEPORT,true); + DoScriptText(SAY_ARCHMAGE,pSummon); + uiTimer = 2000; + uiPhase = 2; + break; + case 2: + pArchmage->SummonCreature(NPC_ARUGAL_VOIDWALKER,SpawnLocation[0],TEMPSUMMON_CORPSE_TIMED_DESPAWN,60000); + pArchmage->SummonCreature(NPC_ARUGAL_VOIDWALKER,SpawnLocation[1],TEMPSUMMON_CORPSE_TIMED_DESPAWN,60000); + pArchmage->SummonCreature(NPC_ARUGAL_VOIDWALKER,SpawnLocation[2],TEMPSUMMON_CORPSE_TIMED_DESPAWN,60000); + pArchmage->SummonCreature(NPC_ARUGAL_VOIDWALKER,SpawnLocation[3],TEMPSUMMON_CORPSE_TIMED_DESPAWN,60000); + uiPhase = 0; + break; + + } + } else uiTimer -= uiDiff; + } + } }; InstanceData* GetInstanceData_instance_shadowfang_keep(Map* pMap) diff --git a/src/bindings/scripts/scripts/eastern_kingdoms/shadowfang_keep/shadowfang_keep.cpp b/src/bindings/scripts/scripts/eastern_kingdoms/shadowfang_keep/shadowfang_keep.cpp index 44aa7b03c09..45148f51ec1 100644 --- a/src/bindings/scripts/scripts/eastern_kingdoms/shadowfang_keep/shadowfang_keep.cpp +++ b/src/bindings/scripts/scripts/eastern_kingdoms/shadowfang_keep/shadowfang_keep.cpp @@ -44,7 +44,9 @@ enum eEnums SAY_POST2_DOOR_AD = -1033006, SPELL_UNLOCK = 6421, - NPC_ASH = 3850 + NPC_ASH = 3850, + + SPELL_DARK_OFFERING = 7154 }; #define GOSSIP_ITEM_DOOR "Thanks, I'll follow you to the door." @@ -129,9 +131,57 @@ bool GossipSelect_npc_shadowfang_prisoner(Player* pPlayer, Creature* pCreature, return true; } +struct TRINITY_DLL_DECL npc_arugal_voidwalkerAI : public ScriptedAI +{ + npc_arugal_voidwalkerAI(Creature* pCreature) : ScriptedAI(pCreature) + { + pInstance = pCreature->GetInstanceData(); + } + + ScriptedInstance* pInstance; + + uint32 uiDarkOffering; + + void Reset() + { + uiDarkOffering = urand(290,10); + } + + void UpdateAI(uint32 const uiDiff) + { + if (!UpdateVictim()) + return; + + if (uiDarkOffering <= uiDiff) + { + if (Creature* pFriend = m_creature->FindNearestCreature(m_creature->GetEntry(),25.0f,true)) + { + if (pFriend) + DoCast(pFriend,SPELL_DARK_OFFERING); + } + else + DoCast(m_creature,SPELL_DARK_OFFERING); + uiDarkOffering = urand(4400,12500); + } else uiDarkOffering -= uiDiff; + + DoMeleeAttackIfReady(); + } + + void JustDied(Unit* pKiller) + { + if (pInstance) + pInstance->SetData(TYPE_FENRUS, pInstance->GetData(TYPE_FENRUS) + 1); + } +}; + +CreatureAI* GetAI_npc_arugal_voidwalker(Creature* pCreature) +{ + return new npc_arugal_voidwalkerAI(pCreature); +} + void AddSC_shadowfang_keep() { - Script *newscript; + Script* newscript; newscript = new Script; newscript->Name = "npc_shadowfang_prisoner"; @@ -139,5 +189,10 @@ void AddSC_shadowfang_keep() newscript->pGossipSelect = &GossipSelect_npc_shadowfang_prisoner; newscript->GetAI = &GetAI_npc_shadowfang_prisoner; newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name = "npc_arugal_voidwalker"; + newscript->GetAI = &GetAI_npc_arugal_voidwalker; + newscript->RegisterSelf(); } diff --git a/src/bindings/scripts/scripts/eastern_kingdoms/shadowfang_keep/shadowfang_keep.h b/src/bindings/scripts/scripts/eastern_kingdoms/shadowfang_keep/shadowfang_keep.h index 8383a5c3950..a1a59789632 100644 --- a/src/bindings/scripts/scripts/eastern_kingdoms/shadowfang_keep/shadowfang_keep.h +++ b/src/bindings/scripts/scripts/eastern_kingdoms/shadowfang_keep/shadowfang_keep.h @@ -5,9 +5,13 @@ #ifndef DEF_SHADOWFANG_H #define DEF_SHADOWFANG_H -#define TYPE_FREE_NPC 1 -#define TYPE_RETHILGORE 2 -#define TYPE_FENRUS 3 -#define TYPE_NANDOS 4 +enum eData +{ + TYPE_FREE_NPC = 1, + TYPE_RETHILGORE = 2, + TYPE_FENRUS = 3, + TYPE_NANDOS = 4 +}; + #endif |