diff options
author | maximius <none@none> | 2009-09-23 19:50:02 -0700 |
---|---|---|
committer | maximius <none@none> | 2009-09-23 19:50:02 -0700 |
commit | 8102372a67098e1af65888b0b411eb3b47814bf0 (patch) | |
tree | 34015699313a740b51b53f80c6dc62969c04c889 /src | |
parent | 3fce346a522780b92ad8902ce4ce141e86a08959 (diff) |
*Krik'thir the Gatewatcher partial script by Manuel and Gyullo
*Ahn'Kahet: Fixes for Prince Taldaram & code Achievement by Tartalo
--HG--
branch : trunk
Diffstat (limited to 'src')
4 files changed, 186 insertions, 57 deletions
diff --git a/src/bindings/scripts/scripts/northrend/azjol_nerub/ahnkahet/boss_prince_taldaram.cpp b/src/bindings/scripts/scripts/northrend/azjol_nerub/ahnkahet/boss_prince_taldaram.cpp index 605219e59e1..b6da4f87fcf 100644 --- a/src/bindings/scripts/scripts/northrend/azjol_nerub/ahnkahet/boss_prince_taldaram.cpp +++ b/src/bindings/scripts/scripts/northrend/azjol_nerub/ahnkahet/boss_prince_taldaram.cpp @@ -53,7 +53,10 @@ EndScriptData */ #define H_DATA_EMBRACE_DMG 40000 #define DATA_GROUND_POSITION_Z 11.4 -#define DATA_SPHERE_DISTANCE 100.0 +#define DATA_SPHERE_DISTANCE 20 +#define DATA_SPHERE_ANGLE_OFFSET 1 + +#define ACHIEVEMENT_THE_PARTY_IS_OVER 1861 //not in db //Yell @@ -95,6 +98,9 @@ struct TRINITY_DLL_DECL boss_taldaramAI : public ScriptedAI uint64 uiSphereGuids[2]; Unit *pEmbraceTarget; + Unit *pSphereTarget; + + Creature* pSpheres[3]; CombatPhase Phase; @@ -131,14 +137,38 @@ struct TRINITY_DLL_DECL boss_taldaramAI : public ScriptedAI { case CASTING_FLAME_SPHERES: //DoCast(m_creature, SPELL_FLAME_SPHERE_SUMMON_1); - DoSpawnCreature(CREATURE_FLAME_SPHERE, 0, 0, 5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000); + pSpheres[0] = DoSpawnCreature(CREATURE_FLAME_SPHERE, 0, 0, 5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000); + pSphereTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); + while (pSphereTarget && pSphereTarget->GetTypeId() != TYPEID_PLAYER) + pSphereTarget = SelectUnit(SELECT_TARGET_RANDOM,0); + if (pSphereTarget) + { + float angle,x,y; + angle = pSpheres[0]->GetAngle(pSphereTarget); + x = pSpheres[0]->GetPositionX() + DATA_SPHERE_DISTANCE * cos(angle); + y = pSpheres[0]->GetPositionY() + DATA_SPHERE_DISTANCE * sin(angle); + pSpheres[0]->GetMotionMaster()->MovePoint(0, x, y, pSpheres[0]->GetPositionZ()); + } if (HeroicMode) { //DoCast(m_creature, H_SPELL_FLAME_SPHERE_SUMMON_1); - DoSpawnCreature(H_CREATURE_FLAME_SPHERE_1, 0, 0, 5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000); + pSpheres[1] = DoSpawnCreature(H_CREATURE_FLAME_SPHERE_1, 0, 0, 5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000); //DoCast(m_creature, H_SPELL_FLAME_SPHERE_SUMMON_2); - DoSpawnCreature(H_CREATURE_FLAME_SPHERE_2, 0, 0, 5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000); + pSpheres[2] = DoSpawnCreature(H_CREATURE_FLAME_SPHERE_2, 0, 0, 5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000); + if (pSphereTarget) + { + float angle,x,y; + angle = pSpheres[1]->GetAngle(pSphereTarget) + DATA_SPHERE_ANGLE_OFFSET; + x = pSpheres[1]->GetPositionX() + DATA_SPHERE_DISTANCE/2 * cos(angle); + y = pSpheres[1]->GetPositionY() + DATA_SPHERE_DISTANCE/2 * sin(angle); + pSpheres[1]->GetMotionMaster()->MovePoint(0, x, y, pSpheres[1]->GetPositionZ()); + angle = pSpheres[2]->GetAngle(pSphereTarget) - DATA_SPHERE_ANGLE_OFFSET; + x = pSpheres[2]->GetPositionX() + DATA_SPHERE_DISTANCE/2 * cos(angle); + y = pSpheres[2]->GetPositionY() + DATA_SPHERE_DISTANCE/2 * sin(angle); + pSpheres[2]->GetMotionMaster()->MovePoint(0, x, y, pSpheres[2]->GetPositionZ()); + } } + Phase = NORMAL; uiPhaseTimer = 0; break; @@ -227,7 +257,31 @@ struct TRINITY_DLL_DECL boss_taldaramAI : public ScriptedAI DoScriptText(SAY_DEATH, m_creature); if (pInstance) + { pInstance->SetData(DATA_PRINCE_TALDARAM_EVENT, DONE); + + //Count players + Unit *target = NULL; + std::list<HostilReference *> t_list = m_creature->getThreatManager().getThreatList(); + std::vector<Unit *> target_list; + for(std::list<HostilReference *>::iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) + { + target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid()); + // exclude pets & totems + if (target && target->GetTypeId() == TYPEID_PLAYER) + target_list.push_back(target); + target = NULL; + } + if (HeroicMode && target_list.size() < 5) + { + AchievementEntry const *AchievThePartyIsOver = GetAchievementStore()->LookupEntry(ACHIEVEMENT_THE_PARTY_IS_OVER); + if (AchievThePartyIsOver) + { + for(std::vector<Unit *>::iterator itr = target_list.begin(); itr!= target_list.end(); ++itr) + ((Player*)(*itr))->CompletedAchievement(AchievThePartyIsOver); + } + } + } } void KilledUnit(Unit *victim) @@ -268,6 +322,7 @@ struct TRINITY_DLL_DECL boss_taldaramAI : public ScriptedAI m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->RemoveAurasDueToSpell(SPELL_BEAM_VISUAL); + m_creature->SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE); m_creature->SetHomePosition(m_creature->GetPositionX(), m_creature->GetPositionY(), DATA_GROUND_POSITION_Z, m_creature->GetOrientation()); uint64 prison_GUID = pInstance->GetData64(DATA_PRINCE_TALDARAM_PLATFORM); pInstance->HandleGameObject(prison_GUID,true); @@ -287,21 +342,13 @@ struct TRINITY_DLL_DECL mob_taldaram_flamesphereAI : public ScriptedAI void Reset() { m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - m_creature->AddUnitMovementFlag(MOVEMENTFLAG_FLYING + MOVEMENTFLAG_HOVER); + m_creature->AddUnitMovementFlag(MOVEMENTFLAG_FLYING); m_creature->setFaction(16); + m_creature->SetFloatValue(OBJECT_FIELD_SCALE_X, 1.0f); DoCast(m_creature, SPELL_FLAME_SPHERE_VISUAL); DoCast(m_creature, SPELL_FLAME_SPHERE_SPAWN_EFFECT); DoCast(m_creature, HeroicMode ? H_SPELL_FLAME_SPHERE_PERIODIC : SPELL_FLAME_SPHERE_PERIODIC); uiDespawnTimer = 10000; - Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); - if (pTarget) - { - float angle,x,y; - angle = m_creature->GetAngle(pTarget); - x = m_creature->GetPositionX() + DATA_SPHERE_DISTANCE * cos(angle); - y = m_creature->GetPositionY() + DATA_SPHERE_DISTANCE * sin(angle); - m_creature->GetMotionMaster()->MovePoint(0, x, y, m_creature->GetPositionZ()); - } } void EnterCombat(Unit *who) {} diff --git a/src/bindings/scripts/scripts/northrend/azjol_nerub/ahnkahet/instance_ahnkahet.cpp b/src/bindings/scripts/scripts/northrend/azjol_nerub/ahnkahet/instance_ahnkahet.cpp index a1516f06dd5..d74fce9e47c 100644 --- a/src/bindings/scripts/scripts/northrend/azjol_nerub/ahnkahet/instance_ahnkahet.cpp +++ b/src/bindings/scripts/scripts/northrend/azjol_nerub/ahnkahet/instance_ahnkahet.cpp @@ -92,13 +92,15 @@ struct TRINITY_DLL_DECL instance_ahnkahet : public ScriptedInstance { switch(pGo->GetEntry()) { - case 193564: Prince_TaldaramPlatform = pGo->GetGUID();break; + case 193564: Prince_TaldaramPlatform = pGo->GetGUID(); + if (m_auiEncounter[1] == DONE) HandleGameObject(NULL,true,pGo); break; case 193093: Prince_TaldaramSpheres[0] = pGo->GetGUID(); if (spheres[0] == IN_PROGRESS) { pGo->SetGoState(GO_STATE_ACTIVE); pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1); } + else pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1); break; case 193094: Prince_TaldaramSpheres[1] = pGo->GetGUID(); if (spheres[1] == IN_PROGRESS) @@ -106,6 +108,7 @@ struct TRINITY_DLL_DECL instance_ahnkahet : public ScriptedInstance pGo->SetGoState(GO_STATE_ACTIVE); pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1); } + else pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1); break; case 192236: Prince_TaldaramGate = pGo->GetGUID(); // Web gate past Prince Taldaram if (m_auiEncounter[1] == DONE)HandleGameObject(NULL,true,pGo);break; @@ -121,7 +124,7 @@ struct TRINITY_DLL_DECL instance_ahnkahet : public ScriptedInstance case DATA_JEDOGA_SHADOWSEEKER: return Jedoga_Shadowseeker; case DATA_HERALD_VOLAZJ: return Herald_Volazj; case DATA_AMANITAR: return Amanitar; - case DATA_SPHERE1: return Prince_TaldaramSpheres[0]; + case DATA_SPHERE1: return Prince_TaldaramSpheres[0]; case DATA_SPHERE2: return Prince_TaldaramSpheres[1]; case DATA_PRINCE_TALDARAM_PLATFORM: return Prince_TaldaramPlatform; } diff --git a/src/bindings/scripts/scripts/northrend/azjol_nerub/azjol_nerub/boss_krikthir_the_gatewatcher.cpp b/src/bindings/scripts/scripts/northrend/azjol_nerub/azjol_nerub/boss_krikthir_the_gatewatcher.cpp index f73f8818228..938cba19cf7 100644 --- a/src/bindings/scripts/scripts/northrend/azjol_nerub/azjol_nerub/boss_krikthir_the_gatewatcher.cpp +++ b/src/bindings/scripts/scripts/northrend/azjol_nerub/azjol_nerub/boss_krikthir_the_gatewatcher.cpp @@ -18,9 +18,8 @@ /* ScriptData SDName: boss_krikthir_the_gatewatcher -SDAuthor: LordVanMartin -SD%Complete: 0 -SDComment: Placeholder +SD%Complete: 80 % +SDComment: Find in the future best timers and the event is not implemented. SDCategory: Azjol Nerub EndScriptData */ @@ -31,53 +30,128 @@ update creature_template set scriptname = 'boss_krik_thir' where entry = ''; #include "precompiled.h" #include "def_azjol_nerub.h" -#define SPELL_MIND_FLAY 52586 -#define H_SPELL_MIND_FLAY 59367 -#define SPELL_CURSE_OF_FATIGUE 52592 -#define H_SPELL_CURSE_OF_FATIGUE 59368 -#define SPELL_FRENZY 28747 // maybe 53361 - -#define MOB_SKITTERING_SWARMER 28735 -#define MOB_SKITTERING_SWARMER_CONTROLLER 32593 - -#define SPELL_SUMMON_SKITTERING_SWARMER 52438//AOE Effekt 140, maybe 52439 -#define SPELL_SUMMON_SKITTERING_SWARMER 52439//Summon 3x 28735 - -// not in db -//Yell -#define SAY_AGGRO -1601011 -#define SAY_SLAY_1 -1601012 -#define SAY_SLAY_2 -1601013 -#define SAY_SLAY_3 -1601014 -#define SAY_DEATH -1601015 -#define SAY_SEND_GROUP_1 -1601018 -#define SAY_SEND_GROUP_2 -1601019 -#define SAY_SEND_GROUP_3 -1601020 -#define SAY_SWARM_1 -1601016 -#define SAY_SWARM_2 -1601017 -#define SAY_PREFIGHT_1 -1601021 -#define SAY_PREFIGHT_2 -1601022 -#define SAY_PREFIGHT_3 -1601023 +enum +{ + SPELL_MIND_FLAY = 52586, + H_SPELL_MIND_FLAY = 59367, + SPELL_CURSE_OF_FATIGUE = 52592, + H_SPELL_CURSE_OF_FATIGUE = 59368, + SPELL_FRENZY = 28747, //maybe 53361 + + MOB_SKITTERING_SWARMER = 28735, + MOB_SKITTERING_SWARMER_CONTROLLER = 32593, + MOB_SKITTERING_INFECTIOR = 28736, + + SPELL_SUMMON_SKITTERING_SWARMER = 52438, //AOE Effect 140, maybe 52439 + SPELL_SUMMON_SKITTERING_SWARMER_1 = 52439, //Summon 3x 28735 + + SAY_AGGRO = -1601000, + SAY_SLAY_1 = -1601001, + SAY_SLAY_2 = -1601002, + SAY_DEATH = -1601003, + + //Not in db + SAY_SEND_GROUP_1 = -1601004, + SAY_SEND_GROUP_2 = -1601005, + SAY_SEND_GROUP_3 = -1601006, + SAY_SWARM_1 = -1601007, + SAY_SWARM_2 = -1601008, + SAY_PREFIGHT_1 = -1601009, + SAY_PREFIGHT_2 = -1601010, + SAY_PREFIGHT_3 = -1601011 + +}; struct TRINITY_DLL_DECL boss_krik_thirAI : public ScriptedAI { - boss_krik_thirAI(Creature *c) : ScriptedAI(c) {} + boss_krik_thirAI(Creature *c) : ScriptedAI(c) + { + pInstance = c->GetInstanceData(); + HeroicMode = c->GetMap()->IsHeroic(); + } + + ScriptedInstance* pInstance; + bool HeroicMode; - void Reset() {} + uint32 MindFlayTimer; + uint32 CurseFatigueTimer; + uint32 SummonTimer; + + void Reset() + { + MindFlayTimer = 15000; + CurseFatigueTimer = 12000; + + if (pInstance) + pInstance->SetData(DATA_KRIKTHIR_THE_GATEWATCHER_EVENT, NOT_STARTED); + } void EnterCombat(Unit* who) { DoScriptText(SAY_AGGRO, m_creature); + Summon(); + SummonTimer = 15000; + + if (pInstance) + pInstance->SetData(DATA_KRIKTHIR_THE_GATEWATCHER_EVENT, IN_PROGRESS); + } + + void Summon() + { + m_creature->SummonCreature(MOB_SKITTERING_SWARMER,566.164,682.087,769.079,2.21657,TEMPSUMMON_TIMED_DESPAWN,25000); + m_creature->SummonCreature(MOB_SKITTERING_SWARMER,566.164,682.087,769.079,2.21657,TEMPSUMMON_TIMED_DESPAWN,25000); + m_creature->SummonCreature(MOB_SKITTERING_SWARMER,529.042,706.941,777.298,1.0821,TEMPSUMMON_TIMED_DESPAWN,25000); + m_creature->SummonCreature(MOB_SKITTERING_SWARMER,529.042,706.941,777.298,1.0821,TEMPSUMMON_TIMED_DESPAWN,25000); + m_creature->SummonCreature(MOB_SKITTERING_SWARMER,489.975,671.239,772.131,0.261799,TEMPSUMMON_TIMED_DESPAWN,25000); + m_creature->SummonCreature(MOB_SKITTERING_SWARMER,489.975,671.239,772.131,0.261799,TEMPSUMMON_TIMED_DESPAWN,25000); + m_creature->SummonCreature(MOB_SKITTERING_SWARMER,488.556,692.95,771.764,4.88692,TEMPSUMMON_TIMED_DESPAWN,25000); + m_creature->SummonCreature(MOB_SKITTERING_SWARMER,488.556,692.95,771.764,4.88692,TEMPSUMMON_TIMED_DESPAWN,25000); + m_creature->SummonCreature(MOB_SKITTERING_INFECTIOR,553.34,640.387,777.419,1.20428,TEMPSUMMON_TIMED_DESPAWN,25000); + m_creature->SummonCreature(MOB_SKITTERING_SWARMER,553.34,640.387,777.419,1.20428,TEMPSUMMON_TIMED_DESPAWN,25000); + m_creature->SummonCreature(MOB_SKITTERING_INFECTIOR,517.486,706.398,777.335,5.35816,TEMPSUMMON_TIMED_DESPAWN,25000); + m_creature->SummonCreature(MOB_SKITTERING_SWARMER,517.486,706.398,777.335,5.35816,TEMPSUMMON_TIMED_DESPAWN,25000); + m_creature->SummonCreature(MOB_SKITTERING_INFECTIOR,504.01,637.693,777.479,0.506145,TEMPSUMMON_TIMED_DESPAWN,25000); + m_creature->SummonCreature(MOB_SKITTERING_SWARMER,504.01,637.693,777.479,0.506145,TEMPSUMMON_TIMED_DESPAWN,25000); + m_creature->SummonCreature(MOB_SKITTERING_SWARMER,552.625,706.408,777.177,3.4383,TEMPSUMMON_TIMED_DESPAWN,25000); + m_creature->SummonCreature(MOB_SKITTERING_SWARMER,552.625,706.408,777.177,3.4383,TEMPSUMMON_TIMED_DESPAWN,25000); + + } void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; + + + if(SummonTimer < diff) + { + Summon(); + SummonTimer = 15000; + }else SummonTimer -= diff; + + if (MindFlayTimer < diff) + { + DoCast(m_creature->getVictim(), HeroicMode ? H_SPELL_MIND_FLAY : SPELL_MIND_FLAY); + + MindFlayTimer = 15000; + }else MindFlayTimer -= diff; + + if (CurseFatigueTimer < diff) + { + //WowWiki say "Curse of Fatigue-Kirk'thir will cast Curse of Fatigue on 2-3 targets periodically. " + Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0); + Unit* target_1 = SelectUnit(SELECT_TARGET_RANDOM, 1); + + DoCast(target, HeroicMode ? H_SPELL_CURSE_OF_FATIGUE : SPELL_CURSE_OF_FATIGUE); + DoCast(target_1, HeroicMode ? H_SPELL_CURSE_OF_FATIGUE : SPELL_CURSE_OF_FATIGUE); + + CurseFatigueTimer = 10000; + }else CurseFatigueTimer -= diff; - if ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) >= 10) + if (!m_creature->HasAura(SPELL_FRENZY) && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 10) { - //Frenzy + m_creature->CastSpell(m_creature,SPELL_FRENZY,true); } DoMeleeAttackIfReady(); @@ -85,18 +159,22 @@ struct TRINITY_DLL_DECL boss_krik_thirAI : public ScriptedAI void JustDied(Unit* killer) { DoScriptText(SAY_DEATH, m_creature); + + if (pInstance) + pInstance->SetData(DATA_KRIKTHIR_THE_GATEWATCHER_EVENT, DONE); } void KilledUnit(Unit *victim) { if (victim == m_creature) return; - switch(rand()%3) - { - case 0: DoScriptText(SAY_SLAY_1, m_creature);break; - case 1: DoScriptText(SAY_SLAY_2, m_creature);break; - case 2: DoScriptText(SAY_SLAY_3, m_creature);break; - } + DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature); + } + + void JustSummoned(Creature* summoned) + { + summoned->GetMotionMaster()->MovePoint(m_creature->GetEntry(),m_creature->GetPositionX(),m_creature->GetPositionY(),m_creature->GetPositionZ()); + } }; @@ -113,5 +191,4 @@ void AddSC_boss_krik_thir() newscript->Name="boss_krik_thir"; newscript->GetAI = &GetAI_boss_krik_thir; newscript->RegisterSelf(); - } diff --git a/src/bindings/scripts/system/ScriptLoader.cpp b/src/bindings/scripts/system/ScriptLoader.cpp index fd5abfa09d4..432ad24ce33 100644 --- a/src/bindings/scripts/system/ScriptLoader.cpp +++ b/src/bindings/scripts/system/ScriptLoader.cpp @@ -262,6 +262,7 @@ extern void AddSC_winterspring(); //northrend extern void AddSC_instance_ahnkahet(); //Azjol-Nerub Ahn'kahet +extern void AddSC_boss_krik_thir(); extern void AddSC_boss_taldaram(); extern void AddSC_boss_elder_nadox(); extern void AddSC_boss_volazj(); @@ -669,6 +670,7 @@ void AddScripts() //northrend AddSC_instance_ahnkahet(); //Azjol-Nerub Ahn'kahet + AddSC_boss_krik_thir(); AddSC_boss_taldaram(); AddSC_boss_elder_nadox(); AddSC_boss_volazj(); |