Index: scripts/northrend/ulduar/ulduar/boss_algalon.cpp =================================================================== --- scripts/northrend/ulduar/ulduar/boss_algalon.cpp (revision 0) +++ scripts/northrend/ulduar/ulduar/boss_algalon.cpp (revision 0) @@ -0,0 +1,78 @@ + +#include "precompiled.h" +#include "def_ulduar.h" + +#define SP_HEAVENS 64487 +#define SP_BIG_BANG 64443 +#define H_SP_BIG_BANG 64584 +#define SP_QUANTUM_STRIKE 64395 +#define H_SP_QUANTUM_STRIKE 64592 +#define SP_ENRAGE 47008 + +struct MANGOS_DLL_DECL boss_algalonAI : public ScriptedAI +{ + boss_algalonAI(Creature* pCreature) : ScriptedAI(pCreature) + { + pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); + Regular = pCreature->GetMap()->IsRegularDifficulty(); + Reset(); + } + + bool Regular; + ScriptedInstance *pInstance; + uint32 QuantumStrikeTimer; + uint32 EnrageTimer; + + void Reset() + { + if(pInstance) pInstance->SetData(TYPE_ALGALON, NOT_STARTED); + QuantumStrikeTimer = 4000 + rand()%10000; + EnrageTimer = 360000; //6 minutes + } + + void Aggro(Unit *who) + { + if(pInstance) pInstance->SetData(TYPE_ALGALON, IN_PROGRESS); + } + + void JustDied(Unit *killer) + { + if(pInstance) pInstance->SetData(TYPE_ALGALON, DONE); + } + + void UpdateAI(const uint32 diff) + { + if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) + return; + + if(QuantumStrikeTimer < diff) + { + DoCast(m_creature->getVictim(), Regular ? SP_QUANTUM_STRIKE : H_SP_QUANTUM_STRIKE); + QuantumStrikeTimer = 4000 + rand()%10000; + } + else QuantumStrikeTimer -= diff; + + if(EnrageTimer < diff) + { + DoCast(m_creature, SP_ENRAGE, true); + EnrageTimer = 30000; + } + else EnrageTimer -= diff; + + DoMeleeAttackIfReady(); + } +}; + +CreatureAI* GetAI_boss_algalon(Creature* pCreature) +{ + return new boss_algalonAI(pCreature); +} + +void AddSC_boss_algalon() +{ + Script *newscript; + newscript = new Script; + newscript->Name = "boss_algalon"; + newscript->GetAI = &GetAI_boss_algalon; + newscript->RegisterSelf(); +} Index: scripts/northrend/ulduar/ulduar/boss_auriaya.cpp =================================================================== --- scripts/northrend/ulduar/ulduar/boss_auriaya.cpp (revision 0) +++ scripts/northrend/ulduar/ulduar/boss_auriaya.cpp (revision 0) @@ -0,0 +1,127 @@ + +#include "precompiled.h" +#include "def_ulduar.h" + +#define SP_BERSERK 47008 +#define SP_TERRIFY 64386 +#define SP_GUARDIAN_SWARM 64396 +#define SP_SONIC_SCREECH 64422 +#define H_SP_SONIC_SCREECH 64688 +#define SP_SENTINEL_BLAST 64389 +#define H_SP_SENTINEL_BLAST 64678 + +#define CR_FERAL_DEFENDER 34035 +#define CR_SWARMING_GUARDIAN 34034 + + +struct MANGOS_DLL_DECL boss_auriayaAI : public ScriptedAI +{ + boss_auriayaAI(Creature* pCreature) : ScriptedAI(pCreature) + { + pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); + Regular = pCreature->GetMap()->IsRegularDifficulty(); + Reset(); + } + + ScriptedInstance *pInstance; + bool Regular; + uint32 EnrageTimer; + uint32 ScreechTimer; + uint32 TerrifyTimer; + uint32 SwarmTimer; + uint32 DefenderTimer; + + void Reset() + { + EnrageTimer = 600000; //10 minutes + DefenderTimer = 60000; + ScreechTimer = 20000 + rand()%10000; + TerrifyTimer = 30000 + rand()%15000; + SwarmTimer = 10000; + + if(pInstance) pInstance->SetData(TYPE_AURIAYA, NOT_STARTED); + } + + void Aggro(Unit *who) + { + if(pInstance) pInstance->SetData(TYPE_AURIAYA, IN_PROGRESS); + } + + void JustDied(Unit *killer) + { + if(pInstance) pInstance->SetData(TYPE_AURIAYA, DONE); + } + + void UpdateAI(const uint32 diff) + { + if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) + return; + + if (DefenderTimer < diff) + { + Unit *defender = DoSpawnCreature(CR_FERAL_DEFENDER, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); + Unit *target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + if(defender && target && target->isAlive()) + defender->AddThreat(target, 1.0f); + DefenderTimer = 45000; + } + else DefenderTimer -= diff; + + if (ScreechTimer < diff) + { + DoCast(m_creature, Regular ? SP_SONIC_SCREECH : H_SP_SONIC_SCREECH); + ScreechTimer = 25000 + rand()%15000; + } + else ScreechTimer -= diff; + + if (SwarmTimer < diff) + { + Unit *target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + if(target && target->isAlive()) + { + DoCast(target, SP_GUARDIAN_SWARM); + /*Creature *add = NULL; + for(int i=0; i<16; i++) + { + add = DoSpawnCreature(CR_SWARMING_GUARDIAN, + target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, + TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); + if(add) add->AddThreat(target, 1.0f); + }*/ + } + + SwarmTimer = 20000 + rand()%20000; + } + else SwarmTimer -= diff; + + if (TerrifyTimer < diff) + { + DoCast(m_creature->getVictim(), SP_TERRIFY); + TerrifyTimer = 30000 + rand()%15000; + } + else TerrifyTimer -= diff; + + if (EnrageTimer < diff) + { + DoCast(m_creature, SP_BERSERK); + EnrageTimer = 20000 + rand()%20000; + } + else EnrageTimer -= diff; + + DoMeleeAttackIfReady(); + } +}; + +CreatureAI* GetAI_boss_auriaya(Creature* pCreature) +{ + return new boss_auriayaAI(pCreature); +} + +void AddSC_boss_auriaya() +{ + Script *newscript; + newscript = new Script; + newscript->Name = "boss_auriaya"; + newscript->GetAI = &GetAI_boss_auriaya; + newscript->RegisterSelf(); +} Index: scripts/northrend/ulduar/ulduar/boss_freya.cpp =================================================================== --- scripts/northrend/ulduar/ulduar/boss_freya.cpp (revision 0) +++ scripts/northrend/ulduar/ulduar/boss_freya.cpp (revision 0) @@ -0,0 +1,208 @@ + +#include "precompiled.h" +#include "def_ulduar.h" + +#define SP_ATTUNED_TO_NATURE 62519 //increases healing, start at 150 stacks +#define SP_TOUCH_OF_EONAR 62528 //heals Freya, 6k per second +#define H_SP_TOUCH_OF_EONAR 62892 //heals Freya, 24k per second +#define SP_SUNBEAM 62623 +#define H_SP_SUNBEAM 62872 +#define SP_BERSERK 47008 + + +#define CR_DETONATING_LASHER 32918 +#define CR_ANCIENT_CONSERVATOR 33203 +#define CR_WATER_SPIRIT 33202 +#define CR_STORM_LASHER 32919 +#define CR_SNAPLASHER 32916 + +class MANGOS_DLL_DECL AttunedToNatureAura : public Aura +{ + public: + AttunedToNatureAura(const SpellEntry *spell, SpellEffectIndex eff, int32 *bp, Unit *target, Unit *caster) : Aura(spell, eff, bp, target, caster, NULL) + {} +}; + +struct MANGOS_DLL_DECL boss_freyaAI : public ScriptedAI +{ + boss_freyaAI(Creature* pCreature) : ScriptedAI(pCreature) + { + pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); + Regular = pCreature->GetMap()->IsRegularDifficulty(); + sp = (SpellEntry *)GetSpellStore()->LookupEntry(SP_ATTUNED_TO_NATURE); + bp = 8; + if(!pCreature->HasAura(SP_ATTUNED_TO_NATURE, EFFECT_INDEX_0)) + pCreature->AddAura(new AttunedToNatureAura(sp, EFFECT_INDEX_0, &bp, pCreature, pCreature)); + pCreature->GetAura(SP_ATTUNED_TO_NATURE, EFFECT_INDEX_0)->SetStackAmount(150); + Reset(); + } + + uint32 SummonTimer; + uint32 WaveNumber; + uint32 WaveType; + uint32 WaveTypeInc; + uint32 SunbeamTimer; + uint32 EnrageTimer; + + bool Regular; + ScriptedInstance *pInstance; + SpellEntry const *sp; + int32 bp; + + void Reset() + { + SummonTimer = 15000; + WaveNumber = 0; + WaveType = irand(0,2); + WaveTypeInc = irand(1,2); + SunbeamTimer = rand()%10000; + EnrageTimer = 600000; //10 minutes + + if(!m_creature->HasAura(SP_ATTUNED_TO_NATURE, EFFECT_INDEX_0)) + m_creature->AddAura(new AttunedToNatureAura(sp, EFFECT_INDEX_0, &bp, m_creature, m_creature)); + m_creature->GetAura(SP_ATTUNED_TO_NATURE, EFFECT_INDEX_0)->SetStackAmount(150); + + if(pInstance) pInstance->SetData(TYPE_FREYA, NOT_STARTED); + } + + void Aggro(Unit *who) + { + if(!m_creature->HasAura(SP_ATTUNED_TO_NATURE, EFFECT_INDEX_0)) + m_creature->AddAura(new AttunedToNatureAura(sp, EFFECT_INDEX_0, &bp, m_creature, m_creature)); + m_creature->GetAura(SP_ATTUNED_TO_NATURE, EFFECT_INDEX_0)->SetStackAmount(150); + + DoCast(m_creature, Regular ? SP_TOUCH_OF_EONAR : H_SP_TOUCH_OF_EONAR); + + if(pInstance) pInstance->SetData(TYPE_FREYA, IN_PROGRESS); + } + + void JustDied(Unit *killer) + { + if(pInstance) pInstance->SetData(TYPE_FREYA, DONE); + } + + void SummonLashers() + { + int i; + float x,y; + for(i=0; i<10; ++i) + { + x = (rand_norm() * 30.0f) - 15.0f; + y = (rand_norm() * 30.0f) - 15.0f; + Creature *lasher = DoSpawnCreature(CR_DETONATING_LASHER, x, y, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 2000); + Unit *target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + if(lasher && target) + lasher->AddThreat(target, 1.0f); + } + } + + void SummonConservator() + { + float x = (rand_norm() * 30.0f) - 15.0f; + float y = (rand_norm() * 30.0f) - 15.0f; + Creature *add = DoSpawnCreature(CR_ANCIENT_CONSERVATOR, x, y, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 2000); + Unit *target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + if(add && target) + add->AddThreat(target, 1.0f); + } + + void SummonElementals() + { + Creature *add; + Unit *target; + add = DoSpawnCreature(CR_WATER_SPIRIT, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 2000); + target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + if(add && target) + add->AddThreat(target, 1.0f); + + add = DoSpawnCreature(CR_STORM_LASHER, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 2000); + target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + if(add && target) + add->AddThreat(target, 1.0f); + + add = DoSpawnCreature(CR_SNAPLASHER, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 2000); + target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + if(add && target) + add->AddThreat(target, 1.0f); + } + + void SummonedCreatureDespawn(Creature* mob) + { + if(!m_creature->HasAura(SP_ATTUNED_TO_NATURE, EFFECT_INDEX_0)) return; + + switch(mob->GetEntry()) + { + case CR_DETONATING_LASHER: + if(m_creature->GetAura(SP_ATTUNED_TO_NATURE, EFFECT_INDEX_0)->modStackAmount(-2)) + m_creature->RemoveAurasDueToSpell(SP_ATTUNED_TO_NATURE); + break; + case CR_ANCIENT_CONSERVATOR: + if(m_creature->GetAura(SP_ATTUNED_TO_NATURE, EFFECT_INDEX_0)->modStackAmount(-25)) + m_creature->RemoveAurasDueToSpell(SP_ATTUNED_TO_NATURE); + break; + case CR_SNAPLASHER: + case CR_STORM_LASHER: + case CR_WATER_SPIRIT: + if(m_creature->GetAura(SP_ATTUNED_TO_NATURE, EFFECT_INDEX_0)->modStackAmount(-10)) + m_creature->RemoveAurasDueToSpell(SP_ATTUNED_TO_NATURE); + + } + } + + void UpdateAI(const uint32 diff) + { + if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) + return; + + //Phase 1, waves of adds + if(WaveNumber < 6) + { + if(SummonTimer < diff) + { + switch(WaveType) + { + case 0: SummonLashers(); break; + case 1: SummonConservator(); break; + case 2: SummonElementals(); break; + } + WaveType = (WaveType + WaveTypeInc) % 3; + ++WaveNumber; + SummonTimer = 60000; + } + else SummonTimer -= diff; + } + + + //All phases + if(SunbeamTimer < diff) + { + if( Unit *target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) + DoCast(target, Regular ? SP_SUNBEAM : H_SP_SUNBEAM); + SunbeamTimer = 6000 + rand()%10000; + } + else SunbeamTimer -= diff; + + if(EnrageTimer < diff) + { + DoCast(m_creature, SP_BERSERK); + EnrageTimer = 30000; + } + else EnrageTimer -= diff; + + DoMeleeAttackIfReady(); + } +}; + +CreatureAI* GetAI_boss_freya(Creature* pCreature) +{ + return new boss_freyaAI(pCreature); +} + +void AddSC_boss_freya() +{ + Script *newscript; + newscript = new Script; + newscript->Name = "boss_freya"; + newscript->GetAI = &GetAI_boss_freya; + newscript->RegisterSelf(); +} Index: scripts/northrend/ulduar/ulduar/boss_hodir.cpp =================================================================== --- scripts/northrend/ulduar/ulduar/boss_hodir.cpp (revision 0) +++ scripts/northrend/ulduar/ulduar/boss_hodir.cpp (revision 0) @@ -0,0 +1,128 @@ + +#include "precompiled.h" +#include "def_ulduar.h" + +#define SP_ENRAGE 26662 + +#define SP_FROZEN_BLOWS 62478 +#define H_SP_FROZEN_BLOWS 63512 +#define SP_FREEZE 62469 + +#define SAY_AGGRO -1603012 +#define SAY_DEATH -1603013 +#define SAY_SLAY01 -1603014 +#define SAY_SLAY02 -1603015 +#define SAY_FLASH_FREEZE -1603016 +#define SAY_FROZEN_BLOWS -1603017 +#define SOUND_FROZEN_BLOWS 15556 + +struct MANGOS_DLL_DECL boss_hodirAI : public ScriptedAI +{ + boss_hodirAI(Creature* pCreature) : ScriptedAI(pCreature) + { + pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); + Regular = pCreature->GetMap()->IsRegularDifficulty(); + Reset(); + } + + bool Regular; + ScriptedInstance *pInstance; + + uint64 SpeedKillTimer; + uint64 EnrageTimer; + uint64 FlashFreezeTimer; + uint64 FrozenBlowsTimer; + uint64 FreezeTimer; + + void Reset() + { + SpeedKillTimer = 180000; + EnrageTimer = 480000; + FlashFreezeTimer = 50000; + FrozenBlowsTimer = 60000; + FreezeTimer = 40000; + + if(pInstance) pInstance->SetData(TYPE_HODIR, NOT_STARTED); + } + + void Aggro(Unit *who) + { + if(pInstance) pInstance->SetData(TYPE_HODIR, IN_PROGRESS); + + DoScriptText(SAY_AGGRO, m_creature); + } + + void JustDied(Unit *killer) + { + if(pInstance) + { + if(SpeedKillTimer > 0) + pInstance->SetData(TYPE_HODIR_HARD, DONE); + else + pInstance->SetData(TYPE_HODIR, DONE); + } + DoScriptText(SAY_DEATH, m_creature); + } + + void KilledUnit(Unit *who) + { + if(irand(0,1)) + DoScriptText(SAY_SLAY01, m_creature); + else + DoScriptText(SAY_SLAY02, m_creature); + } + + void UpdateAI(const uint32 diff) + { + if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) + return; + + SpeedKillTimer -= diff; + + if(FlashFreezeTimer < diff) + { + DoScriptText(SAY_FLASH_FREEZE, m_creature); + FlashFreezeTimer = 60000; + } + else FlashFreezeTimer -= diff; + + if(FrozenBlowsTimer < diff) + { + DoPlaySoundToSet(m_creature, SOUND_FROZEN_BLOWS); + DoCast(m_creature, Regular ? SP_FROZEN_BLOWS : H_SP_FROZEN_BLOWS); + FrozenBlowsTimer = 60000; + } + else FrozenBlowsTimer -= diff; + + if(FreezeTimer < diff) + { + Unit *target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + if(target) DoCast(target, SP_FREEZE); + FreezeTimer = 60000; + } + else FreezeTimer -= diff; + + if(EnrageTimer < diff) + { + DoCast(m_creature, SP_ENRAGE); + EnrageTimer = 30000; + } + else EnrageTimer -= diff; + + DoMeleeAttackIfReady(); + } +}; + +CreatureAI* GetAI_boss_hodir(Creature* pCreature) +{ + return new boss_hodirAI(pCreature); +} + +void AddSC_boss_hodir() +{ + Script *newscript; + newscript = new Script; + newscript->Name = "boss_hodir"; + newscript->GetAI = &GetAI_boss_hodir; + newscript->RegisterSelf(); +} Index: scripts/northrend/ulduar/ulduar/boss_ignis.cpp =================================================================== --- scripts/northrend/ulduar/ulduar/boss_ignis.cpp (revision 0) +++ scripts/northrend/ulduar/ulduar/boss_ignis.cpp (revision 0) @@ -0,0 +1,111 @@ + + +#include "precompiled.h" +#include "def_ulduar.h" + + +#define SP_FLAME_JETS 62680 +#define H_SP_FLAME_JETS 63472 +#define SP_SCORCH 62546 +#define H_SP_SCORCH 63474 +#define SP_SLAG_POT 62717 +#define H_SP_SLAG_POT 63477 +#define SP_STRENGTH_OF_THE_CREATOR 64473 + +#define CR_CONSTRUCT 34085 + +struct MANGOS_DLL_DECL boss_ignisAI : public ScriptedAI +{ + boss_ignisAI(Creature* pCreature) : ScriptedAI(pCreature) + { + pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); + Regular = pCreature->GetMap()->IsRegularDifficulty(); + Reset(); + } + + ScriptedInstance *pInstance; + bool Regular; + //Timers + uint32 ScorchTimer; + uint32 SlagPotTimer; + uint32 FlameJetsTimer; + uint32 SummonTimer; + + void Reset() + { + ScorchTimer = 25000; + SlagPotTimer = 15000; + FlameJetsTimer = 20000; + SummonTimer = 40000 + rand()%20000; + + if(pInstance) pInstance->SetData(TYPE_IGNIS, NOT_STARTED); + } + + void Aggro(Unit* who) + { + if(pInstance) pInstance->SetData(TYPE_IGNIS, IN_PROGRESS); + } + + void JustDied(Unit *killer) + { + if(pInstance) pInstance->SetData(TYPE_IGNIS, DONE); + } + + void UpdateAI(const uint32 diff) + { + if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) + return; + + if (ScorchTimer < diff) + { + DoCast(m_creature->getVictim(), Regular ? SP_SCORCH : H_SP_SCORCH); + ScorchTimer = 25000; + } + else ScorchTimer -= diff; + + if (FlameJetsTimer < diff) + { + DoCast(m_creature->getVictim(), Regular ? SP_FLAME_JETS : H_SP_FLAME_JETS); + FlameJetsTimer = 20000+rand()%10000; + } + else FlameJetsTimer -= diff; + + /*if (SlagPotTimer < diff) + { + Unit *target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + if(target && target->isAlive()) + DoCast(target, Regular ? SP_SLAG_POT : H_SP_SLAG_POT); + SlagPotTimer = 15000; + } + else SlagPotTimer -= diff;*/ + + if (SummonTimer < diff) + { + Creature *construct; + construct = DoSpawnCreature(CR_CONSTRUCT, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); + Unit *target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + if(construct && target && target->isAlive()) + { + construct->AddThreat(target, 1.0f); + } + SummonTimer = 60000+rand()%30000; + } + else SummonTimer -= diff; + + DoMeleeAttackIfReady(); + } +}; + +CreatureAI* GetAI_boss_ignisAI(Creature* pCreature) +{ + return new boss_ignisAI(pCreature); +} + +void AddSC_boss_ignis() +{ + Script *newscript; + newscript = new Script; + newscript->Name = "boss_ignis"; + newscript->GetAI = &GetAI_boss_ignisAI; + newscript->RegisterSelf(); +} Index: scripts/northrend/ulduar/ulduar/boss_iron_council.cpp =================================================================== --- scripts/northrend/ulduar/ulduar/boss_iron_council.cpp (revision 0) +++ scripts/northrend/ulduar/ulduar/boss_iron_council.cpp (revision 0) @@ -0,0 +1,280 @@ + + +#include "precompiled.h" +#include "def_ulduar.h" + +#define SP_SUPERCHARGE 61920 + +//Steelbreaker spells +#define SP_HIGH_VOLTAGE 61890 +#define H_SP_HIGH_VOLTAGE 63498 +#define SP_FUSION_PUNCH 61903 +#define H_SP_FUSION_PUNCH 63493 + +//Stormcaller Brundir spells +#define SP_CHAIN_LIGHTNING 61879 +#define H_SP_CHAIN_LIGHTNING 63479 +#define SP_OVERLOAD 61869 +#define H_SP_OVERLOAD 63481 + +//Runemaster Molgeim spells +#define SP_RUNE_OF_DEATH 62269 +#define H_SP_RUNE_OF_DEATH 63490 +#define CR_LIGHTNING_ELEMENTAL 32958 + +#define CR_STEELBREAKER 32867 +#define CR_BRUNDIR 32857 +#define CR_MOLGEIM 32927 + + +struct MANGOS_DLL_DECL iron_councilAI : public ScriptedAI +{ + iron_councilAI(Creature* pCreature) : ScriptedAI(pCreature) + { + pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); + Regular = pCreature->GetMap()->IsRegularDifficulty(); + Reset(); + } + + ScriptedInstance *pInstance; + bool Regular; + int CouncilAlive; + + void Reset() + { + if(pInstance) + { + RespawnFriends(); + CouncilAlive = 3; + pInstance->SetData(TYPE_IRON_COUNCIL, NOT_STARTED); + } + } + + void EnterCombat(Unit *who) + { + if(!who) return; + if(!pInstance) return; + + uint32 entry = m_creature->GetEntry(); + Creature *council; + + if(entry!=CR_STEELBREAKER) + { + council = pInstance->instance->GetCreature(pInstance->GetData64(NPC_STEELBREAKER)); + if(council && !council->getVictim()) council->AddThreat(who, 0.0f); + }; + if(entry!=CR_BRUNDIR) + { + council = pInstance->instance->GetCreature(pInstance->GetData64(NPC_BRUNDIR)); + if(council && !council->getVictim()) council->AddThreat(who, 0.0f); + }; + if(entry!=CR_MOLGEIM) + { + council = pInstance->instance->GetCreature(pInstance->GetData64(NPC_MOLGEIM)); + if(council && !council->getVictim()) council->AddThreat(who, 0.0f); + }; + + pInstance->SetData(TYPE_IRON_COUNCIL, IN_PROGRESS); + + Aggro(who); + } + + void JustDied(Unit *killer) + { + if(!pInstance) return; + + --CouncilAlive; + if(CouncilAlive <= 0) pInstance->SetData(TYPE_IRON_COUNCIL, DONE); + } + + void RespawnFriends() + { + if(!pInstance) return; + + Creature *council; + council = pInstance->instance->GetCreature(pInstance->GetData64(NPC_STEELBREAKER)); + if(council && council->isDead()) council->Respawn(); + council = pInstance->instance->GetCreature(pInstance->GetData64(NPC_BRUNDIR)); + if(council && council->isDead()) council->Respawn(); + council = pInstance->instance->GetCreature(pInstance->GetData64(NPC_MOLGEIM)); + if(council && council->isDead()) council->Respawn(); + } +}; + + +/************************************** + Steelbreakeer +**************************************/ +struct MANGOS_DLL_DECL boss_steelbreakerAI : public iron_councilAI +{ + boss_steelbreakerAI(Creature* pCreature) : iron_councilAI(pCreature) + { + Reset(); + } + + uint32 PunchTimer; + + void Reset() + { + PunchTimer = 30000; + //iron_councilAI::Reset(); + } + + void Aggro(Unit *who) + { + DoCast(m_creature, Regular ? SP_HIGH_VOLTAGE : H_SP_HIGH_VOLTAGE); + } + + void UpdateAI(const uint32 diff) + { + if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) + return; + + if(PunchTimer < diff) + { + DoCast(m_creature->getVictim(), Regular ? SP_FUSION_PUNCH : H_SP_FUSION_PUNCH); + PunchTimer = 30000; + } + else PunchTimer -= diff; + + DoMeleeAttackIfReady(); + } +}; + +/************************************ + Stormcaller Brundir +************************************/ +struct MANGOS_DLL_DECL boss_brundirAI : public iron_councilAI +{ + boss_brundirAI(Creature* pCreature) : iron_councilAI(pCreature) + { + Reset(); + } + + uint32 LightningTimer; + uint32 OverloadTimer; + + void Reset() + { + LightningTimer = 5000 + rand()%5000; + OverloadTimer = 60000; + //iron_councilAI::Reset(); + } + + void Aggro(Unit *who) + { + } + + void UpdateAI(const uint32 diff) + { + if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) + return; + + if(OverloadTimer < diff) + { + DoCast(m_creature->getVictim(), Regular ? SP_OVERLOAD : H_SP_OVERLOAD); + OverloadTimer = 60000; + } + else OverloadTimer -= diff; + + if(LightningTimer < diff) + { + Unit *target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + if(target && target->isAlive()) + DoCast(target, Regular ? SP_CHAIN_LIGHTNING : H_SP_CHAIN_LIGHTNING); + LightningTimer = 5000 + rand()%5000; + } + else LightningTimer -= diff; + + DoMeleeAttackIfReady(); + } +}; + + +/************************************ + Runemaster Molgeim +************************************/ +struct MANGOS_DLL_DECL boss_molgeimAI : public iron_councilAI +{ + boss_molgeimAI(Creature* pCreature) : iron_councilAI(pCreature) + { + Reset(); + } + + uint32 ElementalTimer; + uint32 DeathRuneTimer; + + void Reset() + { + ElementalTimer = 15000 + rand()%10000; + DeathRuneTimer = 15000; + //iron_councilAI::Reset(); + } + + void Aggro(Unit *who) + { + } + + void UpdateAI(const uint32 diff) + { + if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) + return; + + /*if(ElementalTimer < diff) + { + Creature *elem = DoSpawnCreature(CR_LIGHTNING_ELEMENTAL, 0,0,0,0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); + Unit *target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + if(elem && target && target->isAlive()) + elem->AddThreat(target, 1.0f); + ElementalTimer = 15000 + rand()%10000; + } + else ElementalTimer -= diff;*/ + + if(CouncilAlive < 3) + { + if(DeathRuneTimer < diff) + { + Unit *target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + if(target) DoCast(target, Regular ? SP_RUNE_OF_DEATH : H_SP_RUNE_OF_DEATH); + } + } + + DoMeleeAttackIfReady(); + } +}; + + +CreatureAI* GetAI_boss_steelbreaker(Creature* pCreature) +{ + return new boss_steelbreakerAI(pCreature); +} + +CreatureAI* GetAI_boss_brundir(Creature* pCreature) +{ + return new boss_brundirAI(pCreature); +} + +CreatureAI* GetAI_boss_molgeim(Creature* pCreature) +{ + return new boss_molgeimAI(pCreature); +} + +void AddSC_boss_iron_council() +{ + Script *newscript; + + newscript = new Script; + newscript->Name = "boss_steelbreaker"; + newscript->GetAI = &GetAI_boss_steelbreaker; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name = "boss_brundir"; + newscript->GetAI = &GetAI_boss_brundir; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name = "boss_molgeim"; + newscript->GetAI = &GetAI_boss_molgeim; + newscript->RegisterSelf(); +} Index: scripts/northrend/ulduar/ulduar/boss_kologarn.cpp =================================================================== --- scripts/northrend/ulduar/ulduar/boss_kologarn.cpp (revision 0) +++ scripts/northrend/ulduar/ulduar/boss_kologarn.cpp (revision 0) @@ -0,0 +1,309 @@ + +#include "precompiled.h" +#include "def_ulduar.h" + +#define SP_OVERHEAD_SMASH_2H 63356 //64710 +#define SP_OVERHEAD_SMASH_1H 63573 //64715 +#define SP_STONE_SHOUT 64004 +#define SP_PETRIFYING_BREATH 62030 +#define H_SP_PETRIFYING_BREATH 63980 +#define SP_FOCUSED_EYEBEAM 63346 +#define H_SP_FOCUSED_EYEBEAM 63976 + +#define SP_BERSERK 64238 + +#define SP_SHOCKWAVE 63783 +#define H_SP_SHOCKWAVE 63982 + +#define SP_STONE_GRIP 62056 +#define H_SP_STONE_GRIP 63985 + +#define CR_RUBBLE 33768 + +#define LEFT 0x01 //01 +#define RIGHT 0x02 //10 + + +struct MANGOS_DLL_DECL boss_kologarnAI : public Scripted_NoMovementAI +{ + boss_kologarnAI(Creature* pCreature) : Scripted_NoMovementAI(pCreature) + { + pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); + Regular = pCreature->GetMap()->IsRegularDifficulty(); + Reset(); + } + + ScriptedInstance *pInstance; + bool Regular; + uint32 BreathTimer; + uint32 SmashTimer; + uint32 EnrageTimer; + uint8 arms; + uint32 LeftArmRespawn; + uint32 RightArmRespawn; + + void Reset() + { + BreathTimer = 5000; + SmashTimer = 10000+rand()%5000; + EnrageTimer = 600000; + arms = LEFT & RIGHT; + if(pInstance) + { + pInstance->SetData(TYPE_KOLOGARN, NOT_STARTED); + Creature *arm = NULL; + arm = (Creature *) Unit::GetUnit((*m_creature), pInstance->GetData64(NPC_KOLOGARN_LEFT_ARM)); + if(arm) arm->Respawn(); + arm = (Creature *) Unit::GetUnit((*m_creature), pInstance->GetData64(NPC_KOLOGARN_RIGHT_ARM)); + if(arm) arm->Respawn(); + } + LeftArmRespawn = 30000; + RightArmRespawn = 30000; + } + + void ArmDied(int arm) + { + arms = arms & !arm; + } + + void Aggro(Unit *who) + { + if(pInstance) + { + pInstance->SetData(TYPE_KOLOGARN, IN_PROGRESS); + /*Creature *arm = NULL; + arm = (Creature *) Unit::GetUnit((*m_creature), pInstance->GetData64(NPC_KOLOGARN_LEFT_ARM)); + if(arm) arm->Respawn(); + arm = (Creature *) Unit::GetUnit((*m_creature), pInstance->GetData64(NPC_KOLOGARN_RIGHT_ARM)); + if(arm) arm->Respawn();*/ + } + } + + void JustDied(Unit *killer) + { + if(pInstance) pInstance->SetData(TYPE_KOLOGARN, DONE); + } + + void UpdateAI(const uint32 diff) + { + if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) + return; + + if(BreathTimer < diff) + { + if(!m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE)) + DoCast(m_creature->getVictim(), Regular ? SP_PETRIFYING_BREATH : H_SP_PETRIFYING_BREATH); + BreathTimer = 5000; + } + else BreathTimer -= diff; + + if(pInstance) + { + if((arms & LEFT) != LEFT) + { + if(LeftArmRespawn < diff) + { + Creature *arm = NULL; + arm = (Creature *) Unit::GetUnit((*m_creature), pInstance->GetData64(NPC_KOLOGARN_LEFT_ARM)); + if(arm) arm->Respawn(); + } + else LeftArmRespawn -= diff; + } + + if((arms & RIGHT) != RIGHT) + { + if(RightArmRespawn < diff) + { + Creature *arm = NULL; + arm = (Creature *) Unit::GetUnit((*m_creature), pInstance->GetData64(NPC_KOLOGARN_RIGHT_ARM)); + if(arm) arm->Respawn(); + } + else RightArmRespawn -= diff; + } + } + + if(SmashTimer < diff) + { + if(arms== (LEFT & RIGHT)) DoCast(m_creature->getVictim(), SP_OVERHEAD_SMASH_2H); + if(arms==LEFT || arms==RIGHT) DoCast(m_creature->getVictim(), SP_OVERHEAD_SMASH_1H); + //if(arms==0) DoCast(m_creature->getVictim(), SP_STONE_SHOUT); + SmashTimer = 10000 + rand()%5000; + } + else SmashTimer -= diff; + + if(EnrageTimer < diff) + { + DoCast(m_creature, SP_BERSERK); + EnrageTimer = 30000; + } + else EnrageTimer -= diff; + + DoMeleeAttackIfReady(); + } +}; + +struct MANGOS_DLL_DECL boss_kologarn_left_armAI : public Scripted_NoMovementAI +{ + boss_kologarn_left_armAI(Creature* pCreature) : Scripted_NoMovementAI(pCreature) + { + pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); + Regular = pCreature->GetMap()->IsRegularDifficulty(); + Reset(); + } + + ScriptedInstance *pInstance; + bool Regular; + uint32 ShockwaveTimer; + + void Reset() + { + ShockwaveTimer = 20000 + rand()%10000; + } + + void Aggro(Unit *who) {} + + void JustDied(Unit *killer) + { + Creature *kologarn = (Creature *) Unit::GetUnit((*m_creature), pInstance->GetData64(NPC_KOLOGARN)); + if(kologarn && kologarn->isAlive()) + { + kologarn->DealDamage(kologarn, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + ((boss_kologarnAI *)kologarn->AI())->ArmDied(LEFT); + } + } + + void UpdateAI(const uint32 diff) + { + if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) + return; + + if(ShockwaveTimer < diff) + { + DoCast(m_creature->getVictim(), SP_SHOCKWAVE); + ShockwaveTimer = 20000 + rand()%10000; + } + else ShockwaveTimer -= diff; + } +}; + +struct MANGOS_DLL_DECL boss_kologarn_right_armAI : public Scripted_NoMovementAI +{ + boss_kologarn_right_armAI(Creature* pCreature) : Scripted_NoMovementAI(pCreature) + { + pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); + Regular = pCreature->GetMap()->IsRegularDifficulty(); + Reset(); + } + + ScriptedInstance *pInstance; + bool Regular; + uint32 GripThreshold; + uint32 GripTimer; + Unit *GrippedPlayer; + bool Gripped; + + void Reset() + { + GrippedPlayer = NULL; + Gripped = false; + GripTimer = 10000 + rand()%10000; + GripThreshold = Regular ? 100000 : 480000; + } + + void Aggro(Unit *who) {} + + void JustDied(Unit *killer) + { + Creature *kologarn = (Creature *) Unit::GetUnit((*m_creature), pInstance->GetData64(NPC_KOLOGARN)); + if(kologarn && kologarn->isAlive()) + { + kologarn->DealDamage(kologarn, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + ((boss_kologarnAI *)kologarn->AI())->ArmDied(RIGHT); + } + + //summon rubbles + Creature *rubble; + Unit *target; + for(int i=0; i<5; i++) + { + rubble = DoSpawnCreature(CR_RUBBLE, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); + target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + if(rubble && target && target->isAlive()) + rubble->AddThreat(target, 1.0f); + } + } + + void DamageTaken(Unit *done_by, uint32 &dmg) + { + if(Gripped) GripThreshold -= dmg; + } + + void UpdateAI(const uint32 diff) + { + if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) + return; + + if(Gripped) + { + if(!GrippedPlayer || GrippedPlayer->isDead() || GripThreshold < 0) + { + //release gripped player + //GrippedPlayer->RemoveAurasDueToSpell(SP_STONE_GRIP); + GrippedPlayer = NULL; + GripTimer = 10000 + rand()%10000; + Gripped = false; + GripThreshold = Regular ? 100000 : 400000; + } + } + else + { + if(GripTimer < diff) + { + GrippedPlayer = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + if(GrippedPlayer && GrippedPlayer->isAlive()) + { + //grip player + //DoCast(GrippedPlayer, SP_STONE_GRIP); + Gripped = true; + } + else GripTimer = 5000; + } + else GripTimer -= diff; + } + } +}; + +CreatureAI* GetAI_boss_kologarn(Creature* pCreature) +{ + return new boss_kologarnAI(pCreature); +} + +CreatureAI* GetAI_boss_kologarn_left_arm(Creature* pCreature) +{ + return new boss_kologarn_left_armAI(pCreature); +} + +CreatureAI* GetAI_boss_kologarn_right_arm(Creature* pCreature) +{ + return new boss_kologarn_right_armAI(pCreature); +} + +void AddSC_boss_kologarn() +{ + Script *newscript; + + newscript = new Script; + newscript->Name = "boss_kologarn"; + newscript->GetAI = &GetAI_boss_kologarn; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name = "boss_kologarn_left_arm"; + newscript->GetAI = &GetAI_boss_kologarn_left_arm; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name = "boss_kologarn_right_arm"; + newscript->GetAI = &GetAI_boss_kologarn_right_arm; + newscript->RegisterSelf(); +} Index: scripts/northrend/ulduar/ulduar/boss_leviathan.cpp =================================================================== --- scripts/northrend/ulduar/ulduar/boss_leviathan.cpp (revision 0) +++ scripts/northrend/ulduar/ulduar/boss_leviathan.cpp (revision 0) @@ -0,0 +1,114 @@ + + +#include "precompiled.h" +#include "def_ulduar.h" + +#define SP_BATTERING_RAM 62376 +#define SP_FLAME_VENTS 62396 +#define SP_GATHERING_SPEED 62375 + +#define SP_ROCKET 62400 + +#define SAY_AGGRO -1603009 +#define SAY_DEATH -1603010 +#define SAY_SLAY -1603011 + + + + +struct MANGOS_DLL_DECL boss_flame_leviathan : public ScriptedAI +{ + boss_flame_leviathan(Creature* pCreature) : ScriptedAI(pCreature) + { + pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); + Regular = pCreature->GetMap()->IsRegularDifficulty(); + Reset(); + } + + ScriptedInstance *pInstance; + bool Regular; + + uint32 BatteringRamTimer; + uint32 FlameVentsTimer; + uint32 RocketTimer; + + void Reset() + { + BatteringRamTimer = 15000 + rand()%20000; + FlameVentsTimer = 20000 + rand()%10000; + RocketTimer = 1000; + + if(pInstance) pInstance->SetData(TYPE_FLAME_LEVIATHAN, NOT_STARTED); + } + + void Aggro(Unit *who) + { + if(pInstance) pInstance->SetData(TYPE_FLAME_LEVIATHAN, IN_PROGRESS); + + DoScriptText(SAY_AGGRO, m_creature); + } + + void JustDied(Unit *killer) + { + if(pInstance) pInstance->SetData(TYPE_FLAME_LEVIATHAN, DONE); + + DoScriptText(SAY_DEATH, m_creature); + } + + void KilledUnit(Unit *who) + { + DoScriptText(SAY_SLAY, m_creature); + } + + void DamageTaken(Unit *pDoneBy, uint32 &dmg) + { + //компенсируем отсутствие машинок и большое хп босса + dmg *= 4; + } + + void UpdateAI(const uint32 diff) + { + if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) + return; + + if(FlameVentsTimer < diff) + { + DoCast(m_creature->getVictim(), SP_FLAME_VENTS); + FlameVentsTimer = 30000 + rand()%20000; + } + else FlameVentsTimer -= diff; + + if(BatteringRamTimer < diff) + { + DoCast(m_creature->getVictim(), SP_BATTERING_RAM); + BatteringRamTimer = 25000 + rand()%15000; + } + else BatteringRamTimer -= diff; + + if(RocketTimer < diff) + { + Unit *target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + int32 dmg = Regular ? (3000 + rand()%2000) : (2000 + rand()%1200); + if(target && target->isAlive()) + m_creature->CastCustomSpell(target, SP_ROCKET, &dmg, 0, 0, false); + RocketTimer = 3000 + rand()%2000; + } + else RocketTimer -= diff; + + DoMeleeAttackIfReady(); + } +}; + +CreatureAI* GetAI_boss_flame_leviathan(Creature* pCreature) +{ + return new boss_flame_leviathan(pCreature); +} + +void AddSC_boss_leviathan() +{ + Script *newscript; + newscript = new Script; + newscript->Name = "boss_flame_leviathan"; + newscript->GetAI = &GetAI_boss_flame_leviathan; + newscript->RegisterSelf(); +} Index: scripts/northrend/ulduar/ulduar/boss_mimiron.cpp =================================================================== --- scripts/northrend/ulduar/ulduar/boss_mimiron.cpp (revision 0) +++ scripts/northrend/ulduar/ulduar/boss_mimiron.cpp (revision 0) @@ -0,0 +1,53 @@ + +#include "precompiled.h" +#include "def_ulduar.h" + +struct MANGOS_DLL_DECL boss_mimironAI : public ScriptedAI +{ + boss_mimironAI(Creature* pCreature) : ScriptedAI(pCreature) + { + pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); + Regular = pCreature->GetMap()->IsRegularDifficulty(); + Reset(); + } + + bool Regular; + ScriptedInstance *pInstance; + + void Reset() + { + if(pInstance) pInstance->SetData(TYPE_MIMIRON, NOT_STARTED); + } + + void Aggro(Unit *who) + { + if(pInstance) pInstance->SetData(TYPE_MIMIRON, IN_PROGRESS); + } + + void JustDied(Unit *killer) + { + if(pInstance) pInstance->SetData(TYPE_MIMIRON, DONE); + } + + void UpdateAI(const uint32 diff) + { + if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) + return; + + DoMeleeAttackIfReady(); + } +}; + +CreatureAI* GetAI_boss_mimiron(Creature* pCreature) +{ + return new boss_mimironAI(pCreature); +} + +void AddSC_boss_mimiron() +{ + Script *newscript; + newscript = new Script; + newscript->Name = "boss_mimiron"; + newscript->GetAI = &GetAI_boss_mimiron; + newscript->RegisterSelf(); +} Index: scripts/northrend/ulduar/ulduar/boss_razorscale.cpp =================================================================== --- scripts/northrend/ulduar/ulduar/boss_razorscale.cpp (revision 0) +++ scripts/northrend/ulduar/ulduar/boss_razorscale.cpp (revision 0) @@ -0,0 +1,141 @@ + + + +#include "precompiled.h" +#include "def_ulduar.h" + +#define SP_DEVOURING_FLAME1 63236 //animation? +#define SP_DEVOURING_FLAME 63014 +#define H_SP_DEVOURING_FLAME 63816 +#define SP_FIREBALL 62796 //only air phase +#define H_SP_FIREBALL 63815 +#define SP_FLAME_BUFFET 64016 +#define H_SP_FLAME_BUFFET 64023 +#define SP_WING_BUFFET 62666 +#define SP_BERSERK 47008 +#define SP_FLAME_BREATH 63317 +#define H_SP_FLAME_BREATH 64021 +#define SP_FUSE_ARMOR 64771 + + + + +struct MANGOS_DLL_DECL boss_razorscaleAI : public ScriptedAI +{ + boss_razorscaleAI(Creature* pCreature) : ScriptedAI(pCreature) + { + pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); + Regular = pCreature->GetMap()->IsRegularDifficulty(); + Reset(); + } + + ScriptedInstance *pInstance; + bool Regular; + //Timers + uint32 BerserkTimer; + uint32 DevouringFlameTimer; + uint32 FlameBuffetTimer; + uint32 WingBuffetTimer; + uint32 FlameBreathTimer; + uint32 FuseArmorTimer; + uint32 FireballTimer; + + + void Reset() + { + BerserkTimer = 420000; //7 minutes + DevouringFlameTimer = 10000+rand()%10000; //every 10 sec + FlameBuffetTimer = 20000+rand()%15000; //every 10-15 seconds + WingBuffetTimer = 30000 + rand()%60000; //completely random + FlameBreathTimer = 15000+rand()%5000; //every 15 sec + FuseArmorTimer = 10000+rand()%5000; //every 10 seconds + FireballTimer = 5000 + rand()%5000; + + if(pInstance) pInstance->SetData(TYPE_RAZORSCALE, NOT_STARTED); + } + + void Aggro(Unit* who) + { + if(pInstance) pInstance->SetData(TYPE_RAZORSCALE, IN_PROGRESS); + } + + void JustDied(Unit *killer) + { + if(pInstance) pInstance->SetData(TYPE_RAZORSCALE, DONE); + } + + void UpdateAI(const uint32 diff) + { + if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) + return; + + if (FuseArmorTimer < diff) + { + DoCast(m_creature->getVictim(), SP_FUSE_ARMOR); + FuseArmorTimer = 10000; + } + else FuseArmorTimer -= diff; + + if (WingBuffetTimer < diff) + { + DoCast(m_creature->getVictim(), SP_WING_BUFFET); + WingBuffetTimer = 30000 + rand()%60000; + } + else WingBuffetTimer -= diff; + + if (DevouringFlameTimer < diff) + { + Unit *target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + if(target && target->isAlive()) + DoCast(target, Regular ? SP_DEVOURING_FLAME : H_SP_DEVOURING_FLAME); + DevouringFlameTimer = 9000+rand()%3000; + } + else DevouringFlameTimer -= diff; + + if (FlameBreathTimer < diff) + { + DoCast(m_creature->getVictim(), Regular ? SP_FLAME_BREATH : H_SP_FLAME_BREATH); + FlameBreathTimer = 15000 + rand()%5000; + } + else FlameBreathTimer -= diff; + + if (FlameBuffetTimer < diff) + { + DoCast(m_creature, Regular ? SP_FLAME_BUFFET : H_SP_FLAME_BUFFET, true); + FlameBuffetTimer = 20000 + rand()%15000; + } + else FlameBuffetTimer -= diff; + + if (FireballTimer < diff) + { + Unit *target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + if(target && target->isAlive()) + DoCast(target, Regular ? SP_FIREBALL : H_SP_FIREBALL); + FireballTimer = 4000 + rand()%4000; + } + else FireballTimer -= diff; + + if (BerserkTimer < diff) + { + DoCast(m_creature, SP_BERSERK); + BerserkTimer = 30000; + } + else BerserkTimer -= diff; + + DoMeleeAttackIfReady(); + } +}; + +CreatureAI* GetAI_boss_razorscaleAI(Creature* pCreature) +{ + return new boss_razorscaleAI(pCreature); +} + +void AddSC_boss_razorscale() +{ + Script *newscript; + newscript = new Script; + newscript->Name = "boss_razorscale"; + newscript->GetAI = &GetAI_boss_razorscaleAI; + newscript->RegisterSelf(); +} Index: scripts/northrend/ulduar/ulduar/boss_thorim.cpp =================================================================== --- scripts/northrend/ulduar/ulduar/boss_thorim.cpp (revision 0) +++ scripts/northrend/ulduar/ulduar/boss_thorim.cpp (revision 0) @@ -0,0 +1,53 @@ + +#include "precompiled.h" +#include "def_ulduar.h" + +struct MANGOS_DLL_DECL boss_thorimAI : public ScriptedAI +{ + boss_thorimAI(Creature* pCreature) : ScriptedAI(pCreature) + { + pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); + Regular = pCreature->GetMap()->IsRegularDifficulty(); + Reset(); + } + + bool Regular; + ScriptedInstance *pInstance; + + void Reset() + { + if(pInstance) pInstance->SetData(TYPE_THORIM, NOT_STARTED); + } + + void Aggro(Unit *who) + { + if(pInstance) pInstance->SetData(TYPE_THORIM, IN_PROGRESS); + } + + void JustDied(Unit *killer) + { + if(pInstance) pInstance->SetData(TYPE_THORIM, DONE); + } + + void UpdateAI(const uint32 diff) + { + if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) + return; + + DoMeleeAttackIfReady(); + } +}; + +CreatureAI* GetAI_boss_thorim(Creature* pCreature) +{ + return new boss_thorimAI(pCreature); +} + +void AddSC_boss_thorim() +{ + Script *newscript; + newscript = new Script; + newscript->Name = "boss_thorim"; + newscript->GetAI = &GetAI_boss_thorim; + newscript->RegisterSelf(); +} Index: scripts/northrend/ulduar/ulduar/boss_vezax.cpp =================================================================== --- scripts/northrend/ulduar/ulduar/boss_vezax.cpp (revision 0) +++ scripts/northrend/ulduar/ulduar/boss_vezax.cpp (revision 0) @@ -0,0 +1,85 @@ + +#include "precompiled.h" +#include "def_ulduar.h" + +#define SP_AURA_OF_DESPAIR 62692 +#define SP_SHADOW_CRASH 62660 +#define H_SP_SHADOW_CRASH +#define SP_MARK_OF_FACELESS +#define SP_SEARING_FLAMES +#define SP_SURGE_OF_DARKNESS +#define SP_BERSERK 26662 +#define SP_AURA_OF_DESPAIR 62692 + +struct MANGOS_DLL_DECL boss_vezaxAI : public ScriptedAI +{ + boss_vezaxAI(Creature* pCreature) : ScriptedAI(pCreature) + { + pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); + Regular = pCreature->GetMap()->IsRegularDifficulty(); + Reset(); + } + + bool Regular; + ScriptedInstance *pInstance; + + uint32 EnrageTimer; + /*uint32 CrashTimer; + uint32 MarkTimer; + uint32 FlamesTimer; + uint32 SurgeTimer;*/ + + void Reset() + { + EnrageTimer = 600000; //10 minutes + //FlamesTimer = 10000 + rand()%10000; + if(pInstance) pInstance->SetData(TYPE_VEZAX, NOT_STARTED); + } + + void Aggro(Unit *who) + { + if(pInstance) pInstance->SetData(TYPE_VEZAX, IN_PROGRESS); + DoCast(NULL, SP_AURA_OF_DESPAIR, true); + } + + void JustDied(Unit *killer) + { + if(pInstance) pInstance->SetData(TYPE_VEZAX, DONE); + } + + void UpdateAI(const uint32 diff) + { + if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) + return; + + /*if(FlamesTimer < diff) + { + DoCast(m_creature->getVictim(), SP_SEARING_FLAMES); + FlamesTimer = 10000 + rand()%10000; + } + else FlamesTimer -= diff; */ + + if(EnrageTimer < diff) + { + DoCast(m_creature, SP_BERSERK); + EnrageTimer = 30000; + } + else EnrageTimer -= diff; + + DoMeleeAttackIfReady(); + } +}; + +CreatureAI* GetAI_boss_vezax(Creature* pCreature) +{ + return new boss_vezaxAI(pCreature); +} + +void AddSC_boss_vezax() +{ + Script *newscript; + newscript = new Script; + newscript->Name = "boss_vezax"; + newscript->GetAI = &GetAI_boss_vezax; + newscript->RegisterSelf(); +} Index: scripts/northrend/ulduar/ulduar/boss_xt_002.cpp =================================================================== --- scripts/northrend/ulduar/ulduar/boss_xt_002.cpp (revision 0) +++ scripts/northrend/ulduar/ulduar/boss_xt_002.cpp (revision 0) @@ -0,0 +1,241 @@ + +#include "precompiled.h" +#include "def_ulduar.h" + +#define SP_TANTRUM 62776 +#define SP_SEARING_LIGHT 63018 +#define H_SP_SEARING_LIGHT 65121 +#define SEARING_LIGHT_EFFECT 63023 +#define H_SEARING_LIGHT_EFFECT 65120 +#define SP_ENRAGE 47008 +#define SP_GRAVITY 63024 +#define H_SP_GRAVITY 64234 + + +#define CR_PUMMELER 33344 +#define CR_SCRAPBOT 33343 +#define CR_BOOMBOT 33346 + +#define SAY_AGGRO -1603000 +#define SAY_DEATH -1603008 +#define SAY_TANTRUM -1603001 +#define SAY_SLAY_01 -1603002 +#define SAY_SLAY_02 -1603003 +#define SAY_BERSERK -1603007 +#define SAY_ADDS -1603006 +#define SAY_HEART_OPEN -1603004 +#define SAY_HEART_CLOSE -1603005 + +/* +792.706 64.033 413.632 - 4.823 +879.750 64.815 409.804 - 3.816 +896.488 -93.018 411.731 - 1.858 +791.016 -83.516 409.804 - 0.782 +*/ + +float AddX[4]; +float AddY[4]; +float AddZ[4]; + +struct MANGOS_DLL_DECL boss_xt002 : public ScriptedAI +{ + boss_xt002(Creature* pCreature) : ScriptedAI(pCreature) + { + pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); + Regular = pCreature->GetMap()->IsRegularDifficulty(); + //PummelerCount = Regular ? 1 : 2; + ScrapbotCount = Regular ? 4 : 6; + BoombotCount = Regular ? 2 : 4; + AddX[0] = 792.706f; AddY[0] = 64.033f; AddZ[0] = 413.632f; + AddX[1] = 879.750f; AddY[1] = 64.815f; AddZ[1] = 409.804f; + AddX[2] = 896.488f; AddY[2] = -93.018f; AddZ[2] = 411.731f; + AddX[3] = 791.016f; AddY[3] = -83.516f; AddZ[3] = 409.804f; + Reset(); + } + + ScriptedInstance *pInstance; + bool Regular; + + uint32 AddsPhaseTimer; + bool addsPhase; + uint32 addsPhaseNumber; + uint32 NextWaveTimer; + + //uint32 PummelerCount; + uint32 ScrapbotCount; + uint32 BoombotCount; + + uint32 TantrumTimer; + uint32 LightTimer; + uint32 EnrageTimer; + uint32 GravityTimer; + + void Reset() + { + addsPhase = false; + AddsPhaseTimer = 30000; + addsPhaseNumber = 3; + + TantrumTimer = 45000; + LightTimer = 10000; + EnrageTimer = 600000; + GravityTimer = 15000 + rand()%5000; + + if(pInstance) pInstance->SetData(TYPE_XT002, NOT_STARTED); + } + + void Aggro(Unit *who) + { + if(pInstance) pInstance->SetData(TYPE_XT002, IN_PROGRESS); + + DoScriptText(SAY_AGGRO, m_creature); + } + + void DamageTaken(Unit *done_by, uint32 &damage) + { + if(addsPhase) damage += damage; + } + + void JustDied(Unit *killer) + { + if(pInstance) pInstance->SetData(TYPE_XT002, DONE); + + DoScriptText(SAY_DEATH, m_creature); + } + + void KilledUnit(Unit *who) + { + if(irand(0,1)) + DoScriptText(SAY_SLAY_01, m_creature); + else + DoScriptText(SAY_SLAY_02, m_creature); + } + + void UpdateAI(const uint32 diff) + { + if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) + return; + + if(addsPhase) + { + if(AddsPhaseTimer < diff) + { + addsPhase = false; + //make boss active and attackable + SetCombatMovement(true); + m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); + //m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + + DoScriptText(SAY_HEART_CLOSE, m_creature); + } + else AddsPhaseTimer -= diff; + + if(NextWaveTimer < diff) + { + NextWaveTimer = 15000; + int rnd = irand(0,3); + /*if( m_creature->GetDistance2d(AddX[rnd], AddY[rnd]) > 220) + { + EnterEvadeMode(); + return; + }*/ + int i; + Creature *add; + Unit *target; + if(!Regular || (AddsPhaseTimer > 15000)) + { + add = m_creature->SummonCreature(CR_PUMMELER, AddX[rnd], AddY[rnd], AddZ[rnd], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); + add->SetActiveObjectState(true); + target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + if(add && target && target->isAlive()) + add->AddThreat(target, 1.0f); + } + for(i=0; i < ScrapbotCount; i++) + { + add = m_creature->SummonCreature(CR_SCRAPBOT, AddX[rnd], AddY[rnd], AddZ[rnd], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); + add->SetActiveObjectState(true); + target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + if(add && target && target->isAlive()) + add->AddThreat(target, 1.0f); + } + for(i=0; i < BoombotCount; i++) + { + add = m_creature->SummonCreature(CR_BOOMBOT, AddX[rnd], AddY[rnd], AddZ[rnd], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); + add->SetActiveObjectState(true); + target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + if(add && target && target->isAlive()) + add->AddThreat(target, 1.0f); + } + } + else NextWaveTimer -= diff; + } + else + { + if (addsPhaseNumber && ((m_creature->GetHealth()*100) / m_creature->GetMaxHealth() <= addsPhaseNumber*25)) + { + addsPhaseNumber--; + addsPhase = true; + AddsPhaseTimer = 30000; + NextWaveTimer = 5000; + //make boss unattackable and inactive + SetCombatMovement(false); + m_creature->GetMotionMaster()->Clear(); + //m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + + DoScriptText(SAY_HEART_OPEN, m_creature); + } + + //regular spells + if(TantrumTimer < diff) + { + DoCast(m_creature->getVictim(), SP_TANTRUM); + TantrumTimer = 45000; + DoScriptText(SAY_TANTRUM, m_creature); + } + else TantrumTimer -= diff; + + if(LightTimer < diff) + { + Unit *target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + if(target && target->isAlive()) + DoCast(target, Regular ? SP_SEARING_LIGHT : H_SP_SEARING_LIGHT); + LightTimer = 10000; + } + else LightTimer -= diff; + + if(GravityTimer < diff) + { + Unit *target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + if(target && target->isAlive()) + DoCast(target, Regular ? SP_GRAVITY : H_SP_GRAVITY); + GravityTimer = 15000 + rand()%5000; + } + else GravityTimer -= diff; + + if(EnrageTimer < diff) + { + DoCast(m_creature, SP_ENRAGE); + EnrageTimer = 60000; + + DoScriptText(SAY_BERSERK, m_creature); + } + else EnrageTimer -= diff; + + DoMeleeAttackIfReady(); + } + } +}; + +CreatureAI* GetAI_boss_xt002(Creature* pCreature) +{ + return new boss_xt002(pCreature); +} + +void AddSC_boss_xt002() +{ + Script *newscript; + newscript = new Script; + newscript->Name = "boss_xt002"; + newscript->GetAI = &GetAI_boss_xt002; + newscript->RegisterSelf(); +} Index: scripts/northrend/ulduar/ulduar/boss_yogg_saron.cpp =================================================================== --- scripts/northrend/ulduar/ulduar/boss_yogg_saron.cpp (revision 0) +++ scripts/northrend/ulduar/ulduar/boss_yogg_saron.cpp (revision 0) @@ -0,0 +1,54 @@ + +#include "precompiled.h" +#include "def_ulduar.h" + +#define CR_GUARDIAN_OF_YOGG_SARON 33136 +#define CR_IMMORTAL_GUARDIAN 33988 + +struct MANGOS_DLL_DECL boss_yogg_saronAI : public ScriptedAI +{ + boss_yogg_saronAI(Creature* pCreature) : ScriptedAI(pCreature) + { + pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); + Regular = pCreature->GetMap()->IsRegularDifficulty(); + Reset(); + } + + bool Regular; + ScriptedInstance *pInstance; + + void Reset() + { + if(pInstance) pInstance->SetData(TYPE_YOGG_SARON, NOT_STARTED); + } + + void Aggro(Unit *who) + { + if(pInstance) pInstance->SetData(TYPE_YOGG_SARON, IN_PROGRESS); + } + + void JustDied(Unit *killer) + { + if(pInstance) pInstance->SetData(TYPE_YOGG_SARON, DONE); + } + + void UpdateAI(const uint32 diff) + { + if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) + return; + } +}; + +CreatureAI* GetAI_boss_yogg_saron(Creature* pCreature) +{ + return new boss_yogg_saronAI(pCreature); +} + +void AddSC_boss_yogg_saron() +{ + Script *newscript; + newscript = new Script; + newscript->Name = "boss_yogg_saron"; + newscript->GetAI = &GetAI_boss_yogg_saron; + newscript->RegisterSelf(); +} Index: scripts/northrend/ulduar/ulduar/def_ulduar.h =================================================================== --- scripts/northrend/ulduar/ulduar/def_ulduar.h (revision 0) +++ scripts/northrend/ulduar/ulduar/def_ulduar.h (revision 0) @@ -0,0 +1,42 @@ + +#ifndef DEF_ULDUAR_H +#define DEF_ULDUAR_H + +enum +{ + TYPE_FLAME_LEVIATHAN = 1, + TYPE_IGNIS, + TYPE_RAZORSCALE, + TYPE_XT002, + TYPE_IRON_COUNCIL, + TYPE_KOLOGARN, + TYPE_AURIAYA, + TYPE_HODIR, + TYPE_FREYA, + TYPE_THORIM, + TYPE_MIMIRON, + TYPE_VEZAX, + TYPE_YOGG_SARON, + TYPE_ALGALON, + + //Hardmodes etc. + TYPE_HODIR_HARD, + TYPE_MIMIRON_HARD, + TYPE_THORIM_HARD, + + TYPE_LEVIATHAN_TP, + TYPE_XT002_TP, + TYPE_MIMIRON_TP, + + TYPE_KEEPERS, + + NPC_KOLOGARN = 100, + NPC_KOLOGARN_RIGHT_ARM, + NPC_KOLOGARN_LEFT_ARM, + NPC_STEELBREAKER, + NPC_MOLGEIM, + NPC_BRUNDIR, +}; + + +#endif Index: scripts/northrend/ulduar/ulduar/instance_ulduar.cpp =================================================================== --- scripts/northrend/ulduar/ulduar/instance_ulduar.cpp (revision 1708) +++ scripts/northrend/ulduar/ulduar/instance_ulduar.cpp (working copy) @@ -14,263 +14,372 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* ScriptData -SDName: Instance_Ulduar -SD%Complete: -SDComment: -SDCategory: Ulduar -EndScriptData */ - #include "precompiled.h" -#include "ulduar.h" +#include "def_ulduar.h" +#define ENCOUNTERS 14 + +//Ancient Gate of the Keepers (194255) +//Ice door after Hodir (194441) +//Runed Stone Door after vezax (194750) + struct MANGOS_DLL_DECL instance_ulduar : public ScriptedInstance { - instance_ulduar(Map* pMap) : ScriptedInstance(pMap) { Initialize(); } + instance_ulduar(Map* pMap) : ScriptedInstance(pMap) + { + Regular = pMap->IsRegularDifficulty(); + Initialize(); + } - uint32 m_auiEncounter[MAX_ENCOUNTER]; - std::string m_strInstData; + bool Regular; + //Creatures GUID + uint64 mKologarnGUID; + uint64 mKologarnLeftArmGUID; + uint64 mKologarnRightArmGUID; + uint64 mSteelbreakerGUID; + uint64 mMolgeimGUID; + uint64 mBrundirGUID; + //GO Guid (Caches) + uint64 mKologarnCacheGUID; + uint64 mHodirCacheGUID; + uint64 mHodirRareCacheGUID; + uint64 mThorimCacheGUID; + uint64 mThorimHardCacheGUID; + uint64 mMimironCacheGUID; + uint64 mMimironHardCacheGUID; + uint64 mAlgalonCacheGUID; + uint64 mFreyaCacheGUID; + uint64 mFreyaHard1CacheGUID; + uint64 mFreyaHard2CacheGUID; + uint64 mFreyaHard3CacheGUID; + //Doors + uint64 mXT002DoorGUID; + uint64 mHodirFrozenDoorGUID; + uint64 mAncientGateGUID; + // + uint32 mEncounter[ENCOUNTERS]; + uint32 mLeviathanReached; + uint32 mXT002Reached; + uint32 mMimironReached; + std::string strSaveData; + //misc + bool KeepersKilled; + bool KeepersKilledHM; + + void OpenDoor(uint64 guid) + { + if(!guid) return; + GameObject* pGo = instance->GetGameObject(guid); + if(pGo) pGo->SetGoState(GO_STATE_ACTIVE); + } - uint64 m_uiLeviathanGUID; - uint64 m_uiIgnisGUID; - uint64 m_uiRazorscaleGUID; - uint64 m_uiXT002GUID; - uint64 m_auiAssemblyGUIDs[3]; - uint64 m_uiKologarnGUID; - uint64 m_uiAuriayaGUID; - uint64 m_uiMimironGUID; - uint64 m_uiHodirGUID; - uint64 m_uiThorimGUID; - uint64 m_uiFreyaGUID; - uint64 m_uiVezaxGUID; - uint64 m_uiYoggSaronGUID; - uint64 m_uiAlgalonGUID; + void CloseDoor(uint64 guid) + { + if(!guid) return; + GameObject* pGo = instance->GetGameObject(guid); + if(pGo) pGo->SetGoState(GO_STATE_READY); + } void Initialize() { - m_uiLeviathanGUID = 0; - m_uiIgnisGUID = 0; - m_uiRazorscaleGUID = 0; - m_uiXT002GUID = 0; - m_uiKologarnGUID = 0; - m_uiAuriayaGUID = 0; - m_uiMimironGUID = 0; - m_uiHodirGUID = 0; - m_uiThorimGUID = 0; - m_uiFreyaGUID = 0; - m_uiVezaxGUID = 0; - m_uiYoggSaronGUID = 0; - m_uiAlgalonGUID = 0; + for (uint8 i = 0; i < ENCOUNTERS; ++i) + mEncounter[i] = NOT_STARTED; - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - memset(&m_auiAssemblyGUIDs, 0, sizeof(m_auiAssemblyGUIDs)); + mKologarnGUID = 0; + mKologarnLeftArmGUID = 0; + mKologarnRightArmGUID = 0; + mSteelbreakerGUID = 0; + mMolgeimGUID = 0; + mBrundirGUID = 0; + + mKologarnCacheGUID = 0; + mHodirCacheGUID = 0; + mHodirRareCacheGUID = 0; + mThorimCacheGUID = 0; + mThorimHardCacheGUID = 0; + mMimironCacheGUID = 0; + mMimironHardCacheGUID = 0; + mAlgalonCacheGUID = 0; + mFreyaCacheGUID = 0; + mFreyaHard1CacheGUID = 0; + mFreyaHard2CacheGUID = 0; + mFreyaHard3CacheGUID = 0; + + mXT002DoorGUID = 0; + mHodirFrozenDoorGUID = 0; + mAncientGateGUID = 0; + + mLeviathanReached = 0; + mXT002Reached = 0; + mMimironReached = 0; + + KeepersKilled = false; } - bool IsEncounterInProgress() const + void OnCreatureCreate(Creature* pCreature) { - for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) + switch(pCreature->GetEntry()) { - if (m_auiEncounter[i] == IN_PROGRESS) - return true; + case 32930: mKologarnGUID = pCreature->GetGUID(); + case 32933: mKologarnLeftArmGUID = pCreature->GetGUID(); + case 32934: mKologarnRightArmGUID = pCreature->GetGUID(); + case 32867: mSteelbreakerGUID = pCreature->GetGUID(); + case 32927: mMolgeimGUID = pCreature->GetGUID(); + case 32857: mBrundirGUID = pCreature->GetGUID(); } - - return false; } - void OnCreatureCreate(Creature* pCreature) + void OnObjectCreate(GameObject* pGo) { - switch(pCreature->GetEntry()) + switch(pGo->GetEntry()) { - case NPC_LEVIATHAN: - m_uiLeviathanGUID = pCreature->GetGUID(); - break; - case NPC_IGNIS: - m_uiIgnisGUID = pCreature->GetGUID(); - break; - case NPC_RAZORSCALE: - m_uiRazorscaleGUID = pCreature->GetGUID(); - break; - case NPC_XT002: - m_uiXT002GUID = pCreature->GetGUID(); - break; + //LOOT CACHES: + //Cache of Living Stone (Kologarn) + case 195046: if(Regular) mKologarnCacheGUID = pGo->GetGUID(); break; + case 195047: if(!Regular) mKologarnCacheGUID = pGo->GetGUID(); break; + //Cache of Winter (Hodir) + case 194307: if(Regular) mHodirCacheGUID = pGo->GetGUID(); break; + case 194308: if(!Regular) mHodirCacheGUID = pGo->GetGUID(); break; + //Rare Cache of Winter (Hodir hard) + case 194200: if(Regular) mHodirRareCacheGUID = pGo->GetGUID(); break; + case 194201: if(!Regular) mHodirRareCacheGUID = pGo->GetGUID(); break; + //Thorim's cache + case 194312: if(Regular) mThorimCacheGUID = pGo->GetGUID(); break; + case 194314: if(!Regular) mThorimCacheGUID = pGo->GetGUID(); break; + //Thorim's cache (hard) + case 194313: if(Regular) mThorimHardCacheGUID = pGo->GetGUID(); break; + case 194315: if(!Regular) mThorimHardCacheGUID = pGo->GetGUID(); break; + //Cache of Innovation (Mimiron) + case 194789: if(Regular) mMimironCacheGUID = pGo->GetGUID(); break; + case 194956: if(!Regular) mMimironCacheGUID = pGo->GetGUID(); break; + //Cache of Innovation (Mimiron hard) + //Gift of Freya + case 194324: if(Regular) mFreyaCacheGUID = pGo->GetGUID(); break; + case 194328: if(!Regular) mFreyaCacheGUID = pGo->GetGUID(); break; + //Gift of the Observer + case 194822: if(Regular) mAlgalonCacheGUID = pGo->GetGUID(); break; + case 194823: if(!Regular) mAlgalonCacheGUID = pGo->GetGUID(); break; - // Assembly of Iron - case NPC_STEELBREAKER: - m_auiAssemblyGUIDs[0] = pCreature->GetGUID(); - break; - case NPC_MOLGEIM: - m_auiAssemblyGUIDs[1] = pCreature->GetGUID(); - break; - case NPC_BRUNDIR: - m_auiAssemblyGUIDs[2] = pCreature->GetGUID(); - break; - - case NPC_KOLOGARN: - m_uiKologarnGUID = pCreature->GetGUID(); - break; - case NPC_AURIAYA: - m_uiAuriayaGUID = pCreature->GetGUID(); - break; - case NPC_MIMIRON: - m_uiMimironGUID = pCreature->GetGUID(); - break; - case NPC_HODIR: - m_uiHodirGUID = pCreature->GetGUID(); - break; - case NPC_THORIM: - m_uiThorimGUID = pCreature->GetGUID(); - break; - case NPC_FREYA: - m_uiFreyaGUID = pCreature->GetGUID(); - break; - case NPC_VEZAX: - m_uiVezaxGUID = pCreature->GetGUID(); - break; - case NPC_YOGGSARON: - m_uiYoggSaronGUID = pCreature->GetGUID(); - break; - case NPC_ALGALON: - m_uiAlgalonGUID = pCreature->GetGUID(); - break; + //DOORS: + case 194631: mXT002DoorGUID = pGo->GetGUID(); break; + case 194441: mHodirFrozenDoorGUID = pGo->GetGUID(); break; + case 194255: mAncientGateGUID = pGo->GetGUID(); break; } } - /*void OnObjectCreate(GameObject *pGo) - { - }*/ - void SetData(uint32 uiType, uint32 uiData) { + bool needSave = false; switch(uiType) { - case TYPE_LEVIATHAN: - case TYPE_IGNIS: - case TYPE_RAZORSCALE: - case TYPE_XT002: - case TYPE_ASSEMBLY: + case TYPE_FLAME_LEVIATHAN: + if(uiData == IN_PROGRESS) + { + mLeviathanReached = 1; + needSave = true; + } + mEncounter[0] = uiData; + break; + case TYPE_IGNIS: + mEncounter[1] = uiData; break; + case TYPE_RAZORSCALE: + mEncounter[2] = uiData; break; + case TYPE_XT002: + if(uiData == IN_PROGRESS) + { + mXT002Reached = 1; + needSave = true; + CloseDoor(mXT002DoorGUID); + } + else + { + OpenDoor(mXT002DoorGUID); + } + mEncounter[3] = uiData; + break; + case TYPE_IRON_COUNCIL: + mEncounter[4] = uiData; break; case TYPE_KOLOGARN: - case TYPE_AURIAYA: - case TYPE_MIMIRON: + if(uiData == DONE) DoRespawnGameObject(mKologarnCacheGUID, DAY); + mEncounter[5] = uiData; + break; + case TYPE_AURIAYA: + mEncounter[6] = uiData; break; case TYPE_HODIR: + if(uiData == DONE) + { + DoRespawnGameObject(mHodirCacheGUID, DAY); + OpenDoor(mHodirFrozenDoorGUID); + + //Unlock Ancient Gate of the Keepers + //TODO: onscreen notification + KeepersKilled = mEncounter[7]==DONE && mEncounter[8]==DONE && mEncounter[9]==DONE && mEncounter[10]==DONE; + if(KeepersKilled) OpenDoor(mAncientGateGUID); + } + mEncounter[7] = uiData; + break; + case TYPE_FREYA: + if(uiData == DONE) + { + DoRespawnGameObject(mFreyaCacheGUID, DAY); + //Unlock Ancient Gate of the Keepers + //TODO: onscreen notification + KeepersKilled = mEncounter[7]==DONE && mEncounter[8]==DONE && mEncounter[9]==DONE && mEncounter[10]==DONE; + if(KeepersKilled) OpenDoor(mAncientGateGUID);; + } + mEncounter[8] = uiData; + break; case TYPE_THORIM: - case TYPE_FREYA: - case TYPE_VEZAX: - case TYPE_YOGGSARON: + if(uiData == DONE) + { + DoRespawnGameObject(mThorimCacheGUID, DAY); + //Unlock Ancient Gate of the Keepers + //TODO: onscreen notification + KeepersKilled = mEncounter[7]==DONE && mEncounter[8]==DONE && mEncounter[9]==DONE && mEncounter[10]==DONE; + if(KeepersKilled) OpenDoor(mAncientGateGUID); + } + mEncounter[9] = uiData; + break; + case TYPE_MIMIRON: + if(uiData == IN_PROGRESS) + { + mMimironReached = 1; + needSave = true; + } + if(uiData == DONE) + { + DoRespawnGameObject(mMimironCacheGUID, DAY); + //Unlock Ancient Gate of the Keepers + //TODO: onscreen notification + KeepersKilled = mEncounter[7]==DONE && mEncounter[8]==DONE && mEncounter[9]==DONE && mEncounter[10]==DONE; + if(KeepersKilled) OpenDoor(mAncientGateGUID); + } + mEncounter[10] = uiData; + break; + case TYPE_VEZAX: + mEncounter[11] = uiData; break; + case TYPE_YOGG_SARON: + mEncounter[12] = uiData; break; case TYPE_ALGALON: - m_auiEncounter[uiType] = uiData; + if(uiData == DONE) DoRespawnGameObject(mAlgalonCacheGUID, DAY); + mEncounter[13] = uiData; break; + + //Hard Modes + case TYPE_HODIR_HARD: + if(uiData == DONE) + { + DoRespawnGameObject(mHodirRareCacheGUID, DAY); + DoRespawnGameObject(mHodirCacheGUID, DAY); + OpenDoor(mHodirFrozenDoorGUID); + mEncounter[7] = uiData; + } + break; + case TYPE_THORIM_HARD: + if(uiData == DONE) DoRespawnGameObject(mThorimHardCacheGUID, DAY); + mEncounter[9] = uiData; + break; } - if (uiData == DONE) + if (uiData == DONE || needSave) { OUT_SAVE_INST_DATA; std::ostringstream saveStream; + saveStream << mEncounter[0] << " " << mEncounter[1] << " " << mEncounter[2] << " " + << mEncounter[3] << " " << mEncounter[4] << " " << mEncounter[5] << " " + << mEncounter[6] << " " << mEncounter[7] << " " << mEncounter[8] << " " + << mEncounter[9] << " " << mEncounter[10] << " " << mEncounter[11] << " " + << mEncounter[12] << " " << mEncounter[13] << " " << mEncounter[14] << " " + << mLeviathanReached << " " << mXT002Reached << " " << mMimironReached; - for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) - saveStream << m_auiEncounter[i] << " "; + strSaveData = saveStream.str(); - m_strInstData = saveStream.str(); - SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; } } - uint64 GetData64(uint32 uiData) + const char* Save() { - switch(uiData) - { - 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]; - } - - return 0; + return strSaveData.c_str(); } uint32 GetData(uint32 uiType) { switch(uiType) { - case TYPE_LEVIATHAN: - case TYPE_IGNIS: - case TYPE_RAZORSCALE: - case TYPE_XT002: - case TYPE_ASSEMBLY: - case TYPE_KOLOGARN: - case TYPE_AURIAYA: - case TYPE_MIMIRON: - case TYPE_HODIR: - case TYPE_THORIM: - case TYPE_FREYA: - case TYPE_VEZAX: - case TYPE_YOGGSARON: - case TYPE_ALGALON: - return m_auiEncounter[uiType]; + case TYPE_FLAME_LEVIATHAN: return mEncounter[0]; + case TYPE_IGNIS: return mEncounter[1]; + case TYPE_RAZORSCALE: return mEncounter[2]; + case TYPE_XT002: return mEncounter[3]; + case TYPE_IRON_COUNCIL: return mEncounter[4]; + case TYPE_KOLOGARN: return mEncounter[5]; + case TYPE_AURIAYA: return mEncounter[6]; + case TYPE_HODIR: return mEncounter[7]; + case TYPE_FREYA: return mEncounter[8]; + case TYPE_THORIM: return mEncounter[9]; + case TYPE_MIMIRON: return mEncounter[10]; + case TYPE_VEZAX: return mEncounter[11]; + case TYPE_YOGG_SARON: return mEncounter[12]; + case TYPE_ALGALON: return mEncounter[13]; + + case TYPE_LEVIATHAN_TP: return mLeviathanReached; + case TYPE_XT002_TP: return mXT002Reached; + case TYPE_MIMIRON_TP: return mMimironReached; + + case TYPE_KEEPERS: return KeepersKilled ? 1 : 0; } - return 0; } - const char* Save() + uint64 GetData64(uint32 uiData) { - return m_strInstData.c_str(); + switch(uiData) + { + case NPC_KOLOGARN: return mKologarnGUID; + case NPC_KOLOGARN_LEFT_ARM: return mKologarnLeftArmGUID; + case NPC_KOLOGARN_RIGHT_ARM: return mKologarnRightArmGUID; + case NPC_STEELBREAKER: return mSteelbreakerGUID; + case NPC_MOLGEIM: return mMolgeimGUID; + case NPC_BRUNDIR: return mBrundirGUID; + } + return 0; } - void Load(const char* strIn) + void Load(const char* chrIn) { - if (!strIn) + if (!chrIn) { OUT_LOAD_INST_DATA_FAIL; return; } - OUT_LOAD_INST_DATA(strIn); + OUT_LOAD_INST_DATA(chrIn); - std::istringstream loadStream(strIn); + std::istringstream loadStream(chrIn); - for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) - { - loadStream >> m_auiEncounter[i]; + loadStream >> mEncounter[0] >> mEncounter[1] >> mEncounter[2] >> mEncounter[3] + >> mEncounter[4] >> mEncounter[5] >> mEncounter[6] >> mEncounter[7] + >> mEncounter[8] >> mEncounter[9] >> mEncounter[10] >> mEncounter[11] + >> mEncounter[12] >> mEncounter[13] >> mEncounter[14] >> mLeviathanReached + >> mXT002Reached >> mMimironReached; - if (m_auiEncounter[i] == IN_PROGRESS) - m_auiEncounter[i] = NOT_STARTED; - } + for(uint8 i = 0; i < ENCOUNTERS; ++i) + if (mEncounter[i] == IN_PROGRESS) + mEncounter[i] = NOT_STARTED; OUT_LOAD_INST_DATA_COMPLETE; } + + bool IsEncounterInProgress() const + { + for (uint8 i = 0; i < ENCOUNTERS; ++i) + if (mEncounter[i] == IN_PROGRESS) + return true; + + return false; + } }; InstanceData* GetInstanceData_instance_ulduar(Map* pMap) @@ -280,9 +389,9 @@ void AddSC_instance_ulduar() { - Script *newscript; - newscript = new Script; - newscript->Name = "instance_ulduar"; - newscript->GetInstanceData = &GetInstanceData_instance_ulduar; - newscript->RegisterSelf(); -} + Script* pNewScript; + pNewScript = new Script; + pNewScript->Name = "instance_ulduar"; + pNewScript->GetInstanceData = &GetInstanceData_instance_ulduar; + pNewScript->RegisterSelf(); +} \ No newline at end of file Index: sql/optional/ulduar_eventai_mangos.sql =================================================================== --- sql/optional/ulduar_eventai_mangos.sql (revision 0) +++ sql/optional/ulduar_eventai_mangos.sql (revision 0) @@ -0,0 +1,5 @@ +UPDATE creature_template SET AIName='EventAI', ScriptName='' WHERE entry IN (32918, 36561); +DELETE FROM creature_ai_scripts WHERE creature_id IN (32918, 36561); +INSERT INTO creature_ai_scripts VALUES +(3291800, 32918, 6, 0, 100, 2, 0, 0, 0, 0, 11, 62598, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Detonating Lasher - OnDeath (N)'), +(3291801, 32918, 6, 0, 100, 4, 0, 0, 0, 0, 11, 62937, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Detonating Lasher - OnDeath (H)'); Index: sql/optional/ulduar_mangos.sql =================================================================== --- sql/optional/ulduar_mangos.sql (revision 0) +++ sql/optional/ulduar_mangos.sql (revision 0) @@ -0,0 +1,32 @@ +UPDATE `creature_template` SET `ScriptName`='boss_razorscale' WHERE `entry`=33186; +UPDATE `creature_template` SET `ScriptName`='boss_ignis' WHERE `entry`=33118; +UPDATE `creature_template` SET `ScriptName`='boss_xt002' WHERE `entry`=33293; +UPDATE `creature_template` SET `ScriptName`='boss_flame_leviathan' WHERE `entry`=33113; +UPDATE `creature_template` SET `ScriptName`='boss_auriaya' WHERE `entry`=33515; +UPDATE `creature_template` SET `ScriptName`='boss_kologarn' WHERE `entry`=32930; +UPDATE `creature_template` SET `ScriptName`='boss_kologarn_left_arm' WHERE `entry`=32933; +UPDATE `creature_template` SET `ScriptName`='boss_kologarn_right_arm' WHERE `entry`=32934; +UPDATE `creature_template` SET `ScriptName`='boss_steelbreaker' WHERE `entry`=32867; +UPDATE `creature_template` SET `ScriptName`='boss_molgeim' WHERE `entry`=32927; +UPDATE `creature_template` SET `ScriptName`='boss_brundir' WHERE `entry`=32857; +UPDATE `creature_template` SET `ScriptName`='boss_thorim' WHERE `entry`=32865; +UPDATE `creature_template` SET `ScriptName`='boss_hodir' WHERE `entry`=32845; +UPDATE `creature_template` SET `ScriptName`='boss_freya' WHERE `entry`=32906; +UPDATE `creature_template` SET `ScriptName`='boss_mimiron' WHERE `entry`=33350; +UPDATE `creature_template` SET `ScriptName`='boss_vezax' WHERE `entry`=33271; +UPDATE `creature_template` SET `ScriptName`='boss_yogg_saron' WHERE `entry`=33288; +UPDATE `creature_template` SET `ScriptName`='boss_algalon' WHERE `entry`=32871; +UPDATE `instance_template` SET `script`='instance_ulduar' WHERE `map`=603; + +/* +insert into `creature_template` values ('99005','0','0','0','0','0','22448','0','22448','0','Ulduar teleporter','',NULL,'0','80','80','64200','64200','12300','12300','31200','35','35','1','1.48','0.5','0','3170','6182','0','33235','1','1400','1900','0','0','0','0','0','0','0','0','0','0','100','7','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','','1','3','1','1','0','0','0','0','0','0','0','0','1','99003','0','0','ulduar_teleporter'); +insert into `creature_template_addon` values ('99005','0','0','0','0','0','48143 0'); +insert into `locales_creature` values ('99005','','','','','','','','Ульдуарский телепорт',NULL,NULL,NULL,NULL,NULL,NULL,NULL,''); +replace into `creature` values +('500000','99005','571','1','1','0','99003','9025.76','-1179.12','1060.18','4.59386','25','0','0','64200','12300','0','0'), +('500001','99005','603','2','1','0','99003','1497.84','-23.9801','421.367','5.0242','25','0','0','64200','12300','0','0'), +('500002','99005','603','2','1','0','99003','131.248','-35.3802','410.204','0','25','0','0','64200','12300','0','0'), +('500003','99005','603','2','1','0','99003','553.233','-12.3247','410.079','0','25','0','0','64200','12300','0','0'), +('500004','99005','603','2','1','0','99003','926.292','-11.4635','418.995','0','25','0','0','64200','12300','0','0'), +('500005','99005','603','2','1','0','99003','2086.17','-24.3111','421.639','3.11803','25','0','0','64200','12300','0','0'); +*/ Index: sql/optional/ulduar_scriptdev2.sql =================================================================== --- sql/optional/ulduar_scriptdev2.sql (revision 0) +++ sql/optional/ulduar_scriptdev2.sql (revision 0) @@ -0,0 +1,40 @@ +DELETE FROM script_texts WHERE entry BETWEEN -1603017 AND -1603000; +INSERT INTO script_texts VALUES +(-1603000, "New toys? For me? I promise I won't break them this time!", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 15724, 1, 0, 0, "XT-002 Aggro"), +(-1603001, "NO! NO! NO! NO! NO!", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 15727, 1, 0, 0, "XT-002 Tympanic Tantrum"), +(-1603002, "I... I think I broke it.", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 15728, 1, 0, 0, "XT-002 Slay 1"), +(-1603003, "I guess it doesn't bend that way.", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 15729, 1, 0, 0, "XT-002 Slay 2"), +(-1603004, "So tired. I will rest for just a moment!", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 15725, 1, 0, 0, "XT-002 Heart Opened"), +(-1603005, "I'm ready to play!", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 15726, 1, 0, 0, "XT-002 Heart Closed"), +(-1603006, "Time for a new game! My old toys will fight my new toys!", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 15732, 1, 0, 0, "XT-002 Adds"), +(-1603007, "I'm tired of these toys. I don't want to play anymore!", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 15730, 1, 0, 0, "XT-002 Berserk"), +(-1603008, "You are bad... Toys... Very... Baaaaad!", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 15731, 1, 0, 0, "XT-002 Death"), +(-1603009, "Hostile entities detected. Threat assessment protocol active. Primary target engaged. Time minus thirty seconds to re-evaluation.", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 15506, 1, 0, 0, "Flame Leviathan Aggro"), +(-1603010, "Total systems failure. Defense protocols breached. Leviathan Unit shutting down.", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 15520, 1, 0, 0, "Flame Leviathan Death"), +(-1603011, "Threat assessment routine modified. Current target threat level: zero. Acquiring new target.", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 15521, 1, 0, 0, "Flame Leviathan Slay"), +(-1603012, "You will suffer for this trespass!", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 15552, 1, 0, 0, "Hodir Aggro"), +(-1603013, "I... I am released from his grasp... at last.", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 15557, 1, 0, 0, "Hodir Death"), +(-1603014, "Tragic. To come so far, only to fail.", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 15553, 1, 0, 0, "Hodir Slay 1"), +(-1603015, "Welcome to the endless winter.", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 15554, 1, 0, 0, "Hodir Slay 2"), +(-1603016, "Winds of the north consume you!", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 15555, 1, 0, 0, "Hodir Flash Freeze"), +(-1603017, "", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 15556, 1, 0, 0, "Hodir Frozen Blows"); + + +UPDATE `script_texts` SET `entry` = -1603017,`content_loc8` = '<Яростный рёв>' WHERE `entry` = -1603017; +UPDATE `script_texts` SET `entry` = -1603016,`content_loc8` = 'Северный ветер истребит вас!' WHERE `entry` = -1603016; +UPDATE `script_texts` SET `entry` = -1603015,`content_loc8` = 'Добро пожаловать в бесконечную зиму.' WHERE `entry` = -1603015; +UPDATE `script_texts` SET `entry` = -1603014,`content_loc8` = 'Трагедия. Зайти так далеко только чтобы погибнуть.' WHERE `entry` = -1603014; +UPDATE `script_texts` SET `entry` = -1603013,`content_loc8` = 'Я... Я выпустил из своих рук... наконец...' WHERE `entry` = -1603013; +UPDATE `script_texts` SET `entry` = -1603012,`content_loc8` = 'Вы будете страдать за то, что нарушили мои границы!' WHERE `entry` = -1603012; +UPDATE `script_texts` SET `entry` = -1603011,`content_loc8` = 'Стандартная операция - оценка угрозы. Уровень опасности цели - ноль. Поиск новой цели.' WHERE `entry` = -1603011; +UPDATE `script_texts` SET `entry` = -1603010,`content_loc8` = 'Полный отказ системы. Ошибка пртокола защиты. Блок Левиафан отключается.' WHERE `entry` = -1603010; +UPDATE `script_texts` SET `entry` = -1603009,`content_loc8` = 'Обнаружены враждебные существа. Активирую протокол оценки урвня угрозы. Вычисление основной цели. Время минус тридцать секунд до переоценки.' WHERE `entry` = -1603009; +UPDATE `script_texts` SET `entry` = -1603008,`content_loc8` = 'Вы плохие... Игрушки... Очень... Плохи-и-и-ие!' WHERE `entry` = -1603008; +UPDATE `script_texts` SET `entry` = -1603007,`content_loc8` = 'Я устал от этих игрушек. Не хочу больше играть!' WHERE `entry` = -1603007; +UPDATE `script_texts` SET `entry` = -1603006,`content_loc8` = 'Время для новой игры! Мои старые игрушки должны подраться с моими новыми игрушками!' WHERE `entry` = -1603006; +UPDATE `script_texts` SET `entry` = -1603005,`content_loc8` = 'Я готов поиграть!' WHERE `entry` = -1603005; +UPDATE `script_texts` SET `entry` = -1603004,`content_loc8` = 'Что-то подустал. Я должен отдохнуть минутку!' WHERE `entry` = -1603004; +UPDATE `script_texts` SET `entry` = -1603003,`content_loc8` = 'Кажется они не разбираются.' WHERE `entry` = -1603003; +UPDATE `script_texts` SET `entry` = -1603002,`content_loc8` = 'Ой... Мне кажется, я их сломал.' WHERE `entry` = -1603002; +UPDATE `script_texts` SET `entry` = -1603001,`content_loc8` = 'НЕТ! НЕТ! НЕТ! НЕТ! НЕТ!' WHERE `entry` = -1603001; +UPDATE `script_texts` SET `entry` = -1603000,`content_loc8` = 'Новые игрушки? Для меня? Обещаю не сломать их так быстро в этот раз!' WHERE `entry` = -1603000; Index: system/ScriptLoader.cpp =================================================================== --- system/ScriptLoader.cpp (revision 1708) +++ system/ScriptLoader.cpp (working copy) @@ -310,6 +310,20 @@ extern void AddSC_halls_of_stone(); extern void AddSC_instance_halls_of_stone(); extern void AddSC_instance_ulduar(); //ulduar +extern void AddSC_boss_algalon(); +extern void AddSC_boss_auriaya(); +extern void AddSC_boss_freya(); +extern void AddSC_boss_hodir(); +extern void AddSC_boss_ignis(); +extern void AddSC_boss_iron_council(); +extern void AddSC_boss_kologarn(); +extern void AddSC_boss_leviathan(); +extern void AddSC_boss_mimiron(); +extern void AddSC_boss_razorscale(); +extern void AddSC_boss_thorim(); +extern void AddSC_boss_vezax(); +extern void AddSC_boss_xt002(); +extern void AddSC_boss_yogg_saron(); extern void AddSC_boss_ingvar(); //utgarde_keep extern void AddSC_boss_keleseth(); extern void AddSC_boss_skarvald_and_dalronn(); @@ -718,6 +732,20 @@ AddSC_halls_of_stone(); AddSC_instance_halls_of_stone(); AddSC_instance_ulduar(); //ulduar + AddSC_boss_algalon(); + AddSC_boss_auriaya(); + AddSC_boss_freya(); + AddSC_boss_hodir(); + AddSC_boss_ignis(); + AddSC_boss_iron_council(); + AddSC_boss_kologarn(); + AddSC_boss_leviathan(); + AddSC_boss_mimiron(); + AddSC_boss_razorscale(); + AddSC_boss_thorim(); + AddSC_boss_vezax(); + AddSC_boss_xt002(); + AddSC_boss_yogg_saron(); AddSC_boss_ingvar(); //utgarde_keep AddSC_boss_keleseth(); AddSC_boss_skarvald_and_dalronn(); Index: VC80/80ScriptDev2.vcproj =================================================================== --- VC80/80ScriptDev2.vcproj (revision 1708) +++ VC80/80ScriptDev2.vcproj (working copy) @@ -2066,10 +2066,21 @@ RelativePath="..\scripts\northrend\ulduar\ulduar\instance_ulduar.cpp" > - - + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + +