diff --git a/src/scripts/EasternKingdoms/Karazhan/boss_curator.cpp b/src/scripts/EasternKingdoms/Karazhan/boss_curator.cpp index ebc8be79d..5999f58b9 100644 --- a/src/scripts/EasternKingdoms/Karazhan/boss_curator.cpp +++ b/src/scripts/EasternKingdoms/Karazhan/boss_curator.cpp @@ -40,7 +40,7 @@ class boss_curator : public CreatureScript struct boss_curatorAI : public BossAI { - boss_curatorAI(Creature* creature) : BossAI(creature, TYPE_CURATOR) { } + boss_curatorAI(Creature* creature) : BossAI(creature, DATA_CURATOR) { } void Reset() { @@ -75,6 +75,7 @@ class boss_curator : public CreatureScript events.ScheduleEvent(EVENT_SPELL_ASTRAL_FLARE, 6000); events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000); events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + DoZoneInCombat(); } void JustSummoned(Creature* summon) diff --git a/src/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp b/src/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp index aed1c6fe6..fda5f665c 100644 --- a/src/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp +++ b/src/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp @@ -33,7 +33,7 @@ class boss_maiden_of_virtue : public CreatureScript struct boss_maiden_of_virtueAI : public BossAI { - boss_maiden_of_virtueAI(Creature* creature) : BossAI(creature, TYPE_MAIDEN) { } + boss_maiden_of_virtueAI(Creature* creature) : BossAI(creature, DATA_MAIDEN) { } void Reset() { @@ -65,6 +65,7 @@ class boss_maiden_of_virtue : public CreatureScript events.ScheduleEvent(EVENT_SPELL_HOLY_FIRE, 8000); events.ScheduleEvent(EVENT_SPELL_HOLY_WRATH, 15000); events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000); + DoZoneInCombat(); } void UpdateAI(uint32 diff) diff --git a/src/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp b/src/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp index 3e94e9490..10b427a08 100644 --- a/src/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp +++ b/src/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp @@ -72,7 +72,7 @@ class boss_midnight : public CreatureScript struct boss_midnightAI : public BossAI { - boss_midnightAI(Creature* creature) : BossAI(creature, TYPE_ATTUMEN) { } + boss_midnightAI(Creature* creature) : BossAI(creature, DATA_ATTUMEN) { } void Reset() { @@ -86,6 +86,7 @@ class boss_midnight : public CreatureScript BossAI::EnterCombat(who); events.ScheduleEvent(EVENT_CHECK_HEALTH_95, 0); events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 6000); + DoZoneInCombat(); } void KilledUnit(Unit* /*victim*/) diff --git a/src/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp b/src/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp index 73450d9c8..c9e56804a 100644 --- a/src/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp +++ b/src/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp @@ -71,11 +71,14 @@ class boss_moroes : public CreatureScript struct boss_moroesAI : public BossAI { - boss_moroesAI(Creature* creature) : BossAI(creature, TYPE_MOROES) + boss_moroesAI(Creature* creature) : BossAI(creature, DATA_MOROES) { _activeGuests = 0; + instance = creature->GetInstanceScript(); } + InstanceScript* instance; + void InitializeAI() { BossAI::InitializeAI(); @@ -128,6 +131,7 @@ class boss_moroes : public CreatureScript _events2.Reset(); me->CallForHelp(20.0f); + DoZoneInCombat(); } void KilledUnit(Unit* /*victim*/) @@ -144,7 +148,7 @@ class boss_moroes : public CreatureScript summons.clear(); BossAI::JustDied(killer); Talk(SAY_DEATH); - + instance->SetBossState(DATA_MOROES, DONE); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_GARROTE); } @@ -216,7 +220,11 @@ class boss_moroes : public CreatureScript events.ScheduleEvent(EVENT_SPELL_GARROTE, urand(5000, 7000)); return; case EVENT_SPELL_GARROTE: + Talk(SAY_SPECIAL); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + target->CastSpell(target, SPELL_GARROTE, true); me->CastSpell(me, SPELL_VANISH_TELEPORT, false); + events.SetPhase(0); break; } diff --git a/src/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp b/src/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp index f98188c60..ac6e50d08 100644 --- a/src/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp +++ b/src/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp @@ -249,6 +249,7 @@ public: { HandleDoors(false); SwitchToPortalPhase(); + DoZoneInCombat(); } void JustDied(Unit* /*killer*/) diff --git a/src/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp b/src/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp index e77cca82a..0ac3660e3 100644 --- a/src/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp +++ b/src/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp @@ -120,10 +120,10 @@ public: if (instance) { - if (instance->GetData(TYPE_NIGHTBANE) == DONE) + if (instance->GetData64(DATA_NIGHTBANE) == DONE) me->DisappearAndDie(); else - instance->SetData(TYPE_NIGHTBANE, NOT_STARTED); + instance->SetData64(DATA_NIGHTBANE, NOT_STARTED); } HandleTerraceDoors(true); @@ -150,7 +150,7 @@ public: void EnterCombat(Unit* /*who*/) { if (instance) - instance->SetData(TYPE_NIGHTBANE, IN_PROGRESS); + instance->SetData64(DATA_NIGHTBANE, IN_PROGRESS); HandleTerraceDoors(false); Talk(YELL_AGGRO); @@ -165,7 +165,7 @@ public: void JustDied(Unit* /*killer*/) { if (instance) - instance->SetData(TYPE_NIGHTBANE, DONE); + instance->SetData(DATA_NIGHTBANE, DONE); HandleTerraceDoors(true); } @@ -408,10 +408,10 @@ public: { if (InstanceScript* pInstance = pGo->GetInstanceScript()) { - if (pInstance->GetData(TYPE_NIGHTBANE) != DONE && !pGo->FindNearestCreature(17225, 40.0f)) + if (pInstance->GetData(DATA_NIGHTBANE) != DONE && !pGo->FindNearestCreature(NPC_NIGHTBANE, 40.0f)) if (Creature *cr = ObjectAccessor::GetCreature(*pPlayer, pInstance->GetData64(DATA_NIGHTBANE))) cr->GetMotionMaster()->MovePoint(0, IntroWay[0][0], IntroWay[0][1], IntroWay[0][2]); - } + } return false; } }; diff --git a/src/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp b/src/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp index 496876cf3..5302c3be1 100644 --- a/src/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp +++ b/src/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp @@ -1,8 +1,8 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2 - * Copyright (C) 2008-2016 TrinityCore - * Copyright (C) 2005-2009 MaNGOS - */ +* Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2 +* Copyright (C) 2008-2016 TrinityCore +* Copyright (C) 2005-2009 MaNGOS +*/ /* ScriptData SDName: Boss_Prince_Malchezzar @@ -26,24 +26,24 @@ struct InfernalPoint static InfernalPoint InfernalPoints[] = { - {-10922.8f, -1985.2f}, - {-10916.2f, -1996.2f}, - {-10932.2f, -2008.1f}, - {-10948.8f, -2022.1f}, - {-10958.7f, -1997.7f}, - {-10971.5f, -1997.5f}, - {-10990.8f, -1995.1f}, - {-10989.8f, -1976.5f}, - {-10971.6f, -1973.0f}, - {-10955.5f, -1974.0f}, - {-10939.6f, -1969.8f}, - {-10958.0f, -1952.2f}, - {-10941.7f, -1954.8f}, - {-10943.1f, -1988.5f}, - {-10948.8f, -2005.1f}, - {-10984.0f, -2019.3f}, - {-10932.8f, -1979.6f}, - {-10935.7f, -1996.0f} + { -10922.8f, -1985.2f }, + { -10916.2f, -1996.2f }, + { -10932.2f, -2008.1f }, + { -10948.8f, -2022.1f }, + { -10958.7f, -1997.7f }, + { -10971.5f, -1997.5f }, + { -10990.8f, -1995.1f }, + { -10989.8f, -1976.5f }, + { -10971.6f, -1973.0f }, + { -10955.5f, -1974.0f }, + { -10939.6f, -1969.8f }, + { -10958.0f, -1952.2f }, + { -10941.7f, -1954.8f }, + { -10943.1f, -1988.5f }, + { -10948.8f, -2005.1f }, + { -10984.0f, -2019.3f }, + { -10932.8f, -1979.6f }, + { -10935.7f, -1996.0f } }; //Enfeeble is supposed to reduce hp to 1 and then heal player back to full when it ends @@ -51,37 +51,37 @@ static InfernalPoint InfernalPoints[] = //This spell effect will only reduce healing enum PrinceMalchezaar { - SAY_AGGRO = 0, - SAY_AXE_TOSS1 = 1, - SAY_AXE_TOSS2 = 2, -// SAY_SPECIAL1 = 3, Not used, needs to be implemented, but I don't know where it should be used. -// SAY_SPECIAL2 = 4, Not used, needs to be implemented, but I don't know where it should be used. -// SAY_SPECIAL3 = 5, Not used, needs to be implemented, but I don't know where it should be used. - SAY_SLAY = 6, - SAY_SUMMON = 7, - SAY_DEATH = 8, + SAY_AGGRO = 0, + SAY_AXE_TOSS1 = 1, + SAY_AXE_TOSS2 = 2, + // SAY_SPECIAL1 = 3, Not used, needs to be implemented, but I don't know where it should be used. + // SAY_SPECIAL2 = 4, Not used, needs to be implemented, but I don't know where it should be used. + // SAY_SPECIAL3 = 5, Not used, needs to be implemented, but I don't know where it should be used. + SAY_SLAY = 6, + SAY_SUMMON = 7, + SAY_DEATH = 8, - TOTAL_INFERNAL_POINTS = 18, + TOTAL_INFERNAL_POINTS = 18, - SPELL_ENFEEBLE = 30843, //Enfeeble during phase 1 and 2 - SPELL_ENFEEBLE_EFFECT = 41624, + SPELL_ENFEEBLE = 30843, //Enfeeble during phase 1 and 2 + SPELL_ENFEEBLE_EFFECT = 41624, - SPELL_SHADOWNOVA = 30852, //Shadownova used during all phases - SPELL_SW_PAIN = 30854, //Shadow word pain during phase 1 and 3 (different targeting rules though) - SPELL_THRASH_PASSIVE = 12787, //Extra attack chance during phase 2 - SPELL_SUNDER_ARMOR = 30901, //Sunder armor during phase 2 - SPELL_THRASH_AURA = 12787, //Passive proc chance for thrash - SPELL_EQUIP_AXES = 30857, //Visual for axe equiping - SPELL_AMPLIFY_DAMAGE = 39095, //Amplifiy during phase 3 - SPELL_CLEAVE = 30131, //Same as Nightbane. - SPELL_HELLFIRE = 30859, //Infenals' hellfire aura - NETHERSPITE_INFERNAL = 17646, //The netherspite infernal creature - MALCHEZARS_AXE = 17650, //Malchezar's axes (creatures), summoned during phase 3 + SPELL_SHADOWNOVA = 30852, //Shadownova used during all phases + SPELL_SW_PAIN = 30854, //Shadow word pain during phase 1 and 3 (different targeting rules though) + SPELL_THRASH_PASSIVE = 12787, //Extra attack chance during phase 2 + SPELL_SUNDER_ARMOR = 30901, //Sunder armor during phase 2 + SPELL_THRASH_AURA = 12787, //Passive proc chance for thrash + SPELL_EQUIP_AXES = 30857, //Visual for axe equiping + SPELL_AMPLIFY_DAMAGE = 39095, //Amplifiy during phase 3 + SPELL_CLEAVE = 30131, //Same as Nightbane. + SPELL_HELLFIRE = 30859, //Infenals' hellfire aura + NETHERSPITE_INFERNAL = 17646, //The netherspite infernal creature + MALCHEZARS_AXE = 17650, //Malchezar's axes (creatures), summoned during phase 3 - INFERNAL_MODEL_INVISIBLE = 11686, //Infernal Effects - SPELL_INFERNAL_RELAY = 30834, + INFERNAL_MODEL_INVISIBLE = 11686, //Infernal Effects + SPELL_INFERNAL_RELAY = 30834, - EQUIP_ID_AXE = 33542 //Axes info + EQUIP_ID_AXE = 33542 //Axes info }; //---------Infernal code first @@ -128,7 +128,8 @@ public: { Cleanup(); CleanupTimer = 0; - } else CleanupTimer -= diff; + } + else CleanupTimer -= diff; } } @@ -310,7 +311,7 @@ public: //cut down to size if we have more than 5 targets while (targets.size() > 5) - targets.erase(targets.begin()+rand()%targets.size()); + targets.erase(targets.begin() + rand() % targets.size()); uint32 i = 0; for (std::vector::const_iterator iter = targets.begin(); iter != targets.end(); ++iter, ++i) @@ -340,6 +341,7 @@ public: { InfernalPoint *point = NULL; Position pos; + if ((me->GetMapId() != 532) || positions.empty()) me->GetRandomNearPosition(pos, 60); else @@ -352,11 +354,12 @@ public: if (infernal) { + infernal->SetDisplayId(INFERNAL_MODEL_INVISIBLE); infernal->setFaction(me->getFaction()); if (point) - CAST_AI(netherspite_infernal::netherspite_infernalAI, infernal->AI())->point=point; - CAST_AI(netherspite_infernal::netherspite_infernalAI, infernal->AI())->malchezaar=me->GetGUID(); + CAST_AI(netherspite_infernal::netherspite_infernalAI, infernal->AI())->point = point; + CAST_AI(netherspite_infernal::netherspite_infernalAI, infernal->AI())->malchezaar = me->GetGUID(); infernals.push_back(infernal->GetGUID()); DoCast(infernal, SPELL_INFERNAL_RELAY); @@ -374,7 +377,8 @@ public: { EnfeebleResetHealth(); EnfeebleResetTimer = 0; - } else EnfeebleResetTimer -= diff; + } + else EnfeebleResetTimer -= diff; if (me->HasUnitState(UNIT_STATE_STUNNED)) // While shifting to phase 2 malchezaar stuns himself return; @@ -402,7 +406,7 @@ public: //models SetEquipmentSlots(false, EQUIP_ID_AXE, EQUIP_ID_AXE, EQUIP_NO_CHANGE); - me->SetAttackTime(OFF_ATTACK, (me->GetAttackTime(BASE_ATTACK)*150)/100); + me->SetAttackTime(OFF_ATTACK, (me->GetAttackTime(BASE_ATTACK) * 150) / 100); me->SetCanDualWield(true); } } @@ -422,19 +426,18 @@ public: Talk(SAY_AXE_TOSS2); Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); - for (uint8 i = 0; i < 2; ++i) { Creature* axe = me->SummonCreature(MALCHEZARS_AXE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1000); if (axe) { axe->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); axe->setFaction(me->getFaction()); - axes[i] = axe->GetGUID(); + axe->GetGUID(); if (target) { axe->AI()->AttackStart(target); //axe->getThreatManager().tauntApply(target); //Taunt Apply and fade out does not work properly - // So we'll use a hack to add a lot of threat to our target + // So we'll use a hack to add a lot of threat to our target axe->AddThreat(target, 10000000.0f); } } @@ -450,13 +453,15 @@ public: { DoCastVictim(SPELL_SUNDER_ARMOR); SunderArmorTimer = urand(10000, 18000); - } else SunderArmorTimer -= diff; + } + else SunderArmorTimer -= diff; if (Cleave_Timer <= diff) { DoCastVictim(SPELL_CLEAVE); Cleave_Timer = urand(6000, 12000); - } else Cleave_Timer -= diff; + } + else Cleave_Timer -= diff; } else { @@ -466,9 +471,7 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) { - for (uint8 i = 0; i < 2; ++i) - { - if (Unit* axe = ObjectAccessor::GetUnit(*me, axes[i])) + if (Unit* axe = ObjectAccessor::GetUnit(*me, axes[0])) { if (axe->GetVictim()) DoModifyThreatPercent(axe->GetVictim(), -100); @@ -478,15 +481,16 @@ public: //axe->getThreatManager().tauntApply(target); } } - } - } else AxesTargetSwitchTimer -= diff; + } + else AxesTargetSwitchTimer -= diff; if (AmplifyDamageTimer <= diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_AMPLIFY_DAMAGE); AmplifyDamageTimer = urand(20000, 30000); - } else AmplifyDamageTimer -= diff; + } + else AmplifyDamageTimer -= diff; } //Time for global and double timers @@ -494,13 +498,15 @@ public: { SummonInfernal(diff); InfernalTimer = phase == 3 ? 14500 : 44500; // 15 secs in phase 3, 45 otherwise - } else InfernalTimer -= diff; + } + else InfernalTimer -= diff; if (ShadowNovaTimer <= diff) { DoCastVictim(SPELL_SHADOWNOVA); ShadowNovaTimer = phase == 3 ? 31000 : uint32(-1); - } else ShadowNovaTimer -= diff; + } + else ShadowNovaTimer -= diff; if (phase != 2) { @@ -516,7 +522,8 @@ public: DoCast(target, SPELL_SW_PAIN); SWPainTimer = 20000; - } else SWPainTimer -= diff; + } + else SWPainTimer -= diff; } if (phase != 3) @@ -527,7 +534,8 @@ public: EnfeebleTimer = 30000; ShadowNovaTimer = 5000; EnfeebleResetTimer = 9000; - } else EnfeebleTimer -= diff; + } + else EnfeebleTimer -= diff; } if (phase == 2) @@ -557,12 +565,12 @@ public: void Cleanup(Creature* infernal, InfernalPoint *point) { - for (std::vector::iterator itr = infernals.begin(); itr!= infernals.end(); ++itr) + for (std::vector::iterator itr = infernals.begin(); itr != infernals.end(); ++itr) if (*itr == infernal->GetGUID()) - { - infernals.erase(itr); - break; - } + { + infernals.erase(itr); + break; + } positions.push_back(point); } @@ -575,6 +583,7 @@ void netherspite_infernal::netherspite_infernalAI::Cleanup() if (pMalchezaar && pMalchezaar->IsAlive()) CAST_AI(boss_malchezaar::boss_malchezaarAI, pMalchezaar->AI())->Cleanup(me, point); + } void AddSC_boss_malchezaar() diff --git a/src/scripts/EasternKingdoms/Karazhan/boss_servant_quarters.cpp b/src/scripts/EasternKingdoms/Karazhan/boss_servant_quarters.cpp index ee9b33727..b48eb20c6 100644 --- a/src/scripts/EasternKingdoms/Karazhan/boss_servant_quarters.cpp +++ b/src/scripts/EasternKingdoms/Karazhan/boss_servant_quarters.cpp @@ -42,7 +42,7 @@ class boss_servant_quarters : public CreatureScript struct boss_servant_quartersAI : public BossAI { - boss_servant_quartersAI(Creature* creature) : BossAI(creature, TYPE_SERVANT_QUARTERS) { } + boss_servant_quartersAI(Creature* creature) : BossAI(creature, DATA_SERVANT_QUARTERS) { } void Reset() { @@ -95,7 +95,7 @@ class boss_servant_quarters : public CreatureScript switch (_events2.ExecuteEvent()) { case EVENT_CHECK_VISIBILITY: - if (instance->GetBossState(TYPE_SERVANT_QUARTERS) == DONE) + if (instance->GetBossState(DATA_SERVANT_QUARTERS) == DONE) { me->SetVisible(true); me->SetReactState(REACT_AGGRESSIVE); diff --git a/src/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp b/src/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp index 3cbdbe17f..1bc38940d 100644 --- a/src/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp +++ b/src/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp @@ -10,44 +10,44 @@ enum ShadeOfAran { - SAY_AGGRO = 0, - SAY_FLAMEWREATH = 1, - SAY_BLIZZARD = 2, - SAY_EXPLOSION = 3, - SAY_DRINK = 4, - SAY_ELEMENTALS = 5, - SAY_KILL = 6, - SAY_TIMEOVER = 7, - SAY_DEATH = 8, + SAY_AGGRO = 0, + SAY_FLAMEWREATH = 1, + SAY_BLIZZARD = 2, + SAY_EXPLOSION = 3, + SAY_DRINK = 4, + SAY_ELEMENTALS = 5, + SAY_KILL = 6, + SAY_TIMEOVER = 7, + SAY_DEATH = 8, //Spells - SPELL_FROSTBOLT = 29954, - SPELL_FIREBALL = 29953, - SPELL_ARCMISSLE = 29955, - SPELL_CHAINSOFICE = 29991, - SPELL_DRAGONSBREATH = 29964, - SPELL_MASSSLOW = 30035, - SPELL_FLAME_WREATH = 29946, - SPELL_AOE_CS = 29961, - SPELL_PLAYERPULL = 32265, - SPELL_AEXPLOSION = 29973, - SPELL_MASS_POLY = 29963, - SPELL_BLINK_CENTER = 29967, - SPELL_ELEMENTALS = 29962, - SPELL_CONJURE = 29975, - SPELL_DRINK = 30024, - SPELL_POTION = 32453, - SPELL_AOE_PYROBLAST = 29978, + SPELL_FROSTBOLT = 29954, + SPELL_FIREBALL = 29953, + SPELL_ARCMISSLE = 29955, + SPELL_CHAINSOFICE = 29991, + SPELL_DRAGONSBREATH = 29964, + SPELL_MASSSLOW = 30035, + SPELL_FLAME_WREATH = 29946, + SPELL_AOE_CS = 29961, + SPELL_PLAYERPULL = 32265, + SPELL_AEXPLOSION = 29973, + SPELL_MASS_POLY = 29963, + SPELL_BLINK_CENTER = 29967, + SPELL_ELEMENTALS = 29962, + SPELL_CONJURE = 29975, + SPELL_DRINK = 30024, + SPELL_POTION = 32453, + SPELL_AOE_PYROBLAST = 29978, //Creature Spells - SPELL_CIRCULAR_BLIZZARD = 29951, - SPELL_WATERBOLT = 31012, - SPELL_SHADOW_PYRO = 29978, + SPELL_CIRCULAR_BLIZZARD = 29951, + SPELL_WATERBOLT = 31012, + SPELL_SHADOW_PYRO = 29978, //Creatures - CREATURE_WATER_ELEMENTAL = 17167, - CREATURE_SHADOW_OF_ARAN = 18254, - CREATURE_ARAN_BLIZZARD = 17161, + CREATURE_WATER_ELEMENTAL = 17167, + CREATURE_SHADOW_OF_ARAN = 18254, + CREATURE_ARAN_BLIZZARD = 17161, }; enum SuperSpell @@ -64,7 +64,7 @@ public: struct boss_aranAI : public BossAI { - boss_aranAI(Creature* creature) : BossAI(creature, TYPE_ARAN) + boss_aranAI(Creature* creature) : BossAI(creature, DATA_ARAN) { } @@ -100,7 +100,7 @@ public: BerserkTimer = 720000; CloseDoorTimer = 15000; - LastSuperSpell = rand()%3; + LastSuperSpell = rand() % 3; FlameWreathTimer = 0; FlameWreathCheckTime = 0; @@ -117,7 +117,7 @@ public: DrinkInturrupted = false; // Not in progress - instance->SetData(TYPE_ARAN, NOT_STARTED); + instance->SetData(DATA_ARAN, NOT_STARTED); instance->HandleGameObject(instance->GetData64(DATA_GO_LIBRARY_DOOR), true); } @@ -130,16 +130,19 @@ public: { Talk(SAY_DEATH); - instance->SetData(TYPE_ARAN, DONE); + instance->SetData(DATA_ARAN, DONE); instance->HandleGameObject(instance->GetData64(DATA_GO_LIBRARY_DOOR), true); + } void EnterCombat(Unit* /*who*/) { Talk(SAY_AGGRO); - instance->SetData(TYPE_ARAN, IN_PROGRESS); + instance->SetData(DATA_ARAN, IN_PROGRESS); instance->HandleGameObject(instance->GetData64(DATA_GO_LIBRARY_DOOR), false); + DoZoneInCombat(); + } void FlameWreathEffect() @@ -151,7 +154,7 @@ public: return; //store the threat list in a different container - for (ThreatContainer::StorageType::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) + for (ThreatContainer::StorageType::const_iterator itr = t_list.begin(); itr != t_list.end(); ++itr) { Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); //only on alive players @@ -161,10 +164,10 @@ public: //cut down to size if we have more than 3 targets while (targets.size() > 3) - targets.erase(targets.begin()+rand()%targets.size()); + targets.erase(targets.begin() + rand() % targets.size()); uint32 i = 0; - for (std::vector::const_iterator itr = targets.begin(); itr!= targets.end(); ++itr) + for (std::vector::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) { if (*itr) { @@ -188,7 +191,8 @@ public: { instance->HandleGameObject(instance->GetData64(DATA_GO_LIBRARY_DOOR), false); CloseDoorTimer = 0; - } else CloseDoorTimer -= diff; + } + else CloseDoorTimer -= diff; } //Cooldowns for casts @@ -196,24 +200,24 @@ public: { if (ArcaneCooldown >= diff) ArcaneCooldown -= diff; - else ArcaneCooldown = 0; + else ArcaneCooldown = 0; } if (FireCooldown) { if (FireCooldown >= diff) FireCooldown -= diff; - else FireCooldown = 0; + else FireCooldown = 0; } if (FrostCooldown) { if (FrostCooldown >= diff) FrostCooldown -= diff; - else FrostCooldown = 0; + else FrostCooldown = 0; } - if (!Drinking && me->GetMaxPower(POWER_MANA) && (me->GetPower(POWER_MANA)*100 / me->GetMaxPower(POWER_MANA)) < 20) + if (!Drinking && me->GetMaxPower(POWER_MANA) && (me->GetPower(POWER_MANA) * 100 / me->GetMaxPower(POWER_MANA)) < 20) { Drinking = true; me->InterruptNonMeleeSpells(false); @@ -236,7 +240,7 @@ public: Drinking = false; me->RemoveAurasDueToSpell(SPELL_DRINK); me->SetStandState(UNIT_STAND_STATE_STAND); - me->SetPower(POWER_MANA, me->GetMaxPower(POWER_MANA)-32000); + me->SetPower(POWER_MANA, me->GetMaxPower(POWER_MANA) - 32000); DoCast(me, SPELL_POTION, false); } @@ -296,22 +300,24 @@ public: } } NormalCastTimer = 1000; - } else NormalCastTimer -= diff; + } + else NormalCastTimer -= diff; if (SecondarySpellTimer <= diff) { switch (urand(0, 1)) { - case 0: - DoCast(me, SPELL_AOE_CS); - break; - case 1: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_CHAINSOFICE); - break; + case 0: + DoCast(me, SPELL_AOE_CS); + break; + case 1: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + DoCast(target, SPELL_CHAINSOFICE); + break; } SecondarySpellTimer = urand(5000, 20000); - } else SecondarySpellTimer -= diff; + } + else SecondarySpellTimer -= diff; if (SuperCastTimer <= diff) { @@ -319,71 +325,133 @@ public: switch (LastSuperSpell) { - case SUPER_AE: - Available[0] = SUPER_FLAME; - Available[1] = SUPER_BLIZZARD; - break; - case SUPER_FLAME: - Available[0] = SUPER_AE; - Available[1] = SUPER_BLIZZARD; - break; - case SUPER_BLIZZARD: - Available[0] = SUPER_FLAME; - Available[1] = SUPER_AE; - break; + case SUPER_AE: + Available[0] = SUPER_FLAME; + Available[1] = SUPER_BLIZZARD; + break; + case SUPER_FLAME: + Available[0] = SUPER_AE; + Available[1] = SUPER_BLIZZARD; + break; + case SUPER_BLIZZARD: + Available[0] = SUPER_FLAME; + Available[1] = SUPER_AE; + break; } LastSuperSpell = Available[urand(0, 1)]; switch (LastSuperSpell) { - case SUPER_AE: - Talk(SAY_EXPLOSION); + case SUPER_AE: + Talk(SAY_EXPLOSION); - DoCast(me, SPELL_BLINK_CENTER, true); - DoCast(me, SPELL_PLAYERPULL, true); - DoCast(me, SPELL_MASSSLOW, true); - DoCast(me, SPELL_AEXPLOSION, false); - break; + DoCast(me, SPELL_BLINK_CENTER, true); + DoCast(me, SPELL_PLAYERPULL, true); + DoCast(me, SPELL_MASSSLOW, true); + DoCast(me, SPELL_AEXPLOSION, false); + break; - case SUPER_FLAME: - Talk(SAY_FLAMEWREATH); + case SUPER_FLAME: + Talk(SAY_FLAMEWREATH); - FlameWreathTimer = 20000; - FlameWreathCheckTime = 500; + FlameWreathTimer = 20000; + FlameWreathCheckTime = 500; - FlameWreathTarget[0] = 0; - FlameWreathTarget[1] = 0; - FlameWreathTarget[2] = 0; + FlameWreathTarget[0] = 0; + FlameWreathTarget[1] = 0; + FlameWreathTarget[2] = 0; - FlameWreathEffect(); - break; + FlameWreathEffect(); + break; - case SUPER_BLIZZARD: - Talk(SAY_BLIZZARD); + case SUPER_BLIZZARD: + Talk(SAY_BLIZZARD); - if (Creature* pSpawn = me->SummonCreature(CREATURE_ARAN_BLIZZARD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 25000)) - { - pSpawn->setFaction(me->getFaction()); - pSpawn->CastSpell(pSpawn, SPELL_CIRCULAR_BLIZZARD, false); - } - break; + if (Creature* pSpawn = me->SummonCreature(CREATURE_ARAN_BLIZZARD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 25000)) + { + pSpawn->setFaction(me->getFaction()); + pSpawn->CastSpell(pSpawn, SPELL_CIRCULAR_BLIZZARD, false); + } + break; } SuperCastTimer = urand(35000, 40000); - } else SuperCastTimer -= diff; + } + else SuperCastTimer -= diff; if (!ElementalsSpawned && HealthBelowPct(40)) { ElementalsSpawned = true; - for (uint32 i = 0; i < 4; ++i) + Creature* ElementalOne = NULL; + Creature* ElementalTwo = NULL; + Creature* ElementalThree = NULL; + Creature* ElementalFour = NULL; + + ElementalOne = me->SummonCreature(CREATURE_WATER_ELEMENTAL, -11168.1f, -1939.29f, 232.092f, 1.46f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 90000); + ElementalTwo = me->SummonCreature(CREATURE_WATER_ELEMENTAL, -11138.2f, -1915.38f, 232.092f, 3.00f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 90000); + ElementalThree = me->SummonCreature(CREATURE_WATER_ELEMENTAL, -11161.7f, -1885.36f, 232.092f, 4.59f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 90000); + ElementalFour = me->SummonCreature(CREATURE_WATER_ELEMENTAL, -11192.4f, -1909.36f, 232.092f, 6.19f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 90000); + + if (ElementalOne) { - if (Creature* unit = me->SummonCreature(CREATURE_WATER_ELEMENTAL, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 90000)) - { - unit->Attack(me->GetVictim(), true); - unit->setFaction(me->getFaction()); - } + Unit* pTarget = (SELECT_TARGET_RANDOM, 0); + if (!pTarget) + return; + + DoStartNoMovement(pTarget); + ElementalOne->SetInCombatWithZone(); + ElementalOne->CombatStart(pTarget); + ElementalOne->setFaction(me->getFaction()); + ElementalTwo->SetUnitMovementFlags(MOVEMENTFLAG_ROOT); + ElementalOne->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true); + ElementalOne->SetModifierValue(UNIT_MOD_RESISTANCE_FROST, BASE_VALUE, 0); + } + + if (ElementalTwo) + { + Unit* pTarget = (SELECT_TARGET_RANDOM, 0); + if (!pTarget) + return; + + DoStartNoMovement(pTarget); + ElementalTwo->SetInCombatWithZone(); + ElementalTwo->CombatStart(pTarget); + ElementalTwo->setFaction(me->getFaction()); + ElementalTwo->SetUnitMovementFlags(MOVEMENTFLAG_ROOT); + ElementalTwo->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true); + ElementalTwo->SetModifierValue(UNIT_MOD_RESISTANCE_FROST, BASE_VALUE, 0); + } + + if (ElementalThree) + { + Unit* pTarget = (SELECT_TARGET_RANDOM, 0); + if (!pTarget) + return; + + DoStartNoMovement(pTarget); + ElementalThree->SetInCombatWithZone(); + ElementalThree->CombatStart(pTarget); + ElementalThree->setFaction(me->getFaction()); + ElementalTwo->SetUnitMovementFlags(MOVEMENTFLAG_ROOT); + ElementalThree->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true); + ElementalThree->SetModifierValue(UNIT_MOD_RESISTANCE_FROST, BASE_VALUE, 0); + } + + if (ElementalFour) + { + Unit* pTarget = (SELECT_TARGET_RANDOM, 0); + if (!pTarget) + return; + + DoStartNoMovement(pTarget); + ElementalFour->SetInCombatWithZone(); + ElementalFour->CombatStart(pTarget); + ElementalFour->setFaction(me->getFaction()); + ElementalTwo->SetUnitMovementFlags(MOVEMENTFLAG_ROOT); + ElementalFour->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true); + ElementalFour->SetModifierValue(UNIT_MOD_RESISTANCE_FROST, BASE_VALUE, 0); } Talk(SAY_ELEMENTALS); @@ -403,7 +471,8 @@ public: Talk(SAY_TIMEOVER); BerserkTimer = 60000; - } else BerserkTimer -= diff; + } + else BerserkTimer -= diff; //Flame Wreath check if (FlameWreathTimer) @@ -428,7 +497,8 @@ public: } } FlameWreathCheckTime = 500; - } else FlameWreathCheckTime -= diff; + } + else FlameWreathCheckTime -= diff; } if (ArcaneCooldown && FireCooldown && FrostCooldown) @@ -457,9 +527,9 @@ public: switch (CurrentNormalSpell) { - case SPELL_ARCMISSLE: ArcaneCooldown = 5000; break; - case SPELL_FIREBALL: FireCooldown = 5000; break; - case SPELL_FROSTBOLT: FrostCooldown = 5000; break; + case SPELL_ARCMISSLE: ArcaneCooldown = 5000; break; + case SPELL_FIREBALL: FireCooldown = 5000; break; + case SPELL_FROSTBOLT: FrostCooldown = 5000; break; } } }; @@ -482,13 +552,16 @@ public: struct water_elementalAI : public ScriptedAI { - water_elementalAI(Creature* creature) : ScriptedAI(creature) { } + water_elementalAI(Creature* creature) : ScriptedAI(creature) + { + + } uint32 CastTimer; void Reset() { - CastTimer = 2000 + (rand()%3000); + CastTimer = 2000 + (rand() % 3000); } void EnterCombat(Unit* /*who*/) { } @@ -502,7 +575,8 @@ public: { DoCastVictim(SPELL_WATERBOLT); CastTimer = urand(2000, 5000); - } else CastTimer -= diff; + } + else CastTimer -= diff; } }; }; diff --git a/src/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp b/src/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp index 66ff6cfd7..4ec9028a9 100644 --- a/src/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp +++ b/src/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp @@ -48,8 +48,7 @@ enum Creatures { NPC_DEMONCHAINS = 17248, NPC_FIENDISHIMP = 17267, - NPC_PORTAL = 17265, - NPC_KILREK = 17229 + NPC_PORTAL = 17265 }; @@ -258,6 +257,7 @@ public: uint32 ShadowboltTimer; uint32 SummonTimer; uint32 BerserkTimer; + uint32 SummonKilrekTimer; bool SummonedPortals; bool Berserk; @@ -278,16 +278,17 @@ public: } } - PortalsCount = 0; - SacrificeTimer = 30000; - ShadowboltTimer = 5000; - SummonTimer = 10000; - BerserkTimer = 600000; + PortalsCount = 0; + SacrificeTimer = 30000; + ShadowboltTimer = 5000; + SummonTimer = 10000; + BerserkTimer = 600000; + SummonKilrekTimer = 0; - SummonedPortals = false; - Berserk = false; + SummonedPortals = false; + Berserk = false; - instance->SetData(TYPE_TERESTIAN, NOT_STARTED); + instance->SetData(DATA_TERESTIAN, NOT_STARTED); me->RemoveAurasDueToSpell(SPELL_BROKEN_PACT); @@ -305,6 +306,7 @@ public: void EnterCombat(Unit* /*who*/) { Talk(SAY_AGGRO); + DoZoneInCombat(); } void JustSummoned(Creature* summoned) @@ -341,8 +343,7 @@ public: } Talk(SAY_DEATH); - - instance->SetData(TYPE_TERESTIAN, DONE); + instance->SetData(DATA_TERESTIAN, DONE); } void UpdateAI(uint32 diff) @@ -350,6 +351,23 @@ public: if (!UpdateVictim()) return; + if (Minion* Kilrek = me->GetFirstMinion()) + { + if (!Kilrek->IsAlive()) + { + Kilrek->UnSummon(); + SummonKilrekTimer = 45000; + } + } + + + if (SummonKilrekTimer <= diff) + { + DoCast(me, SPELL_SUMMON_IMP, true); + me->RemoveAura(SPELL_BROKEN_PACT); + } + else SummonKilrekTimer -= diff; + if (SacrificeTimer <= diff) { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true); @@ -362,6 +380,7 @@ public: { CAST_AI(npc_demon_chain::npc_demon_chainAI, Chains->AI())->SacrificeGUID = target->GetGUID(); Chains->CastSpell(Chains, SPELL_DEMON_CHAINS, true); + Talk(SAY_SACRIFICE); SacrificeTimer = 30000; } diff --git a/src/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp b/src/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp index 3f39e6474..531eb424a 100644 --- a/src/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp +++ b/src/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp @@ -91,13 +91,15 @@ void SummonCroneIfReady(InstanceScript* instance, Creature* creature) if (instance->GetData(DATA_OPERA_OZ_DEATHCOUNT) == 4) { - if (Creature* pCrone = creature->SummonCreature(CREATURE_CRONE, -10891.96f, -1755.95f, creature->GetPositionZ(), 4.64f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, HOUR*2*IN_MILLISECONDS)) + if (Creature* pCrone = creature->SummonCreature(CREATURE_CRONE, -10891.96f, -1755.95f, creature->GetPositionZ(), 4.64f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, HOUR * 2 * IN_MILLISECONDS)) { if (creature->GetVictim()) pCrone->AI()->AttackStart(creature->GetVictim()); + pCrone->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + pCrone->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); } } -}; +} class boss_dorothee : public CreatureScript { @@ -113,21 +115,11 @@ public: { boss_dorotheeAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); } - InstanceScript* instance; - - uint32 AggroTimer; - - uint32 WaterBoltTimer; - uint32 FearTimer; - uint32 SummonTitoTimer; - - bool SummonedTito; - bool TitoDied; - - void Reset() + void Initialize() { AggroTimer = 500; @@ -139,9 +131,28 @@ public: TitoDied = false; } + InstanceScript* instance; + + + uint32 AggroTimer; + + uint32 WaterBoltTimer; + uint32 FearTimer; + uint32 SummonTitoTimer; + + bool SummonedTito; + bool TitoDied; + + + void Reset() + { + Initialize(); + } + void EnterCombat(Unit* /*who*/) { Talk(SAY_DOROTHEE_AGGRO); + DoZoneInCombat(); } void JustReachedHome() @@ -154,7 +165,6 @@ public: void JustDied(Unit* /*killer*/) { Talk(SAY_DOROTHEE_DEATH); - SummonCroneIfReady(instance, me); } @@ -236,7 +246,10 @@ public: YipTimer = 10000; } - void EnterCombat(Unit* /*who*/) { } + void EnterCombat(Unit* /*who*/) + { + DoZoneInCombat(); + } void JustDied(Unit* /*killer*/) { @@ -304,7 +317,7 @@ public: void Reset() { - AggroTimer = 13000; + AggroTimer = 11000; BrainBashTimer = 5000; BrainWipeTimer = 7000; } @@ -329,6 +342,7 @@ public: void EnterCombat(Unit* /*who*/) { Talk(SAY_STRAWMAN_AGGRO); + DoZoneInCombat(); } void JustReachedHome() @@ -422,7 +436,7 @@ public: { AggroTimer = 15000; CleaveTimer = 5000; - RustTimer = 30000; + RustTimer = 15000; RustCount = 0; } @@ -430,6 +444,7 @@ public: void EnterCombat(Unit* /*who*/) { Talk(SAY_TINHEAD_AGGRO); + DoZoneInCombat(); } void JustReachedHome() @@ -554,6 +569,7 @@ public: void EnterCombat(Unit* /*who*/) { Talk(SAY_ROAR_AGGRO); + DoZoneInCombat(); } void JustReachedHome() @@ -634,8 +650,8 @@ public: void Reset() { - CycloneTimer = 30000; - ChainLightningTimer = 10000; + CycloneTimer = 22000; + ChainLightningTimer = 8000; } void JustReachedHome() @@ -651,15 +667,14 @@ public: void EnterCombat(Unit* /*who*/) { Talk(SAY_CRONE_AGGRO); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + DoZoneInCombat(); } void JustDied(Unit* /*killer*/) { Talk(SAY_CRONE_DEATH); - instance->SetData(TYPE_OPERA, DONE); + instance->SetData(DATA_OPERA_PERFORMANCE, DONE); instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORLEFT), true); instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORRIGHT), true); @@ -679,13 +694,13 @@ public: { if (Creature* Cyclone = DoSpawnCreature(CREATURE_CYCLONE, float(urand(0, 9)), float(urand(0, 9)), 0, 0, TEMPSUMMON_TIMED_DESPAWN, 15000)) Cyclone->CastSpell(Cyclone, SPELL_CYCLONE_VISUAL, true); - CycloneTimer = 30000; + CycloneTimer = 22000; } else CycloneTimer -= diff; if (ChainLightningTimer <= diff) { DoCastVictim(SPELL_CHAIN_LIGHTNING); - ChainLightningTimer = 15000; + ChainLightningTimer = 8000; } else ChainLightningTimer -= diff; DoMeleeAttackIfReady(); @@ -731,7 +746,7 @@ public: Position pos; me->GetRandomNearPosition(pos, 10); me->GetMotionMaster()->MovePoint(0, pos); - MoveTimer = urand(5000, 8000); + MoveTimer = urand(3.000, 5000); } else MoveTimer -= diff; } }; @@ -830,6 +845,7 @@ public: void EnterCombat(Unit* /*who*/) { Talk(SAY_WOLF_AGGRO); + DoZoneInCombat(); } void KilledUnit(Unit* /*victim*/) @@ -846,7 +862,7 @@ public: { DoPlaySoundToSet(me, SOUND_WOLF_DEATH); - instance->SetData(TYPE_OPERA, DONE); + instance->SetData(DATA_OPERA_PERFORMANCE, DONE); instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORLEFT), true); instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORRIGHT), true); @@ -1051,7 +1067,10 @@ public: RomuloDead = false; } - void EnterCombat(Unit* /*who*/) { } + void EnterCombat(Unit* /*who*/) + { + DoZoneInCombat(); + } void AttackStart(Unit* who) { @@ -1090,7 +1109,7 @@ public: { Talk(SAY_JULIANNE_DEATH02); - instance->SetData(TYPE_OPERA, DONE); + instance->SetData(DATA_OPERA_PERFORMANCE, DONE); instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORLEFT), true); instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORRIGHT), true); if (GameObject* pSideEntrance = instance->instance->GetGameObject(instance->GetData64(DATA_GO_SIDE_ENTRANCE_DOOR))) @@ -1217,6 +1236,7 @@ public: void EnterCombat(Unit* /*who*/) { + DoZoneInCombat(); Talk(SAY_ROMULO_AGGRO); if (JulianneGUID) { @@ -1242,7 +1262,7 @@ public: { Talk(SAY_ROMULO_DEATH); - instance->SetData(TYPE_OPERA, DONE); + instance->SetData(DATA_OPERA_PERFORMANCE, DONE); instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORLEFT), true); instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORRIGHT), true); diff --git a/src/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp b/src/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp index f2097ae24..f7a687a85 100644 --- a/src/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp +++ b/src/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp @@ -1,298 +1,402 @@ -/* - * Originally written by Xinef - Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-AGPL -*/ #include "ScriptMgr.h" -#include "ScriptPCH.h" #include "InstanceScript.h" #include "karazhan.h" +const Position OptionalSpawn[] = +{ + { -10960.981445f, -1940.138428f, 46.178097f, 4.12f }, // Hyakiss the Lurker + { -10945.769531f, -2040.153320f, 49.474438f, 0.077f }, // Shadikith the Glider + { -10899.903320f, -2085.573730f, 49.474449f, 1.38f } // Rokad the Ravager +}; class instance_karazhan : public InstanceMapScript { - public: - instance_karazhan() : InstanceMapScript("instance_karazhan", 532) { } +public: + instance_karazhan() : InstanceMapScript("instance_karazhan", 532) { } - InstanceScript* GetInstanceScript(InstanceMap* map) const + InstanceScript* GetInstanceScript(InstanceMap* map) const override + { + return new instance_karazhan_InstanceMapScript(map); + } + + struct instance_karazhan_InstanceMapScript : public InstanceScript + { + instance_karazhan_InstanceMapScript(Map* map) : InstanceScript(map) { - return new instance_karazhan_InstanceMapScript(map); + SetBossNumber(EncounterCount); + + // 1 - OZ, 2 - HOOD, 3 - RAJ, this never gets altered. + OperaEvent = urand(EVENT_OZ, EVENT_RAJ); + OzDeathCount = 0; + OptionalBossCount = 0; } - struct instance_karazhan_InstanceMapScript : public InstanceScript + void OnCreatureCreate(Creature* creature) override { - instance_karazhan_InstanceMapScript(Map* map) : InstanceScript(map) { } - - - void Initialize() + switch (creature->GetEntry()) { - SetBossNumber(MAX_ENCOUNTERS); - _servantQuartersKills = 0; - _selectedRare = RAND(NPC_HYAKISS_THE_LURKER, NPC_SHADIKITH_THE_GLIDER, NPC_ROKAD_THE_RAVAGER); + case NPC_KILREK: + m_uiKilrekGUID = creature->GetGUID(); + break; + case NPC_TERESTIAN_ILLHOOF: + m_uiTerestianGUID = creature->GetGUID(); + break; + case NPC_MOROES: + m_uiMoroesGUID = creature->GetGUID(); + break; + case NPC_NIGHTBANE: + m_uiNightBaneGUID = creature->GetGUID(); } + } - void OnCreatureCreate(Creature* creature) + void OnUnitDeath(Unit* unit) override + { + Creature* creature = unit->ToCreature(); + if (!creature) + return; + + switch (creature->GetEntry()) { - - } - - void SetData(uint32 type, uint32 uiData) - { - switch (type) + case NPC_COLDMIST_WIDOW: + case NPC_COLDMIST_STALKER: + case NPC_SHADOWBAT: + case NPC_VAMPIRIC_SHADOWBAT: + case NPC_GREATER_SHADOWBAT: + case NPC_PHASE_HOUND: + case NPC_DREADBEAST: + case NPC_SHADOWBEAST: + if (GetBossState(DATA_OPTIONAL_BOSS) == TO_BE_DECIDED) { - case DATA_COUNT_SERVANT_QUARTERS_KILLS: - if (++_servantQuartersKills > 52) // 56 in total, not all have to be killed, almost all - { - SetBossState(TYPE_SERVANT_QUARTERS, NOT_STARTED); - SetBossState(TYPE_SERVANT_QUARTERS, DONE); - } - SaveToDB(); - break; - - /* - case TYPE_ATTUMEN: m_auiEncounter[0] = uiData; break; - case TYPE_MOROES: - if (m_auiEncounter[1] == DONE) - break; - m_auiEncounter[1] = uiData; - break; - case TYPE_MAIDEN: m_auiEncounter[2] = uiData; break; - case TYPE_OPTIONAL_BOSS: m_auiEncounter[3] = uiData; break; - case TYPE_OPERA: - m_auiEncounter[4] = uiData; - if (uiData == DONE) - instance->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, 16812, NULL); - break; - case TYPE_CURATOR: m_auiEncounter[5] = uiData; break; - case TYPE_ARAN: m_auiEncounter[6] = uiData; break; - case TYPE_TERESTIAN: m_auiEncounter[7] = uiData; break; - case TYPE_NETHERSPITE: m_auiEncounter[8] = uiData; break; - case TYPE_CHESS: - if (uiData == DONE) - DoRespawnGameObject(DustCoveredChest, DAY); - m_auiEncounter[9] = uiData; - break; - case TYPE_MALCHEZZAR: m_auiEncounter[10] = uiData; break; - case TYPE_NIGHTBANE: - if (m_auiEncounter[11] != DONE) - m_auiEncounter[11] = uiData; - break; - case DATA_OPERA_OZ_DEATHCOUNT: - if (uiData == SPECIAL) - ++m_uiOzDeathCount; - else if (uiData == IN_PROGRESS) - m_uiOzDeathCount = 0; - break; -*/ - } - } - - void SetData64(uint32 identifier, uint64 data) - { - // switch (identifier) - // { - //case DATA_IMAGE_OF_MEDIVH: ImageGUID = data; - // } - } - - void OnGameObjectCreate(GameObject* go) - { - /*switch (go->GetEntry()) - { - case 183932: m_uiCurtainGUID = go->GetGUID(); break; - case 184278: - m_uiStageDoorLeftGUID = go->GetGUID(); - if (m_auiEncounter[4] == DONE) - go->SetGoState(GO_STATE_ACTIVE); - break; - case 184279: - m_uiStageDoorRightGUID = go->GetGUID(); - if (m_auiEncounter[4] == DONE) - go->SetGoState(GO_STATE_ACTIVE); - break; - case 184517: m_uiLibraryDoor = go->GetGUID(); break; - case 185521: m_uiMassiveDoor = go->GetGUID(); break; - case 184276: m_uiGamesmansDoor = go->GetGUID(); break; - case 184277: m_uiGamesmansExitDoor = go->GetGUID(); break; - case 185134: m_uiNetherspaceDoor = go->GetGUID(); break; - case 184274: MastersTerraceDoor[0] = go->GetGUID(); break; - case 184280: MastersTerraceDoor[1] = go->GetGUID(); break; - case 184275: - m_uiSideEntranceDoor = go->GetGUID(); - if (m_auiEncounter[4] == DONE) - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); - else - go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); - break; - case 185119: DustCoveredChest = go->GetGUID(); break; - }*/ - } - - uint32 GetData(uint32 data) const - { - switch (data) - { - case DATA_SELECTED_RARE: - return _selectedRare; - } - - return 0; - } - - uint64 GetData64(uint32 data) const - { - /*switch (uiData) - { - case DATA_KILREK: return m_uiKilrekGUID; - case DATA_TERESTIAN: return m_uiTerestianGUID; - case DATA_MOROES: return m_uiMoroesGUID; - case DATA_GO_STAGEDOORLEFT: return m_uiStageDoorLeftGUID; - case DATA_GO_STAGEDOORRIGHT: return m_uiStageDoorRightGUID; - case DATA_GO_CURTAINS: return m_uiCurtainGUID; - case DATA_GO_LIBRARY_DOOR: return m_uiLibraryDoor; - case DATA_GO_MASSIVE_DOOR: return m_uiMassiveDoor; - case DATA_GO_SIDE_ENTRANCE_DOOR: return m_uiSideEntranceDoor; - case DATA_GO_GAME_DOOR: return m_uiGamesmansDoor; - case DATA_GO_GAME_EXIT_DOOR: return m_uiGamesmansExitDoor; - case DATA_GO_NETHER_DOOR: return m_uiNetherspaceDoor; - case DATA_MASTERS_TERRACE_DOOR_1: return MastersTerraceDoor[0]; - case DATA_MASTERS_TERRACE_DOOR_2: return MastersTerraceDoor[1]; - case DATA_IMAGE_OF_MEDIVH: return ImageGUID; - case DATA_NIGHTBANE: return m_uiNightbaneGUID; - } -*/ - return 0; - } - - std::string GetSaveData() - { - std::ostringstream saveStream; - saveStream << "K A " << GetBossSaveData() << _servantQuartersKills << ' ' << _selectedRare; - return saveStream.str(); - } - - void Load(char const* str) - { - if (!str) - return; - - char dataHead1, dataHead2; - - std::istringstream loadStream(str); - loadStream >> dataHead1 >> dataHead2; - - if (dataHead1 == 'K' && dataHead2 == 'A') - { - for (uint32 i = 0; i < MAX_ENCOUNTERS; ++i) + ++OptionalBossCount; + if (OptionalBossCount == OPTIONAL_BOSS_REQUIRED_DEATH_COUNT) { - uint32 tmpState; - loadStream >> tmpState; - if (tmpState == IN_PROGRESS || tmpState > SPECIAL) - tmpState = NOT_STARTED; - SetBossState(i, EncounterState(tmpState)); + switch (urand(NPC_HYAKISS_THE_LURKER, NPC_ROKAD_THE_RAVAGER)) + { + case NPC_HYAKISS_THE_LURKER: + instance->SummonCreature(NPC_HYAKISS_THE_LURKER, OptionalSpawn[0]); + break; + case NPC_SHADIKITH_THE_GLIDER: + instance->SummonCreature(NPC_SHADIKITH_THE_GLIDER, OptionalSpawn[1]); + break; + case NPC_ROKAD_THE_RAVAGER: + instance->SummonCreature(NPC_ROKAD_THE_RAVAGER, OptionalSpawn[2]); + break; + } } - - loadStream >> _servantQuartersKills; - loadStream >> _selectedRare; } + break; + default: + break; + } + } + + void SetData(uint32 type, uint32 data) override + { + switch (type) + { + case DATA_OPERA_OZ_DEATHCOUNT: + if (data == SPECIAL) + ++OzDeathCount; + else if (data == IN_PROGRESS) + OzDeathCount = 0; + break; + } + } + + bool SetBossState(uint32 type, EncounterState state) override + { + if (!InstanceScript::SetBossState(type, state)) + return false; + + switch (type) + { + case DATA_OPERA_PERFORMANCE: + if (state == DONE) + { + HandleGameObject(m_uiStageDoorLeftGUID, true); + HandleGameObject(m_uiStageDoorRightGUID, true); + if (GameObject* sideEntrance = instance->GetGameObject(m_uiSideEntranceDoor)) + sideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + + } + break; + case DATA_CHESS: + if (state == DONE) + DoRespawnGameObject(DustCoveredChest, DAY); + break; + default: + break; } - private: - uint32 _servantQuartersKills; - uint32 _selectedRare; - }; + return true; + } + + + void OnGameObjectCreate(GameObject* go) override + { + switch (go->GetEntry()) + { + case GO_STAGE_CURTAIN: + m_uiCurtainGUID = go->GetGUID(); + break; + case GO_STAGE_DOOR_LEFT: + m_uiStageDoorLeftGUID = go->GetGUID(); + if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE) + go->SetGoState(GO_STATE_ACTIVE); + break; + case GO_STAGE_DOOR_RIGHT: + m_uiStageDoorRightGUID = go->GetGUID(); + if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE) + go->SetGoState(GO_STATE_ACTIVE); + break; + case GO_PRIVATE_LIBRARY_DOOR: + m_uiLibraryDoor = go->GetGUID(); + break; + case GO_MASSIVE_DOOR: + m_uiMassiveDoor = go->GetGUID(); + if (GetBossState(DATA_ARAN) == !IN_PROGRESS) + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + else + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + break; + case GO_GAMESMAN_HALL_DOOR: + m_uiGamesmansDoor = go->GetGUID(); + break; + case GO_GAMESMAN_HALL_EXIT_DOOR: + m_uiGamesmansExitDoor = go->GetGUID(); + break; + case GO_NETHERSPACE_DOOR: + m_uiNetherspaceDoor = go->GetGUID(); + if (GetBossState(DATA_PRINCE) == !IN_PROGRESS) + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + else + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + break; + case GO_MASTERS_TERRACE_DOOR: + MastersTerraceDoor[0] = go->GetGUID(); + break; + case GO_MASTERS_TERRACE_DOOR2: + MastersTerraceDoor[1] = go->GetGUID(); + break; + case GO_SIDE_ENTRANCE_DOOR: + m_uiSideEntranceDoor = go->GetGUID(); + if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE) + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + else + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + break; + case GO_DUST_COVERED_CHEST: + DustCoveredChest = go->GetGUID(); + break; + + + } + + switch (OperaEvent) + { + /// @todo Set Object visibilities for Opera based on performance + case EVENT_OZ: + break; + + case EVENT_HOOD: + break; + + case EVENT_RAJ: + break; + } + } + + uint32 GetData(uint32 type) const override + { + switch (type) + { + case DATA_OPERA_PERFORMANCE: + return OperaEvent; + case DATA_OPERA_OZ_DEATHCOUNT: + return OzDeathCount; + + case DATA_KILREK: + return m_uiKilrekGUID; + case DATA_TERESTIAN: + return m_uiTerestianGUID; + case DATA_MOROES: + return m_uiMoroesGUID; + case DATA_GO_STAGEDOORLEFT: + return m_uiStageDoorLeftGUID; + case DATA_GO_STAGEDOORRIGHT: + return m_uiStageDoorRightGUID; + case DATA_GO_CURTAINS: + return m_uiCurtainGUID; + case DATA_GO_LIBRARY_DOOR: + return m_uiLibraryDoor; + case DATA_GO_MASSIVE_DOOR: + return m_uiMassiveDoor; + case DATA_GO_SIDE_ENTRANCE_DOOR: + return m_uiSideEntranceDoor; + case DATA_GO_GAME_DOOR: + return m_uiGamesmansDoor; + case DATA_GO_GAME_EXIT_DOOR: + return m_uiGamesmansExitDoor; + case DATA_GO_NETHER_DOOR: + return m_uiNetherspaceDoor; + case DATA_MASTERS_TERRACE_DOOR_1: + return MastersTerraceDoor[0]; + case DATA_MASTERS_TERRACE_DOOR_2: + return MastersTerraceDoor[1]; + case DATA_IMAGE_OF_MEDIVH: + return ImageGUID; + } + + return 0; + + + } + + uint64 GetData64(uint32 data) const + { + switch (data) + { + case DATA_KILREK: return m_uiKilrekGUID; + case DATA_TERESTIAN: return m_uiTerestianGUID; + case DATA_MOROES: return m_uiMoroesGUID; + case DATA_GO_STAGEDOORLEFT: return m_uiStageDoorLeftGUID; + case DATA_GO_STAGEDOORRIGHT: return m_uiStageDoorRightGUID; + case DATA_GO_CURTAINS: return m_uiCurtainGUID; + case DATA_GO_LIBRARY_DOOR: return m_uiLibraryDoor; + case DATA_GO_MASSIVE_DOOR: return m_uiMassiveDoor; + case DATA_GO_SIDE_ENTRANCE_DOOR: return m_uiSideEntranceDoor; + case DATA_GO_GAME_DOOR: return m_uiGamesmansDoor; + case DATA_GO_GAME_EXIT_DOOR: return m_uiGamesmansExitDoor; + case DATA_GO_NETHER_DOOR: return m_uiNetherspaceDoor; + case DATA_MASTERS_TERRACE_DOOR_1: return MastersTerraceDoor[0]; + case DATA_MASTERS_TERRACE_DOOR_2: return MastersTerraceDoor[1]; + case DATA_IMAGE_OF_MEDIVH: return ImageGUID; + case DATA_NIGHTBANE: return m_uiNightBaneGUID; + } + + return 0; + } + + private: + uint32 OperaEvent; + uint32 OzDeathCount; + uint32 OptionalBossCount; + uint32 m_auiEncounter[MAX_ENCOUNTERS]; + uint32 m_uiTeam; + uint64 m_uiCurtainGUID; + uint64 m_uiStageDoorLeftGUID; + uint64 m_uiStageDoorRightGUID; + uint64 m_uiKilrekGUID; + uint64 m_uiTerestianGUID; + uint64 m_uiMoroesGUID; + uint64 m_uiNightBaneGUID; + uint64 EchoOfMedivhGUID; + uint64 m_uiLibraryDoor; // Door at Shade of Aran + uint64 m_uiMassiveDoor; // Door at Netherspite + uint64 m_uiSideEntranceDoor; // Side Entrance + uint64 m_uiGamesmansDoor; // Door before Chess + uint64 m_uiGamesmansExitDoor; // Door after Chess + uint64 m_uiNetherspaceDoor; // Door at Malchezaar + uint64 m_uiServantsAccessDoor; // Door to Brocken Stair + uint64 MastersTerraceDoor[2]; + uint64 ImageGUID; + uint64 DustCoveredChest; + }; }; class spell_karazhan_brittle_bones : public SpellScriptLoader { - public: - spell_karazhan_brittle_bones() : SpellScriptLoader("spell_karazhan_brittle_bones") { } +public: + spell_karazhan_brittle_bones() : SpellScriptLoader("spell_karazhan_brittle_bones") { } - class spell_karazhan_brittle_bones_AuraScript : public AuraScript + class spell_karazhan_brittle_bones_AuraScript : public AuraScript + { + PrepareAuraScript(spell_karazhan_brittle_bones_AuraScript); + + void CalcPeriodic(AuraEffect const* /*effect*/, bool& isPeriodic, int32& amplitude) { - PrepareAuraScript(spell_karazhan_brittle_bones_AuraScript); - - void CalcPeriodic(AuraEffect const* /*effect*/, bool& isPeriodic, int32& amplitude) - { - isPeriodic = true; - amplitude = 5000; - } - - void Update(AuraEffect const* effect) - { - PreventDefaultAction(); - if (roll_chance_i(35)) - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_RATTLED, true); - } - - void Register() - { - DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_karazhan_brittle_bones_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_DUMMY); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_karazhan_brittle_bones_AuraScript::Update, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_karazhan_brittle_bones_AuraScript(); + isPeriodic = true; + amplitude = 5000; } + + void Update(AuraEffect const* effect) + { + PreventDefaultAction(); + if (roll_chance_i(35)) + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_RATTLED, true); + } + + void Register() + { + DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_karazhan_brittle_bones_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_DUMMY); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_karazhan_brittle_bones_AuraScript::Update, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_karazhan_brittle_bones_AuraScript(); + } }; class spell_karazhan_overload : public SpellScriptLoader { - public: - spell_karazhan_overload() : SpellScriptLoader("spell_karazhan_overload") { } +public: + spell_karazhan_overload() : SpellScriptLoader("spell_karazhan_overload") { } - class spell_karazhan_overload_AuraScript : public AuraScript + class spell_karazhan_overload_AuraScript : public AuraScript + { + PrepareAuraScript(spell_karazhan_overload_AuraScript); + + void PeriodicTick(AuraEffect const* auraEffect) { - PrepareAuraScript(spell_karazhan_overload_AuraScript); - - void PeriodicTick(AuraEffect const* auraEffect) - { - PreventDefaultAction(); - GetUnitOwner()->CastCustomSpell(SPELL_OVERLOAD, SPELLVALUE_BASE_POINT0, int32(auraEffect->GetAmount() * (2.0, auraEffect->GetTickNumber())), GetUnitOwner(), true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_karazhan_overload_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_karazhan_overload_AuraScript(); + PreventDefaultAction(); + GetUnitOwner()->CastCustomSpell(SPELL_OVERLOAD, SPELLVALUE_BASE_POINT0, int32(auraEffect->GetAmount() * (2.0, auraEffect->GetTickNumber())), GetUnitOwner(), true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_karazhan_overload_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_karazhan_overload_AuraScript(); + } }; class spell_karazhan_blink : public SpellScriptLoader { - public: - spell_karazhan_blink() : SpellScriptLoader("spell_karazhan_blink") { } +public: + spell_karazhan_blink() : SpellScriptLoader("spell_karazhan_blink") { } - class spell_karazhan_blink_SpellScript : public SpellScript + class spell_karazhan_blink_SpellScript : public SpellScript + { + PrepareSpellScript(spell_karazhan_blink_SpellScript); + + void HandleDummy(SpellEffIndex effIndex) { - PrepareSpellScript(spell_karazhan_blink_SpellScript); - - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetCaster()->getThreatManager().resetAllAggro(); - if (Unit* target = GetHitUnit()) - GetCaster()->CastSpell(target, SPELL_BLINK, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_karazhan_blink_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_karazhan_blink_SpellScript(); + PreventHitDefaultEffect(effIndex); + GetCaster()->getThreatManager().resetAllAggro(); + if (Unit* target = GetHitUnit()) + GetCaster()->CastSpell(target, SPELL_BLINK, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_karazhan_blink_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_karazhan_blink_SpellScript(); + } }; + void AddSC_instance_karazhan() { new instance_karazhan(); diff --git a/src/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/scripts/EasternKingdoms/Karazhan/karazhan.cpp index feae567a8..5c4d39e78 100644 --- a/src/scripts/EasternKingdoms/Karazhan/karazhan.cpp +++ b/src/scripts/EasternKingdoms/Karazhan/karazhan.cpp @@ -151,7 +151,7 @@ public: void StartEvent() { - instance->SetData(TYPE_OPERA, IN_PROGRESS); + instance->SetBossState(DATA_OPERA_PERFORMANCE, IN_PROGRESS); //resets count for this event, in case earlier failed if (m_uiEventId == EVENT_OZ) @@ -361,7 +361,7 @@ public: if (InstanceScript* instance = creature->GetInstanceScript()) { // Check for death of Moroes and if opera event is not done already - if (instance->GetData(TYPE_MOROES) == DONE && instance->GetData(TYPE_OPERA) != DONE) + if (instance->GetBossState(DATA_MOROES) == DONE && instance->GetBossState(DATA_OPERA_PERFORMANCE) != DONE) { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, OZ_GOSSIP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); diff --git a/src/scripts/EasternKingdoms/Karazhan/karazhan.h b/src/scripts/EasternKingdoms/Karazhan/karazhan.h index 6b4bafd46..910390163 100644 --- a/src/scripts/EasternKingdoms/Karazhan/karazhan.h +++ b/src/scripts/EasternKingdoms/Karazhan/karazhan.h @@ -1,78 +1,121 @@ /* - * Originally written by Xinef - Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-AGPL +* Copyright (C) 2008-2016 TrinityCore +* Copyright (C) 2006-2009 ScriptDev2 +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 2 of the License, or (at your +* option) any later version. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along +* with this program. If not, see . */ #ifndef DEF_KARAZHAN_H #define DEF_KARAZHAN_H -#include "ScriptPCH.h" +#define DataHeader "KZ" -enum DataTypes +uint32 const EncounterCount = 12; + +enum KZDataTypes { - TYPE_SERVANT_QUARTERS = 0, - TYPE_ATTUMEN = 1, - TYPE_MOROES = 2, - TYPE_MAIDEN = 3, - TYPE_OPTIONAL_BOSS = 4, - TYPE_OPERA = 5, - TYPE_CURATOR = 6, - TYPE_ARAN = 7, - TYPE_TERESTIAN = 8, - TYPE_NETHERSPITE = 9, - TYPE_CHESS = 10, - TYPE_MALCHEZZAR = 11, - TYPE_NIGHTBANE = 12, - MAX_ENCOUNTERS = 13, + DATA_ATTUMEN = 0, + DATA_MOROES = 1, + DATA_MAIDEN = 2, + DATA_OPTIONAL_BOSS = 3, + DATA_OPERA_PERFORMANCE = 4, + DATA_CURATOR = 5, + DATA_ARAN = 6, + DATA_TERESTIAN = 7, + DATA_NETHERSPITE = 8, + DATA_CHESS = 9, + DATA_MALCHEZZAR = 10, + DATA_NIGHTBANE = 11, + DATA_SERVANT_QUARTERS = 12, + DATA_SELECTED_RARE = 13, - DATA_OPERA_PERFORMANCE = 13, - DATA_OPERA_OZ_DEATHCOUNT = 14, + DATA_OPERA_OZ_DEATHCOUNT = 14, - DATA_KILREK = 15, - DATA_TERESTIAN = 16, - DATA_MOROES = 17, - DATA_GO_CURTAINS = 18, - DATA_GO_STAGEDOORLEFT = 19, - DATA_GO_STAGEDOORRIGHT = 20, - DATA_GO_LIBRARY_DOOR = 21, - DATA_GO_MASSIVE_DOOR = 22, - DATA_GO_NETHER_DOOR = 23, - DATA_GO_GAME_DOOR = 24, - DATA_GO_GAME_EXIT_DOOR = 25, + DATA_KILREK = 15, + MAX_ENCOUNTERS = 16, + DATA_GO_CURTAINS = 18, + DATA_GO_STAGEDOORLEFT = 19, + DATA_GO_STAGEDOORRIGHT = 20, + DATA_GO_LIBRARY_DOOR = 21, + DATA_GO_MASSIVE_DOOR = 22, + DATA_GO_NETHER_DOOR = 23, + DATA_GO_GAME_DOOR = 24, + DATA_GO_GAME_EXIT_DOOR = 25, - DATA_IMAGE_OF_MEDIVH = 26, - DATA_MASTERS_TERRACE_DOOR_1 = 27, - DATA_MASTERS_TERRACE_DOOR_2 = 28, - DATA_GO_SIDE_ENTRANCE_DOOR = 29, - - DATA_NIGHTBANE = 30, - - DATA_COUNT_SERVANT_QUARTERS_KILLS = 100, - DATA_SELECTED_RARE = 101, + DATA_IMAGE_OF_MEDIVH = 26, + DATA_MASTERS_TERRACE_DOOR_1 = 27, + DATA_MASTERS_TERRACE_DOOR_2 = 28, + DATA_GO_SIDE_ENTRANCE_DOOR = 29, + DATA_PRINCE = 30 }; -enum OperaEvents +enum KZOperaEvents { - EVENT_OZ = 1, - EVENT_HOOD = 2, - EVENT_RAJ = 3 + EVENT_OZ = 1, + EVENT_HOOD = 2, + EVENT_RAJ = 3 }; -enum KarazhanNPCs +enum KZMiscCreatures { - NPC_HYAKISS_THE_LURKER = 16179, - NPC_SHADIKITH_THE_GLIDER = 16180, - NPC_ROKAD_THE_RAVAGER = 16181, + NPC_HYAKISS_THE_LURKER = 16179, + NPC_ROKAD_THE_RAVAGER = 16181, + NPC_SHADIKITH_THE_GLIDER = 16180, + NPC_TERESTIAN_ILLHOOF = 15688, + NPC_MOROES = 15687, + NPC_ATTUMEN_THE_HUNTSMAN = 15550, + NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED = 16152, + NPC_NIGHTBANE = 17225, - NPC_ATTUMEN_THE_HUNTSMAN = 15550, - NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED = 16152 + // Trash + NPC_COLDMIST_WIDOW = 16171, + NPC_COLDMIST_STALKER = 16170, + NPC_SHADOWBAT = 16173, + NPC_VAMPIRIC_SHADOWBAT = 16175, + NPC_GREATER_SHADOWBAT = 16174, + NPC_PHASE_HOUND = 16178, + NPC_DREADBEAST = 16177, + NPC_SHADOWBEAST = 16176, + NPC_KILREK = 17229 +}; + +enum KZGameObjectIds +{ + GO_STAGE_CURTAIN = 183932, + GO_STAGE_DOOR_LEFT = 184278, + GO_STAGE_DOOR_RIGHT = 184279, + GO_PRIVATE_LIBRARY_DOOR = 184517, + GO_MASSIVE_DOOR = 185521, + GO_GAMESMAN_HALL_DOOR = 184276, + GO_GAMESMAN_HALL_EXIT_DOOR = 184277, + GO_NETHERSPACE_DOOR = 185134, + GO_MASTERS_TERRACE_DOOR = 184274, + GO_MASTERS_TERRACE_DOOR2 = 184280, + GO_SIDE_ENTRANCE_DOOR = 184275, + GO_DUST_COVERED_CHEST = 185119 +}; + +enum KZMisc +{ + OPTIONAL_BOSS_REQUIRED_DEATH_COUNT = 50 }; enum KarazhanSpells { - SPELL_RATTLED = 32437, - SPELL_OVERLOAD = 29766, - SPELL_BLINK = 29884 + SPELL_RATTLED = 32437, + SPELL_OVERLOAD = 29766, + SPELL_BLINK = 29884 }; #endif -