Karazhan changes to make it now playable for players. all event work apart form chess event
This commit is contained in:
@@ -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]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
|
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
|
||||||
* Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
|
* Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
|
||||||
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
|
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* ScriptData
|
/* ScriptData
|
||||||
SDName: Boss_Prince_Malchezzar
|
SDName: Boss_Prince_Malchezzar
|
||||||
@@ -26,24 +26,24 @@ struct InfernalPoint
|
|||||||
|
|
||||||
static InfernalPoint InfernalPoints[] =
|
static InfernalPoint InfernalPoints[] =
|
||||||
{
|
{
|
||||||
{-10922.8f, -1985.2f},
|
{ -10922.8f, -1985.2f },
|
||||||
{-10916.2f, -1996.2f},
|
{ -10916.2f, -1996.2f },
|
||||||
{-10932.2f, -2008.1f},
|
{ -10932.2f, -2008.1f },
|
||||||
{-10948.8f, -2022.1f},
|
{ -10948.8f, -2022.1f },
|
||||||
{-10958.7f, -1997.7f},
|
{ -10958.7f, -1997.7f },
|
||||||
{-10971.5f, -1997.5f},
|
{ -10971.5f, -1997.5f },
|
||||||
{-10990.8f, -1995.1f},
|
{ -10990.8f, -1995.1f },
|
||||||
{-10989.8f, -1976.5f},
|
{ -10989.8f, -1976.5f },
|
||||||
{-10971.6f, -1973.0f},
|
{ -10971.6f, -1973.0f },
|
||||||
{-10955.5f, -1974.0f},
|
{ -10955.5f, -1974.0f },
|
||||||
{-10939.6f, -1969.8f},
|
{ -10939.6f, -1969.8f },
|
||||||
{-10958.0f, -1952.2f},
|
{ -10958.0f, -1952.2f },
|
||||||
{-10941.7f, -1954.8f},
|
{ -10941.7f, -1954.8f },
|
||||||
{-10943.1f, -1988.5f},
|
{ -10943.1f, -1988.5f },
|
||||||
{-10948.8f, -2005.1f},
|
{ -10948.8f, -2005.1f },
|
||||||
{-10984.0f, -2019.3f},
|
{ -10984.0f, -2019.3f },
|
||||||
{-10932.8f, -1979.6f},
|
{ -10932.8f, -1979.6f },
|
||||||
{-10935.7f, -1996.0f}
|
{ -10935.7f, -1996.0f }
|
||||||
};
|
};
|
||||||
|
|
||||||
//Enfeeble is supposed to reduce hp to 1 and then heal player back to full when it ends
|
//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
|
//This spell effect will only reduce healing
|
||||||
enum PrinceMalchezaar
|
enum PrinceMalchezaar
|
||||||
{
|
{
|
||||||
SAY_AGGRO = 0,
|
SAY_AGGRO = 0,
|
||||||
SAY_AXE_TOSS1 = 1,
|
SAY_AXE_TOSS1 = 1,
|
||||||
SAY_AXE_TOSS2 = 2,
|
SAY_AXE_TOSS2 = 2,
|
||||||
// SAY_SPECIAL1 = 3, Not used, needs to be implemented, but I don't know where it should be used.
|
// 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_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_SPECIAL3 = 5, Not used, needs to be implemented, but I don't know where it should be used.
|
||||||
SAY_SLAY = 6,
|
SAY_SLAY = 6,
|
||||||
SAY_SUMMON = 7,
|
SAY_SUMMON = 7,
|
||||||
SAY_DEATH = 8,
|
SAY_DEATH = 8,
|
||||||
|
|
||||||
TOTAL_INFERNAL_POINTS = 18,
|
TOTAL_INFERNAL_POINTS = 18,
|
||||||
|
|
||||||
SPELL_ENFEEBLE = 30843, //Enfeeble during phase 1 and 2
|
SPELL_ENFEEBLE = 30843, //Enfeeble during phase 1 and 2
|
||||||
SPELL_ENFEEBLE_EFFECT = 41624,
|
SPELL_ENFEEBLE_EFFECT = 41624,
|
||||||
|
|
||||||
SPELL_SHADOWNOVA = 30852, //Shadownova used during all phases
|
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_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_THRASH_PASSIVE = 12787, //Extra attack chance during phase 2
|
||||||
SPELL_SUNDER_ARMOR = 30901, //Sunder armor during phase 2
|
SPELL_SUNDER_ARMOR = 30901, //Sunder armor during phase 2
|
||||||
SPELL_THRASH_AURA = 12787, //Passive proc chance for thrash
|
SPELL_THRASH_AURA = 12787, //Passive proc chance for thrash
|
||||||
SPELL_EQUIP_AXES = 30857, //Visual for axe equiping
|
SPELL_EQUIP_AXES = 30857, //Visual for axe equiping
|
||||||
SPELL_AMPLIFY_DAMAGE = 39095, //Amplifiy during phase 3
|
SPELL_AMPLIFY_DAMAGE = 39095, //Amplifiy during phase 3
|
||||||
SPELL_CLEAVE = 30131, //Same as Nightbane.
|
SPELL_CLEAVE = 30131, //Same as Nightbane.
|
||||||
SPELL_HELLFIRE = 30859, //Infenals' hellfire aura
|
SPELL_HELLFIRE = 30859, //Infenals' hellfire aura
|
||||||
NETHERSPITE_INFERNAL = 17646, //The netherspite infernal creature
|
NETHERSPITE_INFERNAL = 17646, //The netherspite infernal creature
|
||||||
MALCHEZARS_AXE = 17650, //Malchezar's axes (creatures), summoned during phase 3
|
MALCHEZARS_AXE = 17650, //Malchezar's axes (creatures), summoned during phase 3
|
||||||
|
|
||||||
INFERNAL_MODEL_INVISIBLE = 11686, //Infernal Effects
|
INFERNAL_MODEL_INVISIBLE = 11686, //Infernal Effects
|
||||||
SPELL_INFERNAL_RELAY = 30834,
|
SPELL_INFERNAL_RELAY = 30834,
|
||||||
|
|
||||||
EQUIP_ID_AXE = 33542 //Axes info
|
EQUIP_ID_AXE = 33542 //Axes info
|
||||||
};
|
};
|
||||||
|
|
||||||
//---------Infernal code first
|
//---------Infernal code first
|
||||||
@@ -128,7 +128,8 @@ public:
|
|||||||
{
|
{
|
||||||
Cleanup();
|
Cleanup();
|
||||||
CleanupTimer = 0;
|
CleanupTimer = 0;
|
||||||
} else CleanupTimer -= diff;
|
}
|
||||||
|
else CleanupTimer -= diff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -310,7 +311,7 @@ public:
|
|||||||
|
|
||||||
//cut down to size if we have more than 5 targets
|
//cut down to size if we have more than 5 targets
|
||||||
while (targets.size() > 5)
|
while (targets.size() > 5)
|
||||||
targets.erase(targets.begin()+rand()%targets.size());
|
targets.erase(targets.begin() + rand() % targets.size());
|
||||||
|
|
||||||
uint32 i = 0;
|
uint32 i = 0;
|
||||||
for (std::vector<Unit*>::const_iterator iter = targets.begin(); iter != targets.end(); ++iter, ++i)
|
for (std::vector<Unit*>::const_iterator iter = targets.begin(); iter != targets.end(); ++iter, ++i)
|
||||||
@@ -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,11 +354,12 @@ 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)
|
||||||
CAST_AI(netherspite_infernal::netherspite_infernalAI, infernal->AI())->point=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())->malchezaar = me->GetGUID();
|
||||||
|
|
||||||
infernals.push_back(infernal->GetGUID());
|
infernals.push_back(infernal->GetGUID());
|
||||||
DoCast(infernal, SPELL_INFERNAL_RELAY);
|
DoCast(infernal, SPELL_INFERNAL_RELAY);
|
||||||
@@ -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;
|
||||||
@@ -402,7 +406,7 @@ public:
|
|||||||
//models
|
//models
|
||||||
SetEquipmentSlots(false, EQUIP_ID_AXE, EQUIP_ID_AXE, EQUIP_NO_CHANGE);
|
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);
|
me->SetCanDualWield(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -422,19 +426,18 @@ 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);
|
||||||
//axe->getThreatManager().tauntApply(target); //Taunt Apply and fade out does not work properly
|
//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);
|
axe->AddThreat(target, 10000000.0f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
@@ -478,15 +481,16 @@ public:
|
|||||||
//axe->getThreatManager().tauntApply(target);
|
//axe->getThreatManager().tauntApply(target);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} 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)
|
||||||
@@ -557,12 +565,12 @@ public:
|
|||||||
|
|
||||||
void Cleanup(Creature* infernal, InfernalPoint *point)
|
void Cleanup(Creature* infernal, InfernalPoint *point)
|
||||||
{
|
{
|
||||||
for (std::vector<uint64>::iterator itr = infernals.begin(); itr!= infernals.end(); ++itr)
|
for (std::vector<uint64>::iterator itr = infernals.begin(); itr != infernals.end(); ++itr)
|
||||||
if (*itr == infernal->GetGUID())
|
if (*itr == infernal->GetGUID())
|
||||||
{
|
{
|
||||||
infernals.erase(itr);
|
infernals.erase(itr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
positions.push_back(point);
|
positions.push_back(point);
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -10,44 +10,44 @@
|
|||||||
|
|
||||||
enum ShadeOfAran
|
enum ShadeOfAran
|
||||||
{
|
{
|
||||||
SAY_AGGRO = 0,
|
SAY_AGGRO = 0,
|
||||||
SAY_FLAMEWREATH = 1,
|
SAY_FLAMEWREATH = 1,
|
||||||
SAY_BLIZZARD = 2,
|
SAY_BLIZZARD = 2,
|
||||||
SAY_EXPLOSION = 3,
|
SAY_EXPLOSION = 3,
|
||||||
SAY_DRINK = 4,
|
SAY_DRINK = 4,
|
||||||
SAY_ELEMENTALS = 5,
|
SAY_ELEMENTALS = 5,
|
||||||
SAY_KILL = 6,
|
SAY_KILL = 6,
|
||||||
SAY_TIMEOVER = 7,
|
SAY_TIMEOVER = 7,
|
||||||
SAY_DEATH = 8,
|
SAY_DEATH = 8,
|
||||||
|
|
||||||
//Spells
|
//Spells
|
||||||
SPELL_FROSTBOLT = 29954,
|
SPELL_FROSTBOLT = 29954,
|
||||||
SPELL_FIREBALL = 29953,
|
SPELL_FIREBALL = 29953,
|
||||||
SPELL_ARCMISSLE = 29955,
|
SPELL_ARCMISSLE = 29955,
|
||||||
SPELL_CHAINSOFICE = 29991,
|
SPELL_CHAINSOFICE = 29991,
|
||||||
SPELL_DRAGONSBREATH = 29964,
|
SPELL_DRAGONSBREATH = 29964,
|
||||||
SPELL_MASSSLOW = 30035,
|
SPELL_MASSSLOW = 30035,
|
||||||
SPELL_FLAME_WREATH = 29946,
|
SPELL_FLAME_WREATH = 29946,
|
||||||
SPELL_AOE_CS = 29961,
|
SPELL_AOE_CS = 29961,
|
||||||
SPELL_PLAYERPULL = 32265,
|
SPELL_PLAYERPULL = 32265,
|
||||||
SPELL_AEXPLOSION = 29973,
|
SPELL_AEXPLOSION = 29973,
|
||||||
SPELL_MASS_POLY = 29963,
|
SPELL_MASS_POLY = 29963,
|
||||||
SPELL_BLINK_CENTER = 29967,
|
SPELL_BLINK_CENTER = 29967,
|
||||||
SPELL_ELEMENTALS = 29962,
|
SPELL_ELEMENTALS = 29962,
|
||||||
SPELL_CONJURE = 29975,
|
SPELL_CONJURE = 29975,
|
||||||
SPELL_DRINK = 30024,
|
SPELL_DRINK = 30024,
|
||||||
SPELL_POTION = 32453,
|
SPELL_POTION = 32453,
|
||||||
SPELL_AOE_PYROBLAST = 29978,
|
SPELL_AOE_PYROBLAST = 29978,
|
||||||
|
|
||||||
//Creature Spells
|
//Creature Spells
|
||||||
SPELL_CIRCULAR_BLIZZARD = 29951,
|
SPELL_CIRCULAR_BLIZZARD = 29951,
|
||||||
SPELL_WATERBOLT = 31012,
|
SPELL_WATERBOLT = 31012,
|
||||||
SPELL_SHADOW_PYRO = 29978,
|
SPELL_SHADOW_PYRO = 29978,
|
||||||
|
|
||||||
//Creatures
|
//Creatures
|
||||||
CREATURE_WATER_ELEMENTAL = 17167,
|
CREATURE_WATER_ELEMENTAL = 17167,
|
||||||
CREATURE_SHADOW_OF_ARAN = 18254,
|
CREATURE_SHADOW_OF_ARAN = 18254,
|
||||||
CREATURE_ARAN_BLIZZARD = 17161,
|
CREATURE_ARAN_BLIZZARD = 17161,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum SuperSpell
|
enum SuperSpell
|
||||||
@@ -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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,7 +100,7 @@ public:
|
|||||||
BerserkTimer = 720000;
|
BerserkTimer = 720000;
|
||||||
CloseDoorTimer = 15000;
|
CloseDoorTimer = 15000;
|
||||||
|
|
||||||
LastSuperSpell = rand()%3;
|
LastSuperSpell = rand() % 3;
|
||||||
|
|
||||||
FlameWreathTimer = 0;
|
FlameWreathTimer = 0;
|
||||||
FlameWreathCheckTime = 0;
|
FlameWreathCheckTime = 0;
|
||||||
@@ -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()
|
||||||
@@ -151,7 +154,7 @@ public:
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
//store the threat list in a different container
|
//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());
|
Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid());
|
||||||
//only on alive players
|
//only on alive players
|
||||||
@@ -161,10 +164,10 @@ public:
|
|||||||
|
|
||||||
//cut down to size if we have more than 3 targets
|
//cut down to size if we have more than 3 targets
|
||||||
while (targets.size() > 3)
|
while (targets.size() > 3)
|
||||||
targets.erase(targets.begin()+rand()%targets.size());
|
targets.erase(targets.begin() + rand() % targets.size());
|
||||||
|
|
||||||
uint32 i = 0;
|
uint32 i = 0;
|
||||||
for (std::vector<Unit*>::const_iterator itr = targets.begin(); itr!= targets.end(); ++itr)
|
for (std::vector<Unit*>::const_iterator itr = targets.begin(); itr != targets.end(); ++itr)
|
||||||
{
|
{
|
||||||
if (*itr)
|
if (*itr)
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
@@ -196,24 +200,24 @@ public:
|
|||||||
{
|
{
|
||||||
if (ArcaneCooldown >= diff)
|
if (ArcaneCooldown >= diff)
|
||||||
ArcaneCooldown -= diff;
|
ArcaneCooldown -= diff;
|
||||||
else ArcaneCooldown = 0;
|
else ArcaneCooldown = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FireCooldown)
|
if (FireCooldown)
|
||||||
{
|
{
|
||||||
if (FireCooldown >= diff)
|
if (FireCooldown >= diff)
|
||||||
FireCooldown -= diff;
|
FireCooldown -= diff;
|
||||||
else FireCooldown = 0;
|
else FireCooldown = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FrostCooldown)
|
if (FrostCooldown)
|
||||||
{
|
{
|
||||||
if (FrostCooldown >= diff)
|
if (FrostCooldown >= diff)
|
||||||
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;
|
Drinking = true;
|
||||||
me->InterruptNonMeleeSpells(false);
|
me->InterruptNonMeleeSpells(false);
|
||||||
@@ -236,7 +240,7 @@ public:
|
|||||||
Drinking = false;
|
Drinking = false;
|
||||||
me->RemoveAurasDueToSpell(SPELL_DRINK);
|
me->RemoveAurasDueToSpell(SPELL_DRINK);
|
||||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
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);
|
DoCast(me, SPELL_POTION, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -296,22 +300,24 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
NormalCastTimer = 1000;
|
NormalCastTimer = 1000;
|
||||||
} else NormalCastTimer -= diff;
|
}
|
||||||
|
else NormalCastTimer -= diff;
|
||||||
|
|
||||||
if (SecondarySpellTimer <= diff)
|
if (SecondarySpellTimer <= diff)
|
||||||
{
|
{
|
||||||
switch (urand(0, 1))
|
switch (urand(0, 1))
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
DoCast(me, SPELL_AOE_CS);
|
DoCast(me, SPELL_AOE_CS);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||||
DoCast(target, SPELL_CHAINSOFICE);
|
DoCast(target, SPELL_CHAINSOFICE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
SecondarySpellTimer = urand(5000, 20000);
|
SecondarySpellTimer = urand(5000, 20000);
|
||||||
} else SecondarySpellTimer -= diff;
|
}
|
||||||
|
else SecondarySpellTimer -= diff;
|
||||||
|
|
||||||
if (SuperCastTimer <= diff)
|
if (SuperCastTimer <= diff)
|
||||||
{
|
{
|
||||||
@@ -319,71 +325,133 @@ public:
|
|||||||
|
|
||||||
switch (LastSuperSpell)
|
switch (LastSuperSpell)
|
||||||
{
|
{
|
||||||
case SUPER_AE:
|
case SUPER_AE:
|
||||||
Available[0] = SUPER_FLAME;
|
Available[0] = SUPER_FLAME;
|
||||||
Available[1] = SUPER_BLIZZARD;
|
Available[1] = SUPER_BLIZZARD;
|
||||||
break;
|
break;
|
||||||
case SUPER_FLAME:
|
case SUPER_FLAME:
|
||||||
Available[0] = SUPER_AE;
|
Available[0] = SUPER_AE;
|
||||||
Available[1] = SUPER_BLIZZARD;
|
Available[1] = SUPER_BLIZZARD;
|
||||||
break;
|
break;
|
||||||
case SUPER_BLIZZARD:
|
case SUPER_BLIZZARD:
|
||||||
Available[0] = SUPER_FLAME;
|
Available[0] = SUPER_FLAME;
|
||||||
Available[1] = SUPER_AE;
|
Available[1] = SUPER_AE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
LastSuperSpell = Available[urand(0, 1)];
|
LastSuperSpell = Available[urand(0, 1)];
|
||||||
|
|
||||||
switch (LastSuperSpell)
|
switch (LastSuperSpell)
|
||||||
{
|
{
|
||||||
case SUPER_AE:
|
case SUPER_AE:
|
||||||
Talk(SAY_EXPLOSION);
|
Talk(SAY_EXPLOSION);
|
||||||
|
|
||||||
DoCast(me, SPELL_BLINK_CENTER, true);
|
DoCast(me, SPELL_BLINK_CENTER, true);
|
||||||
DoCast(me, SPELL_PLAYERPULL, true);
|
DoCast(me, SPELL_PLAYERPULL, true);
|
||||||
DoCast(me, SPELL_MASSSLOW, true);
|
DoCast(me, SPELL_MASSSLOW, true);
|
||||||
DoCast(me, SPELL_AEXPLOSION, false);
|
DoCast(me, SPELL_AEXPLOSION, false);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SUPER_FLAME:
|
case SUPER_FLAME:
|
||||||
Talk(SAY_FLAMEWREATH);
|
Talk(SAY_FLAMEWREATH);
|
||||||
|
|
||||||
FlameWreathTimer = 20000;
|
FlameWreathTimer = 20000;
|
||||||
FlameWreathCheckTime = 500;
|
FlameWreathCheckTime = 500;
|
||||||
|
|
||||||
FlameWreathTarget[0] = 0;
|
FlameWreathTarget[0] = 0;
|
||||||
FlameWreathTarget[1] = 0;
|
FlameWreathTarget[1] = 0;
|
||||||
FlameWreathTarget[2] = 0;
|
FlameWreathTarget[2] = 0;
|
||||||
|
|
||||||
FlameWreathEffect();
|
FlameWreathEffect();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SUPER_BLIZZARD:
|
case SUPER_BLIZZARD:
|
||||||
Talk(SAY_BLIZZARD);
|
Talk(SAY_BLIZZARD);
|
||||||
|
|
||||||
if (Creature* pSpawn = me->SummonCreature(CREATURE_ARAN_BLIZZARD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 25000))
|
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->setFaction(me->getFaction());
|
||||||
pSpawn->CastSpell(pSpawn, SPELL_CIRCULAR_BLIZZARD, false);
|
pSpawn->CastSpell(pSpawn, SPELL_CIRCULAR_BLIZZARD, false);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
@@ -457,9 +527,9 @@ public:
|
|||||||
|
|
||||||
switch (CurrentNormalSpell)
|
switch (CurrentNormalSpell)
|
||||||
{
|
{
|
||||||
case SPELL_ARCMISSLE: ArcaneCooldown = 5000; break;
|
case SPELL_ARCMISSLE: ArcaneCooldown = 5000; break;
|
||||||
case SPELL_FIREBALL: FireCooldown = 5000; break;
|
case SPELL_FIREBALL: FireCooldown = 5000; break;
|
||||||
case SPELL_FROSTBOLT: FrostCooldown = 5000; break;
|
case SPELL_FROSTBOLT: FrostCooldown = 5000; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -482,13 +552,16 @@ 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;
|
||||||
|
|
||||||
void Reset()
|
void Reset()
|
||||||
{
|
{
|
||||||
CastTimer = 2000 + (rand()%3000);
|
CastTimer = 2000 + (rand() % 3000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EnterCombat(Unit* /*who*/) { }
|
void EnterCombat(Unit* /*who*/) { }
|
||||||
@@ -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;
|
||||||
@@ -278,16 +278,17 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PortalsCount = 0;
|
PortalsCount = 0;
|
||||||
SacrificeTimer = 30000;
|
SacrificeTimer = 30000;
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -91,13 +91,15 @@ void SummonCroneIfReady(InstanceScript* instance, Creature* creature)
|
|||||||
|
|
||||||
if (instance->GetData(DATA_OPERA_OZ_DEATHCOUNT) == 4)
|
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())
|
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,298 +1,402 @@
|
|||||||
/*
|
|
||||||
* 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
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) { }
|
switch (creature->GetEntry())
|
||||||
|
|
||||||
|
|
||||||
void Initialize()
|
|
||||||
{
|
{
|
||||||
SetBossNumber(MAX_ENCOUNTERS);
|
case NPC_KILREK:
|
||||||
_servantQuartersKills = 0;
|
m_uiKilrekGUID = creature->GetGUID();
|
||||||
_selectedRare = RAND(NPC_HYAKISS_THE_LURKER, NPC_SHADIKITH_THE_GLIDER, NPC_ROKAD_THE_RAVAGER);
|
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())
|
||||||
{
|
{
|
||||||
|
case NPC_COLDMIST_WIDOW:
|
||||||
}
|
case NPC_COLDMIST_STALKER:
|
||||||
|
case NPC_SHADOWBAT:
|
||||||
void SetData(uint32 type, uint32 uiData)
|
case NPC_VAMPIRIC_SHADOWBAT:
|
||||||
{
|
case NPC_GREATER_SHADOWBAT:
|
||||||
switch (type)
|
case NPC_PHASE_HOUND:
|
||||||
|
case NPC_DREADBEAST:
|
||||||
|
case NPC_SHADOWBEAST:
|
||||||
|
if (GetBossState(DATA_OPTIONAL_BOSS) == TO_BE_DECIDED)
|
||||||
{
|
{
|
||||||
case DATA_COUNT_SERVANT_QUARTERS_KILLS:
|
++OptionalBossCount;
|
||||||
if (++_servantQuartersKills > 52) // 56 in total, not all have to be killed, almost all
|
if (OptionalBossCount == OPTIONAL_BOSS_REQUIRED_DEATH_COUNT)
|
||||||
{
|
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
uint32 tmpState;
|
switch (urand(NPC_HYAKISS_THE_LURKER, NPC_ROKAD_THE_RAVAGER))
|
||||||
loadStream >> tmpState;
|
{
|
||||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
case NPC_HYAKISS_THE_LURKER:
|
||||||
tmpState = NOT_STARTED;
|
instance->SummonCreature(NPC_HYAKISS_THE_LURKER, OptionalSpawn[0]);
|
||||||
SetBossState(i, EncounterState(tmpState));
|
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:
|
return true;
|
||||||
uint32 _servantQuartersKills;
|
}
|
||||||
uint32 _selectedRare;
|
|
||||||
};
|
|
||||||
|
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
|
class spell_karazhan_brittle_bones : public SpellScriptLoader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
spell_karazhan_brittle_bones() : SpellScriptLoader("spell_karazhan_brittle_bones") { }
|
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);
|
isPeriodic = true;
|
||||||
|
amplitude = 5000;
|
||||||
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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
class spell_karazhan_overload : public SpellScriptLoader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
spell_karazhan_overload() : SpellScriptLoader("spell_karazhan_overload") { }
|
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);
|
PreventDefaultAction();
|
||||||
|
GetUnitOwner()->CastCustomSpell(SPELL_OVERLOAD, SPELLVALUE_BASE_POINT0, int32(auraEffect->GetAmount() * (2.0, auraEffect->GetTickNumber())), GetUnitOwner(), true);
|
||||||
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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
class spell_karazhan_blink : public SpellScriptLoader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
spell_karazhan_blink() : SpellScriptLoader("spell_karazhan_blink") { }
|
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);
|
PreventHitDefaultEffect(effIndex);
|
||||||
|
GetCaster()->getThreatManager().resetAllAggro();
|
||||||
void HandleDummy(SpellEffIndex effIndex)
|
if (Unit* target = GetHitUnit())
|
||||||
{
|
GetCaster()->CastSpell(target, SPELL_BLINK, true);
|
||||||
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 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()
|
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);
|
||||||
|
|
||||||
|
|||||||
@@ -1,78 +1,121 @@
|
|||||||
/*
|
/*
|
||||||
* 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,
|
DATA_GO_LIBRARY_DOOR = 21,
|
||||||
DATA_GO_LIBRARY_DOOR = 21,
|
DATA_GO_MASSIVE_DOOR = 22,
|
||||||
DATA_GO_MASSIVE_DOOR = 22,
|
DATA_GO_NETHER_DOOR = 23,
|
||||||
DATA_GO_NETHER_DOOR = 23,
|
DATA_GO_GAME_DOOR = 24,
|
||||||
DATA_GO_GAME_DOOR = 24,
|
DATA_GO_GAME_EXIT_DOOR = 25,
|
||||||
DATA_GO_GAME_EXIT_DOOR = 25,
|
|
||||||
|
|
||||||
DATA_IMAGE_OF_MEDIVH = 26,
|
DATA_IMAGE_OF_MEDIVH = 26,
|
||||||
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_MOUNTED = 16152,
|
||||||
|
NPC_NIGHTBANE = 17225,
|
||||||
|
|
||||||
NPC_ATTUMEN_THE_HUNTSMAN = 15550,
|
// Trash
|
||||||
NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED = 16152
|
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
|
||||||
{
|
{
|
||||||
SPELL_RATTLED = 32437,
|
SPELL_RATTLED = 32437,
|
||||||
SPELL_OVERLOAD = 29766,
|
SPELL_OVERLOAD = 29766,
|
||||||
SPELL_BLINK = 29884
|
SPELL_BLINK = 29884
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user