diff options
author | Supabad <none@none> | 2010-05-29 15:32:28 +0200 |
---|---|---|
committer | Supabad <none@none> | 2010-05-29 15:32:28 +0200 |
commit | 1b66be14f63f0dd2551db6a3413d8daa263da417 (patch) | |
tree | c1f055f93ded34f79b0142cb8fde5b95798fd0c2 | |
parent | 0d64afc166a491098911aebd03d030066d8096ea (diff) |
Add support to Flame Leviathan.
Thanks to SnakeIce for posting patch, and Manuel for support during codecleanup.
--HG--
branch : trunk
-rw-r--r-- | src/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp | 107 | ||||
-rw-r--r-- | src/scripts/northrend/ulduar/ulduar/instance_ulduar.cpp | 105 | ||||
-rw-r--r-- | src/scripts/northrend/ulduar/ulduar/ulduar.h | 3 |
3 files changed, 152 insertions, 63 deletions
diff --git a/src/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp b/src/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp index d0b7cff3006..6a112588f60 100644 --- a/src/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp +++ b/src/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp @@ -87,22 +87,30 @@ enum Yells SAY_OVERLOAD_3 = -1603075, }; +static Position Center[]= +{ + {354.8771, -12.90240, 409.803650}, +}; + struct boss_flame_leviathanAI : public BossAI { - boss_flame_leviathanAI(Creature *pCreature) : BossAI(pCreature, TYPE_LEVIATHAN), vehicle(pCreature->GetVehicleKit()) + boss_flame_leviathanAI(Creature* pCreature) : BossAI(pCreature, TYPE_LEVIATHAN), vehicle(pCreature->GetVehicleKit()) { assert(vehicle); + pInstance = pCreature->GetInstanceData(); } - Vehicle *vehicle; + Vehicle* vehicle; + ScriptedInstance* pInstance; void Reset() { _Reset(); me->SetReactState(REACT_AGGRESSIVE); + pInstance->SetData(TYPE_LEVIATHAN, NOT_STARTED); } - void EnterCombat(Unit * /*who*/) + void EnterCombat(Unit* /*who*/) { _EnterCombat(); DoScriptText(SAY_AGGRO, me); @@ -114,31 +122,43 @@ struct boss_flame_leviathanAI : public BossAI events.ScheduleEvent(EVENT_SUMMON, 0); //events.ScheduleEvent(EVENT_MIMIRON_INFERNO, urand(60000, 120000)); // Not Blizzlike //events.ScheduleEvent(EVENT_HODIR_FURY, urand(60000, 120000)); // Not Blizzlike + pInstance->SetData(TYPE_LEVIATHAN, IN_PROGRESS); if (Creature *turret = CAST_CRE(vehicle->GetPassenger(SEAT_TURRET))) turret->AI()->DoZoneInCombat(); } // TODO: effect 0 and effect 1 may be on different target - void SpellHitTarget(Unit *pTarget, const SpellEntry *spell) + void SpellHitTarget(Unit* pTarget, const SpellEntry* pSpell) { - if (spell->Id == SPELL_PURSUED) + if (pSpell->Id == SPELL_PURSUED) AttackStart(pTarget); } - void JustDied(Unit * /*victim*/) + void JustDied(Unit* /*victim*/) { + pInstance->SetData(TYPE_LEVIATHAN, DONE); DoScriptText(SAY_DEATH, me); _JustDied(); } - void SpellHit(Unit * /*caster*/, const SpellEntry *spell) + void SpellHit(Unit* /*caster*/, const SpellEntry* pSpell) { - if (spell->Id == 62472) + if (pSpell->Id == 62472) vehicle->InstallAllAccessories(); - else if (spell->Id == SPELL_ELECTROSHOCK) + else if (pSpell->Id == SPELL_ELECTROSHOCK) me->InterruptSpell(CURRENT_CHANNELED_SPELL); } + void DoAction(const int32 param) + { + if (param == 1) + { + me->GetMotionMaster()->MovePoint(0, Center[0]); + me->SetReactState(REACT_AGGRESSIVE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + } + } + void UpdateAI(const uint32 diff) { if (!me->isInCombat()) @@ -184,8 +204,8 @@ struct boss_flame_leviathanAI : public BossAI return; case EVENT_SUMMON: if (summons.size() < 15) // 4seat+1turret+10lift - if (Creature *lift = DoSummonFlyer(MOB_MECHANOLIFT, me, urand(20,40), 50, 0)) - lift->GetMotionMaster()->MoveRandom(100); + if (Creature* pLift = DoSummonFlyer(MOB_MECHANOLIFT, me, urand(20,40), 50, 0)) + pLift->GetMotionMaster()->MoveRandom(100); events.RepeatEvent(2000); return; case EVENT_MIMIRON_INFERNO: // Not Blizzlike @@ -200,7 +220,6 @@ struct boss_flame_leviathanAI : public BossAI events.PopEvent(); break; } - DoSpellAttackIfReady(SPELL_BATTERING_RAM); } }; @@ -217,7 +236,7 @@ struct boss_flame_leviathan_seatAI : public PassiveAI #endif } - Vehicle *vehicle; + Vehicle* vehicle; #ifdef BOSS_DEBUG void MoveInLineOfSight(Unit *who) @@ -228,7 +247,7 @@ struct boss_flame_leviathan_seatAI : public PassiveAI } #endif - void PassengerBoarded(Unit *who, int8 seatId, bool apply) + void PassengerBoarded(Unit* who, int8 seatId, bool apply) { if (!me->GetVehicle()) return; @@ -238,13 +257,13 @@ struct boss_flame_leviathan_seatAI : public PassiveAI if (!apply) return; - if (Creature *turret = CAST_CRE(vehicle->GetPassenger(SEAT_TURRET))) + if (Creature* turret = CAST_CRE(vehicle->GetPassenger(SEAT_TURRET))) { turret->setFaction(me->GetVehicleBase()->getFaction()); turret->SetUInt32Value(UNIT_FIELD_FLAGS, 0); // unselectable turret->AI()->AttackStart(who); } - if (Unit *device = vehicle->GetPassenger(SEAT_DEVICE)) + if (Unit* device = vehicle->GetPassenger(SEAT_DEVICE)) { device->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); device->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -255,7 +274,7 @@ struct boss_flame_leviathan_seatAI : public PassiveAI if (apply) return; - if (Unit *device = vehicle->GetPassenger(SEAT_DEVICE)) + if (Unit* device = vehicle->GetPassenger(SEAT_DEVICE)) { device->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); device->SetUInt32Value(UNIT_FIELD_FLAGS, 0); // unselectable @@ -268,7 +287,7 @@ struct boss_flame_leviathan_defense_turretAI : public TurretAI { boss_flame_leviathan_defense_turretAI(Creature *c) : TurretAI(c) {} - void DamageTaken(Unit *who, uint32 &damage) + void DamageTaken(Unit* who, uint32 &damage) { if (!CanAIAttack(who)) damage = 0; @@ -284,7 +303,7 @@ struct boss_flame_leviathan_defense_turretAI : public TurretAI struct boss_flame_leviathan_overload_deviceAI : public PassiveAI { - boss_flame_leviathan_overload_deviceAI(Creature *c) : PassiveAI(c) {} + boss_flame_leviathan_overload_deviceAI(Creature* pCreature) : PassiveAI(pCreature) {} void DoAction(const int32 param) { @@ -294,12 +313,12 @@ struct boss_flame_leviathan_overload_deviceAI : public PassiveAI me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); if (me->GetVehicle()) { - if (Unit *player = me->GetVehicle()->GetPassenger(SEAT_PLAYER)) + if (Unit* pPlayer = me->GetVehicle()->GetPassenger(SEAT_PLAYER)) { - player->ExitVehicle(); - me->GetVehicleBase()->CastSpell(player, SPELL_SMOKE_TRAIL, true); - if (Unit *leviathan = me->GetVehicleBase()->GetVehicleBase()) - player->GetMotionMaster()->MoveKnockbackFrom(leviathan->GetPositionX(), leviathan->GetPositionY(), 30, 30); + pPlayer->ExitVehicle(); + me->GetVehicleBase()->CastSpell(pPlayer, SPELL_SMOKE_TRAIL, true); + if (Unit* leviathan = me->GetVehicleBase()->GetVehicleBase()) + pPlayer->GetMotionMaster()->MoveKnockbackFrom(leviathan->GetPositionX(), leviathan->GetPositionY(), 30, 30); } } } @@ -314,8 +333,8 @@ struct boss_flame_leviathan_safety_containerAI : public PassiveAI { if (id == me->GetEntry()) { - if (Creature *liquid = DoSummon(MOB_LIQUID, me, 0)) - liquid->CastSpell(liquid, 62494, true); + if (Creature* pLiquid = DoSummon(MOB_LIQUID, me, 0)) + pLiquid->CastSpell(pLiquid, 62494, true); me->DisappearAndDie(); // this will relocate creature to sky } } @@ -346,6 +365,32 @@ struct spell_pool_of_tarAI : public TriggerAI } }; +struct npc_colossusAI : public ScriptedAI +{ + npc_colossusAI(Creature* pCreature) : ScriptedAI(pCreature) + { + pInstance = pCreature->GetInstanceData(); + } + + ScriptedInstance *pInstance; + Position pPos; + + void JustDied(Unit* /*Who*/) + { + if (me->GetHomePosition().IsInDist(Center,50.f)) + { + if (pInstance) + pInstance->SetData(TYPE_COLOSSUS,pInstance->GetData(TYPE_COLOSSUS)+1); + } + } + + void UpdateAI(const uint32 diff) + { + if (!UpdateVictim()) + return; + } +}; + CreatureAI* GetAI_boss_flame_leviathan(Creature* pCreature) { return new boss_flame_leviathanAI (pCreature); @@ -376,6 +421,11 @@ CreatureAI* GetAI_spell_pool_of_tar(Creature* pCreature) return new spell_pool_of_tarAI (pCreature); } +CreatureAI* GetAI_npc_colossus(Creature* pCreature) +{ + return new npc_colossusAI(pCreature); +} + void AddSC_boss_flame_leviathan() { Script *newscript; @@ -408,4 +458,9 @@ void AddSC_boss_flame_leviathan() newscript->Name = "spell_pool_of_tar"; newscript->GetAI = &GetAI_spell_pool_of_tar; newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name = "npc_colossus"; + newscript->GetAI = &GetAI_npc_colossus; + newscript->RegisterSelf(); } diff --git a/src/scripts/northrend/ulduar/ulduar/instance_ulduar.cpp b/src/scripts/northrend/ulduar/ulduar/instance_ulduar.cpp index 62dab2d3f7a..2fc7e77f739 100644 --- a/src/scripts/northrend/ulduar/ulduar/instance_ulduar.cpp +++ b/src/scripts/northrend/ulduar/ulduar/instance_ulduar.cpp @@ -29,6 +29,8 @@ enum eGameObjects GO_Hodir_CHEST = 194307, GO_Freya_CHEST_HERO = 194325, GO_Freya_CHEST = 194324, + GO_LEVIATHAN_DOOR = 194905, + GO_LEVIATHAN_GATE = 194630 }; struct instance_ulduar : public ScriptedInstance @@ -37,6 +39,7 @@ struct instance_ulduar : public ScriptedInstance uint32 m_auiEncounter[MAX_ENCOUNTER]; std::string m_strInstData; + uint8 flag; uint64 m_uiLeviathanGUID; uint64 m_uiIgnisGUID; @@ -51,7 +54,9 @@ struct instance_ulduar : public ScriptedInstance uint64 m_uiFreyaGUID; uint64 m_uiVezaxGUID; uint64 m_uiYoggSaronGUID; - uint64 m_uiAlgalonGUID; + uint64 m_uiAlgalonGUID; + uint64 m_uiLeviathanDoor[7]; + uint64 m_uiLeviathanGateGUID; GameObject* KologarnChest, *ThorimChest, *HodirChest, *FreyaChest; @@ -74,9 +79,12 @@ struct instance_ulduar : public ScriptedInstance ThorimChest = 0; HodirChest = 0; FreyaChest = 0; + m_uiLeviathanGateGUID = 0; + flag = 0; memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); memset(&m_auiAssemblyGUIDs, 0, sizeof(m_auiAssemblyGUIDs)); + memset(&m_uiLeviathanDoor, 0, sizeof(m_uiLeviathanDoor)); } bool IsEncounterInProgress() const @@ -161,6 +169,17 @@ struct instance_ulduar : public ScriptedInstance case GO_Hodir_CHEST: HodirChest = add ? pGo : NULL; break; case GO_Freya_CHEST_HERO: FreyaChest = add ? pGo : NULL; break; case GO_Freya_CHEST: FreyaChest = add ? pGo : NULL; break; + case GO_LEVIATHAN_DOOR: + m_uiLeviathanDoor[flag] = pGo->GetGUID(); + HandleGameObject(NULL, true, pGo); + flag++; + if (flag == 7) + flag =0; + break; + case GO_LEVIATHAN_GATE: + m_uiLeviathanGateGUID = pGo->GetGUID(); + HandleGameObject(NULL, false, pGo); + break; } } @@ -169,6 +188,26 @@ struct instance_ulduar : public ScriptedInstance switch(type) { case TYPE_LEVIATHAN: + if (data == IN_PROGRESS) + { + HandleGameObject(m_uiLeviathanDoor[0],false); + HandleGameObject(m_uiLeviathanDoor[1],false); + HandleGameObject(m_uiLeviathanDoor[2],false); + HandleGameObject(m_uiLeviathanDoor[3],false); + HandleGameObject(m_uiLeviathanDoor[4],false); + HandleGameObject(m_uiLeviathanDoor[5],false); + HandleGameObject(m_uiLeviathanDoor[6],false); + } + else + { + HandleGameObject(m_uiLeviathanDoor[0],true); + HandleGameObject(m_uiLeviathanDoor[1],true); + HandleGameObject(m_uiLeviathanDoor[2],true); + HandleGameObject(m_uiLeviathanDoor[3],true); + HandleGameObject(m_uiLeviathanDoor[4],true); + HandleGameObject(m_uiLeviathanDoor[5],true); + HandleGameObject(m_uiLeviathanDoor[6],true); + } case TYPE_IGNIS: case TYPE_RAZORSCALE: case TYPE_XT002: @@ -195,6 +234,15 @@ struct instance_ulduar : public ScriptedInstance case TYPE_YOGGSARON: case TYPE_ALGALON: m_auiEncounter[type] = data; + case TYPE_COLOSSUS: + m_auiEncounter[TYPE_COLOSSUS] = data; + if (data == 2) + { + if (Creature* pBoss = instance->GetCreature(m_uiLeviathanGUID)) + pBoss->AI()->DoAction(1); + if (GameObject* pGate = instance->GetGameObject(m_uiLeviathanGateGUID)) + pGate->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); + } break; } @@ -218,40 +266,24 @@ struct instance_ulduar : public ScriptedInstance { switch(data) { - case TYPE_LEVIATHAN: - return m_uiLeviathanGUID; - case TYPE_IGNIS: - return m_uiIgnisGUID; - case TYPE_RAZORSCALE: - return m_uiRazorscaleGUID; - case TYPE_XT002: - return m_uiXT002GUID; - case TYPE_KOLOGARN: - return m_uiKologarnGUID; - case TYPE_AURIAYA: - return m_uiAuriayaGUID; - case TYPE_MIMIRON: - return m_uiMimironGUID; - case TYPE_HODIR: - return m_uiMimironGUID; - case TYPE_THORIM: - return m_uiThorimGUID; - case TYPE_FREYA: - return m_uiFreyaGUID; - case TYPE_VEZAX: - return m_uiVezaxGUID; - case TYPE_YOGGSARON: - return m_uiYoggSaronGUID; - case TYPE_ALGALON: - return m_uiAlgalonGUID; + case TYPE_LEVIATHAN: return m_uiLeviathanGUID; + case TYPE_IGNIS: return m_uiIgnisGUID; + case TYPE_RAZORSCALE: return m_uiRazorscaleGUID; + case TYPE_XT002: return m_uiXT002GUID; + case TYPE_KOLOGARN: return m_uiKologarnGUID; + case TYPE_AURIAYA: return m_uiAuriayaGUID; + case TYPE_MIMIRON: return m_uiMimironGUID; + case TYPE_HODIR: return m_uiMimironGUID; + case TYPE_THORIM: return m_uiThorimGUID; + case TYPE_FREYA: return m_uiFreyaGUID; + case TYPE_VEZAX: return m_uiVezaxGUID; + case TYPE_YOGGSARON: return m_uiYoggSaronGUID; + case TYPE_ALGALON: return m_uiAlgalonGUID; // Assembly of Iron - case DATA_STEELBREAKER: - return m_auiAssemblyGUIDs[0]; - case DATA_MOLGEIM: - return m_auiAssemblyGUIDs[1]; - case DATA_BRUNDIR: - return m_auiAssemblyGUIDs[2]; + case DATA_STEELBREAKER: return m_auiAssemblyGUIDs[0]; + case DATA_MOLGEIM: return m_auiAssemblyGUIDs[1]; + case DATA_BRUNDIR: return m_auiAssemblyGUIDs[2]; } return 0; @@ -275,6 +307,7 @@ struct instance_ulduar : public ScriptedInstance case TYPE_VEZAX: case TYPE_YOGGSARON: case TYPE_ALGALON: + case TYPE_COLOSSUS: return m_auiEncounter[type]; } @@ -289,7 +322,7 @@ struct instance_ulduar : public ScriptedInstance saveStream << "U U " << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3] << m_auiEncounter[4] << " " << m_auiEncounter[5] << " " << m_auiEncounter[6] << " " << m_auiEncounter[7] << m_auiEncounter[8] << " " << m_auiEncounter[9] << " " << m_auiEncounter[10] << " " << m_auiEncounter[11] - << m_auiEncounter[12] << " " << m_auiEncounter[13]; + << m_auiEncounter[12] << " " << m_auiEncounter[13] << " " << m_auiEncounter[14]; m_strInstData = saveStream.str(); @@ -309,11 +342,11 @@ struct instance_ulduar : public ScriptedInstance char dataHead1, dataHead2; uint32 data0, data1, data2, data3, data4, data5, data6, - data7, data8, data9, data10, data11, data12, data13; + data7, data8, data9, data10, data11, data12, data13, data14; std::istringstream loadStream(strIn); loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 >> data4 >> data5 >> data6 - >> data7 >> data8 >> data9 >> data10 >> data11 >> data12 >> data13; + >> data7 >> data8 >> data9 >> data10 >> data11 >> data12 >> data13 >> data14; if (dataHead1 == 'U' && dataHead2 == 'U') { diff --git a/src/scripts/northrend/ulduar/ulduar/ulduar.h b/src/scripts/northrend/ulduar/ulduar/ulduar.h index ed7686343fb..83fbb8fa21e 100644 --- a/src/scripts/northrend/ulduar/ulduar/ulduar.h +++ b/src/scripts/northrend/ulduar/ulduar/ulduar.h @@ -21,7 +21,7 @@ enum eTypes { - MAX_ENCOUNTER = 14, + MAX_ENCOUNTER = 15, TYPE_LEVIATHAN = 0, TYPE_IGNIS = 1, @@ -37,6 +37,7 @@ enum eTypes TYPE_VEZAX = 11, TYPE_YOGGSARON = 12, TYPE_ALGALON = 13, + TYPE_COLOSSUS = 14, DATA_STEELBREAKER = 20, DATA_MOLGEIM = 21, |