Karazhan changes to make it now playable for players. all event work apart form chess event

This commit is contained in:
lee1991
2016-12-26 09:34:53 +00:00
parent 298f3c0a8b
commit 6663e7986e
14 changed files with 820 additions and 539 deletions
@@ -40,7 +40,7 @@ class boss_curator : public CreatureScript
struct boss_curatorAI : public BossAI struct boss_curatorAI : public BossAI
{ {
boss_curatorAI(Creature* creature) : BossAI(creature, TYPE_CURATOR) { } boss_curatorAI(Creature* creature) : BossAI(creature, DATA_CURATOR) { }
void Reset() void Reset()
{ {
@@ -75,6 +75,7 @@ class boss_curator : public CreatureScript
events.ScheduleEvent(EVENT_SPELL_ASTRAL_FLARE, 6000); events.ScheduleEvent(EVENT_SPELL_ASTRAL_FLARE, 6000);
events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000); events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000);
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
DoZoneInCombat();
} }
void JustSummoned(Creature* summon) void JustSummoned(Creature* summon)
@@ -33,7 +33,7 @@ class boss_maiden_of_virtue : public CreatureScript
struct boss_maiden_of_virtueAI : public BossAI 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() 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_FIRE, 8000);
events.ScheduleEvent(EVENT_SPELL_HOLY_WRATH, 15000); events.ScheduleEvent(EVENT_SPELL_HOLY_WRATH, 15000);
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000); events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000);
DoZoneInCombat();
} }
void UpdateAI(uint32 diff) void UpdateAI(uint32 diff)
@@ -72,7 +72,7 @@ class boss_midnight : public CreatureScript
struct boss_midnightAI : public BossAI struct boss_midnightAI : public BossAI
{ {
boss_midnightAI(Creature* creature) : BossAI(creature, TYPE_ATTUMEN) { } boss_midnightAI(Creature* creature) : BossAI(creature, DATA_ATTUMEN) { }
void Reset() void Reset()
{ {
@@ -86,6 +86,7 @@ class boss_midnight : public CreatureScript
BossAI::EnterCombat(who); BossAI::EnterCombat(who);
events.ScheduleEvent(EVENT_CHECK_HEALTH_95, 0); events.ScheduleEvent(EVENT_CHECK_HEALTH_95, 0);
events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 6000); events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 6000);
DoZoneInCombat();
} }
void KilledUnit(Unit* /*victim*/) void KilledUnit(Unit* /*victim*/)
@@ -71,11 +71,14 @@ class boss_moroes : public CreatureScript
struct boss_moroesAI : public BossAI struct boss_moroesAI : public BossAI
{ {
boss_moroesAI(Creature* creature) : BossAI(creature, TYPE_MOROES) boss_moroesAI(Creature* creature) : BossAI(creature, DATA_MOROES)
{ {
_activeGuests = 0; _activeGuests = 0;
instance = creature->GetInstanceScript();
} }
InstanceScript* instance;
void InitializeAI() void InitializeAI()
{ {
BossAI::InitializeAI(); BossAI::InitializeAI();
@@ -128,6 +131,7 @@ class boss_moroes : public CreatureScript
_events2.Reset(); _events2.Reset();
me->CallForHelp(20.0f); me->CallForHelp(20.0f);
DoZoneInCombat();
} }
void KilledUnit(Unit* /*victim*/) void KilledUnit(Unit* /*victim*/)
@@ -144,7 +148,7 @@ class boss_moroes : public CreatureScript
summons.clear(); summons.clear();
BossAI::JustDied(killer); BossAI::JustDied(killer);
Talk(SAY_DEATH); Talk(SAY_DEATH);
instance->SetBossState(DATA_MOROES, DONE);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_GARROTE); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_GARROTE);
} }
@@ -216,7 +220,11 @@ class boss_moroes : public CreatureScript
events.ScheduleEvent(EVENT_SPELL_GARROTE, urand(5000, 7000)); events.ScheduleEvent(EVENT_SPELL_GARROTE, urand(5000, 7000));
return; return;
case EVENT_SPELL_GARROTE: 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); me->CastSpell(me, SPELL_VANISH_TELEPORT, false);
events.SetPhase(0);
break; break;
} }
@@ -249,6 +249,7 @@ public:
{ {
HandleDoors(false); HandleDoors(false);
SwitchToPortalPhase(); SwitchToPortalPhase();
DoZoneInCombat();
} }
void JustDied(Unit* /*killer*/) void JustDied(Unit* /*killer*/)
@@ -120,10 +120,10 @@ public:
if (instance) if (instance)
{ {
if (instance->GetData(TYPE_NIGHTBANE) == DONE) if (instance->GetData64(DATA_NIGHTBANE) == DONE)
me->DisappearAndDie(); me->DisappearAndDie();
else else
instance->SetData(TYPE_NIGHTBANE, NOT_STARTED); instance->SetData64(DATA_NIGHTBANE, NOT_STARTED);
} }
HandleTerraceDoors(true); HandleTerraceDoors(true);
@@ -150,7 +150,7 @@ public:
void EnterCombat(Unit* /*who*/) void EnterCombat(Unit* /*who*/)
{ {
if (instance) if (instance)
instance->SetData(TYPE_NIGHTBANE, IN_PROGRESS); instance->SetData64(DATA_NIGHTBANE, IN_PROGRESS);
HandleTerraceDoors(false); HandleTerraceDoors(false);
Talk(YELL_AGGRO); Talk(YELL_AGGRO);
@@ -165,7 +165,7 @@ public:
void JustDied(Unit* /*killer*/) void JustDied(Unit* /*killer*/)
{ {
if (instance) if (instance)
instance->SetData(TYPE_NIGHTBANE, DONE); instance->SetData(DATA_NIGHTBANE, DONE);
HandleTerraceDoors(true); HandleTerraceDoors(true);
} }
@@ -408,7 +408,7 @@ public:
{ {
if (InstanceScript* pInstance = pGo->GetInstanceScript()) 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))) if (Creature *cr = ObjectAccessor::GetCreature(*pPlayer, pInstance->GetData64(DATA_NIGHTBANE)))
cr->GetMotionMaster()->MovePoint(0, IntroWay[0][0], IntroWay[0][1], IntroWay[0][2]); cr->GetMotionMaster()->MovePoint(0, IntroWay[0][0], IntroWay[0][1], IntroWay[0][2]);
} }
@@ -128,7 +128,8 @@ public:
{ {
Cleanup(); Cleanup();
CleanupTimer = 0; CleanupTimer = 0;
} else CleanupTimer -= diff; }
else CleanupTimer -= diff;
} }
} }
@@ -340,6 +341,7 @@ public:
{ {
InfernalPoint *point = NULL; InfernalPoint *point = NULL;
Position pos; Position pos;
if ((me->GetMapId() != 532) || positions.empty()) if ((me->GetMapId() != 532) || positions.empty())
me->GetRandomNearPosition(pos, 60); me->GetRandomNearPosition(pos, 60);
else else
@@ -352,6 +354,7 @@ public:
if (infernal) if (infernal)
{ {
infernal->SetDisplayId(INFERNAL_MODEL_INVISIBLE); infernal->SetDisplayId(INFERNAL_MODEL_INVISIBLE);
infernal->setFaction(me->getFaction()); infernal->setFaction(me->getFaction());
if (point) if (point)
@@ -374,7 +377,8 @@ public:
{ {
EnfeebleResetHealth(); EnfeebleResetHealth();
EnfeebleResetTimer = 0; EnfeebleResetTimer = 0;
} else EnfeebleResetTimer -= diff; }
else EnfeebleResetTimer -= diff;
if (me->HasUnitState(UNIT_STATE_STUNNED)) // While shifting to phase 2 malchezaar stuns himself if (me->HasUnitState(UNIT_STATE_STUNNED)) // While shifting to phase 2 malchezaar stuns himself
return; return;
@@ -422,14 +426,13 @@ public:
Talk(SAY_AXE_TOSS2); Talk(SAY_AXE_TOSS2);
Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); 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); Creature* axe = me->SummonCreature(MALCHEZARS_AXE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1000);
if (axe) if (axe)
{ {
axe->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); axe->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
axe->setFaction(me->getFaction()); axe->setFaction(me->getFaction());
axes[i] = axe->GetGUID(); axe->GetGUID();
if (target) if (target)
{ {
axe->AI()->AttackStart(target); axe->AI()->AttackStart(target);
@@ -450,13 +453,15 @@ public:
{ {
DoCastVictim(SPELL_SUNDER_ARMOR); DoCastVictim(SPELL_SUNDER_ARMOR);
SunderArmorTimer = urand(10000, 18000); SunderArmorTimer = urand(10000, 18000);
} else SunderArmorTimer -= diff; }
else SunderArmorTimer -= diff;
if (Cleave_Timer <= diff) if (Cleave_Timer <= diff)
{ {
DoCastVictim(SPELL_CLEAVE); DoCastVictim(SPELL_CLEAVE);
Cleave_Timer = urand(6000, 12000); Cleave_Timer = urand(6000, 12000);
} else Cleave_Timer -= diff; }
else Cleave_Timer -= diff;
} }
else else
{ {
@@ -466,9 +471,7 @@ public:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
{ {
for (uint8 i = 0; i < 2; ++i) if (Unit* axe = ObjectAccessor::GetUnit(*me, axes[0]))
{
if (Unit* axe = ObjectAccessor::GetUnit(*me, axes[i]))
{ {
if (axe->GetVictim()) if (axe->GetVictim())
DoModifyThreatPercent(axe->GetVictim(), -100); DoModifyThreatPercent(axe->GetVictim(), -100);
@@ -479,14 +482,15 @@ public:
} }
} }
} }
} else AxesTargetSwitchTimer -= diff; else AxesTargetSwitchTimer -= diff;
if (AmplifyDamageTimer <= diff) if (AmplifyDamageTimer <= diff)
{ {
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
DoCast(target, SPELL_AMPLIFY_DAMAGE); DoCast(target, SPELL_AMPLIFY_DAMAGE);
AmplifyDamageTimer = urand(20000, 30000); AmplifyDamageTimer = urand(20000, 30000);
} else AmplifyDamageTimer -= diff; }
else AmplifyDamageTimer -= diff;
} }
//Time for global and double timers //Time for global and double timers
@@ -494,13 +498,15 @@ public:
{ {
SummonInfernal(diff); SummonInfernal(diff);
InfernalTimer = phase == 3 ? 14500 : 44500; // 15 secs in phase 3, 45 otherwise InfernalTimer = phase == 3 ? 14500 : 44500; // 15 secs in phase 3, 45 otherwise
} else InfernalTimer -= diff; }
else InfernalTimer -= diff;
if (ShadowNovaTimer <= diff) if (ShadowNovaTimer <= diff)
{ {
DoCastVictim(SPELL_SHADOWNOVA); DoCastVictim(SPELL_SHADOWNOVA);
ShadowNovaTimer = phase == 3 ? 31000 : uint32(-1); ShadowNovaTimer = phase == 3 ? 31000 : uint32(-1);
} else ShadowNovaTimer -= diff; }
else ShadowNovaTimer -= diff;
if (phase != 2) if (phase != 2)
{ {
@@ -516,7 +522,8 @@ public:
DoCast(target, SPELL_SW_PAIN); DoCast(target, SPELL_SW_PAIN);
SWPainTimer = 20000; SWPainTimer = 20000;
} else SWPainTimer -= diff; }
else SWPainTimer -= diff;
} }
if (phase != 3) if (phase != 3)
@@ -527,7 +534,8 @@ public:
EnfeebleTimer = 30000; EnfeebleTimer = 30000;
ShadowNovaTimer = 5000; ShadowNovaTimer = 5000;
EnfeebleResetTimer = 9000; EnfeebleResetTimer = 9000;
} else EnfeebleTimer -= diff; }
else EnfeebleTimer -= diff;
} }
if (phase == 2) if (phase == 2)
@@ -575,6 +583,7 @@ void netherspite_infernal::netherspite_infernalAI::Cleanup()
if (pMalchezaar && pMalchezaar->IsAlive()) if (pMalchezaar && pMalchezaar->IsAlive())
CAST_AI(boss_malchezaar::boss_malchezaarAI, pMalchezaar->AI())->Cleanup(me, point); CAST_AI(boss_malchezaar::boss_malchezaarAI, pMalchezaar->AI())->Cleanup(me, point);
} }
void AddSC_boss_malchezaar() void AddSC_boss_malchezaar()
@@ -42,7 +42,7 @@ class boss_servant_quarters : public CreatureScript
struct boss_servant_quartersAI : public BossAI 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() void Reset()
{ {
@@ -95,7 +95,7 @@ class boss_servant_quarters : public CreatureScript
switch (_events2.ExecuteEvent()) switch (_events2.ExecuteEvent())
{ {
case EVENT_CHECK_VISIBILITY: case EVENT_CHECK_VISIBILITY:
if (instance->GetBossState(TYPE_SERVANT_QUARTERS) == DONE) if (instance->GetBossState(DATA_SERVANT_QUARTERS) == DONE)
{ {
me->SetVisible(true); me->SetVisible(true);
me->SetReactState(REACT_AGGRESSIVE); me->SetReactState(REACT_AGGRESSIVE);
@@ -64,7 +64,7 @@ public:
struct boss_aranAI : public BossAI struct boss_aranAI : public BossAI
{ {
boss_aranAI(Creature* creature) : BossAI(creature, TYPE_ARAN) boss_aranAI(Creature* creature) : BossAI(creature, DATA_ARAN)
{ {
} }
@@ -117,7 +117,7 @@ public:
DrinkInturrupted = false; DrinkInturrupted = false;
// Not in progress // Not in progress
instance->SetData(TYPE_ARAN, NOT_STARTED); instance->SetData(DATA_ARAN, NOT_STARTED);
instance->HandleGameObject(instance->GetData64(DATA_GO_LIBRARY_DOOR), true); instance->HandleGameObject(instance->GetData64(DATA_GO_LIBRARY_DOOR), true);
} }
@@ -130,16 +130,19 @@ public:
{ {
Talk(SAY_DEATH); Talk(SAY_DEATH);
instance->SetData(TYPE_ARAN, DONE); instance->SetData(DATA_ARAN, DONE);
instance->HandleGameObject(instance->GetData64(DATA_GO_LIBRARY_DOOR), true); instance->HandleGameObject(instance->GetData64(DATA_GO_LIBRARY_DOOR), true);
} }
void EnterCombat(Unit* /*who*/) void EnterCombat(Unit* /*who*/)
{ {
Talk(SAY_AGGRO); Talk(SAY_AGGRO);
instance->SetData(TYPE_ARAN, IN_PROGRESS); instance->SetData(DATA_ARAN, IN_PROGRESS);
instance->HandleGameObject(instance->GetData64(DATA_GO_LIBRARY_DOOR), false); instance->HandleGameObject(instance->GetData64(DATA_GO_LIBRARY_DOOR), false);
DoZoneInCombat();
} }
void FlameWreathEffect() void FlameWreathEffect()
@@ -188,7 +191,8 @@ public:
{ {
instance->HandleGameObject(instance->GetData64(DATA_GO_LIBRARY_DOOR), false); instance->HandleGameObject(instance->GetData64(DATA_GO_LIBRARY_DOOR), false);
CloseDoorTimer = 0; CloseDoorTimer = 0;
} else CloseDoorTimer -= diff; }
else CloseDoorTimer -= diff;
} }
//Cooldowns for casts //Cooldowns for casts
@@ -296,7 +300,8 @@ public:
} }
} }
NormalCastTimer = 1000; NormalCastTimer = 1000;
} else NormalCastTimer -= diff; }
else NormalCastTimer -= diff;
if (SecondarySpellTimer <= diff) if (SecondarySpellTimer <= diff)
{ {
@@ -311,7 +316,8 @@ public:
break; break;
} }
SecondarySpellTimer = urand(5000, 20000); SecondarySpellTimer = urand(5000, 20000);
} else SecondarySpellTimer -= diff; }
else SecondarySpellTimer -= diff;
if (SuperCastTimer <= diff) if (SuperCastTimer <= diff)
{ {
@@ -371,19 +377,81 @@ public:
} }
SuperCastTimer = urand(35000, 40000); SuperCastTimer = urand(35000, 40000);
} else SuperCastTimer -= diff; }
else SuperCastTimer -= diff;
if (!ElementalsSpawned && HealthBelowPct(40)) if (!ElementalsSpawned && HealthBelowPct(40))
{ {
ElementalsSpawned = true; 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* pTarget = (SELECT_TARGET_RANDOM, 0);
{ if (!pTarget)
unit->Attack(me->GetVictim(), true); return;
unit->setFaction(me->getFaction());
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); Talk(SAY_ELEMENTALS);
@@ -403,7 +471,8 @@ public:
Talk(SAY_TIMEOVER); Talk(SAY_TIMEOVER);
BerserkTimer = 60000; BerserkTimer = 60000;
} else BerserkTimer -= diff; }
else BerserkTimer -= diff;
//Flame Wreath check //Flame Wreath check
if (FlameWreathTimer) if (FlameWreathTimer)
@@ -428,7 +497,8 @@ public:
} }
} }
FlameWreathCheckTime = 500; FlameWreathCheckTime = 500;
} else FlameWreathCheckTime -= diff; }
else FlameWreathCheckTime -= diff;
} }
if (ArcaneCooldown && FireCooldown && FrostCooldown) if (ArcaneCooldown && FireCooldown && FrostCooldown)
@@ -482,7 +552,10 @@ public:
struct water_elementalAI : public ScriptedAI struct water_elementalAI : public ScriptedAI
{ {
water_elementalAI(Creature* creature) : ScriptedAI(creature) { } water_elementalAI(Creature* creature) : ScriptedAI(creature)
{
}
uint32 CastTimer; uint32 CastTimer;
@@ -502,7 +575,8 @@ public:
{ {
DoCastVictim(SPELL_WATERBOLT); DoCastVictim(SPELL_WATERBOLT);
CastTimer = urand(2000, 5000); CastTimer = urand(2000, 5000);
} else CastTimer -= diff; }
else CastTimer -= diff;
} }
}; };
}; };
@@ -48,8 +48,7 @@ enum Creatures
{ {
NPC_DEMONCHAINS = 17248, NPC_DEMONCHAINS = 17248,
NPC_FIENDISHIMP = 17267, NPC_FIENDISHIMP = 17267,
NPC_PORTAL = 17265, NPC_PORTAL = 17265
NPC_KILREK = 17229
}; };
@@ -258,6 +257,7 @@ public:
uint32 ShadowboltTimer; uint32 ShadowboltTimer;
uint32 SummonTimer; uint32 SummonTimer;
uint32 BerserkTimer; uint32 BerserkTimer;
uint32 SummonKilrekTimer;
bool SummonedPortals; bool SummonedPortals;
bool Berserk; bool Berserk;
@@ -283,11 +283,12 @@ public:
ShadowboltTimer = 5000; ShadowboltTimer = 5000;
SummonTimer = 10000; SummonTimer = 10000;
BerserkTimer = 600000; BerserkTimer = 600000;
SummonKilrekTimer = 0;
SummonedPortals = false; SummonedPortals = false;
Berserk = false; Berserk = false;
instance->SetData(TYPE_TERESTIAN, NOT_STARTED); instance->SetData(DATA_TERESTIAN, NOT_STARTED);
me->RemoveAurasDueToSpell(SPELL_BROKEN_PACT); me->RemoveAurasDueToSpell(SPELL_BROKEN_PACT);
@@ -305,6 +306,7 @@ public:
void EnterCombat(Unit* /*who*/) void EnterCombat(Unit* /*who*/)
{ {
Talk(SAY_AGGRO); Talk(SAY_AGGRO);
DoZoneInCombat();
} }
void JustSummoned(Creature* summoned) void JustSummoned(Creature* summoned)
@@ -341,8 +343,7 @@ public:
} }
Talk(SAY_DEATH); Talk(SAY_DEATH);
instance->SetData(DATA_TERESTIAN, DONE);
instance->SetData(TYPE_TERESTIAN, DONE);
} }
void UpdateAI(uint32 diff) void UpdateAI(uint32 diff)
@@ -350,6 +351,23 @@ public:
if (!UpdateVictim()) if (!UpdateVictim())
return; 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) if (SacrificeTimer <= diff)
{ {
Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true); 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(); CAST_AI(npc_demon_chain::npc_demon_chainAI, Chains->AI())->SacrificeGUID = target->GetGUID();
Chains->CastSpell(Chains, SPELL_DEMON_CHAINS, true); Chains->CastSpell(Chains, SPELL_DEMON_CHAINS, true);
Talk(SAY_SACRIFICE); Talk(SAY_SACRIFICE);
SacrificeTimer = 30000; SacrificeTimer = 30000;
} }
@@ -95,9 +95,11 @@ void SummonCroneIfReady(InstanceScript* instance, Creature* creature)
{ {
if (creature->GetVictim()) if (creature->GetVictim())
pCrone->AI()->AttackStart(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 class boss_dorothee : public CreatureScript
{ {
@@ -113,21 +115,11 @@ public:
{ {
boss_dorotheeAI(Creature* creature) : ScriptedAI(creature) boss_dorotheeAI(Creature* creature) : ScriptedAI(creature)
{ {
Initialize();
instance = creature->GetInstanceScript(); instance = creature->GetInstanceScript();
} }
InstanceScript* instance; void Initialize()
uint32 AggroTimer;
uint32 WaterBoltTimer;
uint32 FearTimer;
uint32 SummonTitoTimer;
bool SummonedTito;
bool TitoDied;
void Reset()
{ {
AggroTimer = 500; AggroTimer = 500;
@@ -139,9 +131,28 @@ public:
TitoDied = false; TitoDied = false;
} }
InstanceScript* instance;
uint32 AggroTimer;
uint32 WaterBoltTimer;
uint32 FearTimer;
uint32 SummonTitoTimer;
bool SummonedTito;
bool TitoDied;
void Reset()
{
Initialize();
}
void EnterCombat(Unit* /*who*/) void EnterCombat(Unit* /*who*/)
{ {
Talk(SAY_DOROTHEE_AGGRO); Talk(SAY_DOROTHEE_AGGRO);
DoZoneInCombat();
} }
void JustReachedHome() void JustReachedHome()
@@ -154,7 +165,6 @@ public:
void JustDied(Unit* /*killer*/) void JustDied(Unit* /*killer*/)
{ {
Talk(SAY_DOROTHEE_DEATH); Talk(SAY_DOROTHEE_DEATH);
SummonCroneIfReady(instance, me); SummonCroneIfReady(instance, me);
} }
@@ -236,7 +246,10 @@ public:
YipTimer = 10000; YipTimer = 10000;
} }
void EnterCombat(Unit* /*who*/) { } void EnterCombat(Unit* /*who*/)
{
DoZoneInCombat();
}
void JustDied(Unit* /*killer*/) void JustDied(Unit* /*killer*/)
{ {
@@ -304,7 +317,7 @@ public:
void Reset() void Reset()
{ {
AggroTimer = 13000; AggroTimer = 11000;
BrainBashTimer = 5000; BrainBashTimer = 5000;
BrainWipeTimer = 7000; BrainWipeTimer = 7000;
} }
@@ -329,6 +342,7 @@ public:
void EnterCombat(Unit* /*who*/) void EnterCombat(Unit* /*who*/)
{ {
Talk(SAY_STRAWMAN_AGGRO); Talk(SAY_STRAWMAN_AGGRO);
DoZoneInCombat();
} }
void JustReachedHome() void JustReachedHome()
@@ -422,7 +436,7 @@ public:
{ {
AggroTimer = 15000; AggroTimer = 15000;
CleaveTimer = 5000; CleaveTimer = 5000;
RustTimer = 30000; RustTimer = 15000;
RustCount = 0; RustCount = 0;
} }
@@ -430,6 +444,7 @@ public:
void EnterCombat(Unit* /*who*/) void EnterCombat(Unit* /*who*/)
{ {
Talk(SAY_TINHEAD_AGGRO); Talk(SAY_TINHEAD_AGGRO);
DoZoneInCombat();
} }
void JustReachedHome() void JustReachedHome()
@@ -554,6 +569,7 @@ public:
void EnterCombat(Unit* /*who*/) void EnterCombat(Unit* /*who*/)
{ {
Talk(SAY_ROAR_AGGRO); Talk(SAY_ROAR_AGGRO);
DoZoneInCombat();
} }
void JustReachedHome() void JustReachedHome()
@@ -634,8 +650,8 @@ public:
void Reset() void Reset()
{ {
CycloneTimer = 30000; CycloneTimer = 22000;
ChainLightningTimer = 10000; ChainLightningTimer = 8000;
} }
void JustReachedHome() void JustReachedHome()
@@ -651,15 +667,14 @@ public:
void EnterCombat(Unit* /*who*/) void EnterCombat(Unit* /*who*/)
{ {
Talk(SAY_CRONE_AGGRO); Talk(SAY_CRONE_AGGRO);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); DoZoneInCombat();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
} }
void JustDied(Unit* /*killer*/) void JustDied(Unit* /*killer*/)
{ {
Talk(SAY_CRONE_DEATH); 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_STAGEDOORLEFT), true);
instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORRIGHT), 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)) 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); Cyclone->CastSpell(Cyclone, SPELL_CYCLONE_VISUAL, true);
CycloneTimer = 30000; CycloneTimer = 22000;
} else CycloneTimer -= diff; } else CycloneTimer -= diff;
if (ChainLightningTimer <= diff) if (ChainLightningTimer <= diff)
{ {
DoCastVictim(SPELL_CHAIN_LIGHTNING); DoCastVictim(SPELL_CHAIN_LIGHTNING);
ChainLightningTimer = 15000; ChainLightningTimer = 8000;
} else ChainLightningTimer -= diff; } else ChainLightningTimer -= diff;
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
@@ -731,7 +746,7 @@ public:
Position pos; Position pos;
me->GetRandomNearPosition(pos, 10); me->GetRandomNearPosition(pos, 10);
me->GetMotionMaster()->MovePoint(0, pos); me->GetMotionMaster()->MovePoint(0, pos);
MoveTimer = urand(5000, 8000); MoveTimer = urand(3.000, 5000);
} else MoveTimer -= diff; } else MoveTimer -= diff;
} }
}; };
@@ -830,6 +845,7 @@ public:
void EnterCombat(Unit* /*who*/) void EnterCombat(Unit* /*who*/)
{ {
Talk(SAY_WOLF_AGGRO); Talk(SAY_WOLF_AGGRO);
DoZoneInCombat();
} }
void KilledUnit(Unit* /*victim*/) void KilledUnit(Unit* /*victim*/)
@@ -846,7 +862,7 @@ public:
{ {
DoPlaySoundToSet(me, SOUND_WOLF_DEATH); 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_STAGEDOORLEFT), true);
instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORRIGHT), true); instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORRIGHT), true);
@@ -1051,7 +1067,10 @@ public:
RomuloDead = false; RomuloDead = false;
} }
void EnterCombat(Unit* /*who*/) { } void EnterCombat(Unit* /*who*/)
{
DoZoneInCombat();
}
void AttackStart(Unit* who) void AttackStart(Unit* who)
{ {
@@ -1090,7 +1109,7 @@ public:
{ {
Talk(SAY_JULIANNE_DEATH02); 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_STAGEDOORLEFT), true);
instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORRIGHT), true); instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORRIGHT), true);
if (GameObject* pSideEntrance = instance->instance->GetGameObject(instance->GetData64(DATA_GO_SIDE_ENTRANCE_DOOR))) if (GameObject* pSideEntrance = instance->instance->GetGameObject(instance->GetData64(DATA_GO_SIDE_ENTRANCE_DOOR)))
@@ -1217,6 +1236,7 @@ public:
void EnterCombat(Unit* /*who*/) void EnterCombat(Unit* /*who*/)
{ {
DoZoneInCombat();
Talk(SAY_ROMULO_AGGRO); Talk(SAY_ROMULO_AGGRO);
if (JulianneGUID) if (JulianneGUID)
{ {
@@ -1242,7 +1262,7 @@ public:
{ {
Talk(SAY_ROMULO_DEATH); 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_STAGEDOORLEFT), true);
instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORRIGHT), true); instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORRIGHT), true);
@@ -1,146 +1,261 @@
/*
* Originally written by Xinef - Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU AGPL v3 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-AGPL
*/
#include "ScriptMgr.h" #include "ScriptMgr.h"
#include "ScriptPCH.h"
#include "InstanceScript.h" #include "InstanceScript.h"
#include "karazhan.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 class instance_karazhan : public InstanceMapScript
{ {
public: public:
instance_karazhan() : InstanceMapScript("instance_karazhan", 532) { } instance_karazhan() : InstanceMapScript("instance_karazhan", 532) { }
InstanceScript* GetInstanceScript(InstanceMap* map) const InstanceScript* GetInstanceScript(InstanceMap* map) const override
{ {
return new instance_karazhan_InstanceMapScript(map); return new instance_karazhan_InstanceMapScript(map);
} }
struct instance_karazhan_InstanceMapScript : public InstanceScript struct instance_karazhan_InstanceMapScript : public InstanceScript
{ {
instance_karazhan_InstanceMapScript(Map* map) : InstanceScript(map) { } instance_karazhan_InstanceMapScript(Map* map) : InstanceScript(map)
void Initialize()
{ {
SetBossNumber(MAX_ENCOUNTERS); SetBossNumber(EncounterCount);
_servantQuartersKills = 0;
_selectedRare = RAND(NPC_HYAKISS_THE_LURKER, NPC_SHADIKITH_THE_GLIDER, NPC_ROKAD_THE_RAVAGER); // 1 - OZ, 2 - HOOD, 3 - RAJ, this never gets altered.
OperaEvent = urand(EVENT_OZ, EVENT_RAJ);
OzDeathCount = 0;
OptionalBossCount = 0;
} }
void OnCreatureCreate(Creature* creature) void OnCreatureCreate(Creature* creature) override
{ {
switch (creature->GetEntry())
{
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 SetData(uint32 type, uint32 uiData) void OnUnitDeath(Unit* unit) override
{
Creature* creature = unit->ToCreature();
if (!creature)
return;
switch (creature->GetEntry())
{
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)
{
++OptionalBossCount;
if (OptionalBossCount == OPTIONAL_BOSS_REQUIRED_DEATH_COUNT)
{
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;
}
}
}
break;
default:
break;
}
}
void SetData(uint32 type, uint32 data) override
{ {
switch (type) switch (type)
{ {
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: case DATA_OPERA_OZ_DEATHCOUNT:
if (uiData == SPECIAL) if (data == SPECIAL)
++m_uiOzDeathCount; ++OzDeathCount;
else if (uiData == IN_PROGRESS) else if (data == IN_PROGRESS)
m_uiOzDeathCount = 0; OzDeathCount = 0;
break; break;
*/
} }
} }
void SetData64(uint32 identifier, uint64 data) bool SetBossState(uint32 type, EncounterState state) override
{ {
// switch (identifier) if (!InstanceScript::SetBossState(type, state))
// { return false;
//case DATA_IMAGE_OF_MEDIVH: ImageGUID = data;
// } 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;
} }
void OnGameObjectCreate(GameObject* go) return true;
}
void OnGameObjectCreate(GameObject* go) override
{ {
/*switch (go->GetEntry()) switch (go->GetEntry())
{ {
case 183932: m_uiCurtainGUID = go->GetGUID(); break; case GO_STAGE_CURTAIN:
case 184278: m_uiCurtainGUID = go->GetGUID();
break;
case GO_STAGE_DOOR_LEFT:
m_uiStageDoorLeftGUID = go->GetGUID(); m_uiStageDoorLeftGUID = go->GetGUID();
if (m_auiEncounter[4] == DONE) if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE)
go->SetGoState(GO_STATE_ACTIVE); go->SetGoState(GO_STATE_ACTIVE);
break; break;
case 184279: case GO_STAGE_DOOR_RIGHT:
m_uiStageDoorRightGUID = go->GetGUID(); m_uiStageDoorRightGUID = go->GetGUID();
if (m_auiEncounter[4] == DONE) if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE)
go->SetGoState(GO_STATE_ACTIVE); go->SetGoState(GO_STATE_ACTIVE);
break; break;
case 184517: m_uiLibraryDoor = go->GetGUID(); break; case GO_PRIVATE_LIBRARY_DOOR:
case 185521: m_uiMassiveDoor = go->GetGUID(); break; m_uiLibraryDoor = go->GetGUID();
case 184276: m_uiGamesmansDoor = go->GetGUID(); break; break;
case 184277: m_uiGamesmansExitDoor = go->GetGUID(); break; case GO_MASSIVE_DOOR:
case 185134: m_uiNetherspaceDoor = go->GetGUID(); break; m_uiMassiveDoor = go->GetGUID();
case 184274: MastersTerraceDoor[0] = go->GetGUID(); break; if (GetBossState(DATA_ARAN) == !IN_PROGRESS)
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); go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED);
else else
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED);
break; break;
case 185119: DustCoveredChest = go->GetGUID(); 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;
} }
uint32 GetData(uint32 data) const switch (OperaEvent)
{ {
switch (data) /// @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
{ {
case DATA_SELECTED_RARE: switch (type)
return _selectedRare; {
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; return 0;
} }
uint64 GetData64(uint32 data) const uint64 GetData64(uint32 data) const
{ {
/*switch (uiData) switch (data)
{ {
case DATA_KILREK: return m_uiKilrekGUID; case DATA_KILREK: return m_uiKilrekGUID;
case DATA_TERESTIAN: return m_uiTerestianGUID; case DATA_TERESTIAN: return m_uiTerestianGUID;
@@ -157,48 +272,36 @@ class instance_karazhan : public InstanceMapScript
case DATA_MASTERS_TERRACE_DOOR_1: return MastersTerraceDoor[0]; case DATA_MASTERS_TERRACE_DOOR_1: return MastersTerraceDoor[0];
case DATA_MASTERS_TERRACE_DOOR_2: return MastersTerraceDoor[1]; case DATA_MASTERS_TERRACE_DOOR_2: return MastersTerraceDoor[1];
case DATA_IMAGE_OF_MEDIVH: return ImageGUID; case DATA_IMAGE_OF_MEDIVH: return ImageGUID;
case DATA_NIGHTBANE: return m_uiNightbaneGUID; case DATA_NIGHTBANE: return m_uiNightBaneGUID;
} }
*/
return 0; 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)
{
uint32 tmpState;
loadStream >> tmpState;
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
tmpState = NOT_STARTED;
SetBossState(i, EncounterState(tmpState));
}
loadStream >> _servantQuartersKills;
loadStream >> _selectedRare;
}
}
private: private:
uint32 _servantQuartersKills; uint32 OperaEvent;
uint32 _selectedRare; 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;
}; };
}; };
@@ -293,6 +396,7 @@ class spell_karazhan_blink : public SpellScriptLoader
} }
}; };
void AddSC_instance_karazhan() void AddSC_instance_karazhan()
{ {
new instance_karazhan(); new instance_karazhan();
@@ -151,7 +151,7 @@ public:
void StartEvent() void StartEvent()
{ {
instance->SetData(TYPE_OPERA, IN_PROGRESS); instance->SetBossState(DATA_OPERA_PERFORMANCE, IN_PROGRESS);
//resets count for this event, in case earlier failed //resets count for this event, in case earlier failed
if (m_uiEventId == EVENT_OZ) if (m_uiEventId == EVENT_OZ)
@@ -361,7 +361,7 @@ public:
if (InstanceScript* instance = creature->GetInstanceScript()) if (InstanceScript* instance = creature->GetInstanceScript())
{ {
// Check for death of Moroes and if opera event is not done already // 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); player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, OZ_GOSSIP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+74 -31
View File
@@ -1,35 +1,49 @@
/* /*
* Originally written by Xinef - Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU AGPL v3 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-AGPL * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
* Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* 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 <http://www.gnu.org/licenses/>.
*/ */
#ifndef DEF_KARAZHAN_H #ifndef DEF_KARAZHAN_H
#define 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, DATA_ATTUMEN = 0,
TYPE_ATTUMEN = 1, DATA_MOROES = 1,
TYPE_MOROES = 2, DATA_MAIDEN = 2,
TYPE_MAIDEN = 3, DATA_OPTIONAL_BOSS = 3,
TYPE_OPTIONAL_BOSS = 4, DATA_OPERA_PERFORMANCE = 4,
TYPE_OPERA = 5, DATA_CURATOR = 5,
TYPE_CURATOR = 6, DATA_ARAN = 6,
TYPE_ARAN = 7, DATA_TERESTIAN = 7,
TYPE_TERESTIAN = 8, DATA_NETHERSPITE = 8,
TYPE_NETHERSPITE = 9, DATA_CHESS = 9,
TYPE_CHESS = 10, DATA_MALCHEZZAR = 10,
TYPE_MALCHEZZAR = 11, DATA_NIGHTBANE = 11,
TYPE_NIGHTBANE = 12, DATA_SERVANT_QUARTERS = 12,
MAX_ENCOUNTERS = 13, DATA_SELECTED_RARE = 13,
DATA_OPERA_PERFORMANCE = 13,
DATA_OPERA_OZ_DEATHCOUNT = 14, DATA_OPERA_OZ_DEATHCOUNT = 14,
DATA_KILREK = 15, DATA_KILREK = 15,
DATA_TERESTIAN = 16, MAX_ENCOUNTERS = 16,
DATA_MOROES = 17,
DATA_GO_CURTAINS = 18, DATA_GO_CURTAINS = 18,
DATA_GO_STAGEDOORLEFT = 19, DATA_GO_STAGEDOORLEFT = 19,
DATA_GO_STAGEDOORRIGHT = 20, DATA_GO_STAGEDOORRIGHT = 20,
@@ -43,28 +57,58 @@ enum DataTypes
DATA_MASTERS_TERRACE_DOOR_1 = 27, DATA_MASTERS_TERRACE_DOOR_1 = 27,
DATA_MASTERS_TERRACE_DOOR_2 = 28, DATA_MASTERS_TERRACE_DOOR_2 = 28,
DATA_GO_SIDE_ENTRANCE_DOOR = 29, DATA_GO_SIDE_ENTRANCE_DOOR = 29,
DATA_PRINCE = 30
DATA_NIGHTBANE = 30,
DATA_COUNT_SERVANT_QUARTERS_KILLS = 100,
DATA_SELECTED_RARE = 101,
}; };
enum OperaEvents enum KZOperaEvents
{ {
EVENT_OZ = 1, EVENT_OZ = 1,
EVENT_HOOD = 2, EVENT_HOOD = 2,
EVENT_RAJ = 3 EVENT_RAJ = 3
}; };
enum KarazhanNPCs enum KZMiscCreatures
{ {
NPC_HYAKISS_THE_LURKER = 16179, NPC_HYAKISS_THE_LURKER = 16179,
NPC_SHADIKITH_THE_GLIDER = 16180,
NPC_ROKAD_THE_RAVAGER = 16181, 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 = 15550,
NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED = 16152 NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED = 16152,
NPC_NIGHTBANE = 17225,
// 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 enum KarazhanSpells
@@ -75,4 +119,3 @@ enum KarazhanSpells
}; };
#endif #endif