mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-02-16 00:36:07 +00:00
converted all tabs to 4 spaces
This commit is contained in:
@@ -7,13 +7,13 @@ REWRITTEN BY XINEF
|
||||
|
||||
enum Data
|
||||
{
|
||||
TYPE_GELIHAST = 0,
|
||||
TYPE_FIRE1 = 1,
|
||||
TYPE_FIRE2 = 2,
|
||||
TYPE_FIRE3 = 3,
|
||||
TYPE_FIRE4 = 4,
|
||||
TYPE_AKU_MAI = 5,
|
||||
MAX_ENCOUNTERS = 6
|
||||
TYPE_GELIHAST = 0,
|
||||
TYPE_FIRE1 = 1,
|
||||
TYPE_FIRE2 = 2,
|
||||
TYPE_FIRE3 = 3,
|
||||
TYPE_FIRE4 = 4,
|
||||
TYPE_AKU_MAI = 5,
|
||||
MAX_ENCOUNTERS = 6
|
||||
};
|
||||
|
||||
enum CreatureIds
|
||||
|
||||
@@ -8,122 +8,122 @@ REWRITTEN BY XINEF
|
||||
|
||||
class instance_blackfathom_deeps : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_blackfathom_deeps() : InstanceMapScript("instance_blackfathom_deeps", 48) { }
|
||||
public:
|
||||
instance_blackfathom_deeps() : InstanceMapScript("instance_blackfathom_deeps", 48) { }
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_blackfathom_deeps_InstanceMapScript(map);
|
||||
}
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_blackfathom_deeps_InstanceMapScript(map);
|
||||
}
|
||||
|
||||
struct instance_blackfathom_deeps_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_blackfathom_deeps_InstanceMapScript(Map* map) : InstanceScript(map) { }
|
||||
struct instance_blackfathom_deeps_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_blackfathom_deeps_InstanceMapScript(Map* map) : InstanceScript(map) { }
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
memset(&_encounters, 0, sizeof(_encounters));
|
||||
_akumaiPortalGUID = 0;
|
||||
_requiredDeaths = 0;
|
||||
}
|
||||
void Initialize()
|
||||
{
|
||||
memset(&_encounters, 0, sizeof(_encounters));
|
||||
_akumaiPortalGUID = 0;
|
||||
_requiredDeaths = 0;
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
if (creature->IsSummon() && (creature->GetEntry() == NPC_BARBED_CRUSTACEAN || creature->GetEntry() == NPC_AKU_MAI_SERVANT ||
|
||||
creature->GetEntry() == NPC_MURKSHALLOW_SOFTSHELL || creature->GetEntry() == NPC_AKU_MAI_SNAPJAW))
|
||||
++_requiredDeaths;
|
||||
}
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
if (creature->IsSummon() && (creature->GetEntry() == NPC_BARBED_CRUSTACEAN || creature->GetEntry() == NPC_AKU_MAI_SERVANT ||
|
||||
creature->GetEntry() == NPC_MURKSHALLOW_SOFTSHELL || creature->GetEntry() == NPC_AKU_MAI_SNAPJAW))
|
||||
++_requiredDeaths;
|
||||
}
|
||||
|
||||
void OnUnitDeath(Unit* unit)
|
||||
{
|
||||
if (unit->IsSummon() && (unit->GetEntry() == NPC_BARBED_CRUSTACEAN || unit->GetEntry() == NPC_AKU_MAI_SERVANT ||
|
||||
unit->GetEntry() == NPC_MURKSHALLOW_SOFTSHELL || unit->GetEntry() == NPC_AKU_MAI_SNAPJAW))
|
||||
{
|
||||
if (--_requiredDeaths == 0)
|
||||
if (_encounters[TYPE_FIRE1] == DONE && _encounters[TYPE_FIRE2] == DONE && _encounters[TYPE_FIRE3] == DONE && _encounters[TYPE_FIRE4] == DONE)
|
||||
HandleGameObject(_akumaiPortalGUID, true);
|
||||
}
|
||||
}
|
||||
void OnUnitDeath(Unit* unit)
|
||||
{
|
||||
if (unit->IsSummon() && (unit->GetEntry() == NPC_BARBED_CRUSTACEAN || unit->GetEntry() == NPC_AKU_MAI_SERVANT ||
|
||||
unit->GetEntry() == NPC_MURKSHALLOW_SOFTSHELL || unit->GetEntry() == NPC_AKU_MAI_SNAPJAW))
|
||||
{
|
||||
if (--_requiredDeaths == 0)
|
||||
if (_encounters[TYPE_FIRE1] == DONE && _encounters[TYPE_FIRE2] == DONE && _encounters[TYPE_FIRE3] == DONE && _encounters[TYPE_FIRE4] == DONE)
|
||||
HandleGameObject(_akumaiPortalGUID, true);
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* gameobject)
|
||||
{
|
||||
switch (gameobject->GetEntry())
|
||||
{
|
||||
case GO_FIRE_OF_AKU_MAI_1:
|
||||
case GO_FIRE_OF_AKU_MAI_2:
|
||||
case GO_FIRE_OF_AKU_MAI_3:
|
||||
case GO_FIRE_OF_AKU_MAI_4:
|
||||
if (_encounters[gameobject->GetEntry() - GO_FIRE_OF_AKU_MAI_1 + 1] == DONE)
|
||||
{
|
||||
gameobject->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
|
||||
gameobject->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
break;
|
||||
case GO_SHRINE_OF_GELIHAST:
|
||||
if (_encounters[TYPE_GELIHAST] == DONE)
|
||||
gameobject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
break;
|
||||
case GO_ALTAR_OF_THE_DEEPS:
|
||||
if (_encounters[TYPE_AKU_MAI] == DONE)
|
||||
gameobject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
break;
|
||||
case GO_AKU_MAI_DOOR:
|
||||
if (_encounters[TYPE_FIRE1] == DONE && _encounters[TYPE_FIRE2] == DONE && _encounters[TYPE_FIRE3] == DONE && _encounters[TYPE_FIRE4] == DONE)
|
||||
HandleGameObject(0, true, gameobject);
|
||||
_akumaiPortalGUID = gameobject->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
void OnGameObjectCreate(GameObject* gameobject)
|
||||
{
|
||||
switch (gameobject->GetEntry())
|
||||
{
|
||||
case GO_FIRE_OF_AKU_MAI_1:
|
||||
case GO_FIRE_OF_AKU_MAI_2:
|
||||
case GO_FIRE_OF_AKU_MAI_3:
|
||||
case GO_FIRE_OF_AKU_MAI_4:
|
||||
if (_encounters[gameobject->GetEntry() - GO_FIRE_OF_AKU_MAI_1 + 1] == DONE)
|
||||
{
|
||||
gameobject->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
|
||||
gameobject->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
break;
|
||||
case GO_SHRINE_OF_GELIHAST:
|
||||
if (_encounters[TYPE_GELIHAST] == DONE)
|
||||
gameobject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
break;
|
||||
case GO_ALTAR_OF_THE_DEEPS:
|
||||
if (_encounters[TYPE_AKU_MAI] == DONE)
|
||||
gameobject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
break;
|
||||
case GO_AKU_MAI_DOOR:
|
||||
if (_encounters[TYPE_FIRE1] == DONE && _encounters[TYPE_FIRE2] == DONE && _encounters[TYPE_FIRE3] == DONE && _encounters[TYPE_FIRE4] == DONE)
|
||||
HandleGameObject(0, true, gameobject);
|
||||
_akumaiPortalGUID = gameobject->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_GELIHAST:
|
||||
case TYPE_FIRE1:
|
||||
case TYPE_FIRE2:
|
||||
case TYPE_FIRE3:
|
||||
case TYPE_FIRE4:
|
||||
case TYPE_AKU_MAI:
|
||||
_encounters[type] = data;
|
||||
break;
|
||||
}
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_GELIHAST:
|
||||
case TYPE_FIRE1:
|
||||
case TYPE_FIRE2:
|
||||
case TYPE_FIRE3:
|
||||
case TYPE_FIRE4:
|
||||
case TYPE_AKU_MAI:
|
||||
_encounters[type] = data;
|
||||
break;
|
||||
}
|
||||
|
||||
if (data == DONE)
|
||||
SaveToDB();
|
||||
}
|
||||
if (data == DONE)
|
||||
SaveToDB();
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "B L " << _encounters[0] << ' ' << _encounters[1] << ' ' << _encounters[2] << ' ' << _encounters[3] << ' ' << _encounters[4] << ' ' << _encounters[5];
|
||||
return saveStream.str();
|
||||
}
|
||||
std::string GetSaveData()
|
||||
{
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "B L " << _encounters[0] << ' ' << _encounters[1] << ' ' << _encounters[2] << ' ' << _encounters[3] << ' ' << _encounters[4] << ' ' << _encounters[5];
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(const char* in)
|
||||
{
|
||||
if (!in)
|
||||
return;
|
||||
void Load(const char* in)
|
||||
{
|
||||
if (!in)
|
||||
return;
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
std::istringstream loadStream(in);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
if (dataHead1 == 'B' && dataHead2 == 'L')
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
|
||||
{
|
||||
loadStream >> _encounters[i];
|
||||
if (_encounters[i] == IN_PROGRESS)
|
||||
_encounters[i] = NOT_STARTED;
|
||||
}
|
||||
}
|
||||
}
|
||||
char dataHead1, dataHead2;
|
||||
std::istringstream loadStream(in);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
if (dataHead1 == 'B' && dataHead2 == 'L')
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
|
||||
{
|
||||
loadStream >> _encounters[i];
|
||||
if (_encounters[i] == IN_PROGRESS)
|
||||
_encounters[i] = NOT_STARTED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
uint32 _encounters[MAX_ENCOUNTERS];
|
||||
uint64 _akumaiPortalGUID;
|
||||
uint8 _requiredDeaths;
|
||||
};
|
||||
private:
|
||||
uint32 _encounters[MAX_ENCOUNTERS];
|
||||
uint64 _akumaiPortalGUID;
|
||||
uint8 _requiredDeaths;
|
||||
};
|
||||
};
|
||||
|
||||
void AddSC_instance_blackfathom_deeps()
|
||||
|
||||
@@ -174,7 +174,7 @@ class spell_mark_of_kazrogal : public SpellScriptLoader
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& targets)
|
||||
{
|
||||
targets.remove_if(Trinity::PowerCheck(POWER_MANA, false));
|
||||
targets.remove_if(Trinity::PowerCheck(POWER_MANA, false));
|
||||
}
|
||||
|
||||
void Register()
|
||||
|
||||
@@ -8,22 +8,22 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
|
||||
#include "SpellInfo.h"
|
||||
enum Spells
|
||||
{
|
||||
SPELL_CURSE_OF_EXERTION = 52772,
|
||||
SPELL_WOUNDING_STRIKE_N = 52771,
|
||||
SPELL_WOUNDING_STRIKE_H = 58830,
|
||||
SPELL_TIME_STOP = 58848,
|
||||
SPELL_TIME_WARP = 52766,
|
||||
SPELL_TIME_STEP_N = 52737,
|
||||
SPELL_TIME_STEP_H = 58829,
|
||||
SPELL_CURSE_OF_EXERTION = 52772,
|
||||
SPELL_WOUNDING_STRIKE_N = 52771,
|
||||
SPELL_WOUNDING_STRIKE_H = 58830,
|
||||
SPELL_TIME_STOP = 58848,
|
||||
SPELL_TIME_WARP = 52766,
|
||||
SPELL_TIME_STEP_N = 52737,
|
||||
SPELL_TIME_STEP_H = 58829,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_SPELL_CURSE_OF_EXERTION = 1,
|
||||
EVENT_SPELL_WOUNDING_STRIKE = 2,
|
||||
EVENT_SPELL_TIME_STOP = 3,
|
||||
EVENT_SPELL_TIME_WARP = 4,
|
||||
EVENT_TIME_WARP = 5,
|
||||
EVENT_SPELL_CURSE_OF_EXERTION = 1,
|
||||
EVENT_SPELL_WOUNDING_STRIKE = 2,
|
||||
EVENT_SPELL_TIME_STOP = 3,
|
||||
EVENT_SPELL_TIME_WARP = 4,
|
||||
EVENT_TIME_WARP = 5,
|
||||
};
|
||||
|
||||
enum Yells
|
||||
@@ -52,75 +52,75 @@ public:
|
||||
}
|
||||
|
||||
EventMap events;
|
||||
uint8 warps;
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
warps = 0;
|
||||
}
|
||||
uint8 warps;
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
warps = 0;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_CURSE_OF_EXERTION, 9000);
|
||||
events.ScheduleEvent(EVENT_SPELL_WOUNDING_STRIKE, 3000);
|
||||
events.ScheduleEvent(EVENT_SPELL_TIME_WARP, 25000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CURSE_OF_EXERTION, 9000);
|
||||
events.ScheduleEvent(EVENT_SPELL_WOUNDING_STRIKE, 3000);
|
||||
events.ScheduleEvent(EVENT_SPELL_TIME_WARP, 25000);
|
||||
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SPELL_TIME_STOP, 20000);
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SPELL_TIME_STOP, 20000);
|
||||
}
|
||||
|
||||
void SpellHitTarget(Unit* target, const SpellInfo* spellInfo)
|
||||
{
|
||||
if (spellInfo->Id == SPELL_TIME_STEP_H || spellInfo->Id == SPELL_TIME_STEP_N)
|
||||
{
|
||||
if (target == me)
|
||||
return;
|
||||
void SpellHitTarget(Unit* target, const SpellInfo* spellInfo)
|
||||
{
|
||||
if (spellInfo->Id == SPELL_TIME_STEP_H || spellInfo->Id == SPELL_TIME_STEP_N)
|
||||
{
|
||||
if (target == me)
|
||||
return;
|
||||
|
||||
if (warps >= 2)
|
||||
{
|
||||
warps = 0;
|
||||
return;
|
||||
}
|
||||
warps++;
|
||||
me->CastSpell(target, DUNGEON_MODE(SPELL_TIME_STEP_N, SPELL_TIME_STEP_H), true);
|
||||
}
|
||||
}
|
||||
if (warps >= 2)
|
||||
{
|
||||
warps = 0;
|
||||
return;
|
||||
}
|
||||
warps++;
|
||||
me->CastSpell(target, DUNGEON_MODE(SPELL_TIME_STEP_N, SPELL_TIME_STEP_H), true);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_SPELL_CURSE_OF_EXERTION:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
|
||||
me->CastSpell(target, SPELL_CURSE_OF_EXERTION, false);
|
||||
events.RepeatEvent(9000);
|
||||
break;
|
||||
case EVENT_SPELL_WOUNDING_STRIKE:
|
||||
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_WOUNDING_STRIKE_N, SPELL_WOUNDING_STRIKE_H), false);
|
||||
events.RepeatEvent(6000);
|
||||
break;
|
||||
case EVENT_SPELL_TIME_STOP:
|
||||
me->CastSpell(me, SPELL_TIME_STOP, false);
|
||||
events.RepeatEvent(20000);
|
||||
break;
|
||||
case EVENT_SPELL_TIME_WARP:
|
||||
Talk(SAY_TIME_WARP);
|
||||
me->CastSpell(me, SPELL_TIME_WARP, false);
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
|
||||
me->CastSpell(target, DUNGEON_MODE(SPELL_TIME_STEP_N, SPELL_TIME_STEP_H), true);
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_SPELL_CURSE_OF_EXERTION:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
|
||||
me->CastSpell(target, SPELL_CURSE_OF_EXERTION, false);
|
||||
events.RepeatEvent(9000);
|
||||
break;
|
||||
case EVENT_SPELL_WOUNDING_STRIKE:
|
||||
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_WOUNDING_STRIKE_N, SPELL_WOUNDING_STRIKE_H), false);
|
||||
events.RepeatEvent(6000);
|
||||
break;
|
||||
case EVENT_SPELL_TIME_STOP:
|
||||
me->CastSpell(me, SPELL_TIME_STOP, false);
|
||||
events.RepeatEvent(20000);
|
||||
break;
|
||||
case EVENT_SPELL_TIME_WARP:
|
||||
Talk(SAY_TIME_WARP);
|
||||
me->CastSpell(me, SPELL_TIME_WARP, false);
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
|
||||
me->CastSpell(target, DUNGEON_MODE(SPELL_TIME_STEP_N, SPELL_TIME_STEP_H), true);
|
||||
|
||||
events.RepeatEvent(25000);
|
||||
break;
|
||||
}
|
||||
events.RepeatEvent(25000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
@@ -8,16 +8,16 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_CORRUPTING_BLIGHT = 60588,
|
||||
SPELL_VOID_STRIKE = 60590,
|
||||
SPELL_CORRUPTION_OF_TIME_AURA = 60451,
|
||||
SPELL_CORRUPTION_OF_TIME_CHANNEL = 60422,
|
||||
SPELL_CORRUPTING_BLIGHT = 60588,
|
||||
SPELL_VOID_STRIKE = 60590,
|
||||
SPELL_CORRUPTION_OF_TIME_AURA = 60451,
|
||||
SPELL_CORRUPTION_OF_TIME_CHANNEL = 60422,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_SPELL_CORRUPTING_BLIGHT = 1,
|
||||
EVENT_SPELL_VOID_STRIKE = 2,
|
||||
EVENT_SPELL_CORRUPTING_BLIGHT = 1,
|
||||
EVENT_SPELL_VOID_STRIKE = 2,
|
||||
};
|
||||
|
||||
enum Yells
|
||||
@@ -44,96 +44,96 @@ public:
|
||||
}
|
||||
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
uint32 beamTimer;
|
||||
SummonList summons;
|
||||
uint32 beamTimer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
if (InstanceScript* pInstance = me->GetInstanceScript())
|
||||
if (pInstance->GetData(DATA_GUARDIANTIME_EVENT) == 0)
|
||||
me->DespawnOrUnsummon(500);
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
if (InstanceScript* pInstance = me->GetInstanceScript())
|
||||
if (pInstance->GetData(DATA_GUARDIANTIME_EVENT) == 0)
|
||||
me->DespawnOrUnsummon(500);
|
||||
|
||||
me->SummonCreature(NPC_TIME_RIFT, 2337.6f, 1270.0f, 132.95f, 2.79f);
|
||||
me->SummonCreature(NPC_GUARDIAN_OF_TIME, 2319.3f, 1267.7f, 132.8f, 1.0f);
|
||||
beamTimer = 1;
|
||||
}
|
||||
me->SummonCreature(NPC_TIME_RIFT, 2337.6f, 1270.0f, 132.95f, 2.79f);
|
||||
me->SummonCreature(NPC_GUARDIAN_OF_TIME, 2319.3f, 1267.7f, 132.8f, 1.0f);
|
||||
beamTimer = 1;
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* cr) { summons.Summon(cr); }
|
||||
void JustSummoned(Creature* cr) { summons.Summon(cr); }
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
events.ScheduleEvent(EVENT_SPELL_VOID_STRIKE, 8000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CORRUPTING_BLIGHT, 12000);
|
||||
Talk(SAY_AGGRO);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
events.ScheduleEvent(EVENT_SPELL_VOID_STRIKE, 8000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CORRUPTING_BLIGHT, 12000);
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
if (Creature* cr = ObjectAccessor::GetCreature(*me, (*itr)))
|
||||
{
|
||||
if (cr->GetEntry() == NPC_TIME_RIFT)
|
||||
cr->DespawnOrUnsummon(1000);
|
||||
else
|
||||
{
|
||||
cr->DespawnOrUnsummon(5000);
|
||||
cr->RemoveAllAuras();
|
||||
cr->MonsterSay("You have my thanks for saving my existence in this timeline. Now i must report back to my superiors. They must know immediately of what i just experienced.", LANG_UNIVERSAL, 0);
|
||||
}
|
||||
}
|
||||
Talk(SAY_DEATH);
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
if (Creature* cr = ObjectAccessor::GetCreature(*me, (*itr)))
|
||||
{
|
||||
if (cr->GetEntry() == NPC_TIME_RIFT)
|
||||
cr->DespawnOrUnsummon(1000);
|
||||
else
|
||||
{
|
||||
cr->DespawnOrUnsummon(5000);
|
||||
cr->RemoveAllAuras();
|
||||
cr->MonsterSay("You have my thanks for saving my existence in this timeline. Now i must report back to my superiors. They must know immediately of what i just experienced.", LANG_UNIVERSAL, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (InstanceScript* pInstance = me->GetInstanceScript())
|
||||
pInstance->SetData(DATA_SHOW_INFINITE_TIMER, 0);
|
||||
if (InstanceScript* pInstance = me->GetInstanceScript())
|
||||
pInstance->SetData(DATA_SHOW_INFINITE_TIMER, 0);
|
||||
}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if (!me->IsAlive())
|
||||
return;
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if (!me->IsAlive())
|
||||
return;
|
||||
|
||||
if (param == ACTION_RUN_OUT_OF_TIME)
|
||||
{
|
||||
Talk(SAY_FAIL);
|
||||
summons.DespawnAll();
|
||||
me->DespawnOrUnsummon(500);
|
||||
}
|
||||
}
|
||||
if (param == ACTION_RUN_OUT_OF_TIME)
|
||||
{
|
||||
Talk(SAY_FAIL);
|
||||
summons.DespawnAll();
|
||||
me->DespawnOrUnsummon(500);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (beamTimer)
|
||||
{
|
||||
beamTimer += diff;
|
||||
if (beamTimer >= 2000)
|
||||
{
|
||||
me->CastSpell(me, SPELL_CORRUPTION_OF_TIME_CHANNEL, true);
|
||||
beamTimer = 0;
|
||||
}
|
||||
}
|
||||
if (beamTimer)
|
||||
{
|
||||
beamTimer += diff;
|
||||
if (beamTimer >= 2000)
|
||||
{
|
||||
me->CastSpell(me, SPELL_CORRUPTION_OF_TIME_CHANNEL, true);
|
||||
beamTimer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_SPELL_VOID_STRIKE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_VOID_STRIKE, false);
|
||||
events.RepeatEvent(8000);
|
||||
break;
|
||||
case EVENT_SPELL_CORRUPTING_BLIGHT:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
|
||||
me->CastSpell(target, SPELL_CORRUPTING_BLIGHT, false);
|
||||
events.RepeatEvent(12000);
|
||||
break;
|
||||
}
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_SPELL_VOID_STRIKE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_VOID_STRIKE, false);
|
||||
events.RepeatEvent(8000);
|
||||
break;
|
||||
case EVENT_SPELL_CORRUPTING_BLIGHT:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
|
||||
me->CastSpell(target, SPELL_CORRUPTING_BLIGHT, false);
|
||||
events.RepeatEvent(12000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
@@ -9,21 +9,21 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_CARRION_SWARM_N = 52720,
|
||||
SPELL_CARRION_SWARM_H = 58852,
|
||||
SPELL_MIND_BLAST_N = 52722,
|
||||
SPELL_MIND_BLAST_H = 58850,
|
||||
SPELL_SLEEP_N = 52721,
|
||||
SPELL_SLEEP_H = 58849,
|
||||
SPELL_VAMPIRIC_TOUCH = 52723,
|
||||
SPELL_CARRION_SWARM_N = 52720,
|
||||
SPELL_CARRION_SWARM_H = 58852,
|
||||
SPELL_MIND_BLAST_N = 52722,
|
||||
SPELL_MIND_BLAST_H = 58850,
|
||||
SPELL_SLEEP_N = 52721,
|
||||
SPELL_SLEEP_H = 58849,
|
||||
SPELL_VAMPIRIC_TOUCH = 52723,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_SPELL_CARRION_SWARM = 1,
|
||||
EVENT_SPELL_MIND_BLAST = 2,
|
||||
EVENT_SPELL_SLEEP = 3,
|
||||
EVENT_SPELL_VAMPIRIC_TOUCH = 4,
|
||||
EVENT_SPELL_CARRION_SWARM = 1,
|
||||
EVENT_SPELL_MIND_BLAST = 2,
|
||||
EVENT_SPELL_SLEEP = 3,
|
||||
EVENT_SPELL_VAMPIRIC_TOUCH = 4,
|
||||
};
|
||||
|
||||
enum Yells
|
||||
@@ -53,31 +53,31 @@ public:
|
||||
{
|
||||
boss_mal_ganisAI(Creature* c) : ScriptedAI(c)
|
||||
{
|
||||
finished = false;
|
||||
finished = false;
|
||||
}
|
||||
|
||||
EventMap events;
|
||||
bool finished;
|
||||
bool finished;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true);
|
||||
events.Reset();
|
||||
if (finished)
|
||||
{
|
||||
Talk(SAY_OUTRO);
|
||||
me->DespawnOrUnsummon(20000);
|
||||
}
|
||||
}
|
||||
void Reset()
|
||||
{
|
||||
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true);
|
||||
events.Reset();
|
||||
if (finished)
|
||||
{
|
||||
Talk(SAY_OUTRO);
|
||||
me->DespawnOrUnsummon(20000);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
events.ScheduleEvent(EVENT_SPELL_CARRION_SWARM, 6000);
|
||||
events.ScheduleEvent(EVENT_SPELL_MIND_BLAST, 11000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SLEEP, 20000);
|
||||
events.ScheduleEvent(EVENT_SPELL_VAMPIRIC_TOUCH, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CARRION_SWARM, 6000);
|
||||
events.ScheduleEvent(EVENT_SPELL_MIND_BLAST, 11000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SLEEP, 20000);
|
||||
events.ScheduleEvent(EVENT_SPELL_VAMPIRIC_TOUCH, 15000);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
@@ -92,67 +92,67 @@ public:
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* who, uint32 &damage, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if (!finished && damage >= me->GetHealth())
|
||||
{
|
||||
damage = 0;
|
||||
finished = true;
|
||||
me->SetRegeneratingHealth(false);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
if (InstanceScript* pInstance = me->GetInstanceScript())
|
||||
{
|
||||
if (Creature* cr = ObjectAccessor::GetCreature(*me, pInstance->GetData64(DATA_ARTHAS)))
|
||||
cr->AI()->DoAction(ACTION_KILLED_MALGANIS);
|
||||
|
||||
// give credit to players
|
||||
me->CastSpell(me, 58630, true);
|
||||
}
|
||||
|
||||
// quest completion
|
||||
if (who)
|
||||
if (Player* player = who->GetCharmerOrOwnerPlayerOrPlayerItself())
|
||||
player->RewardPlayerAndGroupAtEvent(31006, player); // Royal Escort quest, Mal'ganis bunny
|
||||
|
||||
EnterEvadeMode();
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
void DamageTaken(Unit* who, uint32 &damage, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
if (!finished && damage >= me->GetHealth())
|
||||
{
|
||||
damage = 0;
|
||||
finished = true;
|
||||
me->SetRegeneratingHealth(false);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
if (InstanceScript* pInstance = me->GetInstanceScript())
|
||||
{
|
||||
if (Creature* cr = ObjectAccessor::GetCreature(*me, pInstance->GetData64(DATA_ARTHAS)))
|
||||
cr->AI()->DoAction(ACTION_KILLED_MALGANIS);
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
// give credit to players
|
||||
me->CastSpell(me, 58630, true);
|
||||
}
|
||||
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_SPELL_CARRION_SWARM:
|
||||
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_CARRION_SWARM_N, SPELL_CARRION_SWARM_H), false);
|
||||
events.RepeatEvent(7000);
|
||||
break;
|
||||
case EVENT_SPELL_MIND_BLAST:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
|
||||
me->CastSpell(target, DUNGEON_MODE(SPELL_MIND_BLAST_N, SPELL_MIND_BLAST_H), false);
|
||||
events.RepeatEvent(6000);
|
||||
break;
|
||||
case EVENT_SPELL_SLEEP:
|
||||
Talk(SAY_SLEEP);
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
|
||||
me->CastSpell(target, DUNGEON_MODE(SPELL_SLEEP_N, SPELL_SLEEP_H), false);
|
||||
events.RepeatEvent(17000);
|
||||
break;
|
||||
case EVENT_SPELL_VAMPIRIC_TOUCH:
|
||||
me->CastSpell(me, SPELL_VAMPIRIC_TOUCH, true);
|
||||
events.RepeatEvent(30000);
|
||||
break;
|
||||
}
|
||||
// quest completion
|
||||
if (who)
|
||||
if (Player* player = who->GetCharmerOrOwnerPlayerOrPlayerItself())
|
||||
player->RewardPlayerAndGroupAtEvent(31006, player); // Royal Escort quest, Mal'ganis bunny
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
EnterEvadeMode();
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_SPELL_CARRION_SWARM:
|
||||
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_CARRION_SWARM_N, SPELL_CARRION_SWARM_H), false);
|
||||
events.RepeatEvent(7000);
|
||||
break;
|
||||
case EVENT_SPELL_MIND_BLAST:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
|
||||
me->CastSpell(target, DUNGEON_MODE(SPELL_MIND_BLAST_N, SPELL_MIND_BLAST_H), false);
|
||||
events.RepeatEvent(6000);
|
||||
break;
|
||||
case EVENT_SPELL_SLEEP:
|
||||
Talk(SAY_SLEEP);
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
|
||||
me->CastSpell(target, DUNGEON_MODE(SPELL_SLEEP_N, SPELL_SLEEP_H), false);
|
||||
events.RepeatEvent(17000);
|
||||
break;
|
||||
case EVENT_SPELL_VAMPIRIC_TOUCH:
|
||||
me->CastSpell(me, SPELL_VAMPIRIC_TOUCH, true);
|
||||
events.RepeatEvent(30000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -8,18 +8,18 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_CONSTRICTING_CHAINS_N = 52696,
|
||||
SPELL_CONSTRICTING_CHAINS_H = 58823,
|
||||
SPELL_DISEASE_EXPULSION_N = 52666,
|
||||
SPELL_DISEASE_EXPULSION_H = 58824,
|
||||
SPELL_FRENZY = 58841,
|
||||
SPELL_CONSTRICTING_CHAINS_N = 52696,
|
||||
SPELL_CONSTRICTING_CHAINS_H = 58823,
|
||||
SPELL_DISEASE_EXPULSION_N = 52666,
|
||||
SPELL_DISEASE_EXPULSION_H = 58824,
|
||||
SPELL_FRENZY = 58841,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_SPELL_CONSTRICTING_CHAINS = 1,
|
||||
EVENT_SPELL_DISEASE_EXPULSION = 2,
|
||||
EVENT_SPELL_FRENZY = 3,
|
||||
EVENT_SPELL_CONSTRICTING_CHAINS = 1,
|
||||
EVENT_SPELL_DISEASE_EXPULSION = 2,
|
||||
EVENT_SPELL_FRENZY = 3,
|
||||
};
|
||||
|
||||
enum Yells
|
||||
@@ -47,15 +47,15 @@ public:
|
||||
Talk(SAY_SPAWN);
|
||||
}
|
||||
|
||||
EventMap events;
|
||||
void Reset() { events.Reset(); }
|
||||
EventMap events;
|
||||
void Reset() { events.Reset(); }
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
events.RescheduleEvent(EVENT_SPELL_CONSTRICTING_CHAINS, 15000);
|
||||
events.RescheduleEvent(EVENT_SPELL_DISEASE_EXPULSION, 4000);
|
||||
events.RescheduleEvent(EVENT_SPELL_FRENZY, 20000);
|
||||
events.RescheduleEvent(EVENT_SPELL_CONSTRICTING_CHAINS, 15000);
|
||||
events.RescheduleEvent(EVENT_SPELL_DISEASE_EXPULSION, 4000);
|
||||
events.RescheduleEvent(EVENT_SPELL_FRENZY, 20000);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
@@ -71,35 +71,35 @@ public:
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_SPELL_DISEASE_EXPULSION:
|
||||
me->CastSpell(me, DUNGEON_MODE(SPELL_DISEASE_EXPULSION_N, SPELL_DISEASE_EXPULSION_H), false);
|
||||
events.RepeatEvent(6000);
|
||||
break;
|
||||
case EVENT_SPELL_FRENZY:
|
||||
me->CastSpell(me, SPELL_FRENZY, false);
|
||||
events.RepeatEvent(20000);
|
||||
break;
|
||||
case EVENT_SPELL_CONSTRICTING_CHAINS:
|
||||
if (Unit *pTarget = SelectTarget(SELECT_TARGET_BOTTOMAGGRO, 0, 50.0f, true))
|
||||
me->CastSpell(pTarget, DUNGEON_MODE(SPELL_CONSTRICTING_CHAINS_N, SPELL_CONSTRICTING_CHAINS_H), false);
|
||||
events.RepeatEvent(14000);
|
||||
break;
|
||||
}
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_SPELL_DISEASE_EXPULSION:
|
||||
me->CastSpell(me, DUNGEON_MODE(SPELL_DISEASE_EXPULSION_N, SPELL_DISEASE_EXPULSION_H), false);
|
||||
events.RepeatEvent(6000);
|
||||
break;
|
||||
case EVENT_SPELL_FRENZY:
|
||||
me->CastSpell(me, SPELL_FRENZY, false);
|
||||
events.RepeatEvent(20000);
|
||||
break;
|
||||
case EVENT_SPELL_CONSTRICTING_CHAINS:
|
||||
if (Unit *pTarget = SelectTarget(SELECT_TARGET_BOTTOMAGGRO, 0, 50.0f, true))
|
||||
me->CastSpell(pTarget, DUNGEON_MODE(SPELL_CONSTRICTING_CHAINS_N, SPELL_CONSTRICTING_CHAINS_H), false);
|
||||
events.RepeatEvent(14000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
@@ -9,24 +9,24 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_SHADOW_BOLT_N = 57725,
|
||||
SPELL_SHADOW_BOLT_H = 58827,
|
||||
SPELL_STEAL_FLESH_CHANNEL = 52708,
|
||||
SPELL_STEAL_FLESH_TARGET = 52711,
|
||||
SPELL_STEAL_FLESH_CASTER = 52712,
|
||||
SPELL_SUMMON_GHOULS = 52451,
|
||||
SPELL_EXPLODE_GHOUL_N = 52480,
|
||||
SPELL_EXPLODE_GHOUL_H = 58825,
|
||||
SPELL_CURSE_OF_TWISTED_FAITH = 58845,
|
||||
SPELL_SHADOW_BOLT_N = 57725,
|
||||
SPELL_SHADOW_BOLT_H = 58827,
|
||||
SPELL_STEAL_FLESH_CHANNEL = 52708,
|
||||
SPELL_STEAL_FLESH_TARGET = 52711,
|
||||
SPELL_STEAL_FLESH_CASTER = 52712,
|
||||
SPELL_SUMMON_GHOULS = 52451,
|
||||
SPELL_EXPLODE_GHOUL_N = 52480,
|
||||
SPELL_EXPLODE_GHOUL_H = 58825,
|
||||
SPELL_CURSE_OF_TWISTED_FAITH = 58845,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_SPELL_SHADOW_BOLT = 1,
|
||||
EVENT_SPELL_STEAL_FLESH = 2,
|
||||
EVENT_SPELL_SUMMON_GHOULS = 3,
|
||||
EVENT_EXPLODE_GHOUL = 4,
|
||||
EVENT_SPELL_CURSE = 5,
|
||||
EVENT_SPELL_SHADOW_BOLT = 1,
|
||||
EVENT_SPELL_STEAL_FLESH = 2,
|
||||
EVENT_SPELL_SUMMON_GHOULS = 3,
|
||||
EVENT_EXPLODE_GHOUL = 4,
|
||||
EVENT_SPELL_CURSE = 5,
|
||||
};
|
||||
|
||||
enum Yells
|
||||
@@ -58,29 +58,29 @@ public:
|
||||
}
|
||||
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
}
|
||||
SummonList summons;
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* cr) { summons.Summon(cr); }
|
||||
void JustSummoned(Creature* cr) { summons.Summon(cr); }
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, 7000);
|
||||
events.ScheduleEvent(EVENT_SPELL_STEAL_FLESH, 11000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SUMMON_GHOULS, 16000);
|
||||
events.ScheduleEvent(EVENT_EXPLODE_GHOUL, 22000);
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SPELL_CURSE, 25000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, 7000);
|
||||
events.ScheduleEvent(EVENT_SPELL_STEAL_FLESH, 11000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SUMMON_GHOULS, 16000);
|
||||
events.ScheduleEvent(EVENT_EXPLODE_GHOUL, 22000);
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SPELL_CURSE, 25000);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
summons.DespawnAll();
|
||||
summons.DespawnAll();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
@@ -92,55 +92,55 @@ public:
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void ExplodeGhoul()
|
||||
{
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
if (Creature* cr = ObjectAccessor::GetCreature(*me, (*itr)))
|
||||
if (cr->IsAlive())
|
||||
{
|
||||
me->CastSpell(cr, DUNGEON_MODE(SPELL_EXPLODE_GHOUL_N, SPELL_EXPLODE_GHOUL_H), false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
void ExplodeGhoul()
|
||||
{
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
if (Creature* cr = ObjectAccessor::GetCreature(*me, (*itr)))
|
||||
if (cr->IsAlive())
|
||||
{
|
||||
me->CastSpell(cr, DUNGEON_MODE(SPELL_EXPLODE_GHOUL_N, SPELL_EXPLODE_GHOUL_H), false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_SPELL_SHADOW_BOLT:
|
||||
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_SHADOW_BOLT_N, SPELL_SHADOW_BOLT_H), false);
|
||||
events.RepeatEvent(10000);
|
||||
break;
|
||||
case EVENT_SPELL_STEAL_FLESH:
|
||||
if (!urand(0,2))
|
||||
Talk(SAY_STEAL_FLESH);
|
||||
me->CastSpell(me->GetVictim(), SPELL_STEAL_FLESH_CHANNEL, false);
|
||||
events.RepeatEvent(12000);
|
||||
break;
|
||||
case EVENT_SPELL_SUMMON_GHOULS:
|
||||
if (!urand(0,2))
|
||||
Talk(SAY_SUMMON_GHOULS);
|
||||
me->CastSpell(me, SPELL_SUMMON_GHOULS, false);
|
||||
events.RepeatEvent(10000);
|
||||
break;
|
||||
case EVENT_EXPLODE_GHOUL:
|
||||
if (!urand(0,2))
|
||||
Talk(SAY_EXPLODE_GHOUL);
|
||||
ExplodeGhoul();
|
||||
events.RepeatEvent(15000);
|
||||
break;
|
||||
case EVENT_SPELL_CURSE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CURSE_OF_TWISTED_FAITH, false);
|
||||
events.RepeatEvent(30000);
|
||||
break;
|
||||
}
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_SPELL_SHADOW_BOLT:
|
||||
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_SHADOW_BOLT_N, SPELL_SHADOW_BOLT_H), false);
|
||||
events.RepeatEvent(10000);
|
||||
break;
|
||||
case EVENT_SPELL_STEAL_FLESH:
|
||||
if (!urand(0,2))
|
||||
Talk(SAY_STEAL_FLESH);
|
||||
me->CastSpell(me->GetVictim(), SPELL_STEAL_FLESH_CHANNEL, false);
|
||||
events.RepeatEvent(12000);
|
||||
break;
|
||||
case EVENT_SPELL_SUMMON_GHOULS:
|
||||
if (!urand(0,2))
|
||||
Talk(SAY_SUMMON_GHOULS);
|
||||
me->CastSpell(me, SPELL_SUMMON_GHOULS, false);
|
||||
events.RepeatEvent(10000);
|
||||
break;
|
||||
case EVENT_EXPLODE_GHOUL:
|
||||
if (!urand(0,2))
|
||||
Talk(SAY_EXPLODE_GHOUL);
|
||||
ExplodeGhoul();
|
||||
events.RepeatEvent(15000);
|
||||
break;
|
||||
case EVENT_SPELL_CURSE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CURSE_OF_TWISTED_FAITH, false);
|
||||
events.RepeatEvent(30000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
@@ -159,13 +159,13 @@ class spell_boss_salramm_steal_flesh : public SpellScriptLoader
|
||||
|
||||
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
Unit* caster = GetCaster();
|
||||
Unit* target = GetUnitOwner();
|
||||
if (caster)
|
||||
{
|
||||
caster->CastSpell(caster, SPELL_STEAL_FLESH_CASTER, true);
|
||||
caster->CastSpell(target, SPELL_STEAL_FLESH_TARGET, true);
|
||||
}
|
||||
Unit* caster = GetCaster();
|
||||
Unit* target = GetUnitOwner();
|
||||
if (caster)
|
||||
{
|
||||
caster->CastSpell(caster, SPELL_STEAL_FLESH_CASTER, true);
|
||||
caster->CastSpell(target, SPELL_STEAL_FLESH_TARGET, true);
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
@@ -183,5 +183,5 @@ class spell_boss_salramm_steal_flesh : public SpellScriptLoader
|
||||
void AddSC_boss_salramm()
|
||||
{
|
||||
new boss_salramm();
|
||||
new spell_boss_salramm_steal_flesh();
|
||||
new spell_boss_salramm_steal_flesh();
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,15 +7,15 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
|
||||
|
||||
enum Data
|
||||
{
|
||||
DATA_ARTHAS_EVENT,
|
||||
DATA_GUARDIANTIME_EVENT,
|
||||
DATA_ARTHAS_EVENT,
|
||||
DATA_GUARDIANTIME_EVENT,
|
||||
|
||||
// Communication
|
||||
DATA_SHOW_CRATES,
|
||||
// Communication
|
||||
DATA_SHOW_CRATES,
|
||||
DATA_CRATE_COUNT,
|
||||
DATA_START_WAVES,
|
||||
DATA_SHOW_INFINITE_TIMER,
|
||||
DATA_ARTHAS_REPOSITION,
|
||||
DATA_START_WAVES,
|
||||
DATA_SHOW_INFINITE_TIMER,
|
||||
DATA_ARTHAS_REPOSITION,
|
||||
};
|
||||
|
||||
enum Data64
|
||||
@@ -28,107 +28,107 @@ enum Data64
|
||||
|
||||
enum Creatures
|
||||
{
|
||||
NPC_MEATHOOK = 26529,
|
||||
NPC_SALRAMM = 26530,
|
||||
NPC_EPOCH = 26532,
|
||||
NPC_MAL_GANIS = 26533,
|
||||
NPC_INFINITE = 32273,
|
||||
NPC_ARTHAS = 26499,
|
||||
NPC_JAINA = 26497,
|
||||
NPC_UTHER = 26528,
|
||||
NPC_MEATHOOK = 26529,
|
||||
NPC_SALRAMM = 26530,
|
||||
NPC_EPOCH = 26532,
|
||||
NPC_MAL_GANIS = 26533,
|
||||
NPC_INFINITE = 32273,
|
||||
NPC_ARTHAS = 26499,
|
||||
NPC_JAINA = 26497,
|
||||
NPC_UTHER = 26528,
|
||||
|
||||
NPC_GUARDIAN_OF_TIME = 32281,
|
||||
NPC_TIME_RIFT = 28409,
|
||||
NPC_GUARDIAN_OF_TIME = 32281,
|
||||
NPC_TIME_RIFT = 28409,
|
||||
|
||||
NPC_CHROMIE_MIDDLE = 27915,
|
||||
NPC_GRAIN_CREATE_TRIGGER = 30996,
|
||||
NPC_HOURGLASS = 28656,
|
||||
NPC_CHROMIE_MIDDLE = 27915,
|
||||
NPC_GRAIN_CREATE_TRIGGER = 30996,
|
||||
NPC_HOURGLASS = 28656,
|
||||
};
|
||||
|
||||
enum GameObjects
|
||||
{
|
||||
GO_SHKAF_GATE = 188686,
|
||||
GO_EXIT_GATE = 191788,
|
||||
GO_MALGANIS_CHEST_N = 190663,
|
||||
GO_MALGANIS_CHEST_H = 193597,
|
||||
GO_SUSPICIOUS_CRATE = 190094,
|
||||
GO_PLAGUED_CRATE = 190095,
|
||||
GO_SHKAF_GATE = 188686,
|
||||
GO_EXIT_GATE = 191788,
|
||||
GO_MALGANIS_CHEST_N = 190663,
|
||||
GO_MALGANIS_CHEST_H = 193597,
|
||||
GO_SUSPICIOUS_CRATE = 190094,
|
||||
GO_PLAGUED_CRATE = 190095,
|
||||
};
|
||||
|
||||
enum WorldStatesCoT
|
||||
{
|
||||
WORLDSTATE_SHOW_CRATES = 3479,
|
||||
WORLDSTATE_CRATES_REVEALED = 3480,
|
||||
WORLDSTATE_WAVE_COUNT = 3504,
|
||||
WORLDSTATE_TIME_GUARDIAN = 3931,
|
||||
WORLDSTATE_TIME_GUARDIAN_SHOW = 3932,
|
||||
WORLDSTATE_SHOW_CRATES = 3479,
|
||||
WORLDSTATE_CRATES_REVEALED = 3480,
|
||||
WORLDSTATE_WAVE_COUNT = 3504,
|
||||
WORLDSTATE_TIME_GUARDIAN = 3931,
|
||||
WORLDSTATE_TIME_GUARDIAN_SHOW = 3932,
|
||||
};
|
||||
|
||||
enum CrateSpells
|
||||
{
|
||||
SPELL_CRATES_CREDIT = 58109,
|
||||
SPELL_ARCANE_DISRUPTION = 49590,
|
||||
SPELL_CRATES_CREDIT = 58109,
|
||||
SPELL_ARCANE_DISRUPTION = 49590,
|
||||
|
||||
SPELL_HUMAN_FEMALE = 35483,
|
||||
SPELL_HUMAN_MALE = 35482,
|
||||
SPELL_HUMAN_FEMALE = 35483,
|
||||
SPELL_HUMAN_MALE = 35482,
|
||||
};
|
||||
|
||||
enum EventPositions
|
||||
{
|
||||
EVENT_POS_CHROMIE = 0,
|
||||
EVENT_POS_HOURGLASS = 1,
|
||||
EVENT_SRC_UTHER,
|
||||
EVENT_SRC_JAINA,
|
||||
EVENT_SRC_HORSE1,
|
||||
EVENT_SRC_HORSE2,
|
||||
EVENT_SRC_HORSE3,
|
||||
EVENT_DST_UTHER,
|
||||
EVENT_DST_HORSE1,
|
||||
EVENT_DST_HORSE2,
|
||||
EVENT_DST_HORSE3,
|
||||
EVENT_POS_RETREAT,
|
||||
EVENT_SRC_TOWN_CITYMAN1,
|
||||
EVENT_SRC_TOWN_CITYMAN2,
|
||||
EVENT_DST_CITYMAN,
|
||||
EVENT_SRC_MALGANIS,
|
||||
EVENT_SRC_MEATHOOK,
|
||||
EVENT_SRC_SALRAMM,
|
||||
EVENT_SRC_HALL_CITYMAN1,
|
||||
EVENT_SRC_HALL_CITYMAN2,
|
||||
EVENT_SRC_HALL_CITYMAN3,
|
||||
EVENT_SRC_EPOCH,
|
||||
EVENT_DST_EPOCH,
|
||||
EVENT_SRC_CORRUPTOR,
|
||||
EVENT_SRC_MALGANIS_FINAL,
|
||||
EVENT_POS_CHROMIE = 0,
|
||||
EVENT_POS_HOURGLASS = 1,
|
||||
EVENT_SRC_UTHER,
|
||||
EVENT_SRC_JAINA,
|
||||
EVENT_SRC_HORSE1,
|
||||
EVENT_SRC_HORSE2,
|
||||
EVENT_SRC_HORSE3,
|
||||
EVENT_DST_UTHER,
|
||||
EVENT_DST_HORSE1,
|
||||
EVENT_DST_HORSE2,
|
||||
EVENT_DST_HORSE3,
|
||||
EVENT_POS_RETREAT,
|
||||
EVENT_SRC_TOWN_CITYMAN1,
|
||||
EVENT_SRC_TOWN_CITYMAN2,
|
||||
EVENT_DST_CITYMAN,
|
||||
EVENT_SRC_MALGANIS,
|
||||
EVENT_SRC_MEATHOOK,
|
||||
EVENT_SRC_SALRAMM,
|
||||
EVENT_SRC_HALL_CITYMAN1,
|
||||
EVENT_SRC_HALL_CITYMAN2,
|
||||
EVENT_SRC_HALL_CITYMAN3,
|
||||
EVENT_SRC_EPOCH,
|
||||
EVENT_DST_EPOCH,
|
||||
EVENT_SRC_CORRUPTOR,
|
||||
EVENT_SRC_MALGANIS_FINAL,
|
||||
};
|
||||
|
||||
enum ArthasPhase
|
||||
{
|
||||
COS_PROGRESS_NOT_STARTED = 0,
|
||||
COS_PROGRESS_CRATES_FOUND = 1,
|
||||
COS_PROGRESS_START_INTRO = 2,
|
||||
COS_PROGRESS_FINISHED_INTRO = 3,
|
||||
COS_PROGRESS_FINISHED_CITY_INTRO = 4,
|
||||
COS_PROGRESS_KILLED_MEATHOOK = 5,
|
||||
COS_PROGRESS_KILLED_SALRAMM = 6,
|
||||
COS_PROGRESS_REACHED_TOWN_HALL = 7,
|
||||
COS_PROGRESS_KILLED_EPOCH = 8,
|
||||
COS_PROGRESS_LAST_CITY = 9,
|
||||
COS_PROGRESS_BEFORE_MALGANIS = 10,
|
||||
COS_PROGRESS_FINISHED = 11,
|
||||
COS_PROGRESS_NOT_STARTED = 0,
|
||||
COS_PROGRESS_CRATES_FOUND = 1,
|
||||
COS_PROGRESS_START_INTRO = 2,
|
||||
COS_PROGRESS_FINISHED_INTRO = 3,
|
||||
COS_PROGRESS_FINISHED_CITY_INTRO = 4,
|
||||
COS_PROGRESS_KILLED_MEATHOOK = 5,
|
||||
COS_PROGRESS_KILLED_SALRAMM = 6,
|
||||
COS_PROGRESS_REACHED_TOWN_HALL = 7,
|
||||
COS_PROGRESS_KILLED_EPOCH = 8,
|
||||
COS_PROGRESS_LAST_CITY = 9,
|
||||
COS_PROGRESS_BEFORE_MALGANIS = 10,
|
||||
COS_PROGRESS_FINISHED = 11,
|
||||
};
|
||||
|
||||
enum Actions
|
||||
{
|
||||
ACTION_START_EVENT = 1,
|
||||
ACTION_START_CITY = 2,
|
||||
ACTION_KILLED_SALRAMM = 3,
|
||||
ACTION_START_TOWN_HALL = 4,
|
||||
ACTION_START_SECRET_PASSAGE = 5,
|
||||
ACTION_START_LAST_CITY = 6,
|
||||
ACTION_RUN_OUT_OF_TIME = 7,
|
||||
ACTION_START_MALGANIS = 8,
|
||||
ACTION_KILLED_MALGANIS = 9,
|
||||
ACTION_START_EVENT = 1,
|
||||
ACTION_START_CITY = 2,
|
||||
ACTION_KILLED_SALRAMM = 3,
|
||||
ACTION_START_TOWN_HALL = 4,
|
||||
ACTION_START_SECRET_PASSAGE = 5,
|
||||
ACTION_START_LAST_CITY = 6,
|
||||
ACTION_RUN_OUT_OF_TIME = 7,
|
||||
ACTION_START_MALGANIS = 8,
|
||||
ACTION_KILLED_MALGANIS = 9,
|
||||
};
|
||||
|
||||
const Position LeaderIntroPos1 = {1938.05f, 1289.79f, 145.38f, 3.18f};
|
||||
@@ -141,31 +141,31 @@ const Position LeaderIntroPos6 = {2327.39f, 1412.47f, 127.69f, 0.0f};
|
||||
|
||||
const Position EventPos[] =
|
||||
{
|
||||
{1813.298f, 1283.578f, 142.326f, 3.878161f}, // chromie
|
||||
{1809.46f, 1286.05f, 142.62f, 4.8f}, // hourglass
|
||||
{1795.76f, 1271.54f, 140.61f, 0.21f}, // source for uther
|
||||
{1895.48f, 1292.66f, 143.706f, 0.023475f}, // source for jaina
|
||||
{1788.38f, 1273.7f, 140.15f, 0.2f}, // source for horses
|
||||
{1788.76f, 1271.54f, 140.62f, 0.21f},
|
||||
{1788.74f, 1267.38f, 140.18f, 0.11f},
|
||||
{1897.6f, 1285.5f, 143.44f, 0.32f}, // dest for uther
|
||||
{1888.56f, 1289.95f, 143.8f, 0.01f}, // dest for horses
|
||||
{1888.94f, 1285.41f, 143.69f, 0.08f},
|
||||
{1889.55f, 1279.95f, 143.62f, 0.1f},
|
||||
{1751.9f, 1262.45f, 137.62f, 3.35f}, // retreat position after intro (uther + horses)
|
||||
{2091.977f, 1275.021f, 140.757f, 0.558f}, // source for town city man 1
|
||||
{2093.514f, 1275.842f, 140.408f, 3.801f}, // 2
|
||||
{2089.04f, 1277.98f, 140.85f, 2.35f}, // cityman dest pos
|
||||
{2117.349f, 1288.624f, 136.271f, 1.37f}, // malganis city intro
|
||||
{2351.45f, 1197.81f, 130.45f, 3.83f}, // meathook spawn position
|
||||
{2351.45f, 1197.81f, 130.45f, 3.83f}, // salramm spawn position
|
||||
{2398.14f, 1207.81f, 134.04f, 5.15f}, // source for hall city man 1
|
||||
{2403.22f, 1205.54f, 134.04f, 3.31f}, // 2
|
||||
{2400.82f, 1201.69f, 134.01f, 1.53f}, // 3
|
||||
{2463.131f, 1115.391f, 152.473f, 3.41f}, // epoch spawn position
|
||||
{2451.809f, 1112.901f, 149.220f, 3.36f}, // epoch move pos
|
||||
{2329.07f, 1276.98f, 132.68f, 4.0f}, // infinite corruptor pos
|
||||
{2298.25f, 1500.56f, 128.37f, 4.95f} // malganis final pos
|
||||
{1813.298f, 1283.578f, 142.326f, 3.878161f}, // chromie
|
||||
{1809.46f, 1286.05f, 142.62f, 4.8f}, // hourglass
|
||||
{1795.76f, 1271.54f, 140.61f, 0.21f}, // source for uther
|
||||
{1895.48f, 1292.66f, 143.706f, 0.023475f}, // source for jaina
|
||||
{1788.38f, 1273.7f, 140.15f, 0.2f}, // source for horses
|
||||
{1788.76f, 1271.54f, 140.62f, 0.21f},
|
||||
{1788.74f, 1267.38f, 140.18f, 0.11f},
|
||||
{1897.6f, 1285.5f, 143.44f, 0.32f}, // dest for uther
|
||||
{1888.56f, 1289.95f, 143.8f, 0.01f}, // dest for horses
|
||||
{1888.94f, 1285.41f, 143.69f, 0.08f},
|
||||
{1889.55f, 1279.95f, 143.62f, 0.1f},
|
||||
{1751.9f, 1262.45f, 137.62f, 3.35f}, // retreat position after intro (uther + horses)
|
||||
{2091.977f, 1275.021f, 140.757f, 0.558f}, // source for town city man 1
|
||||
{2093.514f, 1275.842f, 140.408f, 3.801f}, // 2
|
||||
{2089.04f, 1277.98f, 140.85f, 2.35f}, // cityman dest pos
|
||||
{2117.349f, 1288.624f, 136.271f, 1.37f}, // malganis city intro
|
||||
{2351.45f, 1197.81f, 130.45f, 3.83f}, // meathook spawn position
|
||||
{2351.45f, 1197.81f, 130.45f, 3.83f}, // salramm spawn position
|
||||
{2398.14f, 1207.81f, 134.04f, 5.15f}, // source for hall city man 1
|
||||
{2403.22f, 1205.54f, 134.04f, 3.31f}, // 2
|
||||
{2400.82f, 1201.69f, 134.01f, 1.53f}, // 3
|
||||
{2463.131f, 1115.391f, 152.473f, 3.41f}, // epoch spawn position
|
||||
{2451.809f, 1112.901f, 149.220f, 3.36f}, // epoch move pos
|
||||
{2329.07f, 1276.98f, 132.68f, 4.0f}, // infinite corruptor pos
|
||||
{2298.25f, 1500.56f, 128.37f, 4.95f} // malganis final pos
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -24,21 +24,21 @@ class instance_culling_of_stratholme : public InstanceMapScript
|
||||
{
|
||||
instance_culling_of_stratholme_InstanceMapScript(Map* pMap) : InstanceScript(pMap)
|
||||
{
|
||||
// NPCs
|
||||
// NPCs
|
||||
_arthasGUID = 0;
|
||||
_infiniteGUID = 0;
|
||||
_infiniteGUID = 0;
|
||||
|
||||
// GOs
|
||||
// GOs
|
||||
_shkafGateGUID = 0;
|
||||
_exitGateGUID = 0;
|
||||
|
||||
// Instance
|
||||
// Instance
|
||||
_crateCount = 0;
|
||||
_showCrateTimer = 0;
|
||||
_guardianTimer = 0;
|
||||
_respawnAndReposition = false;
|
||||
_encounterState = COS_PROGRESS_NOT_STARTED;
|
||||
_loadTimer = 0;
|
||||
_showCrateTimer = 0;
|
||||
_guardianTimer = 0;
|
||||
_respawnAndReposition = false;
|
||||
_encounterState = COS_PROGRESS_NOT_STARTED;
|
||||
_loadTimer = 0;
|
||||
}
|
||||
|
||||
bool IsEncounterInProgress() const
|
||||
@@ -55,16 +55,16 @@ class instance_culling_of_stratholme : public InstanceMapScript
|
||||
data << uint32(WORLDSTATE_TIME_GUARDIAN_SHOW) << uint32(0);
|
||||
}
|
||||
|
||||
void OnPlayerEnter(Player* plr)
|
||||
{
|
||||
if (instance->GetPlayersCountExceptGMs() == 1)
|
||||
SetData(DATA_ARTHAS_REPOSITION, 2);
|
||||
void OnPlayerEnter(Player* plr)
|
||||
{
|
||||
if (instance->GetPlayersCountExceptGMs() == 1)
|
||||
SetData(DATA_ARTHAS_REPOSITION, 2);
|
||||
|
||||
EnsureGridLoaded();
|
||||
EnsureGridLoaded();
|
||||
|
||||
if (plr->getRace() != RACE_HUMAN && plr->getRace() != RACE_DWARF && plr->getRace() != RACE_GNOME)
|
||||
plr->CastSpell(plr, ((plr->getGender() == GENDER_MALE) ? SPELL_HUMAN_MALE : SPELL_HUMAN_FEMALE), true);
|
||||
}
|
||||
if (plr->getRace() != RACE_HUMAN && plr->getRace() != RACE_DWARF && plr->getRace() != RACE_GNOME)
|
||||
plr->CastSpell(plr, ((plr->getGender() == GENDER_MALE) ? SPELL_HUMAN_MALE : SPELL_HUMAN_FEMALE), true);
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
@@ -72,14 +72,14 @@ class instance_culling_of_stratholme : public InstanceMapScript
|
||||
{
|
||||
case NPC_ARTHAS:
|
||||
_arthasGUID = creature->GetGUID();
|
||||
if (_encounterState == COS_PROGRESS_FINISHED)
|
||||
creature->SetVisible(false);
|
||||
else
|
||||
Reposition(creature);
|
||||
if (_encounterState == COS_PROGRESS_FINISHED)
|
||||
creature->SetVisible(false);
|
||||
else
|
||||
Reposition(creature);
|
||||
break;
|
||||
case NPC_INFINITE:
|
||||
_infiniteGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_INFINITE:
|
||||
_infiniteGUID = creature->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -89,8 +89,8 @@ class instance_culling_of_stratholme : public InstanceMapScript
|
||||
{
|
||||
case GO_SHKAF_GATE:
|
||||
_shkafGateGUID = go->GetGUID();
|
||||
if (_encounterState >= COS_PROGRESS_KILLED_EPOCH)
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
if (_encounterState >= COS_PROGRESS_KILLED_EPOCH)
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case GO_EXIT_GATE:
|
||||
_exitGateGUID = go->GetGUID();
|
||||
@@ -104,68 +104,68 @@ class instance_culling_of_stratholme : public InstanceMapScript
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_SHOW_CRATES:
|
||||
DoUpdateWorldState(WORLDSTATE_SHOW_CRATES, data);
|
||||
return;
|
||||
case DATA_SHOW_INFINITE_TIMER:
|
||||
if (!instance->IsHeroic() || !_guardianTimer)
|
||||
return;
|
||||
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, data);
|
||||
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN, uint32(_guardianTimer / (MINUTE*IN_MILLISECONDS)));
|
||||
if (data == 0)
|
||||
{
|
||||
_guardianTimer = 0;
|
||||
SaveToDB();
|
||||
}
|
||||
else if (!_infiniteGUID)
|
||||
instance->SummonCreature(NPC_INFINITE, EventPos[EVENT_SRC_CORRUPTOR]);
|
||||
return;
|
||||
case DATA_START_WAVES:
|
||||
DoUpdateWorldState(WORLDSTATE_WAVE_COUNT, 1);
|
||||
if (instance->IsHeroic())
|
||||
{
|
||||
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, true);
|
||||
_guardianTimer = 26*MINUTE*IN_MILLISECONDS;
|
||||
if (!_infiniteGUID)
|
||||
instance->SummonCreature(NPC_INFINITE, EventPos[EVENT_SRC_CORRUPTOR]);
|
||||
}
|
||||
return;
|
||||
case DATA_CRATE_COUNT:
|
||||
case DATA_SHOW_CRATES:
|
||||
DoUpdateWorldState(WORLDSTATE_SHOW_CRATES, data);
|
||||
return;
|
||||
case DATA_SHOW_INFINITE_TIMER:
|
||||
if (!instance->IsHeroic() || !_guardianTimer)
|
||||
return;
|
||||
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, data);
|
||||
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN, uint32(_guardianTimer / (MINUTE*IN_MILLISECONDS)));
|
||||
if (data == 0)
|
||||
{
|
||||
_guardianTimer = 0;
|
||||
SaveToDB();
|
||||
}
|
||||
else if (!_infiniteGUID)
|
||||
instance->SummonCreature(NPC_INFINITE, EventPos[EVENT_SRC_CORRUPTOR]);
|
||||
return;
|
||||
case DATA_START_WAVES:
|
||||
DoUpdateWorldState(WORLDSTATE_WAVE_COUNT, 1);
|
||||
if (instance->IsHeroic())
|
||||
{
|
||||
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, true);
|
||||
_guardianTimer = 26*MINUTE*IN_MILLISECONDS;
|
||||
if (!_infiniteGUID)
|
||||
instance->SummonCreature(NPC_INFINITE, EventPos[EVENT_SRC_CORRUPTOR]);
|
||||
}
|
||||
return;
|
||||
case DATA_CRATE_COUNT:
|
||||
_crateCount++;
|
||||
if (_crateCount == 5)
|
||||
{
|
||||
Map::PlayerList const &PlayerList = instance->GetPlayers();
|
||||
if (!PlayerList.isEmpty())
|
||||
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
|
||||
i->GetSource()->KilledMonsterCredit(NPC_GRAIN_CREATE_TRIGGER, 0);
|
||||
Map::PlayerList const &PlayerList = instance->GetPlayers();
|
||||
if (!PlayerList.isEmpty())
|
||||
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
|
||||
i->GetSource()->KilledMonsterCredit(NPC_GRAIN_CREATE_TRIGGER, 0);
|
||||
|
||||
_showCrateTimer++;
|
||||
if (GetData(DATA_ARTHAS_EVENT) < COS_PROGRESS_CRATES_FOUND)
|
||||
SetData(DATA_ARTHAS_EVENT, COS_PROGRESS_CRATES_FOUND);
|
||||
_showCrateTimer++;
|
||||
if (GetData(DATA_ARTHAS_EVENT) < COS_PROGRESS_CRATES_FOUND)
|
||||
SetData(DATA_ARTHAS_EVENT, COS_PROGRESS_CRATES_FOUND);
|
||||
}
|
||||
|
||||
DoUpdateWorldState(WORLDSTATE_CRATES_REVEALED, _crateCount);
|
||||
return;
|
||||
case DATA_ARTHAS_EVENT:
|
||||
// Start Event
|
||||
_encounterState = data;
|
||||
if (data == COS_PROGRESS_START_INTRO)
|
||||
{
|
||||
if (Creature *arthas = instance->GetCreature(_arthasGUID))
|
||||
arthas->AI()->DoAction(ACTION_START_EVENT);
|
||||
}
|
||||
else if (data == COS_PROGRESS_KILLED_SALRAMM)
|
||||
{
|
||||
if (Creature *arthas = instance->GetCreature(_arthasGUID))
|
||||
arthas->AI()->DoAction(ACTION_KILLED_SALRAMM);
|
||||
}
|
||||
break;
|
||||
case DATA_ARTHAS_REPOSITION:
|
||||
if (data == 2)
|
||||
_respawnAndReposition = true;
|
||||
else if (Creature *arthas = instance->GetCreature(_arthasGUID))
|
||||
Reposition(arthas);
|
||||
return;
|
||||
case DATA_ARTHAS_EVENT:
|
||||
// Start Event
|
||||
_encounterState = data;
|
||||
if (data == COS_PROGRESS_START_INTRO)
|
||||
{
|
||||
if (Creature *arthas = instance->GetCreature(_arthasGUID))
|
||||
arthas->AI()->DoAction(ACTION_START_EVENT);
|
||||
}
|
||||
else if (data == COS_PROGRESS_KILLED_SALRAMM)
|
||||
{
|
||||
if (Creature *arthas = instance->GetCreature(_arthasGUID))
|
||||
arthas->AI()->DoAction(ACTION_KILLED_SALRAMM);
|
||||
}
|
||||
break;
|
||||
case DATA_ARTHAS_REPOSITION:
|
||||
if (data == 2)
|
||||
_respawnAndReposition = true;
|
||||
else if (Creature *arthas = instance->GetCreature(_arthasGUID))
|
||||
Reposition(arthas);
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
@@ -177,10 +177,10 @@ class instance_culling_of_stratholme : public InstanceMapScript
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_ARTHAS_EVENT:
|
||||
return _encounterState;
|
||||
case DATA_GUARDIANTIME_EVENT:
|
||||
return _guardianTimer;
|
||||
case DATA_ARTHAS_EVENT:
|
||||
return _encounterState;
|
||||
case DATA_GUARDIANTIME_EVENT:
|
||||
return _guardianTimer;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -189,175 +189,175 @@ class instance_culling_of_stratholme : public InstanceMapScript
|
||||
{
|
||||
switch (identifier)
|
||||
{
|
||||
case DATA_SHKAF_GATE:
|
||||
return _shkafGateGUID;
|
||||
case DATA_ARTHAS:
|
||||
return _arthasGUID;
|
||||
case DATA_EXIT_GATE:
|
||||
return _exitGateGUID;
|
||||
case DATA_SHKAF_GATE:
|
||||
return _shkafGateGUID;
|
||||
case DATA_ARTHAS:
|
||||
return _arthasGUID;
|
||||
case DATA_EXIT_GATE:
|
||||
return _exitGateGUID;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Update(uint32 diff)
|
||||
{
|
||||
if (_loadTimer)
|
||||
{
|
||||
_loadTimer += diff;
|
||||
if (_loadTimer > 3000)
|
||||
{
|
||||
UpdateEventState();
|
||||
_loadTimer = 0;
|
||||
}
|
||||
}
|
||||
// Used when arthas dies
|
||||
if (_respawnAndReposition)
|
||||
{
|
||||
if (Creature *arthas = instance->GetCreature(_arthasGUID))
|
||||
{
|
||||
if (!arthas->IsAlive())
|
||||
{
|
||||
EnsureGridLoaded();
|
||||
arthas->setDeathState(DEAD);
|
||||
arthas->Respawn();
|
||||
}
|
||||
else
|
||||
{
|
||||
arthas->AI()->Reset();
|
||||
_respawnAndReposition = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
void Update(uint32 diff)
|
||||
{
|
||||
if (_loadTimer)
|
||||
{
|
||||
_loadTimer += diff;
|
||||
if (_loadTimer > 3000)
|
||||
{
|
||||
UpdateEventState();
|
||||
_loadTimer = 0;
|
||||
}
|
||||
}
|
||||
// Used when arthas dies
|
||||
if (_respawnAndReposition)
|
||||
{
|
||||
if (Creature *arthas = instance->GetCreature(_arthasGUID))
|
||||
{
|
||||
if (!arthas->IsAlive())
|
||||
{
|
||||
EnsureGridLoaded();
|
||||
arthas->setDeathState(DEAD);
|
||||
arthas->Respawn();
|
||||
}
|
||||
else
|
||||
{
|
||||
arthas->AI()->Reset();
|
||||
_respawnAndReposition = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Used after 5-th crates is revealed
|
||||
if (_showCrateTimer)
|
||||
{
|
||||
_showCrateTimer += diff;
|
||||
if (_showCrateTimer >= 20000)
|
||||
{
|
||||
UpdateEventState();
|
||||
_showCrateTimer = 0; // just to be sure
|
||||
}
|
||||
}
|
||||
// Used after 5-th crates is revealed
|
||||
if (_showCrateTimer)
|
||||
{
|
||||
_showCrateTimer += diff;
|
||||
if (_showCrateTimer >= 20000)
|
||||
{
|
||||
UpdateEventState();
|
||||
_showCrateTimer = 0; // just to be sure
|
||||
}
|
||||
}
|
||||
|
||||
// Used to display how much time players have
|
||||
if (_guardianTimer)
|
||||
{
|
||||
uint32 div = uint32(_guardianTimer / (MINUTE*IN_MILLISECONDS));
|
||||
_guardianTimer -= diff;
|
||||
uint32 divAfter = uint32(_guardianTimer / (MINUTE*IN_MILLISECONDS));
|
||||
|
||||
if (divAfter == 0)
|
||||
{
|
||||
_guardianTimer = 0;
|
||||
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, 0);
|
||||
// Used to display how much time players have
|
||||
if (_guardianTimer)
|
||||
{
|
||||
uint32 div = uint32(_guardianTimer / (MINUTE*IN_MILLISECONDS));
|
||||
_guardianTimer -= diff;
|
||||
uint32 divAfter = uint32(_guardianTimer / (MINUTE*IN_MILLISECONDS));
|
||||
|
||||
if (divAfter == 0)
|
||||
{
|
||||
_guardianTimer = 0;
|
||||
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, 0);
|
||||
|
||||
// Inform infinite we run out of time
|
||||
if (instance->IsHeroic() && _infiniteGUID)
|
||||
if (Creature* cr = instance->GetCreature(_infiniteGUID))
|
||||
cr->AI()->DoAction(ACTION_RUN_OUT_OF_TIME);
|
||||
// Inform infinite we run out of time
|
||||
if (instance->IsHeroic() && _infiniteGUID)
|
||||
if (Creature* cr = instance->GetCreature(_infiniteGUID))
|
||||
cr->AI()->DoAction(ACTION_RUN_OUT_OF_TIME);
|
||||
|
||||
}
|
||||
else if (div > divAfter)
|
||||
{
|
||||
if (divAfter == 5)
|
||||
ChromieWhisper(1);
|
||||
else if (divAfter == 1)
|
||||
ChromieWhisper(2);
|
||||
}
|
||||
else if (div > divAfter)
|
||||
{
|
||||
if (divAfter == 5)
|
||||
ChromieWhisper(1);
|
||||
else if (divAfter == 1)
|
||||
ChromieWhisper(2);
|
||||
|
||||
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN, divAfter);
|
||||
SaveToDB();
|
||||
}
|
||||
}
|
||||
}
|
||||
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN, divAfter);
|
||||
SaveToDB();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateEventState()
|
||||
{
|
||||
if (_encounterState > COS_PROGRESS_NOT_STARTED)
|
||||
{
|
||||
// Summon Chromie and global whisper
|
||||
void UpdateEventState()
|
||||
{
|
||||
if (_encounterState > COS_PROGRESS_NOT_STARTED)
|
||||
{
|
||||
// Summon Chromie and global whisper
|
||||
instance->SummonCreature(NPC_CHROMIE_MIDDLE, EventPos[EVENT_POS_CHROMIE]);
|
||||
instance->SummonCreature(NPC_HOURGLASS, EventPos[EVENT_POS_HOURGLASS]);
|
||||
instance->SummonCreature(NPC_HOURGLASS, EventPos[EVENT_POS_HOURGLASS]);
|
||||
|
||||
if (_encounterState == COS_PROGRESS_CRATES_FOUND ||
|
||||
_encounterState == COS_PROGRESS_START_INTRO)
|
||||
{
|
||||
ChromieWhisper(0);
|
||||
if (_encounterState == COS_PROGRESS_CRATES_FOUND ||
|
||||
_encounterState == COS_PROGRESS_START_INTRO)
|
||||
{
|
||||
ChromieWhisper(0);
|
||||
|
||||
// hide crates count
|
||||
DoUpdateWorldState(WORLDSTATE_SHOW_CRATES, 0);
|
||||
_showCrateTimer = 0;
|
||||
_encounterState = COS_PROGRESS_CRATES_FOUND;
|
||||
}
|
||||
}
|
||||
}
|
||||
// hide crates count
|
||||
DoUpdateWorldState(WORLDSTATE_SHOW_CRATES, 0);
|
||||
_showCrateTimer = 0;
|
||||
_encounterState = COS_PROGRESS_CRATES_FOUND;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ChromieWhisper(uint8 textId)
|
||||
{
|
||||
if (!instance->GetPlayers().isEmpty())
|
||||
if (Player* player = instance->GetPlayers().getFirst()->GetSource())
|
||||
{
|
||||
Position pos;
|
||||
player->GetPosition(&pos);
|
||||
if (Creature* cr = instance->SummonCreature(NPC_CHROMIE_MIDDLE, pos))
|
||||
{
|
||||
cr->SetVisible(false);
|
||||
cr->DespawnOrUnsummon(1000);
|
||||
sCreatureTextMgr->SendChat(cr, textId, player, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_MAP);
|
||||
}
|
||||
}
|
||||
}
|
||||
void ChromieWhisper(uint8 textId)
|
||||
{
|
||||
if (!instance->GetPlayers().isEmpty())
|
||||
if (Player* player = instance->GetPlayers().getFirst()->GetSource())
|
||||
{
|
||||
Position pos;
|
||||
player->GetPosition(&pos);
|
||||
if (Creature* cr = instance->SummonCreature(NPC_CHROMIE_MIDDLE, pos))
|
||||
{
|
||||
cr->SetVisible(false);
|
||||
cr->DespawnOrUnsummon(1000);
|
||||
sCreatureTextMgr->SendChat(cr, textId, player, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_MAP);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Reposition(Creature* arthas)
|
||||
{
|
||||
switch (GetData(DATA_ARTHAS_EVENT))
|
||||
{
|
||||
case COS_PROGRESS_FINISHED_INTRO:
|
||||
arthas->UpdatePosition(LeaderIntroPos2, true);
|
||||
arthas->SetHomePosition(LeaderIntroPos2);
|
||||
arthas->SetFacingTo(LeaderIntroPos2.GetOrientation());
|
||||
break;
|
||||
case COS_PROGRESS_FINISHED_CITY_INTRO:
|
||||
case COS_PROGRESS_KILLED_MEATHOOK:
|
||||
case COS_PROGRESS_KILLED_SALRAMM:
|
||||
arthas->UpdatePosition(LeaderIntroPos2special, true);
|
||||
arthas->SetHomePosition(LeaderIntroPos2special);
|
||||
arthas->SetFacingTo(LeaderIntroPos2special.GetOrientation());
|
||||
break;
|
||||
case COS_PROGRESS_REACHED_TOWN_HALL:
|
||||
arthas->UpdatePosition(LeaderIntroPos3, true);
|
||||
arthas->SetHomePosition(LeaderIntroPos3);
|
||||
arthas->SetFacingTo(LeaderIntroPos3.GetOrientation());
|
||||
break;
|
||||
case COS_PROGRESS_KILLED_EPOCH:
|
||||
arthas->UpdatePosition(LeaderIntroPos4, true);
|
||||
arthas->SetHomePosition(LeaderIntroPos4);
|
||||
arthas->SetFacingTo(LeaderIntroPos4.GetOrientation());
|
||||
break;
|
||||
case COS_PROGRESS_LAST_CITY:
|
||||
arthas->UpdatePosition(LeaderIntroPos5, true);
|
||||
arthas->SetHomePosition(LeaderIntroPos5);
|
||||
arthas->SetFacingTo(LeaderIntroPos5.GetOrientation());
|
||||
break;
|
||||
case COS_PROGRESS_BEFORE_MALGANIS:
|
||||
arthas->UpdatePosition(LeaderIntroPos6, true);
|
||||
arthas->SetHomePosition(LeaderIntroPos6);
|
||||
arthas->SetFacingTo(LeaderIntroPos6.GetOrientation());
|
||||
break;
|
||||
}
|
||||
}
|
||||
void Reposition(Creature* arthas)
|
||||
{
|
||||
switch (GetData(DATA_ARTHAS_EVENT))
|
||||
{
|
||||
case COS_PROGRESS_FINISHED_INTRO:
|
||||
arthas->UpdatePosition(LeaderIntroPos2, true);
|
||||
arthas->SetHomePosition(LeaderIntroPos2);
|
||||
arthas->SetFacingTo(LeaderIntroPos2.GetOrientation());
|
||||
break;
|
||||
case COS_PROGRESS_FINISHED_CITY_INTRO:
|
||||
case COS_PROGRESS_KILLED_MEATHOOK:
|
||||
case COS_PROGRESS_KILLED_SALRAMM:
|
||||
arthas->UpdatePosition(LeaderIntroPos2special, true);
|
||||
arthas->SetHomePosition(LeaderIntroPos2special);
|
||||
arthas->SetFacingTo(LeaderIntroPos2special.GetOrientation());
|
||||
break;
|
||||
case COS_PROGRESS_REACHED_TOWN_HALL:
|
||||
arthas->UpdatePosition(LeaderIntroPos3, true);
|
||||
arthas->SetHomePosition(LeaderIntroPos3);
|
||||
arthas->SetFacingTo(LeaderIntroPos3.GetOrientation());
|
||||
break;
|
||||
case COS_PROGRESS_KILLED_EPOCH:
|
||||
arthas->UpdatePosition(LeaderIntroPos4, true);
|
||||
arthas->SetHomePosition(LeaderIntroPos4);
|
||||
arthas->SetFacingTo(LeaderIntroPos4.GetOrientation());
|
||||
break;
|
||||
case COS_PROGRESS_LAST_CITY:
|
||||
arthas->UpdatePosition(LeaderIntroPos5, true);
|
||||
arthas->SetHomePosition(LeaderIntroPos5);
|
||||
arthas->SetFacingTo(LeaderIntroPos5.GetOrientation());
|
||||
break;
|
||||
case COS_PROGRESS_BEFORE_MALGANIS:
|
||||
arthas->UpdatePosition(LeaderIntroPos6, true);
|
||||
arthas->SetHomePosition(LeaderIntroPos6);
|
||||
arthas->SetFacingTo(LeaderIntroPos6.GetOrientation());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void EnsureGridLoaded()
|
||||
{
|
||||
instance->LoadGrid(LeaderIntroPos1.GetPositionX(), LeaderIntroPos1.GetPositionY());
|
||||
instance->LoadGrid(LeaderIntroPos2.GetPositionX(), LeaderIntroPos2.GetPositionY());
|
||||
instance->LoadGrid(LeaderIntroPos3.GetPositionX(), LeaderIntroPos3.GetPositionY());
|
||||
instance->LoadGrid(LeaderIntroPos4.GetPositionX(), LeaderIntroPos4.GetPositionY());
|
||||
instance->LoadGrid(LeaderIntroPos5.GetPositionX(), LeaderIntroPos5.GetPositionY());
|
||||
instance->LoadGrid(LeaderIntroPos6.GetPositionX(), LeaderIntroPos6.GetPositionY());
|
||||
}
|
||||
void EnsureGridLoaded()
|
||||
{
|
||||
instance->LoadGrid(LeaderIntroPos1.GetPositionX(), LeaderIntroPos1.GetPositionY());
|
||||
instance->LoadGrid(LeaderIntroPos2.GetPositionX(), LeaderIntroPos2.GetPositionY());
|
||||
instance->LoadGrid(LeaderIntroPos3.GetPositionX(), LeaderIntroPos3.GetPositionY());
|
||||
instance->LoadGrid(LeaderIntroPos4.GetPositionX(), LeaderIntroPos4.GetPositionY());
|
||||
instance->LoadGrid(LeaderIntroPos5.GetPositionX(), LeaderIntroPos5.GetPositionY());
|
||||
instance->LoadGrid(LeaderIntroPos6.GetPositionX(), LeaderIntroPos6.GetPositionY());
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
@@ -387,10 +387,10 @@ class instance_culling_of_stratholme : public InstanceMapScript
|
||||
if (dataHead1 == 'C' && dataHead2 == 'S')
|
||||
{
|
||||
_encounterState = data0;
|
||||
_guardianTimer = data1;
|
||||
_guardianTimer = data1;
|
||||
|
||||
//UpdateEventState();
|
||||
_loadTimer++;
|
||||
//UpdateEventState();
|
||||
_loadTimer++;
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
@@ -399,20 +399,20 @@ class instance_culling_of_stratholme : public InstanceMapScript
|
||||
}
|
||||
|
||||
private:
|
||||
// NPCs
|
||||
// NPCs
|
||||
uint64 _arthasGUID;
|
||||
uint64 _infiniteGUID;
|
||||
uint64 _infiniteGUID;
|
||||
|
||||
// GOs
|
||||
// GOs
|
||||
uint64 _shkafGateGUID;
|
||||
uint64 _exitGateGUID;
|
||||
uint32 _encounterState;
|
||||
uint32 _crateCount;
|
||||
uint32 _showCrateTimer;
|
||||
uint32 _guardianTimer;
|
||||
uint32 _showCrateTimer;
|
||||
uint32 _guardianTimer;
|
||||
|
||||
bool _respawnAndReposition;
|
||||
uint32 _loadTimer;
|
||||
bool _respawnAndReposition;
|
||||
uint32 _loadTimer;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -8,35 +8,35 @@ REWRITTEN BY XINEF
|
||||
|
||||
enum CaptainSkarloc
|
||||
{
|
||||
SAY_ENTER = 0,
|
||||
SAY_TAUNT = 1,
|
||||
SAY_SLAY = 2,
|
||||
SAY_DEATH = 3,
|
||||
SAY_ENTER = 0,
|
||||
SAY_TAUNT = 1,
|
||||
SAY_SLAY = 2,
|
||||
SAY_DEATH = 3,
|
||||
|
||||
SPELL_HOLY_LIGHT = 29427,
|
||||
SPELL_CLEANSE = 29380,
|
||||
SPELL_HAMMER_OF_JUSTICE = 13005,
|
||||
SPELL_HOLY_SHIELD = 31904,
|
||||
SPELL_DEVOTION_AURA = 8258,
|
||||
SPELL_CONSECRATION = 38385,
|
||||
SPELL_HOLY_LIGHT = 29427,
|
||||
SPELL_CLEANSE = 29380,
|
||||
SPELL_HAMMER_OF_JUSTICE = 13005,
|
||||
SPELL_HOLY_SHIELD = 31904,
|
||||
SPELL_DEVOTION_AURA = 8258,
|
||||
SPELL_CONSECRATION = 38385,
|
||||
|
||||
WAYPOINTS_COUNT = 4,
|
||||
WAYPOINTS_COUNT = 4,
|
||||
|
||||
EVENT_INITIAL_TALK = 1,
|
||||
EVENT_START_FIGHT = 2,
|
||||
EVENT_SPELL_CLEANSE = 10,
|
||||
EVENT_SPELL_HAMMER = 11,
|
||||
EVENT_SPELL_HOLY_LIGHT = 12,
|
||||
EVENT_SPELL_HOLY_SHIELD = 13,
|
||||
EVENT_SPELL_CONSECRATION = 14
|
||||
EVENT_INITIAL_TALK = 1,
|
||||
EVENT_START_FIGHT = 2,
|
||||
EVENT_SPELL_CLEANSE = 10,
|
||||
EVENT_SPELL_HAMMER = 11,
|
||||
EVENT_SPELL_HOLY_LIGHT = 12,
|
||||
EVENT_SPELL_HOLY_SHIELD = 13,
|
||||
EVENT_SPELL_CONSECRATION = 14
|
||||
};
|
||||
|
||||
const Position startPath[WAYPOINTS_COUNT] =
|
||||
{
|
||||
{2008.38f, 281.57f, 65.70f, 0.0f},
|
||||
{2035.71f, 271.38f, 63.495f, 0.0f},
|
||||
{2049.12f, 252.31f, 62.855f, 0.0f},
|
||||
{2058.77f, 236.04f, 63.92f, 0.0f}
|
||||
{2008.38f, 281.57f, 65.70f, 0.0f},
|
||||
{2035.71f, 271.38f, 63.495f, 0.0f},
|
||||
{2049.12f, 252.31f, 62.855f, 0.0f},
|
||||
{2058.77f, 236.04f, 63.92f, 0.0f}
|
||||
};
|
||||
|
||||
class boss_captain_skarloc : public CreatureScript
|
||||
@@ -54,84 +54,84 @@ public:
|
||||
boss_captain_skarlocAI(Creature* creature) : ScriptedAI(creature), summons(me) { }
|
||||
|
||||
EventMap events;
|
||||
EventMap events2;
|
||||
SummonList summons;
|
||||
EventMap events2;
|
||||
SummonList summons;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
events2.Reset();
|
||||
summons.DespawnAll();
|
||||
events.Reset();
|
||||
events2.Reset();
|
||||
summons.DespawnAll();
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if (Creature* thrall = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(DATA_THRALL_GUID)))
|
||||
thrall->AI()->JustSummoned(summon);
|
||||
summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if (Creature* thrall = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(DATA_THRALL_GUID)))
|
||||
thrall->AI()->JustSummoned(summon);
|
||||
summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
|
||||
if (summon->GetEntry() == NPC_SKARLOC_MOUNT)
|
||||
return;
|
||||
if (summon->GetEntry() == NPC_SKARLOC_MOUNT)
|
||||
return;
|
||||
|
||||
if (summons.size() == 1)
|
||||
summon->GetMotionMaster()->MovePoint(0, 2060.788f, 237.301f, 63.999f);
|
||||
else
|
||||
summon->GetMotionMaster()->MovePoint(0, 2056.870f, 234.853f, 63.839f);
|
||||
}
|
||||
if (summons.size() == 1)
|
||||
summon->GetMotionMaster()->MovePoint(0, 2060.788f, 237.301f, 63.999f);
|
||||
else
|
||||
summon->GetMotionMaster()->MovePoint(0, 2056.870f, 234.853f, 63.839f);
|
||||
}
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
ScriptedAI::InitializeAI();
|
||||
void InitializeAI()
|
||||
{
|
||||
ScriptedAI::InitializeAI();
|
||||
|
||||
Movement::PointsArray path;
|
||||
path.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()));
|
||||
for (uint8 i = 0; i < WAYPOINTS_COUNT; ++i)
|
||||
path.push_back(G3D::Vector3(startPath[i].GetPositionX(), startPath[i].GetPositionY(), startPath[i].GetPositionZ()));
|
||||
Movement::PointsArray path;
|
||||
path.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()));
|
||||
for (uint8 i = 0; i < WAYPOINTS_COUNT; ++i)
|
||||
path.push_back(G3D::Vector3(startPath[i].GetPositionX(), startPath[i].GetPositionY(), startPath[i].GetPositionZ()));
|
||||
|
||||
me->GetMotionMaster()->MoveSplinePath(&path);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
me->Mount(SKARLOC_MOUNT_MODEL);
|
||||
}
|
||||
me->GetMotionMaster()->MoveSplinePath(&path);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
me->Mount(SKARLOC_MOUNT_MODEL);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if (type != ESCORT_MOTION_TYPE)
|
||||
return;
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if (type != ESCORT_MOTION_TYPE)
|
||||
return;
|
||||
|
||||
// Xinef: we can rely here on internal counting
|
||||
if (id == 1)
|
||||
{
|
||||
me->SummonCreature(NPC_DURNHOLDE_MAGE, 2038.549f, 273.303f, 63.420f, 5.30f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->SummonCreature(NPC_DURNHOLDE_VETERAN, 2032.810f, 269.416f, 63.561f, 5.30f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
}
|
||||
else if (id == 2)
|
||||
{
|
||||
me->SummonCreature(NPC_SKARLOC_MOUNT, 2049.12f, 252.31f, 62.855f, me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->Dismount();
|
||||
me->SetWalk(true);
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr))
|
||||
summon->SetWalk(true);
|
||||
}
|
||||
// Xinef: we can rely here on internal counting
|
||||
if (id == 1)
|
||||
{
|
||||
me->SummonCreature(NPC_DURNHOLDE_MAGE, 2038.549f, 273.303f, 63.420f, 5.30f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->SummonCreature(NPC_DURNHOLDE_VETERAN, 2032.810f, 269.416f, 63.561f, 5.30f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
}
|
||||
else if (id == 2)
|
||||
{
|
||||
me->SummonCreature(NPC_SKARLOC_MOUNT, 2049.12f, 252.31f, 62.855f, me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->Dismount();
|
||||
me->SetWalk(true);
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr))
|
||||
summon->SetWalk(true);
|
||||
}
|
||||
|
||||
if (me->movespline->Finalized())
|
||||
{
|
||||
events2.ScheduleEvent(EVENT_INITIAL_TALK, 500);
|
||||
events2.ScheduleEvent(EVENT_START_FIGHT, 8000);
|
||||
}
|
||||
}
|
||||
if (me->movespline->Finalized())
|
||||
{
|
||||
events2.ScheduleEvent(EVENT_INITIAL_TALK, 500);
|
||||
events2.ScheduleEvent(EVENT_START_FIGHT, 8000);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
me->CastSpell(me, SPELL_DEVOTION_AURA, true);
|
||||
me->CastSpell(me, SPELL_DEVOTION_AURA, true);
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_HOLY_LIGHT, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CLEANSE, 6000);
|
||||
events.ScheduleEvent(EVENT_SPELL_HAMMER, 20000);
|
||||
events.ScheduleEvent(EVENT_SPELL_HOLY_SHIELD, 10000);
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SPELL_CONSECRATION, 1000);
|
||||
events.ScheduleEvent(EVENT_SPELL_HOLY_LIGHT, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CLEANSE, 6000);
|
||||
events.ScheduleEvent(EVENT_SPELL_HAMMER, 20000);
|
||||
events.ScheduleEvent(EVENT_SPELL_HOLY_SHIELD, 10000);
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SPELL_CONSECRATION, 1000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
@@ -143,63 +143,63 @@ public:
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
me->GetInstanceScript()->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_SKARLOC_KILLED);
|
||||
me->GetInstanceScript()->SetData(DATA_THRALL_ADD_FLAG, 0);
|
||||
me->GetInstanceScript()->SetData(DATA_THRALL_ADD_FLAG, 0);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events2.Update(diff);
|
||||
switch (events2.ExecuteEvent())
|
||||
{
|
||||
case EVENT_INITIAL_TALK:
|
||||
Talk(SAY_ENTER);
|
||||
break;
|
||||
case EVENT_START_FIGHT:
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
me->SetInCombatWithZone();
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr))
|
||||
if (summon->GetEntry() != NPC_SKARLOC_MOUNT)
|
||||
{
|
||||
summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
summon->SetInCombatWithZone();
|
||||
}
|
||||
break;
|
||||
}
|
||||
events2.Update(diff);
|
||||
switch (events2.ExecuteEvent())
|
||||
{
|
||||
case EVENT_INITIAL_TALK:
|
||||
Talk(SAY_ENTER);
|
||||
break;
|
||||
case EVENT_START_FIGHT:
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
me->SetInCombatWithZone();
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr))
|
||||
if (summon->GetEntry() != NPC_SKARLOC_MOUNT)
|
||||
{
|
||||
summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
summon->SetInCombatWithZone();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_HOLY_LIGHT:
|
||||
me->CastSpell(me, SPELL_HOLY_LIGHT, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_HOLY_LIGHT, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_CLEANSE:
|
||||
if (roll_chance_i(33))
|
||||
Talk(SAY_TAUNT);
|
||||
me->CastSpell(me, SPELL_CLEANSE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CLEANSE, 10000);
|
||||
break;
|
||||
case EVENT_SPELL_HAMMER:
|
||||
me->CastSpell(me->GetVictim(), SPELL_HAMMER_OF_JUSTICE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_HAMMER, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_HOLY_SHIELD:
|
||||
me->CastSpell(me, SPELL_CLEANSE, false);
|
||||
events.ScheduleEvent(SPELL_HOLY_SHIELD, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_CONSECRATION:
|
||||
me->CastSpell(me, SPELL_CONSECRATION, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CONSECRATION, 20000);
|
||||
break;
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_HOLY_LIGHT:
|
||||
me->CastSpell(me, SPELL_HOLY_LIGHT, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_HOLY_LIGHT, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_CLEANSE:
|
||||
if (roll_chance_i(33))
|
||||
Talk(SAY_TAUNT);
|
||||
me->CastSpell(me, SPELL_CLEANSE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CLEANSE, 10000);
|
||||
break;
|
||||
case EVENT_SPELL_HAMMER:
|
||||
me->CastSpell(me->GetVictim(), SPELL_HAMMER_OF_JUSTICE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_HAMMER, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_HOLY_SHIELD:
|
||||
me->CastSpell(me, SPELL_CLEANSE, false);
|
||||
events.ScheduleEvent(SPELL_HOLY_SHIELD, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_CONSECRATION:
|
||||
me->CastSpell(me, SPELL_CONSECRATION, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CONSECRATION, 20000);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
@@ -9,20 +9,20 @@ REWRITTEN BY XINEF
|
||||
|
||||
enum EpochHunter
|
||||
{
|
||||
SAY_AGGRO = 3,
|
||||
SAY_SLAY = 4,
|
||||
SAY_BREATH = 5,
|
||||
SAY_DEATH = 6,
|
||||
SAY_AGGRO = 3,
|
||||
SAY_SLAY = 4,
|
||||
SAY_BREATH = 5,
|
||||
SAY_DEATH = 6,
|
||||
|
||||
SPELL_SAND_BREATH = 31914,
|
||||
SPELL_IMPENDING_DEATH = 31916,
|
||||
SPELL_MAGIC_DISRUPTION_AURA = 33834,
|
||||
SPELL_WING_BUFFET = 31475,
|
||||
|
||||
EVENT_SPELL_SAND_BREATH = 1,
|
||||
EVENT_SPELL_IMPENDING_DEATH = 2,
|
||||
EVENT_SPELL_DISRUPTION = 3,
|
||||
EVENT_SPELL_WING_BUFFET = 4
|
||||
EVENT_SPELL_SAND_BREATH = 1,
|
||||
EVENT_SPELL_IMPENDING_DEATH = 2,
|
||||
EVENT_SPELL_DISRUPTION = 3,
|
||||
EVENT_SPELL_WING_BUFFET = 4
|
||||
};
|
||||
|
||||
class boss_epoch_hunter : public CreatureScript
|
||||
@@ -49,26 +49,26 @@ public:
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_SAND_BREATH, 8000);
|
||||
events.ScheduleEvent(EVENT_SPELL_IMPENDING_DEATH, 2000);
|
||||
events.ScheduleEvent(EVENT_SPELL_DISRUPTION, 20000);
|
||||
events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, 14000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SAND_BREATH, 8000);
|
||||
events.ScheduleEvent(EVENT_SPELL_IMPENDING_DEATH, 2000);
|
||||
events.ScheduleEvent(EVENT_SPELL_DISRUPTION, 20000);
|
||||
events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, 14000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
if (killer == me)
|
||||
return;
|
||||
if (killer == me)
|
||||
return;
|
||||
Talk(SAY_DEATH);
|
||||
me->GetInstanceScript()->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_EPOCH_KILLED);
|
||||
if (Creature* taretha = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(DATA_TARETHA_GUID)))
|
||||
taretha->AI()->DoAction(me->GetEntry());
|
||||
me->GetInstanceScript()->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_EPOCH_KILLED);
|
||||
if (Creature* taretha = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(DATA_TARETHA_GUID)))
|
||||
taretha->AI()->DoAction(me->GetEntry());
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
@@ -76,31 +76,31 @@ public:
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_SAND_BREATH:
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_BREATH);
|
||||
me->CastSpell(me->GetVictim(), SPELL_SAND_BREATH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SAND_BREATH, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_IMPENDING_DEATH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_IMPENDING_DEATH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_IMPENDING_DEATH, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_WING_BUFFET:
|
||||
me->CastSpell(me, SPELL_WING_BUFFET, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_DISRUPTION:
|
||||
me->CastSpell(me, SPELL_MAGIC_DISRUPTION_AURA, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_DISRUPTION, 30000);
|
||||
break;
|
||||
}
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_SAND_BREATH:
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_BREATH);
|
||||
me->CastSpell(me->GetVictim(), SPELL_SAND_BREATH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SAND_BREATH, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_IMPENDING_DEATH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_IMPENDING_DEATH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_IMPENDING_DEATH, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_WING_BUFFET:
|
||||
me->CastSpell(me, SPELL_WING_BUFFET, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_DISRUPTION:
|
||||
me->CastSpell(me, SPELL_MAGIC_DISRUPTION_AURA, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_DISRUPTION, 30000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
@@ -10,24 +10,24 @@ REWRITTEN BY XINEF
|
||||
|
||||
enum LieutenantDrake
|
||||
{
|
||||
SAY_ENTER = 0,
|
||||
SAY_AGGRO = 1,
|
||||
SAY_SLAY = 2,
|
||||
SAY_MORTAL = 3,
|
||||
SAY_SHOUT = 4,
|
||||
SAY_DEATH = 5,
|
||||
SAY_ENTER = 0,
|
||||
SAY_AGGRO = 1,
|
||||
SAY_SLAY = 2,
|
||||
SAY_MORTAL = 3,
|
||||
SAY_SHOUT = 4,
|
||||
SAY_DEATH = 5,
|
||||
|
||||
SPELL_WHIRLWIND = 31909,
|
||||
SPELL_EXPLODING_SHOT = 33792,
|
||||
SPELL_HAMSTRING = 9080,
|
||||
SPELL_MORTAL_STRIKE = 31911,
|
||||
SPELL_FRIGHTENING_SHOUT = 33789,
|
||||
SPELL_WHIRLWIND = 31909,
|
||||
SPELL_EXPLODING_SHOT = 33792,
|
||||
SPELL_HAMSTRING = 9080,
|
||||
SPELL_MORTAL_STRIKE = 31911,
|
||||
SPELL_FRIGHTENING_SHOUT = 33789,
|
||||
|
||||
EVENT_WHIRLWIND = 1,
|
||||
EVENT_FRIGHTENING_SHOUT = 2,
|
||||
EVENT_MORTAL_STRIKE = 3,
|
||||
EVENT_HAMSTRING = 4,
|
||||
EVENT_EXPLODING_SHOT = 5
|
||||
EVENT_WHIRLWIND = 1,
|
||||
EVENT_FRIGHTENING_SHOUT = 2,
|
||||
EVENT_MORTAL_STRIKE = 3,
|
||||
EVENT_HAMSTRING = 4,
|
||||
EVENT_EXPLODING_SHOT = 5
|
||||
};
|
||||
|
||||
class boss_lieutenant_drake : public CreatureScript
|
||||
@@ -43,38 +43,38 @@ public:
|
||||
struct boss_lieutenant_drakeAI : public ScriptedAI
|
||||
{
|
||||
boss_lieutenant_drakeAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
pathPoints.clear();
|
||||
WPPath* path = sSmartWaypointMgr->GetPath(me->GetEntry());
|
||||
if (!path || path->empty())
|
||||
return;
|
||||
{
|
||||
pathPoints.clear();
|
||||
WPPath* path = sSmartWaypointMgr->GetPath(me->GetEntry());
|
||||
if (!path || path->empty())
|
||||
return;
|
||||
|
||||
pathPoints.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()));
|
||||
pathPoints.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()));
|
||||
|
||||
uint32 wpCounter = 1;
|
||||
WPPath::const_iterator itr;
|
||||
while ((itr = path->find(wpCounter++)) != path->end())
|
||||
{
|
||||
WayPoint* wp = itr->second;
|
||||
pathPoints.push_back(G3D::Vector3(wp->x, wp->y, wp->z));
|
||||
}
|
||||
}
|
||||
uint32 wpCounter = 1;
|
||||
WPPath::const_iterator itr;
|
||||
while ((itr = path->find(wpCounter++)) != path->end())
|
||||
{
|
||||
WayPoint* wp = itr->second;
|
||||
pathPoints.push_back(G3D::Vector3(wp->x, wp->y, wp->z));
|
||||
}
|
||||
}
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
ScriptedAI::InitializeAI();
|
||||
//Talk(SAY_ENTER);
|
||||
JustReachedHome();
|
||||
}
|
||||
void InitializeAI()
|
||||
{
|
||||
ScriptedAI::InitializeAI();
|
||||
//Talk(SAY_ENTER);
|
||||
JustReachedHome();
|
||||
}
|
||||
|
||||
void JustReachedHome()
|
||||
{
|
||||
me->SetWalk(true);
|
||||
Movement::MoveSplineInit init(me);
|
||||
init.MovebyPath(pathPoints);
|
||||
init.SetCyclic();
|
||||
init.Launch();
|
||||
}
|
||||
void JustReachedHome()
|
||||
{
|
||||
me->SetWalk(true);
|
||||
Movement::MoveSplineInit init(me);
|
||||
init.MovebyPath(pathPoints);
|
||||
init.SetCyclic();
|
||||
init.Launch();
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
@@ -85,24 +85,24 @@ public:
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_WHIRLWIND, 4000);
|
||||
events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 14000);
|
||||
events.ScheduleEvent(EVENT_MORTAL_STRIKE, 9000);
|
||||
events.ScheduleEvent(EVENT_HAMSTRING, 18000);
|
||||
events.ScheduleEvent(EVENT_EXPLODING_SHOT, 1000);
|
||||
events.ScheduleEvent(EVENT_WHIRLWIND, 4000);
|
||||
events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 14000);
|
||||
events.ScheduleEvent(EVENT_MORTAL_STRIKE, 9000);
|
||||
events.ScheduleEvent(EVENT_HAMSTRING, 18000);
|
||||
events.ScheduleEvent(EVENT_EXPLODING_SHOT, 1000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
if (InstanceScript* instance = me->GetInstanceScript())
|
||||
instance->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_DRAKE_KILLED);
|
||||
if (InstanceScript* instance = me->GetInstanceScript())
|
||||
instance->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_DRAKE_KILLED);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
@@ -110,45 +110,45 @@ public:
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_WHIRLWIND:
|
||||
me->CastSpell(me, SPELL_WHIRLWIND, false);
|
||||
events.ScheduleEvent(EVENT_WHIRLWIND, 25000);
|
||||
break;
|
||||
case EVENT_EXPLODING_SHOT:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 40.0f))
|
||||
me->CastSpell(target, SPELL_EXPLODING_SHOT, false);
|
||||
events.ScheduleEvent(EVENT_EXPLODING_SHOT, 25000);
|
||||
break;
|
||||
case EVENT_MORTAL_STRIKE:
|
||||
if (roll_chance_i(40))
|
||||
Talk(SAY_MORTAL);
|
||||
me->CastSpell(me->GetVictim(), SPELL_MORTAL_STRIKE, false);
|
||||
events.ScheduleEvent(EVENT_MORTAL_STRIKE, 10000);
|
||||
break;
|
||||
case EVENT_FRIGHTENING_SHOUT:
|
||||
if (roll_chance_i(40))
|
||||
Talk(SAY_SHOUT);
|
||||
me->CastSpell(me, SPELL_FRIGHTENING_SHOUT, false);
|
||||
events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 25000);
|
||||
break;
|
||||
case EVENT_HAMSTRING:
|
||||
me->CastSpell(me->GetVictim(), SPELL_HAMSTRING, false);
|
||||
events.ScheduleEvent(EVENT_HAMSTRING, 25000);
|
||||
break;
|
||||
}
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_WHIRLWIND:
|
||||
me->CastSpell(me, SPELL_WHIRLWIND, false);
|
||||
events.ScheduleEvent(EVENT_WHIRLWIND, 25000);
|
||||
break;
|
||||
case EVENT_EXPLODING_SHOT:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 40.0f))
|
||||
me->CastSpell(target, SPELL_EXPLODING_SHOT, false);
|
||||
events.ScheduleEvent(EVENT_EXPLODING_SHOT, 25000);
|
||||
break;
|
||||
case EVENT_MORTAL_STRIKE:
|
||||
if (roll_chance_i(40))
|
||||
Talk(SAY_MORTAL);
|
||||
me->CastSpell(me->GetVictim(), SPELL_MORTAL_STRIKE, false);
|
||||
events.ScheduleEvent(EVENT_MORTAL_STRIKE, 10000);
|
||||
break;
|
||||
case EVENT_FRIGHTENING_SHOUT:
|
||||
if (roll_chance_i(40))
|
||||
Talk(SAY_SHOUT);
|
||||
me->CastSpell(me, SPELL_FRIGHTENING_SHOUT, false);
|
||||
events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 25000);
|
||||
break;
|
||||
case EVENT_HAMSTRING:
|
||||
me->CastSpell(me->GetVictim(), SPELL_HAMSTRING, false);
|
||||
events.ScheduleEvent(EVENT_HAMSTRING, 25000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap events;
|
||||
Movement::PointsArray pathPoints;
|
||||
private:
|
||||
EventMap events;
|
||||
Movement::PointsArray pathPoints;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
@@ -10,18 +10,18 @@ REWRITTEN BY XINEF
|
||||
|
||||
const Position instancePositions[INSTANCE_POSITIONS_COUNT] =
|
||||
{
|
||||
{2188.18f, 228.90f, 53.025f, 1.77f}, // Orcs Gather Point 1
|
||||
{2103.23f, 93.55f, 53.096f, 3.78f}, // Orcs Gather Point 2
|
||||
{2128.43f, 71.01f, 64.42f, 1.74f} // Lieutenant Drake Summon Position
|
||||
{2188.18f, 228.90f, 53.025f, 1.77f}, // Orcs Gather Point 1
|
||||
{2103.23f, 93.55f, 53.096f, 3.78f}, // Orcs Gather Point 2
|
||||
{2128.43f, 71.01f, 64.42f, 1.74f} // Lieutenant Drake Summon Position
|
||||
};
|
||||
|
||||
const Position thrallPositions[THRALL_POSITIONS_COUNT] =
|
||||
{
|
||||
{2181.37f, 119.15f, 89.45f, 5.75f}, // After wearing armor
|
||||
{2096.09f, 195.91f, 65.22f, 2.45f}, // After Fourth Ambush
|
||||
{2062.9f, 229.93f, 64.454f, 2.45f}, // After Captain Skarloc death
|
||||
{2486.91f, 626.356f, 58.0761f, 0.0f}, // Arrived at Tarren Mill
|
||||
{2660.47f, 659.223f, 62.0f, 5.78f} // Taretha Met
|
||||
{2181.37f, 119.15f, 89.45f, 5.75f}, // After wearing armor
|
||||
{2096.09f, 195.91f, 65.22f, 2.45f}, // After Fourth Ambush
|
||||
{2062.9f, 229.93f, 64.454f, 2.45f}, // After Captain Skarloc death
|
||||
{2486.91f, 626.356f, 58.0761f, 0.0f}, // Arrived at Tarren Mill
|
||||
{2660.47f, 659.223f, 62.0f, 5.78f} // Taretha Met
|
||||
|
||||
};
|
||||
|
||||
@@ -42,42 +42,42 @@ public:
|
||||
void Initialize()
|
||||
{
|
||||
_encounterProgress = 0;
|
||||
_barrelCount = 0;
|
||||
_attemptsCount = 0;
|
||||
_barrelCount = 0;
|
||||
_attemptsCount = 0;
|
||||
|
||||
_thrallGUID = 0;
|
||||
_tarethaGUID = 0;
|
||||
_thrallGUID = 0;
|
||||
_tarethaGUID = 0;
|
||||
|
||||
_initalFlamesSet.clear();
|
||||
_finalFlamesSet.clear();
|
||||
_prisonersSet.clear();
|
||||
_events.Reset();
|
||||
_initalFlamesSet.clear();
|
||||
_finalFlamesSet.clear();
|
||||
_prisonersSet.clear();
|
||||
_events.Reset();
|
||||
}
|
||||
|
||||
void OnPlayerEnter(Player* player)
|
||||
{
|
||||
if (instance->GetPlayersCountExceptGMs() == 1)
|
||||
CleanupInstance();
|
||||
void OnPlayerEnter(Player* player)
|
||||
{
|
||||
if (instance->GetPlayersCountExceptGMs() == 1)
|
||||
CleanupInstance();
|
||||
|
||||
EnsureGridLoaded();
|
||||
EnsureGridLoaded();
|
||||
|
||||
if (_encounterProgress < ENCOUNTER_PROGRESS_BARRELS)
|
||||
player->SendUpdateWorldState(WORLD_STATE_BARRELS_PLANTED, _barrelCount);
|
||||
}
|
||||
if (_encounterProgress < ENCOUNTER_PROGRESS_BARRELS)
|
||||
player->SendUpdateWorldState(WORLD_STATE_BARRELS_PLANTED, _barrelCount);
|
||||
}
|
||||
|
||||
void CleanupInstance()
|
||||
{
|
||||
if (_encounterProgress == ENCOUNTER_PROGRESS_NONE)
|
||||
return;
|
||||
void CleanupInstance()
|
||||
{
|
||||
if (_encounterProgress == ENCOUNTER_PROGRESS_NONE)
|
||||
return;
|
||||
|
||||
_events.ScheduleEvent(EVENT_INITIAL_BARRELS_FLAME, 0);
|
||||
_events.ScheduleEvent(EVENT_FINAL_BARRELS_FLAME, 0);
|
||||
_events.ScheduleEvent(EVENT_INITIAL_BARRELS_FLAME, 0);
|
||||
_events.ScheduleEvent(EVENT_FINAL_BARRELS_FLAME, 0);
|
||||
|
||||
if (_encounterProgress == ENCOUNTER_PROGRESS_BARRELS)
|
||||
_events.ScheduleEvent(EVENT_SUMMON_LIEUTENANT, 0);
|
||||
else
|
||||
SetData(DATA_THRALL_REPOSITION, 2);
|
||||
}
|
||||
if (_encounterProgress == ENCOUNTER_PROGRESS_BARRELS)
|
||||
_events.ScheduleEvent(EVENT_SUMMON_LIEUTENANT, 0);
|
||||
else
|
||||
SetData(DATA_THRALL_REPOSITION, 2);
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
@@ -85,207 +85,207 @@ public:
|
||||
{
|
||||
case NPC_THRALL:
|
||||
_thrallGUID = creature->GetGUID();
|
||||
if (_encounterProgress == ENCOUNTER_PROGRESS_FINISHED)
|
||||
creature->SetVisible(false);
|
||||
else
|
||||
Reposition(creature);
|
||||
if (_encounterProgress == ENCOUNTER_PROGRESS_FINISHED)
|
||||
creature->SetVisible(false);
|
||||
else
|
||||
Reposition(creature);
|
||||
break;
|
||||
case NPC_ORC_PRISONER:
|
||||
_prisonersSet.insert(creature->GetGUID());
|
||||
break;
|
||||
case NPC_TARETHA:
|
||||
if (_encounterProgress == ENCOUNTER_PROGRESS_FINISHED)
|
||||
creature->SetVisible(false);
|
||||
_tarethaGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_ORC_PRISONER:
|
||||
_prisonersSet.insert(creature->GetGUID());
|
||||
break;
|
||||
case NPC_TARETHA:
|
||||
if (_encounterProgress == ENCOUNTER_PROGRESS_FINISHED)
|
||||
creature->SetVisible(false);
|
||||
_tarethaGUID = creature->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* gameobject)
|
||||
{
|
||||
switch (gameobject->GetEntry())
|
||||
{
|
||||
case GO_BARREL:
|
||||
if (_encounterProgress >= ENCOUNTER_PROGRESS_BARRELS)
|
||||
gameobject->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
break;
|
||||
case GO_PRISON_DOOR:
|
||||
if (_encounterProgress >= ENCOUNTER_PROGRESS_THRALL_ARMORED)
|
||||
gameobject->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case GO_ROARING_FLAME:
|
||||
// Xinef: hack in DB to distinguish final / initial flames
|
||||
if (gameobject->GetPhaseMask() & 0x2)
|
||||
_finalFlamesSet.insert(gameobject->GetGUID());
|
||||
else
|
||||
_initalFlamesSet.insert(gameobject->GetGUID());
|
||||
break;
|
||||
}
|
||||
}
|
||||
void OnGameObjectCreate(GameObject* gameobject)
|
||||
{
|
||||
switch (gameobject->GetEntry())
|
||||
{
|
||||
case GO_BARREL:
|
||||
if (_encounterProgress >= ENCOUNTER_PROGRESS_BARRELS)
|
||||
gameobject->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
break;
|
||||
case GO_PRISON_DOOR:
|
||||
if (_encounterProgress >= ENCOUNTER_PROGRESS_THRALL_ARMORED)
|
||||
gameobject->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case GO_ROARING_FLAME:
|
||||
// Xinef: hack in DB to distinguish final / initial flames
|
||||
if (gameobject->GetPhaseMask() & 0x2)
|
||||
_finalFlamesSet.insert(gameobject->GetGUID());
|
||||
else
|
||||
_initalFlamesSet.insert(gameobject->GetGUID());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_THRALL_REPOSITION:
|
||||
if (data > 1)
|
||||
_events.ScheduleEvent(EVENT_THRALL_REPOSITION, data == 2 ? 0 : 10000);
|
||||
else if (Creature* thrall = instance->GetCreature(_thrallGUID))
|
||||
Reposition(thrall);
|
||||
return;
|
||||
case DATA_ESCORT_PROGRESS:
|
||||
_encounterProgress = data;
|
||||
SaveToDB();
|
||||
break;
|
||||
case DATA_THRALL_REPOSITION:
|
||||
if (data > 1)
|
||||
_events.ScheduleEvent(EVENT_THRALL_REPOSITION, data == 2 ? 0 : 10000);
|
||||
else if (Creature* thrall = instance->GetCreature(_thrallGUID))
|
||||
Reposition(thrall);
|
||||
return;
|
||||
case DATA_ESCORT_PROGRESS:
|
||||
_encounterProgress = data;
|
||||
SaveToDB();
|
||||
break;
|
||||
case DATA_BOMBS_PLACED:
|
||||
{
|
||||
if (_barrelCount >= 5 || _encounterProgress > ENCOUNTER_PROGRESS_NONE)
|
||||
return;
|
||||
if (_barrelCount >= 5 || _encounterProgress > ENCOUNTER_PROGRESS_NONE)
|
||||
return;
|
||||
|
||||
DoUpdateWorldState(WORLD_STATE_BARRELS_PLANTED, ++_barrelCount);
|
||||
if (_barrelCount == 5)
|
||||
{
|
||||
_events.ScheduleEvent(EVENT_INITIAL_BARRELS_FLAME, 4000);
|
||||
_events.ScheduleEvent(EVENT_FINAL_BARRELS_FLAME, 12000);
|
||||
_events.ScheduleEvent(EVENT_SUMMON_LIEUTENANT, 18000);
|
||||
_events.ScheduleEvent(EVENT_INITIAL_BARRELS_FLAME, 4000);
|
||||
_events.ScheduleEvent(EVENT_FINAL_BARRELS_FLAME, 12000);
|
||||
_events.ScheduleEvent(EVENT_SUMMON_LIEUTENANT, 18000);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case DATA_THRALL_ADD_FLAG:
|
||||
if (Creature* thrall = instance->GetCreature(_thrallGUID))
|
||||
thrall->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
break;
|
||||
case DATA_THRALL_ADD_FLAG:
|
||||
if (Creature* thrall = instance->GetCreature(_thrallGUID))
|
||||
thrall->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 data) const
|
||||
{
|
||||
if (data == DATA_ESCORT_PROGRESS)
|
||||
return _encounterProgress;
|
||||
else if (data == DATA_ATTEMPTS_COUNT)
|
||||
return _attemptsCount;
|
||||
if (data == DATA_ESCORT_PROGRESS)
|
||||
return _encounterProgress;
|
||||
else if (data == DATA_ATTEMPTS_COUNT)
|
||||
return _attemptsCount;
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 data) const
|
||||
{
|
||||
if (data == DATA_THRALL_GUID)
|
||||
return _thrallGUID;
|
||||
else if (data == DATA_TARETHA_GUID)
|
||||
return _tarethaGUID;
|
||||
if (data == DATA_THRALL_GUID)
|
||||
return _thrallGUID;
|
||||
else if (data == DATA_TARETHA_GUID)
|
||||
return _tarethaGUID;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Update(uint32 diff)
|
||||
{
|
||||
_events.Update(diff);
|
||||
switch (_events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_INITIAL_BARRELS_FLAME:
|
||||
{
|
||||
instance->LoadGrid(instancePositions[0].GetPositionX(), instancePositions[0].GetPositionY());
|
||||
instance->LoadGrid(instancePositions[1].GetPositionX(), instancePositions[1].GetPositionY());
|
||||
void Update(uint32 diff)
|
||||
{
|
||||
_events.Update(diff);
|
||||
switch (_events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_INITIAL_BARRELS_FLAME:
|
||||
{
|
||||
instance->LoadGrid(instancePositions[0].GetPositionX(), instancePositions[0].GetPositionY());
|
||||
instance->LoadGrid(instancePositions[1].GetPositionX(), instancePositions[1].GetPositionY());
|
||||
|
||||
for (std::set<uint64>::const_iterator itr = _prisonersSet.begin(); itr != _prisonersSet.end(); ++itr)
|
||||
if (Creature* orc = instance->GetCreature(*itr))
|
||||
{
|
||||
uint8 index = orc->GetDistance(instancePositions[0]) < 80.0f ? 0 : 1;
|
||||
Position pos(instancePositions[index]);
|
||||
orc->MovePosition(pos, frand(1.0f, 3.0f) + 15.0f * (float)rand_norm(), (float)rand_norm() * static_cast<float>(2 * M_PI));
|
||||
orc->GetMotionMaster()->MovePoint(1, pos);
|
||||
orc->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
}
|
||||
for (std::set<uint64>::const_iterator itr = _prisonersSet.begin(); itr != _prisonersSet.end(); ++itr)
|
||||
if (Creature* orc = instance->GetCreature(*itr))
|
||||
{
|
||||
uint8 index = orc->GetDistance(instancePositions[0]) < 80.0f ? 0 : 1;
|
||||
Position pos(instancePositions[index]);
|
||||
orc->MovePosition(pos, frand(1.0f, 3.0f) + 15.0f * (float)rand_norm(), (float)rand_norm() * static_cast<float>(2 * M_PI));
|
||||
orc->GetMotionMaster()->MovePoint(1, pos);
|
||||
orc->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
}
|
||||
|
||||
for (std::set<uint64>::const_iterator itr = _initalFlamesSet.begin(); itr != _initalFlamesSet.end(); ++itr)
|
||||
if (GameObject* gobject = instance->GetGameObject(*itr))
|
||||
{
|
||||
gobject->SetRespawnTime(0);
|
||||
gobject->UpdateObjectVisibility(true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case EVENT_FINAL_BARRELS_FLAME:
|
||||
{
|
||||
instance->LoadGrid(instancePositions[0].GetPositionX(), instancePositions[0].GetPositionY());
|
||||
instance->LoadGrid(instancePositions[1].GetPositionX(), instancePositions[1].GetPositionY());
|
||||
for (std::set<uint64>::const_iterator itr = _initalFlamesSet.begin(); itr != _initalFlamesSet.end(); ++itr)
|
||||
if (GameObject* gobject = instance->GetGameObject(*itr))
|
||||
{
|
||||
gobject->SetRespawnTime(0);
|
||||
gobject->UpdateObjectVisibility(true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case EVENT_FINAL_BARRELS_FLAME:
|
||||
{
|
||||
instance->LoadGrid(instancePositions[0].GetPositionX(), instancePositions[0].GetPositionY());
|
||||
instance->LoadGrid(instancePositions[1].GetPositionX(), instancePositions[1].GetPositionY());
|
||||
|
||||
if (_encounterProgress == ENCOUNTER_PROGRESS_NONE)
|
||||
{
|
||||
Map::PlayerList const& players = instance->GetPlayers();
|
||||
if (!players.isEmpty())
|
||||
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
if (Player* player = itr->GetSource())
|
||||
player->KilledMonsterCredit(NPC_LODGE_QUEST_TRIGGER, 0);
|
||||
}
|
||||
if (_encounterProgress == ENCOUNTER_PROGRESS_NONE)
|
||||
{
|
||||
Map::PlayerList const& players = instance->GetPlayers();
|
||||
if (!players.isEmpty())
|
||||
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
if (Player* player = itr->GetSource())
|
||||
player->KilledMonsterCredit(NPC_LODGE_QUEST_TRIGGER, 0);
|
||||
}
|
||||
|
||||
for (std::set<uint64>::const_iterator itr = _finalFlamesSet.begin(); itr != _finalFlamesSet.end(); ++itr)
|
||||
if (GameObject* gobject = instance->GetGameObject(*itr))
|
||||
{
|
||||
gobject->SetRespawnTime(0);
|
||||
gobject->UpdateObjectVisibility(true);
|
||||
}
|
||||
for (std::set<uint64>::const_iterator itr = _finalFlamesSet.begin(); itr != _finalFlamesSet.end(); ++itr)
|
||||
if (GameObject* gobject = instance->GetGameObject(*itr))
|
||||
{
|
||||
gobject->SetRespawnTime(0);
|
||||
gobject->UpdateObjectVisibility(true);
|
||||
}
|
||||
|
||||
for (std::set<uint64>::const_iterator itr = _prisonersSet.begin(); itr != _prisonersSet.end(); ++itr)
|
||||
if (Creature* orc = instance->GetCreature(*itr))
|
||||
if (roll_chance_i(25))
|
||||
orc->HandleEmoteCommand(EMOTE_ONESHOT_CHEER);
|
||||
|
||||
SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_BARRELS);
|
||||
for (std::set<uint64>::const_iterator itr = _prisonersSet.begin(); itr != _prisonersSet.end(); ++itr)
|
||||
if (Creature* orc = instance->GetCreature(*itr))
|
||||
if (roll_chance_i(25))
|
||||
orc->HandleEmoteCommand(EMOTE_ONESHOT_CHEER);
|
||||
|
||||
SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_BARRELS);
|
||||
DoUpdateWorldState(WORLD_STATE_BARRELS_PLANTED, 0);
|
||||
break;
|
||||
}
|
||||
case EVENT_SUMMON_LIEUTENANT:
|
||||
{
|
||||
instance->LoadGrid(instancePositions[2].GetPositionX(), instancePositions[2].GetPositionY());
|
||||
if (Creature* drake = instance->SummonCreature(NPC_LIEUTENANT_DRAKE, instancePositions[2]))
|
||||
drake->AI()->Talk(0);
|
||||
}
|
||||
case EVENT_THRALL_REPOSITION:
|
||||
{
|
||||
if (Creature* thrall = instance->GetCreature(_thrallGUID))
|
||||
{
|
||||
if (!thrall->IsAlive())
|
||||
{
|
||||
++_attemptsCount;
|
||||
EnsureGridLoaded();
|
||||
thrall->SetVisible(false);
|
||||
Reposition(thrall);
|
||||
thrall->setDeathState(DEAD);
|
||||
thrall->Respawn();
|
||||
thrall->SetVisible(true);
|
||||
SaveToDB();
|
||||
}
|
||||
else
|
||||
thrall->AI()->Reset();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case EVENT_SUMMON_LIEUTENANT:
|
||||
{
|
||||
instance->LoadGrid(instancePositions[2].GetPositionX(), instancePositions[2].GetPositionY());
|
||||
if (Creature* drake = instance->SummonCreature(NPC_LIEUTENANT_DRAKE, instancePositions[2]))
|
||||
drake->AI()->Talk(0);
|
||||
}
|
||||
case EVENT_THRALL_REPOSITION:
|
||||
{
|
||||
if (Creature* thrall = instance->GetCreature(_thrallGUID))
|
||||
{
|
||||
if (!thrall->IsAlive())
|
||||
{
|
||||
++_attemptsCount;
|
||||
EnsureGridLoaded();
|
||||
thrall->SetVisible(false);
|
||||
Reposition(thrall);
|
||||
thrall->setDeathState(DEAD);
|
||||
thrall->Respawn();
|
||||
thrall->SetVisible(true);
|
||||
SaveToDB();
|
||||
}
|
||||
else
|
||||
thrall->AI()->Reset();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Reposition(Creature* thrall)
|
||||
{
|
||||
switch (uint32 data = GetData(DATA_ESCORT_PROGRESS))
|
||||
{
|
||||
case ENCOUNTER_PROGRESS_THRALL_ARMORED:
|
||||
case ENCOUNTER_PROGRESS_AMBUSHES_1:
|
||||
case ENCOUNTER_PROGRESS_SKARLOC_KILLED:
|
||||
case ENCOUNTER_PROGRESS_TARREN_MILL:
|
||||
case ENCOUNTER_PROGRESS_TARETHA_MEET:
|
||||
thrall->UpdatePosition(thrallPositions[data - ENCOUNTER_PROGRESS_THRALL_ARMORED], true);
|
||||
thrall->SetHomePosition(thrallPositions[data - ENCOUNTER_PROGRESS_THRALL_ARMORED]);
|
||||
thrall->SetFacingTo(thrallPositions[data - ENCOUNTER_PROGRESS_THRALL_ARMORED].GetOrientation());
|
||||
break;
|
||||
}
|
||||
}
|
||||
void Reposition(Creature* thrall)
|
||||
{
|
||||
switch (uint32 data = GetData(DATA_ESCORT_PROGRESS))
|
||||
{
|
||||
case ENCOUNTER_PROGRESS_THRALL_ARMORED:
|
||||
case ENCOUNTER_PROGRESS_AMBUSHES_1:
|
||||
case ENCOUNTER_PROGRESS_SKARLOC_KILLED:
|
||||
case ENCOUNTER_PROGRESS_TARREN_MILL:
|
||||
case ENCOUNTER_PROGRESS_TARETHA_MEET:
|
||||
thrall->UpdatePosition(thrallPositions[data - ENCOUNTER_PROGRESS_THRALL_ARMORED], true);
|
||||
thrall->SetHomePosition(thrallPositions[data - ENCOUNTER_PROGRESS_THRALL_ARMORED]);
|
||||
thrall->SetFacingTo(thrallPositions[data - ENCOUNTER_PROGRESS_THRALL_ARMORED].GetOrientation());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void EnsureGridLoaded()
|
||||
{
|
||||
for (uint8 i = 0; i < THRALL_POSITIONS_COUNT; ++i)
|
||||
instance->LoadGrid(thrallPositions[i].GetPositionX(), thrallPositions[i].GetPositionY());
|
||||
}
|
||||
void EnsureGridLoaded()
|
||||
{
|
||||
for (uint8 i = 0; i < THRALL_POSITIONS_COUNT; ++i)
|
||||
instance->LoadGrid(thrallPositions[i].GetPositionX(), thrallPositions[i].GetPositionY());
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
@@ -323,18 +323,18 @@ public:
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
private:
|
||||
uint32 _encounterProgress;
|
||||
uint32 _barrelCount;
|
||||
uint32 _attemptsCount;
|
||||
private:
|
||||
uint32 _encounterProgress;
|
||||
uint32 _barrelCount;
|
||||
uint32 _attemptsCount;
|
||||
|
||||
uint64 _thrallGUID;
|
||||
uint64 _tarethaGUID;
|
||||
std::set<uint64> _initalFlamesSet;
|
||||
std::set<uint64> _finalFlamesSet;
|
||||
std::set<uint64> _prisonersSet;
|
||||
uint64 _thrallGUID;
|
||||
uint64 _tarethaGUID;
|
||||
std::set<uint64> _initalFlamesSet;
|
||||
std::set<uint64> _finalFlamesSet;
|
||||
std::set<uint64> _prisonersSet;
|
||||
|
||||
EventMap _events;
|
||||
EventMap _events;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,71 +7,71 @@ REWRITTEN BY XINEF
|
||||
|
||||
enum DataIds
|
||||
{
|
||||
DATA_ESCORT_PROGRESS = 0,
|
||||
DATA_ESCORT_PROGRESS = 0,
|
||||
|
||||
DATA_BOMBS_PLACED = 10,
|
||||
DATA_THRALL_REPOSITION = 11,
|
||||
DATA_THRALL_ADD_FLAG = 12,
|
||||
DATA_THRALL_GUID = 13,
|
||||
DATA_TARETHA_GUID = 14,
|
||||
DATA_ATTEMPTS_COUNT = 15
|
||||
DATA_BOMBS_PLACED = 10,
|
||||
DATA_THRALL_REPOSITION = 11,
|
||||
DATA_THRALL_ADD_FLAG = 12,
|
||||
DATA_THRALL_GUID = 13,
|
||||
DATA_TARETHA_GUID = 14,
|
||||
DATA_ATTEMPTS_COUNT = 15
|
||||
};
|
||||
|
||||
enum NpcIds
|
||||
{
|
||||
NPC_EROZION = 18723,
|
||||
NPC_THRALL = 17876,
|
||||
NPC_TARETHA = 18887,
|
||||
NPC_EPOCH_HUNTER = 18096,
|
||||
NPC_LIEUTENANT_DRAKE = 17848,
|
||||
NPC_EROZION = 18723,
|
||||
NPC_THRALL = 17876,
|
||||
NPC_TARETHA = 18887,
|
||||
NPC_EPOCH_HUNTER = 18096,
|
||||
NPC_LIEUTENANT_DRAKE = 17848,
|
||||
|
||||
NPC_LODGE_QUEST_TRIGGER = 20155,
|
||||
NPC_ORC_PRISONER = 18598,
|
||||
NPC_LODGE_QUEST_TRIGGER = 20155,
|
||||
NPC_ORC_PRISONER = 18598,
|
||||
|
||||
NPC_DURNHOLDE_ARMORER = 18764,
|
||||
NPC_DURNHOLDE_WARDEN = 17833,
|
||||
NPC_DURNHOLDE_VETERAN = 17860,
|
||||
NPC_DURNHOLDE_MAGE = 17860,
|
||||
NPC_DURNHOLDE_SENTRY = 17860,
|
||||
NPC_DURNHOLDE_ARMORER = 18764,
|
||||
NPC_DURNHOLDE_WARDEN = 17833,
|
||||
NPC_DURNHOLDE_VETERAN = 17860,
|
||||
NPC_DURNHOLDE_MAGE = 17860,
|
||||
NPC_DURNHOLDE_SENTRY = 17860,
|
||||
|
||||
NPC_CAPTAIN_SKARLOC = 17862,
|
||||
NPC_SKARLOC_MOUNT = 18798,
|
||||
NPC_CAPTAIN_SKARLOC = 17862,
|
||||
NPC_SKARLOC_MOUNT = 18798,
|
||||
|
||||
NPC_LORDAERON_SENTRY = 17815,
|
||||
NPC_LORDAERON_WATCHMAN = 17814,
|
||||
NPC_LORDAERON_SENTRY = 17815,
|
||||
NPC_LORDAERON_WATCHMAN = 17814,
|
||||
};
|
||||
|
||||
enum GobjectIds
|
||||
{
|
||||
GO_BARREL = 182589,
|
||||
GO_ROARING_FLAME = 182592,
|
||||
GO_PRISON_DOOR = 184393
|
||||
GO_BARREL = 182589,
|
||||
GO_ROARING_FLAME = 182592,
|
||||
GO_PRISON_DOOR = 184393
|
||||
};
|
||||
|
||||
enum MiscIds
|
||||
{
|
||||
QUEST_DIVERSION = 10283,
|
||||
WORLD_STATE_BARRELS_PLANTED = 2436,
|
||||
SKARLOC_MOUNT_MODEL = 18223,
|
||||
QUEST_DIVERSION = 10283,
|
||||
WORLD_STATE_BARRELS_PLANTED = 2436,
|
||||
SKARLOC_MOUNT_MODEL = 18223,
|
||||
|
||||
ENCOUNTER_PROGRESS_NONE = 0,
|
||||
ENCOUNTER_PROGRESS_BARRELS = 1,
|
||||
ENCOUNTER_PROGRESS_DRAKE_KILLED = 2,
|
||||
ENCOUNTER_PROGRESS_THRALL_ARMORED = 3,
|
||||
ENCOUNTER_PROGRESS_AMBUSHES_1 = 4,
|
||||
ENCOUNTER_PROGRESS_SKARLOC_KILLED = 5,
|
||||
ENCOUNTER_PROGRESS_TARREN_MILL = 6,
|
||||
ENCOUNTER_PROGRESS_TARETHA_MEET = 7,
|
||||
ENCOUNTER_PROGRESS_EPOCH_KILLED = 8,
|
||||
ENCOUNTER_PROGRESS_FINISHED = 9,
|
||||
ENCOUNTER_PROGRESS_NONE = 0,
|
||||
ENCOUNTER_PROGRESS_BARRELS = 1,
|
||||
ENCOUNTER_PROGRESS_DRAKE_KILLED = 2,
|
||||
ENCOUNTER_PROGRESS_THRALL_ARMORED = 3,
|
||||
ENCOUNTER_PROGRESS_AMBUSHES_1 = 4,
|
||||
ENCOUNTER_PROGRESS_SKARLOC_KILLED = 5,
|
||||
ENCOUNTER_PROGRESS_TARREN_MILL = 6,
|
||||
ENCOUNTER_PROGRESS_TARETHA_MEET = 7,
|
||||
ENCOUNTER_PROGRESS_EPOCH_KILLED = 8,
|
||||
ENCOUNTER_PROGRESS_FINISHED = 9,
|
||||
|
||||
EVENT_INITIAL_BARRELS_FLAME = 1,
|
||||
EVENT_FINAL_BARRELS_FLAME = 2,
|
||||
EVENT_SUMMON_LIEUTENANT = 3,
|
||||
EVENT_THRALL_REPOSITION = 4,
|
||||
EVENT_INITIAL_BARRELS_FLAME = 1,
|
||||
EVENT_FINAL_BARRELS_FLAME = 2,
|
||||
EVENT_SUMMON_LIEUTENANT = 3,
|
||||
EVENT_THRALL_REPOSITION = 4,
|
||||
|
||||
INSTANCE_POSITIONS_COUNT = 3,
|
||||
THRALL_POSITIONS_COUNT = 5
|
||||
INSTANCE_POSITIONS_COUNT = 3,
|
||||
THRALL_POSITIONS_COUNT = 5
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -8,27 +8,27 @@ REWRITTEN BY XINEF
|
||||
|
||||
enum Enums
|
||||
{
|
||||
SAY_ENTER = 0,
|
||||
SAY_AGGRO = 1,
|
||||
SAY_BANISH = 2,
|
||||
SAY_SLAY = 3,
|
||||
SAY_DEATH = 4,
|
||||
EMOTE_FRENZY = 5,
|
||||
SAY_ENTER = 0,
|
||||
SAY_AGGRO = 1,
|
||||
SAY_BANISH = 2,
|
||||
SAY_SLAY = 3,
|
||||
SAY_DEATH = 4,
|
||||
EMOTE_FRENZY = 5,
|
||||
|
||||
SPELL_CLEAVE = 40504,
|
||||
SPELL_TIME_STOP = 31422,
|
||||
SPELL_ENRAGE = 37605,
|
||||
SPELL_SAND_BREATH = 31473,
|
||||
SPELL_CORRUPT_MEDIVH = 37853,
|
||||
SPELL_BANISH_DRAGON_HELPER = 31550
|
||||
SPELL_CLEAVE = 40504,
|
||||
SPELL_TIME_STOP = 31422,
|
||||
SPELL_ENRAGE = 37605,
|
||||
SPELL_SAND_BREATH = 31473,
|
||||
SPELL_CORRUPT_MEDIVH = 37853,
|
||||
SPELL_BANISH_DRAGON_HELPER = 31550
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_SANDBREATH = 1,
|
||||
EVENT_TIMESTOP = 2,
|
||||
EVENT_FRENZY = 3,
|
||||
EVENT_CLEAVE = 4
|
||||
EVENT_SANDBREATH = 1,
|
||||
EVENT_TIMESTOP = 2,
|
||||
EVENT_FRENZY = 3,
|
||||
EVENT_CLEAVE = 4
|
||||
};
|
||||
|
||||
class boss_aeonus : public CreatureScript
|
||||
@@ -39,36 +39,36 @@ public:
|
||||
struct boss_aeonusAI : public ScriptedAI
|
||||
{
|
||||
boss_aeonusAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
EventMap events;
|
||||
InstanceScript* instance;
|
||||
EventMap events;
|
||||
InstanceScript* instance;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
}
|
||||
{
|
||||
events.Reset();
|
||||
}
|
||||
|
||||
void JustReachedHome()
|
||||
{
|
||||
if (Unit* medivh = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_MEDIVH)))
|
||||
if (me->GetDistance2d(medivh) < 20.0f)
|
||||
me->CastSpell(me, SPELL_CORRUPT_MEDIVH, false);
|
||||
}
|
||||
void JustReachedHome()
|
||||
{
|
||||
if (Unit* medivh = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_MEDIVH)))
|
||||
if (me->GetDistance2d(medivh) < 20.0f)
|
||||
me->CastSpell(me, SPELL_CORRUPT_MEDIVH, false);
|
||||
}
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
Talk(SAY_ENTER);
|
||||
ScriptedAI::InitializeAI();
|
||||
void InitializeAI()
|
||||
{
|
||||
Talk(SAY_ENTER);
|
||||
ScriptedAI::InitializeAI();
|
||||
|
||||
if (Unit* medivh = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_MEDIVH)))
|
||||
{
|
||||
me->SetHomePosition(medivh->GetPositionX() + 14.0f*cos(medivh->GetAngle(me)), medivh->GetPositionY() + 14.0f*sin(medivh->GetAngle(me)), medivh->GetPositionZ(), me->GetAngle(medivh));
|
||||
me->GetMotionMaster()->MoveTargetedHome();
|
||||
}
|
||||
}
|
||||
if (Unit* medivh = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_MEDIVH)))
|
||||
{
|
||||
me->SetHomePosition(medivh->GetPositionX() + 14.0f*cos(medivh->GetAngle(me)), medivh->GetPositionY() + 14.0f*sin(medivh->GetAngle(me)), medivh->GetPositionZ(), me->GetAngle(medivh));
|
||||
me->GetMotionMaster()->MoveTargetedHome();
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
@@ -87,8 +87,8 @@ public:
|
||||
if (me->IsWithinDistInMap(who, 20.0f))
|
||||
{
|
||||
Talk(SAY_BANISH);
|
||||
me->CastSpell(me, SPELL_BANISH_DRAGON_HELPER, true);
|
||||
return;
|
||||
me->CastSpell(me, SPELL_BANISH_DRAGON_HELPER, true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,21 +118,21 @@ public:
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_CLEAVE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 10000);
|
||||
break;
|
||||
case EVENT_CLEAVE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 10000);
|
||||
break;
|
||||
case EVENT_SANDBREATH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_SAND_BREATH, false);
|
||||
events.ScheduleEvent(EVENT_SANDBREATH, 20000);
|
||||
break;
|
||||
case EVENT_TIMESTOP:
|
||||
me->CastSpell(me, SPELL_TIME_STOP, false);
|
||||
me->CastSpell(me, SPELL_TIME_STOP, false);
|
||||
events.ScheduleEvent(EVENT_TIMESTOP, 25000);
|
||||
break;
|
||||
case EVENT_FRENZY:
|
||||
Talk(EMOTE_FRENZY);
|
||||
me->CastSpell(me, SPELL_ENRAGE, false);
|
||||
me->CastSpell(me, SPELL_ENRAGE, false);
|
||||
events.ScheduleEvent(EVENT_FRENZY, 30000);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -8,26 +8,26 @@ REWRITTEN BY XINEF
|
||||
|
||||
enum Enums
|
||||
{
|
||||
SAY_ENTER = 0,
|
||||
SAY_AGGRO = 1,
|
||||
SAY_BANISH = 2,
|
||||
SAY_SLAY = 3,
|
||||
SAY_DEATH = 4,
|
||||
SAY_ENTER = 0,
|
||||
SAY_AGGRO = 1,
|
||||
SAY_BANISH = 2,
|
||||
SAY_SLAY = 3,
|
||||
SAY_DEATH = 4,
|
||||
|
||||
SPELL_ARCANE_BLAST = 31457,
|
||||
SPELL_ARCANE_DISCHARGE = 31472,
|
||||
SPELL_TIME_LAPSE = 31467,
|
||||
SPELL_ATTRACTION = 38540,
|
||||
SPELL_ARCANE_BLAST = 31457,
|
||||
SPELL_ARCANE_DISCHARGE = 31472,
|
||||
SPELL_TIME_LAPSE = 31467,
|
||||
SPELL_ATTRACTION = 38540,
|
||||
|
||||
SPELL_BANISH_DRAGON_HELPER = 31550,
|
||||
SPELL_BANISH_DRAGON_HELPER = 31550,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_ARCANE_BLAST = 1,
|
||||
EVENT_TIME_LAPSE = 2,
|
||||
EVENT_ARCANE_DISCHARGE = 3,
|
||||
EVENT_ATTRACTION = 4
|
||||
EVENT_ARCANE_BLAST = 1,
|
||||
EVENT_TIME_LAPSE = 2,
|
||||
EVENT_ARCANE_DISCHARGE = 3,
|
||||
EVENT_ATTRACTION = 4
|
||||
};
|
||||
|
||||
class boss_chrono_lord_deja : public CreatureScript
|
||||
@@ -37,26 +37,26 @@ public:
|
||||
|
||||
struct boss_chrono_lord_dejaAI : public ScriptedAI
|
||||
{
|
||||
boss_chrono_lord_dejaAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
boss_chrono_lord_dejaAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
EventMap events;
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
}
|
||||
{
|
||||
events.Reset();
|
||||
}
|
||||
|
||||
void OwnTalk(uint32 id)
|
||||
{
|
||||
if (me->GetEntry() == NPC_CHRONO_LORD_DEJA)
|
||||
Talk(id);
|
||||
}
|
||||
void OwnTalk(uint32 id)
|
||||
{
|
||||
if (me->GetEntry() == NPC_CHRONO_LORD_DEJA)
|
||||
Talk(id);
|
||||
}
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
OwnTalk(SAY_ENTER);
|
||||
ScriptedAI::InitializeAI();
|
||||
}
|
||||
void InitializeAI()
|
||||
{
|
||||
OwnTalk(SAY_ENTER);
|
||||
ScriptedAI::InitializeAI();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
@@ -76,8 +76,8 @@ public:
|
||||
if (me->IsWithinDistInMap(who, 20.0f))
|
||||
{
|
||||
OwnTalk(SAY_BANISH);
|
||||
me->CastSpell(me, SPELL_BANISH_DRAGON_HELPER, true);
|
||||
return;
|
||||
me->CastSpell(me, SPELL_BANISH_DRAGON_HELPER, true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,15 +86,15 @@ public:
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
OwnTalk(SAY_SLAY);
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
OwnTalk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
OwnTalk(SAY_DEATH);
|
||||
if (InstanceScript* instance = me->GetInstanceScript())
|
||||
instance->SetData(TYPE_CHRONO_LORD_DEJA, DONE);
|
||||
if (InstanceScript* instance = me->GetInstanceScript())
|
||||
instance->SetData(TYPE_CHRONO_LORD_DEJA, DONE);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
@@ -109,19 +109,19 @@ public:
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_ARCANE_BLAST:
|
||||
me->CastSpell(me->GetVictim(), SPELL_ARCANE_BLAST, false);
|
||||
me->CastSpell(me->GetVictim(), SPELL_ARCANE_BLAST, false);
|
||||
events.ScheduleEvent(EVENT_ARCANE_BLAST, 20000);
|
||||
break;
|
||||
case EVENT_TIME_LAPSE:
|
||||
me->CastSpell(me, SPELL_TIME_LAPSE, false);
|
||||
me->CastSpell(me, SPELL_TIME_LAPSE, false);
|
||||
events.ScheduleEvent(EVENT_TIME_LAPSE, 20000);
|
||||
break;
|
||||
case EVENT_ARCANE_DISCHARGE:
|
||||
me->CastSpell(me, SPELL_ARCANE_DISCHARGE, false);
|
||||
me->CastSpell(me, SPELL_ARCANE_DISCHARGE, false);
|
||||
events.ScheduleEvent(EVENT_ARCANE_DISCHARGE, 25000);
|
||||
break;
|
||||
case EVENT_ATTRACTION:
|
||||
me->CastSpell(me, SPELL_ATTRACTION, false);
|
||||
me->CastSpell(me, SPELL_ATTRACTION, false);
|
||||
events.ScheduleEvent(EVENT_ATTRACTION, 30000);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -8,25 +8,25 @@ REWRITTEN BY XINEF
|
||||
|
||||
enum Enums
|
||||
{
|
||||
SAY_ENTER = 0,
|
||||
SAY_AGGRO = 1,
|
||||
SAY_BANISH = 2,
|
||||
SAY_SLAY = 3,
|
||||
SAY_DEATH = 4,
|
||||
SAY_ENTER = 0,
|
||||
SAY_AGGRO = 1,
|
||||
SAY_BANISH = 2,
|
||||
SAY_SLAY = 3,
|
||||
SAY_DEATH = 4,
|
||||
|
||||
SPELL_HASTEN = 31458,
|
||||
SPELL_MORTAL_WOUND = 31464,
|
||||
SPELL_WING_BUFFET = 31475,
|
||||
SPELL_REFLECT = 38592,
|
||||
SPELL_BANISH_DRAGON_HELPER = 31550
|
||||
SPELL_HASTEN = 31458,
|
||||
SPELL_MORTAL_WOUND = 31464,
|
||||
SPELL_WING_BUFFET = 31475,
|
||||
SPELL_REFLECT = 38592,
|
||||
SPELL_BANISH_DRAGON_HELPER = 31550
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_HASTEN = 1,
|
||||
EVENT_MORTAL_WOUND = 2,
|
||||
EVENT_WING_BUFFET = 3,
|
||||
EVENT_SPELL_REFLECTION = 4
|
||||
EVENT_HASTEN = 1,
|
||||
EVENT_MORTAL_WOUND = 2,
|
||||
EVENT_WING_BUFFET = 3,
|
||||
EVENT_SPELL_REFLECTION = 4
|
||||
};
|
||||
|
||||
class boss_temporus : public CreatureScript
|
||||
@@ -38,24 +38,24 @@ public:
|
||||
{
|
||||
boss_temporusAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
EventMap events;
|
||||
EventMap events;
|
||||
|
||||
void OwnTalk(uint32 id)
|
||||
{
|
||||
if (me->GetEntry() == NPC_TEMPORUS)
|
||||
Talk(id);
|
||||
}
|
||||
void OwnTalk(uint32 id)
|
||||
{
|
||||
if (me->GetEntry() == NPC_TEMPORUS)
|
||||
Talk(id);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
}
|
||||
{
|
||||
events.Reset();
|
||||
}
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
OwnTalk(SAY_ENTER);
|
||||
ScriptedAI::InitializeAI();
|
||||
}
|
||||
void InitializeAI()
|
||||
{
|
||||
OwnTalk(SAY_ENTER);
|
||||
ScriptedAI::InitializeAI();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
@@ -70,15 +70,15 @@ public:
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
OwnTalk(SAY_SLAY);
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
OwnTalk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
OwnTalk(SAY_DEATH);
|
||||
if (InstanceScript* instance = me->GetInstanceScript())
|
||||
instance->SetData(TYPE_TEMPORUS, DONE);
|
||||
instance->SetData(TYPE_TEMPORUS, DONE);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
@@ -88,8 +88,8 @@ public:
|
||||
if (me->IsWithinDistInMap(who, 20.0f))
|
||||
{
|
||||
OwnTalk(SAY_BANISH);
|
||||
me->CastSpell(me, SPELL_BANISH_DRAGON_HELPER, true);
|
||||
return;
|
||||
me->CastSpell(me, SPELL_BANISH_DRAGON_HELPER, true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -108,11 +108,11 @@ public:
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_HASTEN:
|
||||
me->CastSpell(me, SPELL_HASTEN, false);
|
||||
me->CastSpell(me, SPELL_HASTEN, false);
|
||||
events.ScheduleEvent(EVENT_HASTEN, 20000);
|
||||
break;
|
||||
case EVENT_MORTAL_WOUND:
|
||||
me->CastSpell(me->GetVictim(), SPELL_MORTAL_WOUND, false);
|
||||
me->CastSpell(me->GetVictim(), SPELL_MORTAL_WOUND, false);
|
||||
events.ScheduleEvent(EVENT_MORTAL_WOUND, 10000);
|
||||
break;
|
||||
case EVENT_WING_BUFFET:
|
||||
@@ -120,7 +120,7 @@ public:
|
||||
events.ScheduleEvent(EVENT_WING_BUFFET, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_REFLECTION:
|
||||
me->CastSpell(me, SPELL_REFLECT, false);
|
||||
me->CastSpell(me, SPELL_REFLECT, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_REFLECTION, 30000);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -33,39 +33,39 @@ public:
|
||||
{
|
||||
instance_the_black_morass_InstanceMapScript(Map* map) : InstanceScript(map) { }
|
||||
|
||||
std::set<uint64> encounterNPCs;
|
||||
uint32 encounters[MAX_ENCOUNTER];
|
||||
std::set<uint64> encounterNPCs;
|
||||
uint32 encounters[MAX_ENCOUNTER];
|
||||
uint64 _medivhGUID;
|
||||
uint8 _currentRift;
|
||||
uint8 _shieldPercent;
|
||||
uint8 _shieldPercent;
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
memset(&encounters, 0, sizeof(encounters));
|
||||
memset(&encounters, 0, sizeof(encounters));
|
||||
_medivhGUID = 0;
|
||||
_currentRift = 0;
|
||||
_shieldPercent = 100;
|
||||
encounterNPCs.clear();
|
||||
_shieldPercent = 100;
|
||||
encounterNPCs.clear();
|
||||
}
|
||||
|
||||
void CleanupInstance()
|
||||
{
|
||||
Events.Reset();
|
||||
void CleanupInstance()
|
||||
{
|
||||
Events.Reset();
|
||||
_currentRift = 0;
|
||||
_shieldPercent = 100;
|
||||
_shieldPercent = 100;
|
||||
|
||||
instance->LoadGrid(-2023.0f, 7121.0f);
|
||||
if (Creature* medivh = instance->GetCreature(_medivhGUID))
|
||||
{
|
||||
medivh->DespawnOrUnsummon();
|
||||
medivh->SetRespawnTime(3);
|
||||
}
|
||||
instance->LoadGrid(-2023.0f, 7121.0f);
|
||||
if (Creature* medivh = instance->GetCreature(_medivhGUID))
|
||||
{
|
||||
medivh->DespawnOrUnsummon();
|
||||
medivh->SetRespawnTime(3);
|
||||
}
|
||||
|
||||
std::set<uint64> eCopy = encounterNPCs;
|
||||
for (std::set<uint64>::const_iterator itr = eCopy.begin(); itr != eCopy.end(); ++itr)
|
||||
if (Creature* creature = instance->GetCreature(*itr))
|
||||
creature->DespawnOrUnsummon();
|
||||
}
|
||||
std::set<uint64> eCopy = encounterNPCs;
|
||||
for (std::set<uint64>::const_iterator itr = eCopy.begin(); itr != eCopy.end(); ++itr)
|
||||
if (Creature* creature = instance->GetCreature(*itr))
|
||||
creature->DespawnOrUnsummon();
|
||||
}
|
||||
|
||||
bool IsEncounterInProgress() const
|
||||
{
|
||||
@@ -74,10 +74,10 @@ public:
|
||||
|
||||
void OnPlayerEnter(Player* player)
|
||||
{
|
||||
if (instance->GetPlayersCountExceptGMs() <= 1 && GetData(TYPE_AEONUS) != DONE)
|
||||
CleanupInstance();
|
||||
if (instance->GetPlayersCountExceptGMs() <= 1 && GetData(TYPE_AEONUS) != DONE)
|
||||
CleanupInstance();
|
||||
|
||||
player->SendUpdateWorldState(WORLD_STATE_BM, _currentRift > 0 ? 1 : 0);
|
||||
player->SendUpdateWorldState(WORLD_STATE_BM, _currentRift > 0 ? 1 : 0);
|
||||
player->SendUpdateWorldState(WORLD_STATE_BM_SHIELD, _shieldPercent);
|
||||
player->SendUpdateWorldState(WORLD_STATE_BM_RIFT, _currentRift);
|
||||
}
|
||||
@@ -85,65 +85,65 @@ public:
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_MEDIVH:
|
||||
_medivhGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_TIME_RIFT:
|
||||
case NPC_CHRONO_LORD_DEJA:
|
||||
case NPC_INFINITE_CHRONO_LORD:
|
||||
case NPC_TEMPORUS:
|
||||
case NPC_INFINITE_TIMEREAVER:
|
||||
case NPC_AEONUS:
|
||||
case NPC_RIFT_KEEPER_WARLOCK:
|
||||
case NPC_RIFT_KEEPER_MAGE:
|
||||
case NPC_RIFT_LORD:
|
||||
case NPC_RIFT_LORD_2:
|
||||
case NPC_INFINITE_ASSASIN:
|
||||
case NPC_INFINITE_WHELP:
|
||||
case NPC_INFINITE_CRONOMANCER:
|
||||
case NPC_INFINITE_EXECUTIONER:
|
||||
case NPC_INFINITE_VANQUISHER:
|
||||
encounterNPCs.insert(creature->GetGUID());
|
||||
break;
|
||||
}
|
||||
{
|
||||
case NPC_MEDIVH:
|
||||
_medivhGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_TIME_RIFT:
|
||||
case NPC_CHRONO_LORD_DEJA:
|
||||
case NPC_INFINITE_CHRONO_LORD:
|
||||
case NPC_TEMPORUS:
|
||||
case NPC_INFINITE_TIMEREAVER:
|
||||
case NPC_AEONUS:
|
||||
case NPC_RIFT_KEEPER_WARLOCK:
|
||||
case NPC_RIFT_KEEPER_MAGE:
|
||||
case NPC_RIFT_LORD:
|
||||
case NPC_RIFT_LORD_2:
|
||||
case NPC_INFINITE_ASSASIN:
|
||||
case NPC_INFINITE_WHELP:
|
||||
case NPC_INFINITE_CRONOMANCER:
|
||||
case NPC_INFINITE_EXECUTIONER:
|
||||
case NPC_INFINITE_VANQUISHER:
|
||||
encounterNPCs.insert(creature->GetGUID());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnCreatureRemove(Creature* creature)
|
||||
{
|
||||
void OnCreatureRemove(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_TIME_RIFT:
|
||||
case NPC_CHRONO_LORD_DEJA:
|
||||
case NPC_INFINITE_CHRONO_LORD:
|
||||
case NPC_TEMPORUS:
|
||||
case NPC_INFINITE_TIMEREAVER:
|
||||
case NPC_AEONUS:
|
||||
case NPC_RIFT_KEEPER_WARLOCK:
|
||||
case NPC_RIFT_KEEPER_MAGE:
|
||||
case NPC_RIFT_LORD:
|
||||
case NPC_RIFT_LORD_2:
|
||||
case NPC_INFINITE_ASSASIN:
|
||||
case NPC_INFINITE_WHELP:
|
||||
case NPC_INFINITE_CRONOMANCER:
|
||||
case NPC_INFINITE_EXECUTIONER:
|
||||
case NPC_INFINITE_VANQUISHER:
|
||||
encounterNPCs.erase(creature->GetGUID());
|
||||
break;
|
||||
}
|
||||
{
|
||||
case NPC_TIME_RIFT:
|
||||
case NPC_CHRONO_LORD_DEJA:
|
||||
case NPC_INFINITE_CHRONO_LORD:
|
||||
case NPC_TEMPORUS:
|
||||
case NPC_INFINITE_TIMEREAVER:
|
||||
case NPC_AEONUS:
|
||||
case NPC_RIFT_KEEPER_WARLOCK:
|
||||
case NPC_RIFT_KEEPER_MAGE:
|
||||
case NPC_RIFT_LORD:
|
||||
case NPC_RIFT_LORD_2:
|
||||
case NPC_INFINITE_ASSASIN:
|
||||
case NPC_INFINITE_WHELP:
|
||||
case NPC_INFINITE_CRONOMANCER:
|
||||
case NPC_INFINITE_EXECUTIONER:
|
||||
case NPC_INFINITE_VANQUISHER:
|
||||
encounterNPCs.erase(creature->GetGUID());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_AEONUS:
|
||||
{
|
||||
encounters[type] = DONE;
|
||||
SaveToDB();
|
||||
case TYPE_AEONUS:
|
||||
{
|
||||
encounters[type] = DONE;
|
||||
SaveToDB();
|
||||
|
||||
if (Creature* medivh = instance->GetCreature(_medivhGUID))
|
||||
medivh->AI()->DoAction(ACTION_OUTRO);
|
||||
if (Creature* medivh = instance->GetCreature(_medivhGUID))
|
||||
medivh->AI()->DoAction(ACTION_OUTRO);
|
||||
|
||||
Map::PlayerList const& players = instance->GetPlayers();
|
||||
if (!players.isEmpty())
|
||||
@@ -155,68 +155,68 @@ public:
|
||||
|
||||
if (player->GetQuestStatus(QUEST_MASTER_TOUCH) == QUEST_STATUS_INCOMPLETE)
|
||||
player->AreaExploredOrEventHappens(QUEST_MASTER_TOUCH);
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TYPE_CHRONO_LORD_DEJA:
|
||||
case TYPE_TEMPORUS:
|
||||
encounters[type] = DONE;
|
||||
Events.RescheduleEvent(EVENT_NEXT_PORTAL, 60000);
|
||||
Events.SetPhase(1);
|
||||
SaveToDB();
|
||||
break;
|
||||
case DATA_RIFT_KILLED:
|
||||
if (!Events.IsInPhase(1))
|
||||
Events.RescheduleEvent(EVENT_NEXT_PORTAL, 4000);
|
||||
break;
|
||||
case DATA_MEDIVH:
|
||||
DoUpdateWorldState(WORLD_STATE_BM, 1);
|
||||
DoUpdateWorldState(WORLD_STATE_BM_SHIELD, _shieldPercent);
|
||||
DoUpdateWorldState(WORLD_STATE_BM_RIFT, _currentRift);
|
||||
Events.RescheduleEvent(EVENT_NEXT_PORTAL, 3000);
|
||||
break;
|
||||
case DATA_DAMAGE_SHIELD:
|
||||
--_shieldPercent;
|
||||
DoUpdateWorldState(WORLD_STATE_BM_SHIELD, _shieldPercent);
|
||||
if (!_shieldPercent)
|
||||
if (Creature* medivh = instance->GetCreature(_medivhGUID))
|
||||
if (medivh->IsAlive())
|
||||
{
|
||||
Unit::Kill(medivh, medivh);
|
||||
case TYPE_CHRONO_LORD_DEJA:
|
||||
case TYPE_TEMPORUS:
|
||||
encounters[type] = DONE;
|
||||
Events.RescheduleEvent(EVENT_NEXT_PORTAL, 60000);
|
||||
Events.SetPhase(1);
|
||||
SaveToDB();
|
||||
break;
|
||||
case DATA_RIFT_KILLED:
|
||||
if (!Events.IsInPhase(1))
|
||||
Events.RescheduleEvent(EVENT_NEXT_PORTAL, 4000);
|
||||
break;
|
||||
case DATA_MEDIVH:
|
||||
DoUpdateWorldState(WORLD_STATE_BM, 1);
|
||||
DoUpdateWorldState(WORLD_STATE_BM_SHIELD, _shieldPercent);
|
||||
DoUpdateWorldState(WORLD_STATE_BM_RIFT, _currentRift);
|
||||
Events.RescheduleEvent(EVENT_NEXT_PORTAL, 3000);
|
||||
break;
|
||||
case DATA_DAMAGE_SHIELD:
|
||||
--_shieldPercent;
|
||||
DoUpdateWorldState(WORLD_STATE_BM_SHIELD, _shieldPercent);
|
||||
if (!_shieldPercent)
|
||||
if (Creature* medivh = instance->GetCreature(_medivhGUID))
|
||||
if (medivh->IsAlive())
|
||||
{
|
||||
Unit::Kill(medivh, medivh);
|
||||
|
||||
// Xinef: delete all spawns
|
||||
std::set<uint64> eCopy = encounterNPCs;
|
||||
for (std::set<uint64>::iterator itr = eCopy.begin(); itr != eCopy.end(); ++itr)
|
||||
if (Creature* creature = instance->GetCreature(*itr))
|
||||
creature->DespawnOrUnsummon();
|
||||
}
|
||||
break;
|
||||
// Xinef: delete all spawns
|
||||
std::set<uint64> eCopy = encounterNPCs;
|
||||
for (std::set<uint64>::iterator itr = eCopy.begin(); itr != eCopy.end(); ++itr)
|
||||
if (Creature* creature = instance->GetCreature(*itr))
|
||||
creature->DespawnOrUnsummon();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type) const
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_CHRONO_LORD_DEJA:
|
||||
case TYPE_TEMPORUS:
|
||||
case TYPE_AEONUS:
|
||||
return encounters[type];
|
||||
case DATA_SHIELD_PERCENT:
|
||||
return _shieldPercent;
|
||||
case DATA_RIFT_NUMBER:
|
||||
return _currentRift;
|
||||
}
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_CHRONO_LORD_DEJA:
|
||||
case TYPE_TEMPORUS:
|
||||
case TYPE_AEONUS:
|
||||
return encounters[type];
|
||||
case DATA_SHIELD_PERCENT:
|
||||
return _shieldPercent;
|
||||
case DATA_RIFT_NUMBER:
|
||||
return _currentRift;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SetData64(uint32 type, uint64 data)
|
||||
{
|
||||
if (type == DATA_SUMMONED_NPC)
|
||||
encounterNPCs.insert(data);
|
||||
else if (type == DATA_DELETED_NPC)
|
||||
encounterNPCs.erase(data);
|
||||
}
|
||||
void SetData64(uint32 type, uint64 data)
|
||||
{
|
||||
if (type == DATA_SUMMONED_NPC)
|
||||
encounterNPCs.insert(data);
|
||||
else if (type == DATA_DELETED_NPC)
|
||||
encounterNPCs.erase(data);
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 data) const
|
||||
{
|
||||
@@ -228,46 +228,46 @@ public:
|
||||
|
||||
void SummonPortalKeeper()
|
||||
{
|
||||
Creature* rift = NULL;
|
||||
for (std::set<uint64>::const_iterator itr = encounterNPCs.begin(); itr != encounterNPCs.end(); ++itr)
|
||||
if (Creature* summon = instance->GetCreature(*itr))
|
||||
if (summon->GetEntry() == NPC_TIME_RIFT)
|
||||
{
|
||||
rift = summon;
|
||||
break;
|
||||
}
|
||||
Creature* rift = NULL;
|
||||
for (std::set<uint64>::const_iterator itr = encounterNPCs.begin(); itr != encounterNPCs.end(); ++itr)
|
||||
if (Creature* summon = instance->GetCreature(*itr))
|
||||
if (summon->GetEntry() == NPC_TIME_RIFT)
|
||||
{
|
||||
rift = summon;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!rift)
|
||||
return;
|
||||
if (!rift)
|
||||
return;
|
||||
|
||||
int32 entry = 0;
|
||||
switch (_currentRift)
|
||||
{
|
||||
case 6: entry = GetData(TYPE_CHRONO_LORD_DEJA) == DONE ? (instance->IsHeroic() ? NPC_INFINITE_CHRONO_LORD : -NPC_CHRONO_LORD_DEJA) : NPC_CHRONO_LORD_DEJA; break;
|
||||
case 12: entry = GetData(TYPE_TEMPORUS) == DONE ? (instance->IsHeroic() ? NPC_INFINITE_TIMEREAVER : -NPC_TEMPORUS) : NPC_TEMPORUS; break;
|
||||
case 18: entry = NPC_AEONUS; break;
|
||||
default: entry = RAND(NPC_RIFT_KEEPER_WARLOCK, NPC_RIFT_KEEPER_MAGE, NPC_RIFT_LORD, NPC_RIFT_LORD_2); break;
|
||||
}
|
||||
int32 entry = 0;
|
||||
switch (_currentRift)
|
||||
{
|
||||
case 6: entry = GetData(TYPE_CHRONO_LORD_DEJA) == DONE ? (instance->IsHeroic() ? NPC_INFINITE_CHRONO_LORD : -NPC_CHRONO_LORD_DEJA) : NPC_CHRONO_LORD_DEJA; break;
|
||||
case 12: entry = GetData(TYPE_TEMPORUS) == DONE ? (instance->IsHeroic() ? NPC_INFINITE_TIMEREAVER : -NPC_TEMPORUS) : NPC_TEMPORUS; break;
|
||||
case 18: entry = NPC_AEONUS; break;
|
||||
default: entry = RAND(NPC_RIFT_KEEPER_WARLOCK, NPC_RIFT_KEEPER_MAGE, NPC_RIFT_LORD, NPC_RIFT_LORD_2); break;
|
||||
}
|
||||
|
||||
Position pos;
|
||||
rift->GetNearPosition(pos, 10.0f, 2*M_PI*rand_norm());
|
||||
|
||||
if (TempSummon* summon = instance->SummonCreature(abs(entry), pos))
|
||||
{
|
||||
summon->SetTempSummonType(TEMPSUMMON_CORPSE_TIMED_DESPAWN);
|
||||
summon->SetTimer(3*MINUTE*IN_MILLISECONDS);
|
||||
{
|
||||
summon->SetTempSummonType(TEMPSUMMON_CORPSE_TIMED_DESPAWN);
|
||||
summon->SetTimer(3*MINUTE*IN_MILLISECONDS);
|
||||
|
||||
if (entry < 0)
|
||||
summon->SetLootMode(0);
|
||||
if (entry < 0)
|
||||
summon->SetLootMode(0);
|
||||
|
||||
if (summon->GetEntry() != NPC_AEONUS)
|
||||
{
|
||||
rift->AI()->SetGUID(summon->GetGUID());
|
||||
rift->CastSpell(summon, SPELL_RIFT_CHANNEL, false);
|
||||
}
|
||||
else
|
||||
summon->SetReactState(REACT_DEFENSIVE);
|
||||
}
|
||||
if (summon->GetEntry() != NPC_AEONUS)
|
||||
{
|
||||
rift->AI()->SetGUID(summon->GetGUID());
|
||||
rift->CastSpell(summon, SPELL_RIFT_CHANNEL, false);
|
||||
}
|
||||
else
|
||||
summon->SetReactState(REACT_DEFENSIVE);
|
||||
}
|
||||
}
|
||||
|
||||
void Update(uint32 diff)
|
||||
@@ -275,59 +275,59 @@ public:
|
||||
Events.Update(diff);
|
||||
switch (Events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_NEXT_PORTAL:
|
||||
++_currentRift;
|
||||
DoUpdateWorldState(WORLD_STATE_BM_RIFT, _currentRift);
|
||||
Events.ScheduleEvent(EVENT_SUMMON_KEEPER, 6000);
|
||||
Events.SetPhase(0);
|
||||
case EVENT_NEXT_PORTAL:
|
||||
++_currentRift;
|
||||
DoUpdateWorldState(WORLD_STATE_BM_RIFT, _currentRift);
|
||||
Events.ScheduleEvent(EVENT_SUMMON_KEEPER, 6000);
|
||||
Events.SetPhase(0);
|
||||
|
||||
if (Creature* medivh = instance->GetCreature(_medivhGUID))
|
||||
{
|
||||
uint8 position = (_currentRift-1)%4;
|
||||
instance->SummonCreature(NPC_TIME_RIFT, PortalLocation[position]);
|
||||
}
|
||||
break;
|
||||
case EVENT_SUMMON_KEEPER:
|
||||
SummonPortalKeeper();
|
||||
break;
|
||||
if (Creature* medivh = instance->GetCreature(_medivhGUID))
|
||||
{
|
||||
uint8 position = (_currentRift-1)%4;
|
||||
instance->SummonCreature(NPC_TIME_RIFT, PortalLocation[position]);
|
||||
}
|
||||
break;
|
||||
case EVENT_SUMMON_KEEPER:
|
||||
SummonPortalKeeper();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "B M " << encounters[0] << ' ' << encounters[1] << ' ' << encounters[2];
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "B M " << encounters[0] << ' ' << encounters[1] << ' ' << encounters[2];
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(const char* in)
|
||||
{
|
||||
if (!in)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
void Load(const char* in)
|
||||
{
|
||||
if (!in)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(in);
|
||||
OUT_LOAD_INST_DATA(in);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(in);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
if (dataHead1 == 'B' && dataHead2 == 'M')
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
loadStream >> encounters[i];
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
std::istringstream loadStream(in);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
if (dataHead1 == 'B' && dataHead2 == 'M')
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
loadStream >> encounters[i];
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
protected:
|
||||
EventMap Events;
|
||||
|
||||
@@ -10,67 +10,67 @@ REWRITTEN BY XINEF
|
||||
|
||||
enum medivhSays
|
||||
{
|
||||
SAY_WEAK75 = 0,
|
||||
SAY_WEAK50 = 1,
|
||||
SAY_WEAK25 = 2,
|
||||
SAY_ENTER = 3,
|
||||
SAY_INTRO = 4,
|
||||
SAY_DEATH = 5,
|
||||
SAY_WIN = 6,
|
||||
SAY_ORCS_ENTER = 7,
|
||||
SAY_WEAK75 = 0,
|
||||
SAY_WEAK50 = 1,
|
||||
SAY_WEAK25 = 2,
|
||||
SAY_ENTER = 3,
|
||||
SAY_INTRO = 4,
|
||||
SAY_DEATH = 5,
|
||||
SAY_WIN = 6,
|
||||
SAY_ORCS_ENTER = 7,
|
||||
|
||||
SAY_ORCS_ANSWER = 0
|
||||
SAY_ORCS_ANSWER = 0
|
||||
};
|
||||
|
||||
enum medivhSpells
|
||||
{
|
||||
SPELL_MANA_SHIELD = 31635,
|
||||
SPELL_MEDIVH_CHANNEL = 31556,
|
||||
SPELL_BLACK_CRYSTAL = 32563,
|
||||
SPELL_PORTAL_CRYSTALS = 32564,
|
||||
SPELL_BANISH_PURPLE = 32566,
|
||||
SPELL_BANISH_GREEN = 32567,
|
||||
SPELL_MANA_SHIELD = 31635,
|
||||
SPELL_MEDIVH_CHANNEL = 31556,
|
||||
SPELL_BLACK_CRYSTAL = 32563,
|
||||
SPELL_PORTAL_CRYSTALS = 32564,
|
||||
SPELL_BANISH_PURPLE = 32566,
|
||||
SPELL_BANISH_GREEN = 32567,
|
||||
|
||||
SPELL_CORRUPT = 31326,
|
||||
SPELL_CORRUPT_AEONUS = 37853,
|
||||
SPELL_CORRUPT = 31326,
|
||||
SPELL_CORRUPT_AEONUS = 37853,
|
||||
};
|
||||
|
||||
enum medivhMisc
|
||||
{
|
||||
NPC_DP_EMITTER_STALKER = 18582,
|
||||
NPC_DP_CRYSTAL_STALKER = 18553,
|
||||
NPC_SHADOW_COUNCIL_ENFORCER = 17023,
|
||||
GO_DARK_PORTAL = 185103,
|
||||
NPC_DP_EMITTER_STALKER = 18582,
|
||||
NPC_DP_CRYSTAL_STALKER = 18553,
|
||||
NPC_SHADOW_COUNCIL_ENFORCER = 17023,
|
||||
GO_DARK_PORTAL = 185103,
|
||||
|
||||
EVENT_CHECK_HEALTH_25 = 1,
|
||||
EVENT_CHECK_HEALTH_50 = 2,
|
||||
EVENT_CHECK_HEALTH_75 = 3,
|
||||
EVENT_SUMMON_CRYSTAL = 4,
|
||||
EVENT_SUMMON_FLYING_CRYSTAL = 5,
|
||||
EVENT_CHECK_HEALTH_25 = 1,
|
||||
EVENT_CHECK_HEALTH_50 = 2,
|
||||
EVENT_CHECK_HEALTH_75 = 3,
|
||||
EVENT_SUMMON_CRYSTAL = 4,
|
||||
EVENT_SUMMON_FLYING_CRYSTAL = 5,
|
||||
|
||||
EVENT_OUTRO_1 = 10,
|
||||
EVENT_OUTRO_2 = 11,
|
||||
EVENT_OUTRO_3 = 12,
|
||||
EVENT_OUTRO_4 = 13,
|
||||
EVENT_OUTRO_5 = 14,
|
||||
EVENT_OUTRO_6 = 15,
|
||||
EVENT_OUTRO_7 = 16,
|
||||
EVENT_OUTRO_8 = 17
|
||||
EVENT_OUTRO_1 = 10,
|
||||
EVENT_OUTRO_2 = 11,
|
||||
EVENT_OUTRO_3 = 12,
|
||||
EVENT_OUTRO_4 = 13,
|
||||
EVENT_OUTRO_5 = 14,
|
||||
EVENT_OUTRO_6 = 15,
|
||||
EVENT_OUTRO_7 = 16,
|
||||
EVENT_OUTRO_8 = 17
|
||||
};
|
||||
|
||||
class NpcRunToHome : public BasicEvent
|
||||
{
|
||||
public:
|
||||
NpcRunToHome(Creature& owner) : _owner(owner) { }
|
||||
NpcRunToHome(Creature& owner) : _owner(owner) { }
|
||||
|
||||
bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/)
|
||||
{
|
||||
_owner.GetMotionMaster()->MoveTargetedHome();
|
||||
return true;
|
||||
}
|
||||
bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/)
|
||||
{
|
||||
_owner.GetMotionMaster()->MoveTargetedHome();
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
Creature& _owner;
|
||||
Creature& _owner;
|
||||
};
|
||||
|
||||
class npc_medivh_bm : public CreatureScript
|
||||
@@ -89,184 +89,184 @@ public:
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
|
||||
groundArray.clear();
|
||||
airArray.clear();
|
||||
groundArray.clear();
|
||||
airArray.clear();
|
||||
|
||||
groundArray.push_back(G3D::Vector3(creature->GetPositionX() + 8.0f, creature->GetPositionY(), creature->GetPositionZ()));
|
||||
airArray.push_back(G3D::Vector3(creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ()));
|
||||
for (uint8 i = 0; i < 10; ++i)
|
||||
groundArray.push_back(G3D::Vector3(creature->GetPositionX() + 8.0f*cos(2.0f*M_PI*i/10.0f), creature->GetPositionY() + 8.0f*sin(2.0f*M_PI*i/10.0f), creature->GetPositionZ()));
|
||||
groundArray.push_back(G3D::Vector3(creature->GetPositionX() + 8.0f, creature->GetPositionY(), creature->GetPositionZ()));
|
||||
airArray.push_back(G3D::Vector3(creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ()));
|
||||
for (uint8 i = 0; i < 10; ++i)
|
||||
groundArray.push_back(G3D::Vector3(creature->GetPositionX() + 8.0f*cos(2.0f*M_PI*i/10.0f), creature->GetPositionY() + 8.0f*sin(2.0f*M_PI*i/10.0f), creature->GetPositionZ()));
|
||||
|
||||
for (uint8 i = 0; i < 40; ++i)
|
||||
airArray.push_back(G3D::Vector3(creature->GetPositionX() + i*0.25f*cos(2.0f*M_PI*i/10.0f), creature->GetPositionY() + i*0.25f*sin(2.0f*M_PI*i/10.0f), creature->GetPositionZ() + i/4.0f));
|
||||
for (uint8 i = 40; i < 80; ++i)
|
||||
airArray.push_back(G3D::Vector3(creature->GetPositionX() + 10.0f*cos(2.0f*M_PI*i/10.0f), creature->GetPositionY() + 10.0f*sin(2.0f*M_PI*i/10.0f), creature->GetPositionZ() + i/4.0f));
|
||||
for (uint8 i = 0; i < 40; ++i)
|
||||
airArray.push_back(G3D::Vector3(creature->GetPositionX() + i*0.25f*cos(2.0f*M_PI*i/10.0f), creature->GetPositionY() + i*0.25f*sin(2.0f*M_PI*i/10.0f), creature->GetPositionZ() + i/4.0f));
|
||||
for (uint8 i = 40; i < 80; ++i)
|
||||
airArray.push_back(G3D::Vector3(creature->GetPositionX() + 10.0f*cos(2.0f*M_PI*i/10.0f), creature->GetPositionY() + 10.0f*sin(2.0f*M_PI*i/10.0f), creature->GetPositionZ() + i/4.0f));
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
EventMap events;
|
||||
Movement::PointsArray groundArray;
|
||||
Movement::PointsArray airArray;
|
||||
EventMap events;
|
||||
Movement::PointsArray groundArray;
|
||||
Movement::PointsArray airArray;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
me->CastSpell(me, SPELL_MANA_SHIELD, true);
|
||||
events.Reset();
|
||||
me->CastSpell(me, SPELL_MANA_SHIELD, true);
|
||||
|
||||
if (instance->GetData(TYPE_AEONUS) != DONE)
|
||||
me->CastSpell(me, SPELL_MEDIVH_CHANNEL, false);
|
||||
if (instance->GetData(TYPE_AEONUS) != DONE)
|
||||
me->CastSpell(me, SPELL_MEDIVH_CHANNEL, false);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
instance->SetData64(DATA_SUMMONED_NPC, summon->GetGUID());
|
||||
if (summon->GetEntry() == NPC_DP_CRYSTAL_STALKER)
|
||||
{
|
||||
summon->DespawnOrUnsummon(25000);
|
||||
summon->CastSpell(summon, RAND(SPELL_BANISH_PURPLE, SPELL_BANISH_GREEN), true);
|
||||
summon->GetMotionMaster()->MoveSplinePath(&airArray);
|
||||
}
|
||||
else if (summon->GetEntry() == NPC_DP_EMITTER_STALKER)
|
||||
{
|
||||
summon->CastSpell(summon, SPELL_BLACK_CRYSTAL, true);
|
||||
Movement::MoveSplineInit init(summon);
|
||||
init.MovebyPath(groundArray);
|
||||
init.SetCyclic();
|
||||
init.Launch();
|
||||
}
|
||||
}
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
instance->SetData64(DATA_SUMMONED_NPC, summon->GetGUID());
|
||||
if (summon->GetEntry() == NPC_DP_CRYSTAL_STALKER)
|
||||
{
|
||||
summon->DespawnOrUnsummon(25000);
|
||||
summon->CastSpell(summon, RAND(SPELL_BANISH_PURPLE, SPELL_BANISH_GREEN), true);
|
||||
summon->GetMotionMaster()->MoveSplinePath(&airArray);
|
||||
}
|
||||
else if (summon->GetEntry() == NPC_DP_EMITTER_STALKER)
|
||||
{
|
||||
summon->CastSpell(summon, SPELL_BLACK_CRYSTAL, true);
|
||||
Movement::MoveSplineInit init(summon);
|
||||
init.MovebyPath(groundArray);
|
||||
init.SetCyclic();
|
||||
init.Launch();
|
||||
}
|
||||
}
|
||||
|
||||
void SummonedCreatureDespawn(Creature* summon)
|
||||
{
|
||||
instance->SetData64(DATA_DELETED_NPC, summon->GetGUID());
|
||||
}
|
||||
void SummonedCreatureDespawn(Creature* summon)
|
||||
{
|
||||
instance->SetData64(DATA_DELETED_NPC, summon->GetGUID());
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
{
|
||||
if (!events.Empty() || instance->GetData(TYPE_AEONUS) == DONE)
|
||||
return;
|
||||
if (!events.Empty() || instance->GetData(TYPE_AEONUS) == DONE)
|
||||
return;
|
||||
|
||||
if (who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 20.0f))
|
||||
{
|
||||
Talk(SAY_ENTER);
|
||||
instance->SetData(DATA_MEDIVH, 1);
|
||||
me->CastSpell(me, SPELL_MEDIVH_CHANNEL, false);
|
||||
instance->SetData(DATA_MEDIVH, 1);
|
||||
me->CastSpell(me, SPELL_MEDIVH_CHANNEL, false);
|
||||
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH_75, 500);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH_50, 500);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 500);
|
||||
events.ScheduleEvent(EVENT_SUMMON_CRYSTAL, 2000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_CRYSTAL, 4000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_CRYSTAL, 6000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_FLYING_CRYSTAL, 8000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH_75, 500);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH_50, 500);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 500);
|
||||
events.ScheduleEvent(EVENT_SUMMON_CRYSTAL, 2000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_CRYSTAL, 4000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_CRYSTAL, 6000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_FLYING_CRYSTAL, 8000);
|
||||
}
|
||||
}
|
||||
|
||||
void AttackStart(Unit* ) { }
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if (param == ACTION_OUTRO)
|
||||
{
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_OUTRO_1, 4000);
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if (param == ACTION_OUTRO)
|
||||
{
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_OUTRO_1, 4000);
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
|
||||
me->SummonGameObject(GO_DARK_PORTAL, -2086.0f, 7125.6215f, 30.5f, 6.148f, 0.0f, 0.0f, 0.0f, 0.0f, 0);
|
||||
}
|
||||
}
|
||||
me->SummonGameObject(GO_DARK_PORTAL, -2086.0f, 7125.6215f, 30.5f, 6.148f, 0.0f, 0.0f, 0.0f, 0.0f, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* )
|
||||
{
|
||||
me->SetRespawnTime(DAY);
|
||||
events.Reset();
|
||||
Talk(SAY_DEATH);
|
||||
me->SetRespawnTime(DAY);
|
||||
events.Reset();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events.Update(diff);
|
||||
switch (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_CHECK_HEALTH_25:
|
||||
case EVENT_CHECK_HEALTH_50:
|
||||
case EVENT_CHECK_HEALTH_75:
|
||||
if (instance->GetData(DATA_SHIELD_PERCENT) <= eventId*25)
|
||||
{
|
||||
Talk(eventId-1);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(eventId, 500);
|
||||
break;
|
||||
case EVENT_SUMMON_CRYSTAL:
|
||||
me->SummonCreature(NPC_DP_EMITTER_STALKER, me->GetPositionX() + 8.0f, me->GetPositionY(), me->GetPositionZ());
|
||||
break;
|
||||
case EVENT_SUMMON_FLYING_CRYSTAL:
|
||||
me->CastSpell(me, SPELL_PORTAL_CRYSTALS, true);
|
||||
events.ScheduleEvent(EVENT_SUMMON_FLYING_CRYSTAL, 1000);
|
||||
break;
|
||||
case EVENT_OUTRO_1:
|
||||
me->SetFacingTo(6.21f);
|
||||
Talk(SAY_WIN);
|
||||
events.ScheduleEvent(EVENT_OUTRO_2, 17000);
|
||||
break;
|
||||
case EVENT_OUTRO_2:
|
||||
me->SetFacingTo(3.07f);
|
||||
events.ScheduleEvent(EVENT_OUTRO_3, 2000);
|
||||
break;
|
||||
case EVENT_OUTRO_3:
|
||||
SummonOrcs(-2046.158f, -3.0f, 37000, 30000, true);
|
||||
events.ScheduleEvent(EVENT_OUTRO_4, 2000);
|
||||
break;
|
||||
case EVENT_OUTRO_4:
|
||||
SummonOrcs(-2055.97f, -2.0f, 33000, 28000, false);
|
||||
events.ScheduleEvent(EVENT_OUTRO_5, 2000);
|
||||
break;
|
||||
case EVENT_OUTRO_5:
|
||||
SummonOrcs(-2064.0f, -1.5f, 29000, 26000, false);
|
||||
events.ScheduleEvent(EVENT_OUTRO_6, 2000);
|
||||
break;
|
||||
case EVENT_OUTRO_6:
|
||||
SummonOrcs(-2074.35f, -0.1f, 26000, 24000, false);
|
||||
events.ScheduleEvent(EVENT_OUTRO_7, 7000);
|
||||
break;
|
||||
case EVENT_OUTRO_7:
|
||||
Talk(SAY_ORCS_ENTER);
|
||||
events.ScheduleEvent(EVENT_OUTRO_8, 7000);
|
||||
break;
|
||||
case EVENT_OUTRO_8:
|
||||
if (Creature* cr = me->FindNearestCreature(NPC_SHADOW_COUNCIL_ENFORCER, 20.0f))
|
||||
{
|
||||
cr->SetFacingTo(3.07f);
|
||||
cr->AI()->Talk(SAY_ORCS_ANSWER);
|
||||
}
|
||||
break;
|
||||
events.Update(diff);
|
||||
switch (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_CHECK_HEALTH_25:
|
||||
case EVENT_CHECK_HEALTH_50:
|
||||
case EVENT_CHECK_HEALTH_75:
|
||||
if (instance->GetData(DATA_SHIELD_PERCENT) <= eventId*25)
|
||||
{
|
||||
Talk(eventId-1);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(eventId, 500);
|
||||
break;
|
||||
case EVENT_SUMMON_CRYSTAL:
|
||||
me->SummonCreature(NPC_DP_EMITTER_STALKER, me->GetPositionX() + 8.0f, me->GetPositionY(), me->GetPositionZ());
|
||||
break;
|
||||
case EVENT_SUMMON_FLYING_CRYSTAL:
|
||||
me->CastSpell(me, SPELL_PORTAL_CRYSTALS, true);
|
||||
events.ScheduleEvent(EVENT_SUMMON_FLYING_CRYSTAL, 1000);
|
||||
break;
|
||||
case EVENT_OUTRO_1:
|
||||
me->SetFacingTo(6.21f);
|
||||
Talk(SAY_WIN);
|
||||
events.ScheduleEvent(EVENT_OUTRO_2, 17000);
|
||||
break;
|
||||
case EVENT_OUTRO_2:
|
||||
me->SetFacingTo(3.07f);
|
||||
events.ScheduleEvent(EVENT_OUTRO_3, 2000);
|
||||
break;
|
||||
case EVENT_OUTRO_3:
|
||||
SummonOrcs(-2046.158f, -3.0f, 37000, 30000, true);
|
||||
events.ScheduleEvent(EVENT_OUTRO_4, 2000);
|
||||
break;
|
||||
case EVENT_OUTRO_4:
|
||||
SummonOrcs(-2055.97f, -2.0f, 33000, 28000, false);
|
||||
events.ScheduleEvent(EVENT_OUTRO_5, 2000);
|
||||
break;
|
||||
case EVENT_OUTRO_5:
|
||||
SummonOrcs(-2064.0f, -1.5f, 29000, 26000, false);
|
||||
events.ScheduleEvent(EVENT_OUTRO_6, 2000);
|
||||
break;
|
||||
case EVENT_OUTRO_6:
|
||||
SummonOrcs(-2074.35f, -0.1f, 26000, 24000, false);
|
||||
events.ScheduleEvent(EVENT_OUTRO_7, 7000);
|
||||
break;
|
||||
case EVENT_OUTRO_7:
|
||||
Talk(SAY_ORCS_ENTER);
|
||||
events.ScheduleEvent(EVENT_OUTRO_8, 7000);
|
||||
break;
|
||||
case EVENT_OUTRO_8:
|
||||
if (Creature* cr = me->FindNearestCreature(NPC_SHADOW_COUNCIL_ENFORCER, 20.0f))
|
||||
{
|
||||
cr->SetFacingTo(3.07f);
|
||||
cr->AI()->Talk(SAY_ORCS_ANSWER);
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SummonOrcs(float x, float y, uint32 duration, uint32 homeTime, bool first)
|
||||
{
|
||||
for (uint8 i = 0; i < 6; ++i)
|
||||
{
|
||||
if (Creature* cr = me->SummonCreature(NPC_SHADOW_COUNCIL_ENFORCER, -2091.731f, 7133.083f - 3.0f*i, 34.589f, 0.0f))
|
||||
{
|
||||
cr->GetMotionMaster()->MovePoint(0, (first && i == 3) ? x+2.0f : x, cr->GetPositionY()+y, cr->GetMap()->GetHeight(x, cr->GetPositionY()+y, MAX_HEIGHT, true));
|
||||
cr->m_Events.AddEvent(new NpcRunToHome(*cr), cr->m_Events.CalculateTime(homeTime+urand(0, 2000)));
|
||||
cr->DespawnOrUnsummon(duration+urand(0, 2000));
|
||||
}
|
||||
}
|
||||
}
|
||||
void SummonOrcs(float x, float y, uint32 duration, uint32 homeTime, bool first)
|
||||
{
|
||||
for (uint8 i = 0; i < 6; ++i)
|
||||
{
|
||||
if (Creature* cr = me->SummonCreature(NPC_SHADOW_COUNCIL_ENFORCER, -2091.731f, 7133.083f - 3.0f*i, 34.589f, 0.0f))
|
||||
{
|
||||
cr->GetMotionMaster()->MovePoint(0, (first && i == 3) ? x+2.0f : x, cr->GetPositionY()+y, cr->GetMap()->GetHeight(x, cr->GetPositionY()+y, MAX_HEIGHT, true));
|
||||
cr->m_Events.AddEvent(new NpcRunToHome(*cr), cr->m_Events.CalculateTime(homeTime+urand(0, 2000)));
|
||||
cr->DespawnOrUnsummon(duration+urand(0, 2000));
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
enum timeRift
|
||||
{
|
||||
EVENT_SUMMON_AT_RIFT = 1,
|
||||
EVENT_CHECK_DEATH = 2
|
||||
EVENT_SUMMON_AT_RIFT = 1,
|
||||
EVENT_CHECK_DEATH = 2
|
||||
};
|
||||
|
||||
class npc_time_rift : public CreatureScript
|
||||
@@ -282,45 +282,45 @@ public:
|
||||
struct npc_time_riftAI : public NullCreatureAI
|
||||
{
|
||||
npc_time_riftAI(Creature* creature) : NullCreatureAI(creature)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
riftKeeperGUID = 0;
|
||||
}
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
riftKeeperGUID = 0;
|
||||
}
|
||||
|
||||
EventMap events;
|
||||
InstanceScript* instance;
|
||||
uint64 riftKeeperGUID;
|
||||
EventMap events;
|
||||
InstanceScript* instance;
|
||||
uint64 riftKeeperGUID;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
if (instance->GetData(DATA_RIFT_NUMBER) >= 18)
|
||||
{
|
||||
me->DespawnOrUnsummon(30000);
|
||||
return;
|
||||
}
|
||||
if (instance->GetData(DATA_RIFT_NUMBER) >= 18)
|
||||
{
|
||||
me->DespawnOrUnsummon(30000);
|
||||
return;
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_SUMMON_AT_RIFT, 16000);
|
||||
events.ScheduleEvent(EVENT_CHECK_DEATH, 8000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_AT_RIFT, 16000);
|
||||
events.ScheduleEvent(EVENT_CHECK_DEATH, 8000);
|
||||
}
|
||||
|
||||
void SetGUID(uint64 guid, int32)
|
||||
{
|
||||
riftKeeperGUID = guid;
|
||||
}
|
||||
void SetGUID(uint64 guid, int32)
|
||||
{
|
||||
riftKeeperGUID = guid;
|
||||
}
|
||||
|
||||
void DoSummonAtRift(uint32 entry)
|
||||
{
|
||||
Position pos;
|
||||
me->GetNearPosition(pos, 10.0f, 2*M_PI*rand_norm());
|
||||
|
||||
if (Creature* summon = me->SummonCreature(entry, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000))
|
||||
if (Creature* summon = me->SummonCreature(entry, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000))
|
||||
if (Unit* medivh = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_MEDIVH)))
|
||||
{
|
||||
float o = medivh->GetAngle(summon)+frand(-1.0f, 1.0f);
|
||||
summon->SetHomePosition(medivh->GetPositionX() + 14.0f*cos(o), medivh->GetPositionY() + 14.0f*sin(o), medivh->GetPositionZ(), summon->GetAngle(medivh));
|
||||
summon->GetMotionMaster()->MoveTargetedHome();
|
||||
summon->SetReactState(REACT_DEFENSIVE);
|
||||
}
|
||||
{
|
||||
float o = medivh->GetAngle(summon)+frand(-1.0f, 1.0f);
|
||||
summon->SetHomePosition(medivh->GetPositionX() + 14.0f*cos(o), medivh->GetPositionY() + 14.0f*sin(o), medivh->GetPositionZ(), summon->GetAngle(medivh));
|
||||
summon->GetMotionMaster()->MoveTargetedHome();
|
||||
summon->SetReactState(REACT_DEFENSIVE);
|
||||
}
|
||||
}
|
||||
|
||||
void DoSelectSummon()
|
||||
@@ -328,75 +328,75 @@ public:
|
||||
uint32 entry = RAND(NPC_INFINITE_ASSASIN, NPC_INFINITE_WHELP, NPC_INFINITE_CRONOMANCER, NPC_INFINITE_EXECUTIONER, NPC_INFINITE_VANQUISHER);
|
||||
if (entry == NPC_INFINITE_WHELP)
|
||||
{
|
||||
DoSummonAtRift(entry);
|
||||
DoSummonAtRift(entry);
|
||||
DoSummonAtRift(entry);
|
||||
DoSummonAtRift(entry);
|
||||
DoSummonAtRift(entry);
|
||||
DoSummonAtRift(entry);
|
||||
}
|
||||
else
|
||||
DoSummonAtRift(entry);
|
||||
else
|
||||
DoSummonAtRift(entry);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events.Update(diff);
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SUMMON_AT_RIFT:
|
||||
DoSelectSummon();
|
||||
events.ScheduleEvent(EVENT_SUMMON_AT_RIFT, 15000);
|
||||
break;
|
||||
case EVENT_CHECK_DEATH:
|
||||
if (!me->HasUnitState(UNIT_STATE_CASTING))
|
||||
{
|
||||
Creature* riftKeeper = ObjectAccessor::GetCreature(*me, riftKeeperGUID);
|
||||
if (!riftKeeper || !riftKeeper->IsAlive())
|
||||
{
|
||||
instance->SetData(DATA_RIFT_KILLED, 1);
|
||||
me->DespawnOrUnsummon(0);
|
||||
break;
|
||||
}
|
||||
else
|
||||
me->CastSpell(riftKeeper, SPELL_RIFT_CHANNEL, false);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_DEATH, 500);
|
||||
break;
|
||||
}
|
||||
events.Update(diff);
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SUMMON_AT_RIFT:
|
||||
DoSelectSummon();
|
||||
events.ScheduleEvent(EVENT_SUMMON_AT_RIFT, 15000);
|
||||
break;
|
||||
case EVENT_CHECK_DEATH:
|
||||
if (!me->HasUnitState(UNIT_STATE_CASTING))
|
||||
{
|
||||
Creature* riftKeeper = ObjectAccessor::GetCreature(*me, riftKeeperGUID);
|
||||
if (!riftKeeper || !riftKeeper->IsAlive())
|
||||
{
|
||||
instance->SetData(DATA_RIFT_KILLED, 1);
|
||||
me->DespawnOrUnsummon(0);
|
||||
break;
|
||||
}
|
||||
else
|
||||
me->CastSpell(riftKeeper, SPELL_RIFT_CHANNEL, false);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_DEATH, 500);
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class spell_black_morass_corrupt_medivh : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_black_morass_corrupt_medivh() : SpellScriptLoader("spell_black_morass_corrupt_medivh") { }
|
||||
public:
|
||||
spell_black_morass_corrupt_medivh() : SpellScriptLoader("spell_black_morass_corrupt_medivh") { }
|
||||
|
||||
class spell_black_morass_corrupt_medivh_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_black_morass_corrupt_medivh_AuraScript);
|
||||
class spell_black_morass_corrupt_medivh_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_black_morass_corrupt_medivh_AuraScript);
|
||||
|
||||
void PeriodicTick(AuraEffect const* /*aurEff*/)
|
||||
{
|
||||
if (InstanceScript* instance = GetUnitOwner()->GetInstanceScript())
|
||||
instance->SetData(DATA_DAMAGE_SHIELD, 1);
|
||||
}
|
||||
void PeriodicTick(AuraEffect const* /*aurEff*/)
|
||||
{
|
||||
if (InstanceScript* instance = GetUnitOwner()->GetInstanceScript())
|
||||
instance->SetData(DATA_DAMAGE_SHIELD, 1);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_morass_corrupt_medivh_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_morass_corrupt_medivh_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
|
||||
InstanceScript* _instance;
|
||||
};
|
||||
InstanceScript* _instance;
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_black_morass_corrupt_medivh_AuraScript();
|
||||
}
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_black_morass_corrupt_medivh_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_the_black_morass()
|
||||
{
|
||||
new npc_medivh_bm();
|
||||
new npc_time_rift();
|
||||
new spell_black_morass_corrupt_medivh();
|
||||
new spell_black_morass_corrupt_medivh();
|
||||
}
|
||||
|
||||
@@ -7,19 +7,19 @@ REWRITTEN BY XINEF
|
||||
|
||||
enum DataTypes
|
||||
{
|
||||
TYPE_CHRONO_LORD_DEJA = 0,
|
||||
TYPE_TEMPORUS = 1,
|
||||
TYPE_AEONUS = 2,
|
||||
MAX_ENCOUNTER = 3,
|
||||
TYPE_CHRONO_LORD_DEJA = 0,
|
||||
TYPE_TEMPORUS = 1,
|
||||
TYPE_AEONUS = 2,
|
||||
MAX_ENCOUNTER = 3,
|
||||
|
||||
DATA_MEDIVH = 10,
|
||||
DATA_RIFT_KILLED = 11,
|
||||
DATA_DAMAGE_SHIELD = 12,
|
||||
DATA_SHIELD_PERCENT = 13,
|
||||
DATA_RIFT_NUMBER = 14,
|
||||
DATA_MEDIVH = 10,
|
||||
DATA_RIFT_KILLED = 11,
|
||||
DATA_DAMAGE_SHIELD = 12,
|
||||
DATA_SHIELD_PERCENT = 13,
|
||||
DATA_RIFT_NUMBER = 14,
|
||||
|
||||
DATA_SUMMONED_NPC = 20,
|
||||
DATA_DELETED_NPC = 21,
|
||||
DATA_SUMMONED_NPC = 20,
|
||||
DATA_DELETED_NPC = 21,
|
||||
};
|
||||
|
||||
enum WorldStateIds
|
||||
@@ -37,36 +37,36 @@ enum QuestIds
|
||||
|
||||
enum CreatureIds
|
||||
{
|
||||
NPC_MEDIVH = 15608,
|
||||
NPC_TIME_RIFT = 17838,
|
||||
NPC_TIME_KEEPER = 17918,
|
||||
NPC_MEDIVH = 15608,
|
||||
NPC_TIME_RIFT = 17838,
|
||||
NPC_TIME_KEEPER = 17918,
|
||||
|
||||
NPC_RIFT_KEEPER_WARLOCK = 21104,
|
||||
NPC_RIFT_KEEPER_MAGE = 21148,
|
||||
NPC_RIFT_LORD = 17839,
|
||||
NPC_RIFT_LORD_2 = 21140,
|
||||
NPC_RIFT_KEEPER_WARLOCK = 21104,
|
||||
NPC_RIFT_KEEPER_MAGE = 21148,
|
||||
NPC_RIFT_LORD = 17839,
|
||||
NPC_RIFT_LORD_2 = 21140,
|
||||
|
||||
NPC_CHRONO_LORD_DEJA = 17879,
|
||||
NPC_INFINITE_CHRONO_LORD = 21697,
|
||||
NPC_TEMPORUS = 17880,
|
||||
NPC_INFINITE_TIMEREAVER = 21698,
|
||||
NPC_AEONUS = 17881,
|
||||
NPC_CHRONO_LORD_DEJA = 17879,
|
||||
NPC_INFINITE_CHRONO_LORD = 21697,
|
||||
NPC_TEMPORUS = 17880,
|
||||
NPC_INFINITE_TIMEREAVER = 21698,
|
||||
NPC_AEONUS = 17881,
|
||||
|
||||
NPC_INFINITE_ASSASIN = 17835,
|
||||
NPC_INFINITE_WHELP = 21818,
|
||||
NPC_INFINITE_CRONOMANCER = 17892,
|
||||
NPC_INFINITE_EXECUTIONER = 18994,
|
||||
NPC_INFINITE_VANQUISHER = 18995
|
||||
NPC_INFINITE_ASSASIN = 17835,
|
||||
NPC_INFINITE_WHELP = 21818,
|
||||
NPC_INFINITE_CRONOMANCER = 17892,
|
||||
NPC_INFINITE_EXECUTIONER = 18994,
|
||||
NPC_INFINITE_VANQUISHER = 18995
|
||||
};
|
||||
|
||||
enum Misc
|
||||
{
|
||||
SPELL_RIFT_CHANNEL = 31387,
|
||||
{
|
||||
SPELL_RIFT_CHANNEL = 31387,
|
||||
|
||||
EVENT_NEXT_PORTAL = 1,
|
||||
EVENT_SUMMON_KEEPER = 2,
|
||||
EVENT_NEXT_PORTAL = 1,
|
||||
EVENT_SUMMON_KEEPER = 2,
|
||||
|
||||
ACTION_OUTRO = 1
|
||||
ACTION_OUTRO = 1
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -7,25 +7,25 @@ REWRITTEN BY XINEF
|
||||
|
||||
enum DataTypes
|
||||
{
|
||||
TYPE_EAST_WING_PROGRESS = 0,
|
||||
TYPE_WEST_WING_PROGRESS = 1,
|
||||
TYPE_PYLONS_STATE = 2,
|
||||
TYPE_NORTH_WING_PROGRESS = 3,
|
||||
TYPE_NORTH_WING_BOSSES = 4,
|
||||
TYPE_EAST_WING_PROGRESS = 0,
|
||||
TYPE_WEST_WING_PROGRESS = 1,
|
||||
TYPE_PYLONS_STATE = 2,
|
||||
TYPE_NORTH_WING_PROGRESS = 3,
|
||||
TYPE_NORTH_WING_BOSSES = 4,
|
||||
|
||||
ALL_PYLONS_OFF = 0x1F
|
||||
ALL_PYLONS_OFF = 0x1F
|
||||
};
|
||||
|
||||
enum GoIds
|
||||
{
|
||||
GO_DIRE_MAUL_FORCE_FIELD = 179503,
|
||||
GO_GORDOK_TRIBUTE = 179564
|
||||
GO_DIRE_MAUL_FORCE_FIELD = 179503,
|
||||
GO_GORDOK_TRIBUTE = 179564
|
||||
};
|
||||
|
||||
enum NpcIds
|
||||
{
|
||||
NPC_IMMOL_THAR = 11496,
|
||||
NPC_HIGHBORNE_SUMMONER = 11466
|
||||
NPC_IMMOL_THAR = 11496,
|
||||
NPC_HIGHBORNE_SUMMONER = 11466
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -8,146 +8,146 @@ REWRITTEN BY XINEF
|
||||
|
||||
class instance_dire_maul : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_dire_maul() : InstanceMapScript("instance_dire_maul", 429) { }
|
||||
public:
|
||||
instance_dire_maul() : InstanceMapScript("instance_dire_maul", 429) { }
|
||||
|
||||
struct instance_dire_maul_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_dire_maul_InstanceMapScript(Map* map) : InstanceScript(map) { }
|
||||
struct instance_dire_maul_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_dire_maul_InstanceMapScript(Map* map) : InstanceScript(map) { }
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
_eastWingProgress = 0;
|
||||
_westWingProgress = 0;
|
||||
_pylonsState = 0;
|
||||
_northWingProgress = 0;
|
||||
_northWingBosses = 0;
|
||||
_immoltharGUID = 0;
|
||||
}
|
||||
void Initialize()
|
||||
{
|
||||
_eastWingProgress = 0;
|
||||
_westWingProgress = 0;
|
||||
_pylonsState = 0;
|
||||
_northWingProgress = 0;
|
||||
_northWingBosses = 0;
|
||||
_immoltharGUID = 0;
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_IMMOL_THAR:
|
||||
_immoltharGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_HIGHBORNE_SUMMONER:
|
||||
if (_pylonsState == ALL_PYLONS_OFF)
|
||||
creature->DespawnOrUnsummon(5000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_IMMOL_THAR:
|
||||
_immoltharGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_HIGHBORNE_SUMMONER:
|
||||
if (_pylonsState == ALL_PYLONS_OFF)
|
||||
creature->DespawnOrUnsummon(5000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* gameobject)
|
||||
{
|
||||
switch (gameobject->GetEntry())
|
||||
{
|
||||
case GO_DIRE_MAUL_FORCE_FIELD:
|
||||
if (_pylonsState == ALL_PYLONS_OFF)
|
||||
gameobject->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case GO_GORDOK_TRIBUTE:
|
||||
{
|
||||
uint32 fullLootMode = 0x3F;
|
||||
for (uint32 i = 0; i < _northWingBosses; ++i)
|
||||
fullLootMode >>= 1;
|
||||
void OnGameObjectCreate(GameObject* gameobject)
|
||||
{
|
||||
switch (gameobject->GetEntry())
|
||||
{
|
||||
case GO_DIRE_MAUL_FORCE_FIELD:
|
||||
if (_pylonsState == ALL_PYLONS_OFF)
|
||||
gameobject->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case GO_GORDOK_TRIBUTE:
|
||||
{
|
||||
uint32 fullLootMode = 0x3F;
|
||||
for (uint32 i = 0; i < _northWingBosses; ++i)
|
||||
fullLootMode >>= 1;
|
||||
|
||||
gameobject->SetLootMode(fullLootMode);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
gameobject->SetLootMode(fullLootMode);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_EAST_WING_PROGRESS:
|
||||
_eastWingProgress = data;
|
||||
instance->LoadGrid(-56.59f, -269.12f);
|
||||
break;
|
||||
case TYPE_WEST_WING_PROGRESS:
|
||||
_westWingProgress = data;
|
||||
instance->LoadGrid(132.626f, 625.913f);
|
||||
break;
|
||||
case TYPE_NORTH_WING_PROGRESS:
|
||||
_northWingProgress = data;
|
||||
break;
|
||||
case TYPE_NORTH_WING_BOSSES:
|
||||
_northWingBosses |= (1 << _northWingBosses);
|
||||
break;
|
||||
case TYPE_PYLONS_STATE:
|
||||
if (_pylonsState & data)
|
||||
return;
|
||||
_pylonsState |= data;
|
||||
if (_pylonsState == ALL_PYLONS_OFF) // all five active, 31
|
||||
{
|
||||
instance->LoadGrid(-38.08f, 812.44f);
|
||||
if (Creature* immol = instance->GetCreature(_immoltharGUID))
|
||||
{
|
||||
immol->setActive(true);
|
||||
immol->GetAI()->SetData(1, 1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_EAST_WING_PROGRESS:
|
||||
_eastWingProgress = data;
|
||||
instance->LoadGrid(-56.59f, -269.12f);
|
||||
break;
|
||||
case TYPE_WEST_WING_PROGRESS:
|
||||
_westWingProgress = data;
|
||||
instance->LoadGrid(132.626f, 625.913f);
|
||||
break;
|
||||
case TYPE_NORTH_WING_PROGRESS:
|
||||
_northWingProgress = data;
|
||||
break;
|
||||
case TYPE_NORTH_WING_BOSSES:
|
||||
_northWingBosses |= (1 << _northWingBosses);
|
||||
break;
|
||||
case TYPE_PYLONS_STATE:
|
||||
if (_pylonsState & data)
|
||||
return;
|
||||
_pylonsState |= data;
|
||||
if (_pylonsState == ALL_PYLONS_OFF) // all five active, 31
|
||||
{
|
||||
instance->LoadGrid(-38.08f, 812.44f);
|
||||
if (Creature* immol = instance->GetCreature(_immoltharGUID))
|
||||
{
|
||||
immol->setActive(true);
|
||||
immol->GetAI()->SetData(1, 1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
SaveToDB();
|
||||
}
|
||||
SaveToDB();
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type) const
|
||||
{
|
||||
if (type == TYPE_EAST_WING_PROGRESS)
|
||||
return _eastWingProgress;
|
||||
else if (type == TYPE_WEST_WING_PROGRESS)
|
||||
return _westWingProgress;
|
||||
else if (type == TYPE_NORTH_WING_PROGRESS)
|
||||
return _northWingProgress;
|
||||
uint32 GetData(uint32 type) const
|
||||
{
|
||||
if (type == TYPE_EAST_WING_PROGRESS)
|
||||
return _eastWingProgress;
|
||||
else if (type == TYPE_WEST_WING_PROGRESS)
|
||||
return _westWingProgress;
|
||||
else if (type == TYPE_NORTH_WING_PROGRESS)
|
||||
return _northWingProgress;
|
||||
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "D M " << _eastWingProgress << ' ' << _westWingProgress << ' ' << _pylonsState << ' ' << _northWingProgress << ' ' << _northWingBosses;
|
||||
return saveStream.str();
|
||||
}
|
||||
std::string GetSaveData()
|
||||
{
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "D M " << _eastWingProgress << ' ' << _westWingProgress << ' ' << _pylonsState << ' ' << _northWingProgress << ' ' << _northWingBosses;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(const char* in)
|
||||
{
|
||||
if (!in)
|
||||
return;
|
||||
void Load(const char* in)
|
||||
{
|
||||
if (!in)
|
||||
return;
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
std::istringstream loadStream(in);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
if (dataHead1 == 'D' && dataHead2 == 'M')
|
||||
{
|
||||
loadStream >> _eastWingProgress;
|
||||
loadStream >> _westWingProgress;
|
||||
loadStream >> _pylonsState;
|
||||
loadStream >> _northWingProgress;
|
||||
loadStream >> _northWingBosses;
|
||||
}
|
||||
}
|
||||
char dataHead1, dataHead2;
|
||||
std::istringstream loadStream(in);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
if (dataHead1 == 'D' && dataHead2 == 'M')
|
||||
{
|
||||
loadStream >> _eastWingProgress;
|
||||
loadStream >> _westWingProgress;
|
||||
loadStream >> _pylonsState;
|
||||
loadStream >> _northWingProgress;
|
||||
loadStream >> _northWingBosses;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
uint32 _eastWingProgress;
|
||||
uint32 _westWingProgress;
|
||||
uint32 _pylonsState;
|
||||
uint32 _northWingProgress;
|
||||
uint32 _northWingBosses;
|
||||
private:
|
||||
uint32 _eastWingProgress;
|
||||
uint32 _westWingProgress;
|
||||
uint32 _pylonsState;
|
||||
uint32 _northWingProgress;
|
||||
uint32 _northWingBosses;
|
||||
|
||||
uint64 _immoltharGUID;
|
||||
};
|
||||
uint64 _immoltharGUID;
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_dire_maul_InstanceMapScript(map);
|
||||
}
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_dire_maul_InstanceMapScript(map);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_dire_maul()
|
||||
|
||||
@@ -8,78 +8,78 @@ REWRITTEN BY XINEF
|
||||
|
||||
class instance_maraudon : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_maraudon() : InstanceMapScript("instance_maraudon", 349) { }
|
||||
public:
|
||||
instance_maraudon() : InstanceMapScript("instance_maraudon", 349) { }
|
||||
|
||||
struct instance_maraudon_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_maraudon_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
}
|
||||
struct instance_maraudon_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_maraudon_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
memset(&_encounters, 0, sizeof(_encounters));
|
||||
}
|
||||
void Initialize()
|
||||
{
|
||||
memset(&_encounters, 0, sizeof(_encounters));
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* gameobject)
|
||||
{
|
||||
switch (gameobject->GetEntry())
|
||||
{
|
||||
case GO_CORRUPTION_SPEWER:
|
||||
if (_encounters[TYPE_NOXXION] == DONE)
|
||||
HandleGameObject(0, true, gameobject);
|
||||
break;
|
||||
}
|
||||
}
|
||||
void OnGameObjectCreate(GameObject* gameobject)
|
||||
{
|
||||
switch (gameobject->GetEntry())
|
||||
{
|
||||
case GO_CORRUPTION_SPEWER:
|
||||
if (_encounters[TYPE_NOXXION] == DONE)
|
||||
HandleGameObject(0, true, gameobject);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_NOXXION:
|
||||
_encounters[type] = data;
|
||||
break;
|
||||
}
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_NOXXION:
|
||||
_encounters[type] = data;
|
||||
break;
|
||||
}
|
||||
|
||||
if (data == DONE)
|
||||
SaveToDB();
|
||||
}
|
||||
if (data == DONE)
|
||||
SaveToDB();
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "M A " << _encounters[0];
|
||||
return saveStream.str();
|
||||
}
|
||||
std::string GetSaveData()
|
||||
{
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "M A " << _encounters[0];
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(const char* in)
|
||||
{
|
||||
if (!in)
|
||||
return;
|
||||
void Load(const char* in)
|
||||
{
|
||||
if (!in)
|
||||
return;
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
std::istringstream loadStream(in);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
if (dataHead1 == 'M' && dataHead2 == 'A')
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
|
||||
{
|
||||
loadStream >> _encounters[i];
|
||||
if (_encounters[i] == IN_PROGRESS)
|
||||
_encounters[i] = NOT_STARTED;
|
||||
}
|
||||
}
|
||||
}
|
||||
char dataHead1, dataHead2;
|
||||
std::istringstream loadStream(in);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
if (dataHead1 == 'M' && dataHead2 == 'A')
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
|
||||
{
|
||||
loadStream >> _encounters[i];
|
||||
if (_encounters[i] == IN_PROGRESS)
|
||||
_encounters[i] = NOT_STARTED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
uint32 _encounters[MAX_ENCOUNTERS];
|
||||
};
|
||||
private:
|
||||
uint32 _encounters[MAX_ENCOUNTERS];
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_maraudon_InstanceMapScript(map);
|
||||
}
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_maraudon_InstanceMapScript(map);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_maraudon()
|
||||
|
||||
@@ -7,13 +7,13 @@ REWRITTEN BY XINEF
|
||||
|
||||
enum DataTypes
|
||||
{
|
||||
TYPE_NOXXION = 0,
|
||||
MAX_ENCOUNTERS = 1,
|
||||
TYPE_NOXXION = 0,
|
||||
MAX_ENCOUNTERS = 1,
|
||||
};
|
||||
|
||||
enum GoIds
|
||||
{
|
||||
GO_CORRUPTION_SPEWER = 178570
|
||||
GO_CORRUPTION_SPEWER = 178570
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -16,166 +16,166 @@ public:
|
||||
return new instance_onyxias_lair_InstanceMapScript(pMap);
|
||||
}
|
||||
|
||||
struct instance_onyxias_lair_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_onyxias_lair_InstanceMapScript(Map* pMap) : InstanceScript(pMap) {Initialize();};
|
||||
struct instance_onyxias_lair_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_onyxias_lair_InstanceMapScript(Map* pMap) : InstanceScript(pMap) {Initialize();};
|
||||
|
||||
uint64 m_uiOnyxiasGUID;
|
||||
uint32 m_auiEncounter[MAX_ENCOUNTER];
|
||||
std::string str_data;
|
||||
uint16 ManyWhelpsCounter;
|
||||
std::vector<uint64> minions;
|
||||
bool bDeepBreath;
|
||||
uint64 m_uiOnyxiasGUID;
|
||||
uint32 m_auiEncounter[MAX_ENCOUNTER];
|
||||
std::string str_data;
|
||||
uint16 ManyWhelpsCounter;
|
||||
std::vector<uint64> minions;
|
||||
bool bDeepBreath;
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
|
||||
m_uiOnyxiasGUID = 0;
|
||||
ManyWhelpsCounter = 0;
|
||||
bDeepBreath = true;
|
||||
}
|
||||
void Initialize()
|
||||
{
|
||||
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
|
||||
m_uiOnyxiasGUID = 0;
|
||||
ManyWhelpsCounter = 0;
|
||||
bDeepBreath = true;
|
||||
}
|
||||
|
||||
bool IsEncounterInProgress() const
|
||||
{
|
||||
for( uint8 i=0; i<MAX_ENCOUNTER; ++i )
|
||||
if( m_auiEncounter[i] == IN_PROGRESS )
|
||||
return true;
|
||||
bool IsEncounterInProgress() const
|
||||
{
|
||||
for( uint8 i=0; i<MAX_ENCOUNTER; ++i )
|
||||
if( m_auiEncounter[i] == IN_PROGRESS )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* pCreature)
|
||||
{
|
||||
switch( pCreature->GetEntry() )
|
||||
{
|
||||
case NPC_ONYXIA:
|
||||
m_uiOnyxiasGUID = pCreature->GetGUID();
|
||||
break;
|
||||
case NPC_ONYXIAN_WHELP:
|
||||
case NPC_ONYXIAN_LAIR_GUARD:
|
||||
minions.push_back(pCreature->GetGUID());
|
||||
break;
|
||||
}
|
||||
}
|
||||
void OnCreatureCreate(Creature* pCreature)
|
||||
{
|
||||
switch( pCreature->GetEntry() )
|
||||
{
|
||||
case NPC_ONYXIA:
|
||||
m_uiOnyxiasGUID = pCreature->GetGUID();
|
||||
break;
|
||||
case NPC_ONYXIAN_WHELP:
|
||||
case NPC_ONYXIAN_LAIR_GUARD:
|
||||
minions.push_back(pCreature->GetGUID());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch( go->GetEntry() )
|
||||
{
|
||||
case GO_WHELP_SPAWNER:
|
||||
go->CastSpell((Unit*)NULL, 17646);
|
||||
if( Creature* onyxia = instance->GetCreature(m_uiOnyxiasGUID) )
|
||||
onyxia->AI()->DoAction(-1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch( go->GetEntry() )
|
||||
{
|
||||
case GO_WHELP_SPAWNER:
|
||||
go->CastSpell((Unit*)NULL, 17646);
|
||||
if( Creature* onyxia = instance->GetCreature(m_uiOnyxiasGUID) )
|
||||
onyxia->AI()->DoAction(-1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 uiType, uint32 uiData)
|
||||
{
|
||||
switch(uiType)
|
||||
{
|
||||
case DATA_ONYXIA:
|
||||
m_auiEncounter[0] = uiData;
|
||||
ManyWhelpsCounter = 0;
|
||||
bDeepBreath = true;
|
||||
if( uiData == NOT_STARTED )
|
||||
{
|
||||
for( std::vector<uint64>::iterator itr = minions.begin(); itr != minions.end(); ++itr )
|
||||
if( Creature* c = instance->GetCreature(*itr) )
|
||||
c->DespawnOrUnsummon();
|
||||
minions.clear();
|
||||
}
|
||||
break;
|
||||
case DATA_WHELP_SUMMONED:
|
||||
++ManyWhelpsCounter;
|
||||
break;
|
||||
case DATA_DEEP_BREATH_FAILED:
|
||||
bDeepBreath = false;
|
||||
break;
|
||||
}
|
||||
void SetData(uint32 uiType, uint32 uiData)
|
||||
{
|
||||
switch(uiType)
|
||||
{
|
||||
case DATA_ONYXIA:
|
||||
m_auiEncounter[0] = uiData;
|
||||
ManyWhelpsCounter = 0;
|
||||
bDeepBreath = true;
|
||||
if( uiData == NOT_STARTED )
|
||||
{
|
||||
for( std::vector<uint64>::iterator itr = minions.begin(); itr != minions.end(); ++itr )
|
||||
if( Creature* c = instance->GetCreature(*itr) )
|
||||
c->DespawnOrUnsummon();
|
||||
minions.clear();
|
||||
}
|
||||
break;
|
||||
case DATA_WHELP_SUMMONED:
|
||||
++ManyWhelpsCounter;
|
||||
break;
|
||||
case DATA_DEEP_BREATH_FAILED:
|
||||
bDeepBreath = false;
|
||||
break;
|
||||
}
|
||||
|
||||
if (uiType < MAX_ENCOUNTER && uiData == DONE)
|
||||
SaveToDB();
|
||||
}
|
||||
if (uiType < MAX_ENCOUNTER && uiData == DONE)
|
||||
SaveToDB();
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 uiType) const
|
||||
{
|
||||
switch(uiType)
|
||||
{
|
||||
case DATA_ONYXIA:
|
||||
return m_auiEncounter[0];
|
||||
}
|
||||
uint32 GetData(uint32 uiType) const
|
||||
{
|
||||
switch(uiType)
|
||||
{
|
||||
case DATA_ONYXIA:
|
||||
return m_auiEncounter[0];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 uiData) const
|
||||
{
|
||||
switch(uiData)
|
||||
{
|
||||
case DATA_ONYXIA:
|
||||
return m_uiOnyxiasGUID;
|
||||
}
|
||||
uint64 GetData64(uint32 uiData) const
|
||||
{
|
||||
switch(uiData)
|
||||
{
|
||||
case DATA_ONYXIA:
|
||||
return m_uiOnyxiasGUID;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "O L " << m_auiEncounter[0];
|
||||
str_data = saveStream.str();
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return str_data;
|
||||
}
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "O L " << m_auiEncounter[0];
|
||||
str_data = saveStream.str();
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return str_data;
|
||||
}
|
||||
|
||||
void Load(const char* in)
|
||||
{
|
||||
if( !in )
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
void Load(const char* in)
|
||||
{
|
||||
if( !in )
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(in);
|
||||
OUT_LOAD_INST_DATA(in);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
uint16 data0;
|
||||
std::istringstream loadStream(in);
|
||||
loadStream >> dataHead1 >> dataHead2 >> data0;
|
||||
char dataHead1, dataHead2;
|
||||
uint16 data0;
|
||||
std::istringstream loadStream(in);
|
||||
loadStream >> dataHead1 >> dataHead2 >> data0;
|
||||
|
||||
if( dataHead1 == 'O' && dataHead2 == 'L' )
|
||||
{
|
||||
m_auiEncounter[0] = data0;
|
||||
if( dataHead1 == 'O' && dataHead2 == 'L' )
|
||||
{
|
||||
m_auiEncounter[0] = data0;
|
||||
|
||||
for( uint8 i = 0; i < MAX_ENCOUNTER; ++i )
|
||||
if( m_auiEncounter[i] == IN_PROGRESS )
|
||||
m_auiEncounter[i] = NOT_STARTED;
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
for( uint8 i = 0; i < MAX_ENCOUNTER; ++i )
|
||||
if( m_auiEncounter[i] == IN_PROGRESS )
|
||||
m_auiEncounter[i] = NOT_STARTED;
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* source, Unit const* target = NULL, uint32 miscvalue1 = 0)
|
||||
{
|
||||
switch(criteria_id)
|
||||
{
|
||||
case ACHIEV_CRITERIA_MANY_WHELPS_10_PLAYER:
|
||||
case ACHIEV_CRITERIA_MANY_WHELPS_25_PLAYER:
|
||||
return ManyWhelpsCounter>=50;
|
||||
case ACHIEV_CRITERIA_DEEP_BREATH_10_PLAYER:
|
||||
case ACHIEV_CRITERIA_DEEP_BREATH_25_PLAYER:
|
||||
return bDeepBreath;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* source, Unit const* target = NULL, uint32 miscvalue1 = 0)
|
||||
{
|
||||
switch(criteria_id)
|
||||
{
|
||||
case ACHIEV_CRITERIA_MANY_WHELPS_10_PLAYER:
|
||||
case ACHIEV_CRITERIA_MANY_WHELPS_25_PLAYER:
|
||||
return ManyWhelpsCounter>=50;
|
||||
case ACHIEV_CRITERIA_DEEP_BREATH_10_PLAYER:
|
||||
case ACHIEV_CRITERIA_DEEP_BREATH_25_PLAYER:
|
||||
return bDeepBreath;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
void AddSC_instance_onyxias_lair()
|
||||
{
|
||||
new instance_onyxias_lair();
|
||||
new instance_onyxias_lair();
|
||||
}
|
||||
@@ -7,23 +7,23 @@ REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
|
||||
|
||||
enum eInstanceData
|
||||
{
|
||||
DATA_ONYXIA = 0,
|
||||
MAX_ENCOUNTER = 1,
|
||||
DATA_WHELP_SUMMONED,
|
||||
DATA_DEEP_BREATH_FAILED,
|
||||
DATA_ONYXIA = 0,
|
||||
MAX_ENCOUNTER = 1,
|
||||
DATA_WHELP_SUMMONED,
|
||||
DATA_DEEP_BREATH_FAILED,
|
||||
};
|
||||
|
||||
enum eCreatures
|
||||
{
|
||||
NPC_ONYXIA = 10184,
|
||||
NPC_ONYXIAN_WHELP = 11262,
|
||||
NPC_ONYXIAN_LAIR_GUARD = 36561,
|
||||
NPC_ONYXIA = 10184,
|
||||
NPC_ONYXIAN_WHELP = 11262,
|
||||
NPC_ONYXIAN_LAIR_GUARD = 36561,
|
||||
};
|
||||
|
||||
enum eGameObjects
|
||||
{
|
||||
GO_WHELP_SPAWNER = 176510,
|
||||
GO_WHELP_EGG = 176511
|
||||
GO_WHELP_SPAWNER = 176510,
|
||||
GO_WHELP_EGG = 176511
|
||||
};
|
||||
|
||||
enum eAchievementData
|
||||
|
||||
@@ -7,18 +7,18 @@ REWRITTEN BY XINEF
|
||||
|
||||
class instance_ragefire_chasm : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_ragefire_chasm() : InstanceMapScript("instance_ragefire_chasm", 389) { }
|
||||
public:
|
||||
instance_ragefire_chasm() : InstanceMapScript("instance_ragefire_chasm", 389) { }
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_ragefire_chasm_InstanceMapScript(map);
|
||||
}
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_ragefire_chasm_InstanceMapScript(map);
|
||||
}
|
||||
|
||||
struct instance_ragefire_chasm_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_ragefire_chasm_InstanceMapScript(Map* map) : InstanceScript(map) { }
|
||||
};
|
||||
struct instance_ragefire_chasm_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_ragefire_chasm_InstanceMapScript(Map* map) : InstanceScript(map) { }
|
||||
};
|
||||
};
|
||||
|
||||
void AddSC_instance_ragefire_chasm()
|
||||
|
||||
@@ -9,86 +9,86 @@ REWRITTEN BY XINEF
|
||||
|
||||
class instance_razorfen_downs : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_razorfen_downs() : InstanceMapScript("instance_razorfen_downs", 129) { }
|
||||
public:
|
||||
instance_razorfen_downs() : InstanceMapScript("instance_razorfen_downs", 129) { }
|
||||
|
||||
struct instance_razorfen_downs_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_razorfen_downs_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
}
|
||||
struct instance_razorfen_downs_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_razorfen_downs_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
_gongPhase = 0;
|
||||
_firesState = 0;
|
||||
}
|
||||
void Initialize()
|
||||
{
|
||||
_gongPhase = 0;
|
||||
_firesState = 0;
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* gameobject)
|
||||
{
|
||||
switch (gameobject->GetEntry())
|
||||
{
|
||||
case GO_IDOL_OVEN_FIRE:
|
||||
case GO_IDOL_CUP_FIRE:
|
||||
case GO_IDOL_MOUTH_FIRE:
|
||||
if (_firesState == DONE)
|
||||
gameobject->Delete();
|
||||
break;
|
||||
case GO_GONG:
|
||||
if (_gongPhase == DONE)
|
||||
gameobject->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
void OnGameObjectCreate(GameObject* gameobject)
|
||||
{
|
||||
switch (gameobject->GetEntry())
|
||||
{
|
||||
case GO_IDOL_OVEN_FIRE:
|
||||
case GO_IDOL_CUP_FIRE:
|
||||
case GO_IDOL_MOUTH_FIRE:
|
||||
if (_firesState == DONE)
|
||||
gameobject->Delete();
|
||||
break;
|
||||
case GO_GONG:
|
||||
if (_gongPhase == DONE)
|
||||
gameobject->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type) const
|
||||
{
|
||||
if (type == GO_GONG)
|
||||
return _gongPhase;
|
||||
return 0;
|
||||
}
|
||||
uint32 GetData(uint32 type) const
|
||||
{
|
||||
if (type == GO_GONG)
|
||||
return _gongPhase;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
if (type == GO_GONG)
|
||||
_gongPhase = data;
|
||||
else if (type == GO_BELNISTRASZS_BRAZIER)
|
||||
_firesState = DONE;
|
||||
SaveToDB();
|
||||
}
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
if (type == GO_GONG)
|
||||
_gongPhase = data;
|
||||
else if (type == GO_BELNISTRASZS_BRAZIER)
|
||||
_firesState = DONE;
|
||||
SaveToDB();
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "R D " << _gongPhase << ' ' << _firesState;
|
||||
return saveStream.str();
|
||||
}
|
||||
std::string GetSaveData()
|
||||
{
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "R D " << _gongPhase << ' ' << _firesState;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(const char* str)
|
||||
{
|
||||
if (!str)
|
||||
return;
|
||||
void Load(const char* str)
|
||||
{
|
||||
if (!str)
|
||||
return;
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
std::istringstream loadStream(str);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
char dataHead1, dataHead2;
|
||||
std::istringstream loadStream(str);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'R' && dataHead2 == 'D')
|
||||
{
|
||||
loadStream >> _gongPhase;
|
||||
loadStream >> _firesState;
|
||||
}
|
||||
}
|
||||
if (dataHead1 == 'R' && dataHead2 == 'D')
|
||||
{
|
||||
loadStream >> _gongPhase;
|
||||
loadStream >> _firesState;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
uint32 _gongPhase;
|
||||
uint32 _firesState;
|
||||
};
|
||||
private:
|
||||
uint32 _gongPhase;
|
||||
uint32 _firesState;
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_razorfen_downs_InstanceMapScript(map);
|
||||
}
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_razorfen_downs_InstanceMapScript(map);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_razorfen_downs()
|
||||
|
||||
@@ -57,212 +57,212 @@ enum Belnistrasz
|
||||
|
||||
class npc_belnistrasz : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_belnistrasz() : CreatureScript("npc_belnistrasz") { }
|
||||
public:
|
||||
npc_belnistrasz() : CreatureScript("npc_belnistrasz") { }
|
||||
|
||||
struct npc_belnistraszAI : public ScriptedAI
|
||||
{
|
||||
npc_belnistraszAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
eventInProgress = false;
|
||||
spawnerCount = 0;
|
||||
}
|
||||
struct npc_belnistraszAI : public ScriptedAI
|
||||
{
|
||||
npc_belnistraszAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
eventInProgress = false;
|
||||
spawnerCount = 0;
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
if (!eventInProgress)
|
||||
{
|
||||
if (!me->HasAura(SPELL_ARCANE_INTELLECT))
|
||||
DoCast(me, SPELL_ARCANE_INTELLECT);
|
||||
void Reset()
|
||||
{
|
||||
if (!eventInProgress)
|
||||
{
|
||||
if (!me->HasAura(SPELL_ARCANE_INTELLECT))
|
||||
DoCast(me, SPELL_ARCANE_INTELLECT);
|
||||
|
||||
channeling = false;
|
||||
eventProgress = 0;
|
||||
spawnerCount = 0;
|
||||
me->SetFlag(UNIT_NPC_FLAGS, GOSSIP_OPTION_QUESTGIVER);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
}
|
||||
}
|
||||
channeling = false;
|
||||
eventProgress = 0;
|
||||
spawnerCount = 0;
|
||||
me->SetFlag(UNIT_NPC_FLAGS, GOSSIP_OPTION_QUESTGIVER);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
if (channeling)
|
||||
Talk(SAY_WATCH_OUT, who);
|
||||
else
|
||||
{
|
||||
events.ScheduleEvent(EVENT_FIREBALL, 1000);
|
||||
events.ScheduleEvent(EVENT_FROST_NOVA, urand(8000, 12000));
|
||||
if (urand(0, 100) > 40)
|
||||
Talk(SAY_AGGRO, who);
|
||||
}
|
||||
}
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
if (channeling)
|
||||
Talk(SAY_WATCH_OUT, who);
|
||||
else
|
||||
{
|
||||
events.ScheduleEvent(EVENT_FIREBALL, 1000);
|
||||
events.ScheduleEvent(EVENT_FROST_NOVA, urand(8000, 12000));
|
||||
if (urand(0, 100) > 40)
|
||||
Talk(SAY_AGGRO, who);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
me->DespawnOrUnsummon(5000);
|
||||
}
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
me->DespawnOrUnsummon(5000);
|
||||
}
|
||||
|
||||
void sQuestAccept(Player* /*player*/, Quest const* quest)
|
||||
{
|
||||
if (quest->GetQuestId() == QUEST_EXTINGUISHING_THE_IDOL)
|
||||
{
|
||||
eventInProgress = true;
|
||||
Talk(SAY_QUEST_ACCEPTED);
|
||||
me->RemoveFlag(UNIT_NPC_FLAGS, GOSSIP_OPTION_QUESTGIVER);
|
||||
me->setFaction(FACTION_ESCORT);
|
||||
me->GetMotionMaster()->MovePath(PATH_ESCORT, false);
|
||||
}
|
||||
}
|
||||
void sQuestAccept(Player* /*player*/, Quest const* quest)
|
||||
{
|
||||
if (quest->GetQuestId() == QUEST_EXTINGUISHING_THE_IDOL)
|
||||
{
|
||||
eventInProgress = true;
|
||||
Talk(SAY_QUEST_ACCEPTED);
|
||||
me->RemoveFlag(UNIT_NPC_FLAGS, GOSSIP_OPTION_QUESTGIVER);
|
||||
me->setFaction(FACTION_ESCORT);
|
||||
me->GetMotionMaster()->MovePath(PATH_ESCORT, false);
|
||||
}
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if (type == WAYPOINT_MOTION_TYPE && id == POINT_REACH_IDOL)
|
||||
{
|
||||
channeling = true;
|
||||
events.ScheduleEvent(EVENT_CHANNEL, 2000);
|
||||
}
|
||||
}
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if (type == WAYPOINT_MOTION_TYPE && id == POINT_REACH_IDOL)
|
||||
{
|
||||
channeling = true;
|
||||
events.ScheduleEvent(EVENT_CHANNEL, 2000);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!eventInProgress)
|
||||
return;
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!eventInProgress)
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_CHANNEL:
|
||||
Talk(SAY_EVENT_START);
|
||||
DoCast(me, SPELL_IDOL_SHUTDOWN_VISUAL);
|
||||
events.ScheduleEvent(EVENT_IDOL_ROOM_SPAWNER, 100);
|
||||
events.ScheduleEvent(EVENT_PROGRESS, 120000);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
break;
|
||||
case EVENT_IDOL_ROOM_SPAWNER:
|
||||
if (Creature* creature = me->SummonCreature(NPC_IDOL_ROOM_SPAWNER, PosSummonSpawner[urand(0,2)], TEMPSUMMON_TIMED_DESPAWN, 4000))
|
||||
creature->AI()->SetData(0,spawnerCount);
|
||||
if (++spawnerCount < 8)
|
||||
events.ScheduleEvent(EVENT_IDOL_ROOM_SPAWNER, 35000);
|
||||
break;
|
||||
case EVENT_PROGRESS:
|
||||
{
|
||||
switch (eventProgress)
|
||||
{
|
||||
case 0:
|
||||
Talk(SAY_EVENT_THREE_MIN_LEFT);
|
||||
++eventProgress;
|
||||
events.ScheduleEvent(EVENT_PROGRESS, 60000);
|
||||
break;
|
||||
case 1:
|
||||
Talk(SAY_EVENT_TWO_MIN_LEFT);
|
||||
++eventProgress;
|
||||
events.ScheduleEvent(EVENT_PROGRESS, 60000);
|
||||
break;
|
||||
case 2:
|
||||
Talk(SAY_EVENT_ONE_MIN_LEFT);
|
||||
++eventProgress;
|
||||
events.ScheduleEvent(EVENT_PROGRESS, 60000);
|
||||
break;
|
||||
case 3:
|
||||
events.CancelEvent(EVENT_IDOL_ROOM_SPAWNER);
|
||||
me->InterruptSpell(CURRENT_CHANNELED_SPELL);
|
||||
Talk(SAY_EVENT_END);
|
||||
events.ScheduleEvent(EVENT_COMPLETE, 3000);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case EVENT_COMPLETE:
|
||||
{
|
||||
DoCast(me, SPELL_IDOM_ROOM_CAMERA_SHAKE);
|
||||
me->SummonGameObject(GO_BELNISTRASZS_BRAZIER, 2577.196f, 947.0781f, 53.16757f, 2.356195f, 0, 0, 0.9238796f, 0.3826832f, 3600);
|
||||
std::list<WorldObject*> ClusterList;
|
||||
Trinity::AllWorldObjectsInRange objects(me, 50.0f);
|
||||
Trinity::WorldObjectListSearcher<Trinity::AllWorldObjectsInRange> searcher(me, ClusterList, objects);
|
||||
me->VisitNearbyObject(50.0f, searcher);
|
||||
for (std::list<WorldObject*>::const_iterator itr = ClusterList.begin(); itr != ClusterList.end(); ++itr)
|
||||
{
|
||||
if (Player* player = (*itr)->ToPlayer())
|
||||
{
|
||||
if (player->GetQuestStatus(QUEST_EXTINGUISHING_THE_IDOL) == QUEST_STATUS_INCOMPLETE)
|
||||
player->CompleteQuest(QUEST_EXTINGUISHING_THE_IDOL);
|
||||
}
|
||||
else if (GameObject* go = (*itr)->ToGameObject())
|
||||
{
|
||||
if (go->GetEntry() == GO_IDOL_OVEN_FIRE || go->GetEntry() == GO_IDOL_CUP_FIRE || go->GetEntry() == GO_IDOL_MOUTH_FIRE)
|
||||
go->Delete();
|
||||
}
|
||||
}
|
||||
instance->SetData(GO_BELNISTRASZS_BRAZIER, DONE);
|
||||
me->DespawnOrUnsummon();
|
||||
break;
|
||||
}
|
||||
case EVENT_FIREBALL:
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING) || !UpdateVictim())
|
||||
return;
|
||||
DoCastVictim(SPELL_FIREBALL);
|
||||
events.ScheduleEvent(EVENT_FIREBALL, 8000);
|
||||
break;
|
||||
case EVENT_FROST_NOVA:
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING) || !UpdateVictim())
|
||||
return;
|
||||
DoCast(me, SPELL_FROST_NOVA);
|
||||
events.ScheduleEvent(EVENT_FROST_NOVA, 15000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!channeling)
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_CHANNEL:
|
||||
Talk(SAY_EVENT_START);
|
||||
DoCast(me, SPELL_IDOL_SHUTDOWN_VISUAL);
|
||||
events.ScheduleEvent(EVENT_IDOL_ROOM_SPAWNER, 100);
|
||||
events.ScheduleEvent(EVENT_PROGRESS, 120000);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
break;
|
||||
case EVENT_IDOL_ROOM_SPAWNER:
|
||||
if (Creature* creature = me->SummonCreature(NPC_IDOL_ROOM_SPAWNER, PosSummonSpawner[urand(0,2)], TEMPSUMMON_TIMED_DESPAWN, 4000))
|
||||
creature->AI()->SetData(0,spawnerCount);
|
||||
if (++spawnerCount < 8)
|
||||
events.ScheduleEvent(EVENT_IDOL_ROOM_SPAWNER, 35000);
|
||||
break;
|
||||
case EVENT_PROGRESS:
|
||||
{
|
||||
switch (eventProgress)
|
||||
{
|
||||
case 0:
|
||||
Talk(SAY_EVENT_THREE_MIN_LEFT);
|
||||
++eventProgress;
|
||||
events.ScheduleEvent(EVENT_PROGRESS, 60000);
|
||||
break;
|
||||
case 1:
|
||||
Talk(SAY_EVENT_TWO_MIN_LEFT);
|
||||
++eventProgress;
|
||||
events.ScheduleEvent(EVENT_PROGRESS, 60000);
|
||||
break;
|
||||
case 2:
|
||||
Talk(SAY_EVENT_ONE_MIN_LEFT);
|
||||
++eventProgress;
|
||||
events.ScheduleEvent(EVENT_PROGRESS, 60000);
|
||||
break;
|
||||
case 3:
|
||||
events.CancelEvent(EVENT_IDOL_ROOM_SPAWNER);
|
||||
me->InterruptSpell(CURRENT_CHANNELED_SPELL);
|
||||
Talk(SAY_EVENT_END);
|
||||
events.ScheduleEvent(EVENT_COMPLETE, 3000);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case EVENT_COMPLETE:
|
||||
{
|
||||
DoCast(me, SPELL_IDOM_ROOM_CAMERA_SHAKE);
|
||||
me->SummonGameObject(GO_BELNISTRASZS_BRAZIER, 2577.196f, 947.0781f, 53.16757f, 2.356195f, 0, 0, 0.9238796f, 0.3826832f, 3600);
|
||||
std::list<WorldObject*> ClusterList;
|
||||
Trinity::AllWorldObjectsInRange objects(me, 50.0f);
|
||||
Trinity::WorldObjectListSearcher<Trinity::AllWorldObjectsInRange> searcher(me, ClusterList, objects);
|
||||
me->VisitNearbyObject(50.0f, searcher);
|
||||
for (std::list<WorldObject*>::const_iterator itr = ClusterList.begin(); itr != ClusterList.end(); ++itr)
|
||||
{
|
||||
if (Player* player = (*itr)->ToPlayer())
|
||||
{
|
||||
if (player->GetQuestStatus(QUEST_EXTINGUISHING_THE_IDOL) == QUEST_STATUS_INCOMPLETE)
|
||||
player->CompleteQuest(QUEST_EXTINGUISHING_THE_IDOL);
|
||||
}
|
||||
else if (GameObject* go = (*itr)->ToGameObject())
|
||||
{
|
||||
if (go->GetEntry() == GO_IDOL_OVEN_FIRE || go->GetEntry() == GO_IDOL_CUP_FIRE || go->GetEntry() == GO_IDOL_MOUTH_FIRE)
|
||||
go->Delete();
|
||||
}
|
||||
}
|
||||
instance->SetData(GO_BELNISTRASZS_BRAZIER, DONE);
|
||||
me->DespawnOrUnsummon();
|
||||
break;
|
||||
}
|
||||
case EVENT_FIREBALL:
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING) || !UpdateVictim())
|
||||
return;
|
||||
DoCastVictim(SPELL_FIREBALL);
|
||||
events.ScheduleEvent(EVENT_FIREBALL, 8000);
|
||||
break;
|
||||
case EVENT_FROST_NOVA:
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING) || !UpdateVictim())
|
||||
return;
|
||||
DoCast(me, SPELL_FROST_NOVA);
|
||||
events.ScheduleEvent(EVENT_FROST_NOVA, 15000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!channeling)
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
InstanceScript* instance;
|
||||
EventMap events;
|
||||
bool eventInProgress;
|
||||
bool channeling;
|
||||
uint8 eventProgress;
|
||||
uint8 spawnerCount;
|
||||
};
|
||||
private:
|
||||
InstanceScript* instance;
|
||||
EventMap events;
|
||||
bool eventInProgress;
|
||||
bool channeling;
|
||||
uint8 eventProgress;
|
||||
uint8 spawnerCount;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<npc_belnistraszAI>(creature);
|
||||
}
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<npc_belnistraszAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class npc_idol_room_spawner : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_idol_room_spawner() : CreatureScript("npc_idol_room_spawner") { }
|
||||
public:
|
||||
npc_idol_room_spawner() : CreatureScript("npc_idol_room_spawner") { }
|
||||
|
||||
struct npc_idol_room_spawnerAI : public NullCreatureAI
|
||||
{
|
||||
npc_idol_room_spawnerAI(Creature* creature) : NullCreatureAI(creature)
|
||||
{
|
||||
}
|
||||
struct npc_idol_room_spawnerAI : public NullCreatureAI
|
||||
{
|
||||
npc_idol_room_spawnerAI(Creature* creature) : NullCreatureAI(creature)
|
||||
{
|
||||
}
|
||||
|
||||
void SetData(uint32 /*type*/, uint32 data)
|
||||
{
|
||||
if (data < 7)
|
||||
{
|
||||
me->SummonCreature(NPC_WITHERED_BATTLE_BOAR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
|
||||
if (data > 0 && me->GetOrientation() < 4.0f)
|
||||
me->SummonCreature(NPC_WITHERED_BATTLE_BOAR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
|
||||
me->SummonCreature(NPC_DEATHS_HEAD_GEOMANCER, me->GetPositionX() + (cos(me->GetOrientation() - (M_PI/2)) * 2), me->GetPositionY() + (sin(me->GetOrientation() - (M_PI/2)) * 2), me->GetPositionZ(), me->GetOrientation());
|
||||
me->SummonCreature(NPC_WITHERED_QUILGUARD, me->GetPositionX() + (cos(me->GetOrientation() + (M_PI/2)) * 2), me->GetPositionY() + (sin(me->GetOrientation() + (M_PI/2)) * 2), me->GetPositionZ(), me->GetOrientation());
|
||||
}
|
||||
else if (data == 7)
|
||||
me->SummonCreature(NPC_PLAGUEMAW_THE_ROTTING, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
|
||||
}
|
||||
};
|
||||
void SetData(uint32 /*type*/, uint32 data)
|
||||
{
|
||||
if (data < 7)
|
||||
{
|
||||
me->SummonCreature(NPC_WITHERED_BATTLE_BOAR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
|
||||
if (data > 0 && me->GetOrientation() < 4.0f)
|
||||
me->SummonCreature(NPC_WITHERED_BATTLE_BOAR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
|
||||
me->SummonCreature(NPC_DEATHS_HEAD_GEOMANCER, me->GetPositionX() + (cos(me->GetOrientation() - (M_PI/2)) * 2), me->GetPositionY() + (sin(me->GetOrientation() - (M_PI/2)) * 2), me->GetPositionZ(), me->GetOrientation());
|
||||
me->SummonCreature(NPC_WITHERED_QUILGUARD, me->GetPositionX() + (cos(me->GetOrientation() + (M_PI/2)) * 2), me->GetPositionY() + (sin(me->GetOrientation() + (M_PI/2)) * 2), me->GetPositionZ(), me->GetOrientation());
|
||||
}
|
||||
else if (data == 7)
|
||||
me->SummonCreature(NPC_PLAGUEMAW_THE_ROTTING, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<npc_idol_room_spawnerAI>(creature);
|
||||
}
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<npc_idol_room_spawnerAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_razorfen_downs()
|
||||
|
||||
@@ -7,18 +7,18 @@ REWRITTEN BY XINEF
|
||||
|
||||
class instance_razorfen_kraul : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_razorfen_kraul() : InstanceMapScript("instance_razorfen_kraul", 47) { }
|
||||
public:
|
||||
instance_razorfen_kraul() : InstanceMapScript("instance_razorfen_kraul", 47) { }
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_razorfen_kraul_InstanceMapScript(map);
|
||||
}
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_razorfen_kraul_InstanceMapScript(map);
|
||||
}
|
||||
|
||||
struct instance_razorfen_kraul_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_razorfen_kraul_InstanceMapScript(Map* map) : InstanceScript(map) { }
|
||||
};
|
||||
struct instance_razorfen_kraul_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_razorfen_kraul_InstanceMapScript(Map* map) : InstanceScript(map) { }
|
||||
};
|
||||
};
|
||||
|
||||
void AddSC_instance_razorfen_kraul()
|
||||
|
||||
@@ -99,7 +99,7 @@ class boss_buru : public CreatureScript
|
||||
{
|
||||
if (action == ACTION_EXPLODE)
|
||||
if (_phase == PHASE_EGG)
|
||||
Unit::DealDamage(me, me, 45000);
|
||||
Unit::DealDamage(me, me, 45000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
@@ -258,7 +258,7 @@ class spell_egg_explosion : public SpellScriptLoader
|
||||
void HandleDummyHitTarget(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Unit* target = GetHitUnit())
|
||||
Unit::DealDamage(GetCaster(), target, -16 * GetCaster()->GetDistance(target) + 500);
|
||||
Unit::DealDamage(GetCaster(), target, -16 * GetCaster()->GetDistance(target) + 500);
|
||||
}
|
||||
|
||||
void Register()
|
||||
|
||||
@@ -319,7 +319,7 @@ public:
|
||||
//Freeze animation
|
||||
DoCast(me, SPELL_FREEZE_ANIM);
|
||||
me->StopMoving();
|
||||
me->SetFacingTo(DarkGlareAngle);
|
||||
me->SetFacingTo(DarkGlareAngle);
|
||||
me->SetOrientation(DarkGlareAngle);
|
||||
|
||||
//Darkbeam for 35 seconds
|
||||
@@ -337,15 +337,15 @@ public:
|
||||
|
||||
//Set angle and cast
|
||||
if (ClockWise)
|
||||
{
|
||||
me->SetFacingTo(DarkGlareAngle + DarkGlareTick * M_PI / 35);
|
||||
{
|
||||
me->SetFacingTo(DarkGlareAngle + DarkGlareTick * M_PI / 35);
|
||||
me->SetOrientation(DarkGlareAngle + DarkGlareTick * M_PI / 35);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
me->SetFacingTo(DarkGlareAngle - DarkGlareTick * M_PI / 35);
|
||||
{
|
||||
me->SetFacingTo(DarkGlareAngle - DarkGlareTick * M_PI / 35);
|
||||
me->SetOrientation(DarkGlareAngle - DarkGlareTick * M_PI / 35);
|
||||
}
|
||||
}
|
||||
|
||||
//Actual dark glare cast, maybe something missing here?
|
||||
DoCast(me, SPELL_DARK_GLARE, false);
|
||||
@@ -922,7 +922,7 @@ public:
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
if (Unit* p = ObjectAccessor::GetUnit(*me, Portal))
|
||||
Unit::Kill(p, p);
|
||||
Unit::Kill(p, p);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
@@ -948,7 +948,7 @@ public:
|
||||
//KillSelfTimer
|
||||
if (KillSelfTimer <= diff)
|
||||
{
|
||||
Unit::Kill(me, me);
|
||||
Unit::Kill(me, me);
|
||||
return;
|
||||
} else KillSelfTimer -= diff;
|
||||
|
||||
|
||||
@@ -272,7 +272,7 @@ class npc_glob_of_viscidus : public CreatureScript
|
||||
if (Viscidus->IsAlive() && Viscidus->GetHealthPct() < 5.0f)
|
||||
{
|
||||
Viscidus->SetVisible(true);
|
||||
Unit::Kill(Viscidus->GetVictim(), Viscidus);
|
||||
Unit::Kill(Viscidus->GetVictim(), Viscidus);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -8,110 +8,110 @@ REWRITTEN BY XINEF
|
||||
|
||||
class instance_wailing_caverns : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_wailing_caverns() : InstanceMapScript("instance_wailing_caverns", 43) { }
|
||||
public:
|
||||
instance_wailing_caverns() : InstanceMapScript("instance_wailing_caverns", 43) { }
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_wailing_caverns_InstanceMapScript(map);
|
||||
}
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_wailing_caverns_InstanceMapScript(map);
|
||||
}
|
||||
|
||||
struct instance_wailing_caverns_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_wailing_caverns_InstanceMapScript(Map* map) : InstanceScript(map) { }
|
||||
struct instance_wailing_caverns_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_wailing_caverns_InstanceMapScript(Map* map) : InstanceScript(map) { }
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
memset(&_encounters, 0, sizeof(_encounters));
|
||||
void Initialize()
|
||||
{
|
||||
memset(&_encounters, 0, sizeof(_encounters));
|
||||
|
||||
DiscipleOfNaralexGUID = 0;
|
||||
SerpentisGUID = 0;
|
||||
}
|
||||
DiscipleOfNaralexGUID = 0;
|
||||
SerpentisGUID = 0;
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
if (creature->GetEntry() == NPC_DISCIPLE_OF_NARALEX)
|
||||
DiscipleOfNaralexGUID = creature->GetGUID();
|
||||
else if (creature->GetEntry() == NPC_LORD_SERPENTIS)
|
||||
SerpentisGUID = creature->GetGUID();
|
||||
}
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
if (creature->GetEntry() == NPC_DISCIPLE_OF_NARALEX)
|
||||
DiscipleOfNaralexGUID = creature->GetGUID();
|
||||
else if (creature->GetEntry() == NPC_LORD_SERPENTIS)
|
||||
SerpentisGUID = creature->GetGUID();
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_LORD_COBRAHN:
|
||||
case TYPE_LORD_PYTHAS:
|
||||
case TYPE_LADY_ANACONDRA:
|
||||
case TYPE_LORD_SERPENTIS:
|
||||
case TYPE_MUTANUS:
|
||||
_encounters[type] = data;
|
||||
break;
|
||||
}
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_LORD_COBRAHN:
|
||||
case TYPE_LORD_PYTHAS:
|
||||
case TYPE_LADY_ANACONDRA:
|
||||
case TYPE_LORD_SERPENTIS:
|
||||
case TYPE_MUTANUS:
|
||||
_encounters[type] = data;
|
||||
break;
|
||||
}
|
||||
|
||||
if (data == DONE)
|
||||
SaveToDB();
|
||||
if (data == DONE)
|
||||
SaveToDB();
|
||||
|
||||
if (type == TYPE_LORD_COBRAHN && _encounters[TYPE_LORD_SERPENTIS] != DONE)
|
||||
{
|
||||
instance->LoadGrid(-120.163f, -24.624f);
|
||||
if (Creature* serpentis = instance->GetCreature(SerpentisGUID))
|
||||
serpentis->AI()->Talk(SAY_SERPENTIS);
|
||||
}
|
||||
if (type == TYPE_LORD_COBRAHN && _encounters[TYPE_LORD_SERPENTIS] != DONE)
|
||||
{
|
||||
instance->LoadGrid(-120.163f, -24.624f);
|
||||
if (Creature* serpentis = instance->GetCreature(SerpentisGUID))
|
||||
serpentis->AI()->Talk(SAY_SERPENTIS);
|
||||
}
|
||||
|
||||
if (type != TYPE_MUTANUS && _encounters[TYPE_LORD_COBRAHN] == DONE && _encounters[TYPE_LORD_PYTHAS] == DONE &&
|
||||
_encounters[TYPE_LADY_ANACONDRA] == DONE && _encounters[TYPE_LORD_SERPENTIS] == DONE)
|
||||
{
|
||||
instance->LoadGrid(-134.97f, 125.402f);
|
||||
if (Creature* disciple = instance->GetCreature(DiscipleOfNaralexGUID))
|
||||
disciple->AI()->Talk(SAY_DISCIPLE);
|
||||
}
|
||||
}
|
||||
if (type != TYPE_MUTANUS && _encounters[TYPE_LORD_COBRAHN] == DONE && _encounters[TYPE_LORD_PYTHAS] == DONE &&
|
||||
_encounters[TYPE_LADY_ANACONDRA] == DONE && _encounters[TYPE_LORD_SERPENTIS] == DONE)
|
||||
{
|
||||
instance->LoadGrid(-134.97f, 125.402f);
|
||||
if (Creature* disciple = instance->GetCreature(DiscipleOfNaralexGUID))
|
||||
disciple->AI()->Talk(SAY_DISCIPLE);
|
||||
}
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type) const
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_LORD_COBRAHN:
|
||||
case TYPE_LORD_PYTHAS:
|
||||
case TYPE_LADY_ANACONDRA:
|
||||
case TYPE_LORD_SERPENTIS:
|
||||
return _encounters[type];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
uint32 GetData(uint32 type) const
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_LORD_COBRAHN:
|
||||
case TYPE_LORD_PYTHAS:
|
||||
case TYPE_LADY_ANACONDRA:
|
||||
case TYPE_LORD_SERPENTIS:
|
||||
return _encounters[type];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "W C " << _encounters[0] << ' ' << _encounters[1] << ' ' << _encounters[2] << ' ' << _encounters[3] << ' ' << _encounters[4];
|
||||
return saveStream.str();
|
||||
}
|
||||
std::string GetSaveData()
|
||||
{
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "W C " << _encounters[0] << ' ' << _encounters[1] << ' ' << _encounters[2] << ' ' << _encounters[3] << ' ' << _encounters[4];
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(const char* in)
|
||||
{
|
||||
if (!in)
|
||||
return;
|
||||
void Load(const char* in)
|
||||
{
|
||||
if (!in)
|
||||
return;
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
std::istringstream loadStream(in);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
if (dataHead1 == 'W' && dataHead2 == 'C')
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
|
||||
{
|
||||
loadStream >> _encounters[i];
|
||||
if (_encounters[i] == IN_PROGRESS)
|
||||
_encounters[i] = NOT_STARTED;
|
||||
}
|
||||
}
|
||||
}
|
||||
char dataHead1, dataHead2;
|
||||
std::istringstream loadStream(in);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
if (dataHead1 == 'W' && dataHead2 == 'C')
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
|
||||
{
|
||||
loadStream >> _encounters[i];
|
||||
if (_encounters[i] == IN_PROGRESS)
|
||||
_encounters[i] = NOT_STARTED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
uint32 _encounters[MAX_ENCOUNTERS];
|
||||
uint64 DiscipleOfNaralexGUID;
|
||||
uint64 SerpentisGUID;
|
||||
};
|
||||
private:
|
||||
uint32 _encounters[MAX_ENCOUNTERS];
|
||||
uint64 DiscipleOfNaralexGUID;
|
||||
uint64 SerpentisGUID;
|
||||
};
|
||||
};
|
||||
|
||||
void AddSC_instance_wailing_caverns()
|
||||
|
||||
@@ -7,18 +7,18 @@ REWRITTEN BY XINEF
|
||||
|
||||
enum DataTypes
|
||||
{
|
||||
TYPE_LORD_COBRAHN = 0,
|
||||
TYPE_LORD_PYTHAS = 1,
|
||||
TYPE_LADY_ANACONDRA = 2,
|
||||
TYPE_LORD_SERPENTIS = 3,
|
||||
TYPE_MUTANUS = 4,
|
||||
MAX_ENCOUNTERS = 5,
|
||||
TYPE_LORD_COBRAHN = 0,
|
||||
TYPE_LORD_PYTHAS = 1,
|
||||
TYPE_LADY_ANACONDRA = 2,
|
||||
TYPE_LORD_SERPENTIS = 3,
|
||||
TYPE_MUTANUS = 4,
|
||||
MAX_ENCOUNTERS = 5,
|
||||
|
||||
NPC_DISCIPLE_OF_NARALEX = 3678,
|
||||
NPC_LORD_SERPENTIS = 3673,
|
||||
NPC_DISCIPLE_OF_NARALEX = 3678,
|
||||
NPC_LORD_SERPENTIS = 3673,
|
||||
|
||||
SAY_DISCIPLE = 0,
|
||||
SAY_SERPENTIS = 0,
|
||||
SAY_DISCIPLE = 0,
|
||||
SAY_SERPENTIS = 0,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -10,79 +10,79 @@ REWRITTEN BY XINEF
|
||||
|
||||
class instance_zulfarrak : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_zulfarrak() : InstanceMapScript("instance_zulfarrak", 209) { }
|
||||
public:
|
||||
instance_zulfarrak() : InstanceMapScript("instance_zulfarrak", 209) { }
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_zulfarrak_InstanceMapScript(map);
|
||||
}
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_zulfarrak_InstanceMapScript(map);
|
||||
}
|
||||
|
||||
struct instance_zulfarrak_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_zulfarrak_InstanceMapScript(Map* map) : InstanceScript(map) { }
|
||||
struct instance_zulfarrak_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_zulfarrak_InstanceMapScript(Map* map) : InstanceScript(map) { }
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
_pyramidEventProgress = NOT_STARTED;
|
||||
_gahzrillaSummoned = NOT_STARTED;
|
||||
}
|
||||
void Initialize()
|
||||
{
|
||||
_pyramidEventProgress = NOT_STARTED;
|
||||
_gahzrillaSummoned = NOT_STARTED;
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* gameobject)
|
||||
{
|
||||
if (gameobject->GetEntry() == GO_END_DOOR && _pyramidEventProgress == DONE)
|
||||
gameobject->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
|
||||
}
|
||||
void OnGameObjectCreate(GameObject* gameobject)
|
||||
{
|
||||
if (gameobject->GetEntry() == GO_END_DOOR && _pyramidEventProgress == DONE)
|
||||
gameobject->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type) const
|
||||
{
|
||||
if (type == TYPE_PYRAMID_EVENT)
|
||||
return _pyramidEventProgress;
|
||||
return 0;
|
||||
}
|
||||
uint32 GetData(uint32 type) const
|
||||
{
|
||||
if (type == TYPE_PYRAMID_EVENT)
|
||||
return _pyramidEventProgress;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_PYRAMID_EVENT:
|
||||
_pyramidEventProgress = data;
|
||||
break;
|
||||
case TYPE_GAHZRILLA:
|
||||
_gahzrillaSummoned = data;
|
||||
break;
|
||||
}
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_PYRAMID_EVENT:
|
||||
_pyramidEventProgress = data;
|
||||
break;
|
||||
case TYPE_GAHZRILLA:
|
||||
_gahzrillaSummoned = data;
|
||||
break;
|
||||
}
|
||||
|
||||
SaveToDB();
|
||||
}
|
||||
SaveToDB();
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "Z F " << _pyramidEventProgress << ' ' << _gahzrillaSummoned;
|
||||
return saveStream.str();
|
||||
}
|
||||
std::string GetSaveData()
|
||||
{
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "Z F " << _pyramidEventProgress << ' ' << _gahzrillaSummoned;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(const char* str)
|
||||
{
|
||||
if (!str)
|
||||
return;
|
||||
void Load(const char* str)
|
||||
{
|
||||
if (!str)
|
||||
return;
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
std::istringstream loadStream(str);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
char dataHead1, dataHead2;
|
||||
std::istringstream loadStream(str);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'Z' && dataHead2 == 'F')
|
||||
{
|
||||
loadStream >> _pyramidEventProgress;
|
||||
loadStream >> _gahzrillaSummoned;
|
||||
}
|
||||
}
|
||||
if (dataHead1 == 'Z' && dataHead2 == 'F')
|
||||
{
|
||||
loadStream >> _pyramidEventProgress;
|
||||
loadStream >> _gahzrillaSummoned;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
uint32 _pyramidEventProgress;
|
||||
uint32 _gahzrillaSummoned;
|
||||
};
|
||||
private:
|
||||
uint32 _pyramidEventProgress;
|
||||
uint32 _gahzrillaSummoned;
|
||||
};
|
||||
};
|
||||
|
||||
class spell_zulfarrak_summon_zulfarrak_zombies : public SpellScriptLoader
|
||||
@@ -96,19 +96,19 @@ class spell_zulfarrak_summon_zulfarrak_zombies : public SpellScriptLoader
|
||||
|
||||
void HandleSummon(SpellEffIndex effIndex)
|
||||
{
|
||||
if (effIndex == EFFECT_0)
|
||||
{
|
||||
if (roll_chance_i(30))
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (roll_chance_i(40))
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
return;
|
||||
}
|
||||
if (effIndex == EFFECT_0)
|
||||
{
|
||||
if (roll_chance_i(30))
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (roll_chance_i(40))
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
@@ -126,43 +126,43 @@ class spell_zulfarrak_summon_zulfarrak_zombies : public SpellScriptLoader
|
||||
|
||||
class spell_zulfarrak_unlocking : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_zulfarrak_unlocking() : SpellScriptLoader("spell_zulfarrak_unlocking") { }
|
||||
public:
|
||||
spell_zulfarrak_unlocking() : SpellScriptLoader("spell_zulfarrak_unlocking") { }
|
||||
|
||||
class spell_zulfarrak_unlocking_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_zulfarrak_unlocking_SpellScript);
|
||||
class spell_zulfarrak_unlocking_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_zulfarrak_unlocking_SpellScript);
|
||||
|
||||
void HandleOpenLock(SpellEffIndex effIndex)
|
||||
{
|
||||
GameObject* cage = GetHitGObj();
|
||||
std::list<WorldObject*> cagesList;
|
||||
Trinity::AllWorldObjectsInRange objects(GetCaster(), 15.0f);
|
||||
Trinity::WorldObjectListSearcher<Trinity::AllWorldObjectsInRange> searcher(GetCaster(), cagesList, objects);
|
||||
GetCaster()->VisitNearbyObject(15.0f, searcher);
|
||||
for (std::list<WorldObject*>::const_iterator itr = cagesList.begin(); itr != cagesList.end(); ++itr)
|
||||
{
|
||||
if (GameObject* go = (*itr)->ToGameObject())
|
||||
if (go->GetDisplayId() == cage->GetDisplayId())
|
||||
go->UseDoorOrButton(0, false, GetCaster());
|
||||
}
|
||||
}
|
||||
void HandleOpenLock(SpellEffIndex effIndex)
|
||||
{
|
||||
GameObject* cage = GetHitGObj();
|
||||
std::list<WorldObject*> cagesList;
|
||||
Trinity::AllWorldObjectsInRange objects(GetCaster(), 15.0f);
|
||||
Trinity::WorldObjectListSearcher<Trinity::AllWorldObjectsInRange> searcher(GetCaster(), cagesList, objects);
|
||||
GetCaster()->VisitNearbyObject(15.0f, searcher);
|
||||
for (std::list<WorldObject*>::const_iterator itr = cagesList.begin(); itr != cagesList.end(); ++itr)
|
||||
{
|
||||
if (GameObject* go = (*itr)->ToGameObject())
|
||||
if (go->GetDisplayId() == cage->GetDisplayId())
|
||||
go->UseDoorOrButton(0, false, GetCaster());
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_zulfarrak_unlocking_SpellScript::HandleOpenLock, EFFECT_0, SPELL_EFFECT_OPEN_LOCK);
|
||||
}
|
||||
};
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_zulfarrak_unlocking_SpellScript::HandleOpenLock, EFFECT_0, SPELL_EFFECT_OPEN_LOCK);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_zulfarrak_unlocking_SpellScript();
|
||||
}
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_zulfarrak_unlocking_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_zulfarrak()
|
||||
{
|
||||
new instance_zulfarrak();
|
||||
new spell_zulfarrak_summon_zulfarrak_zombies();
|
||||
new spell_zulfarrak_unlocking();
|
||||
new spell_zulfarrak_summon_zulfarrak_zombies();
|
||||
new spell_zulfarrak_unlocking();
|
||||
}
|
||||
|
||||
@@ -7,10 +7,10 @@ REWRITTEN BY XINEF
|
||||
|
||||
enum ZulFarrakData
|
||||
{
|
||||
TYPE_PYRAMID_EVENT = 0,
|
||||
TYPE_GAHZRILLA = 1,
|
||||
TYPE_PYRAMID_EVENT = 0,
|
||||
TYPE_GAHZRILLA = 1,
|
||||
|
||||
GO_END_DOOR = 146084
|
||||
GO_END_DOOR = 146084
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -445,10 +445,10 @@ public:
|
||||
{
|
||||
Creature* Spark = ObjectAccessor::GetCreature(*me, SparkGUID);
|
||||
if (!Spark)
|
||||
{
|
||||
me->DespawnOrUnsummon(1);
|
||||
{
|
||||
me->DespawnOrUnsummon(1);
|
||||
return 5000;
|
||||
}
|
||||
}
|
||||
|
||||
switch (Step)
|
||||
{
|
||||
@@ -489,10 +489,10 @@ public:
|
||||
CompleteQuest();
|
||||
return 9000;
|
||||
case 10:
|
||||
Spark->DespawnOrUnsummon(1);
|
||||
Spark->DespawnOrUnsummon(1);
|
||||
DespawnNagaFlag(false);
|
||||
me->DespawnOrUnsummon(1);
|
||||
return 5000;
|
||||
me->DespawnOrUnsummon(1);
|
||||
return 5000;
|
||||
default: return 99999999;
|
||||
}
|
||||
}
|
||||
@@ -683,7 +683,7 @@ class npc_stillpine_capitive : public CreatureScript
|
||||
if (type != POINT_MOTION_TYPE || id != POINT_INIT)
|
||||
return;
|
||||
|
||||
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
|
||||
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
|
||||
player->KilledMonsterCredit(me->GetEntry(), me->GetGUID());
|
||||
|
||||
_movementComplete = true;
|
||||
|
||||
@@ -40,15 +40,15 @@ EndContentData */
|
||||
// Ours
|
||||
enum murkdeep
|
||||
{
|
||||
NPC_GREYMIST_HUNTER = 2206,
|
||||
NPC_GREYMIST_WARRIOR = 2205,
|
||||
NPC_GREYMIST_COASTRUNNER = 2202,
|
||||
NPC_GREYMIST_HUNTER = 2206,
|
||||
NPC_GREYMIST_WARRIOR = 2205,
|
||||
NPC_GREYMIST_COASTRUNNER = 2202,
|
||||
|
||||
SPELL_SUNDER_ARMOR = 11971,
|
||||
SPELL_NET = 6533,
|
||||
SPELL_SUNDER_ARMOR = 11971,
|
||||
SPELL_NET = 6533,
|
||||
|
||||
EVENT_SPELL_SUNDER_ARMOR = 2,
|
||||
EVENT_SPELL_NET = 3,
|
||||
EVENT_SPELL_SUNDER_ARMOR = 2,
|
||||
EVENT_SPELL_NET = 3,
|
||||
};
|
||||
|
||||
class npc_murkdeep : public CreatureScript
|
||||
@@ -58,107 +58,107 @@ public:
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_murkdeepAI(creature);
|
||||
return new npc_murkdeepAI(creature);
|
||||
}
|
||||
|
||||
struct npc_murkdeepAI : public ScriptedAI
|
||||
{
|
||||
npc_murkdeepAI(Creature* c) : ScriptedAI(c) {}
|
||||
|
||||
uint8 phase;
|
||||
uint32 spawnTimer;
|
||||
EventMap events;
|
||||
uint8 phase;
|
||||
uint32 spawnTimer;
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
spawnTimer = 0;
|
||||
phase = 0;
|
||||
me->SetVisible(false);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
}
|
||||
void Reset()
|
||||
{
|
||||
spawnTimer = 0;
|
||||
phase = 0;
|
||||
me->SetVisible(false);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit*)
|
||||
{
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_SUNDER_ARMOR, 5000);
|
||||
events.ScheduleEvent(EVENT_SPELL_NET, 10000);
|
||||
}
|
||||
void EnterCombat(Unit*)
|
||||
{
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_SUNDER_ARMOR, 5000);
|
||||
events.ScheduleEvent(EVENT_SPELL_NET, 10000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
spawnTimer += diff;
|
||||
if (spawnTimer >= 5000)
|
||||
{
|
||||
spawnTimer = 0;
|
||||
switch (phase)
|
||||
{
|
||||
case 0:
|
||||
if (!me->FindNearestCreature(NPC_GREYMIST_WARRIOR, 80.0f, true) && !me->FindNearestCreature(NPC_GREYMIST_HUNTER, 80.0f, true))
|
||||
{
|
||||
Player *player = me->SelectNearestPlayer(100.0f);
|
||||
if (!player)
|
||||
return;
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
spawnTimer += diff;
|
||||
if (spawnTimer >= 5000)
|
||||
{
|
||||
spawnTimer = 0;
|
||||
switch (phase)
|
||||
{
|
||||
case 0:
|
||||
if (!me->FindNearestCreature(NPC_GREYMIST_WARRIOR, 80.0f, true) && !me->FindNearestCreature(NPC_GREYMIST_HUNTER, 80.0f, true))
|
||||
{
|
||||
Player *player = me->SelectNearestPlayer(100.0f);
|
||||
if (!player)
|
||||
return;
|
||||
|
||||
phase++;
|
||||
for (int i = 0; i < 3; ++i)
|
||||
if (Creature* cr = me->SummonCreature(NPC_GREYMIST_COASTRUNNER, me->GetPositionX()+irand(-5, 5), me->GetPositionY()+irand(-5, 5), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))
|
||||
cr->AI()->AttackStart(player);
|
||||
}
|
||||
return;
|
||||
case 1:
|
||||
if (!me->FindNearestCreature(NPC_GREYMIST_COASTRUNNER, 80.0f))
|
||||
{
|
||||
Player *player = me->SelectNearestPlayer(100.0f);
|
||||
if (!player)
|
||||
return;
|
||||
phase++;
|
||||
for (int i = 0; i < 3; ++i)
|
||||
if (Creature* cr = me->SummonCreature(NPC_GREYMIST_COASTRUNNER, me->GetPositionX()+irand(-5, 5), me->GetPositionY()+irand(-5, 5), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))
|
||||
cr->AI()->AttackStart(player);
|
||||
}
|
||||
return;
|
||||
case 1:
|
||||
if (!me->FindNearestCreature(NPC_GREYMIST_COASTRUNNER, 80.0f))
|
||||
{
|
||||
Player *player = me->SelectNearestPlayer(100.0f);
|
||||
if (!player)
|
||||
return;
|
||||
|
||||
phase++;
|
||||
for (int i = 0; i < 2; ++i)
|
||||
if (Creature* cr = me->SummonCreature(NPC_GREYMIST_WARRIOR, me->GetPositionX()+irand(-5, 5), me->GetPositionY()+irand(-5, 5), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))
|
||||
cr->AI()->AttackStart(player);
|
||||
}
|
||||
return;
|
||||
case 2:
|
||||
if (!me->FindNearestCreature(NPC_GREYMIST_WARRIOR, 80.0f))
|
||||
{
|
||||
Player *player = me->SelectNearestPlayer(100.0f);
|
||||
if (!player)
|
||||
return;
|
||||
phase++;
|
||||
for (int i = 0; i < 2; ++i)
|
||||
if (Creature* cr = me->SummonCreature(NPC_GREYMIST_WARRIOR, me->GetPositionX()+irand(-5, 5), me->GetPositionY()+irand(-5, 5), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))
|
||||
cr->AI()->AttackStart(player);
|
||||
}
|
||||
return;
|
||||
case 2:
|
||||
if (!me->FindNearestCreature(NPC_GREYMIST_WARRIOR, 80.0f))
|
||||
{
|
||||
Player *player = me->SelectNearestPlayer(100.0f);
|
||||
if (!player)
|
||||
return;
|
||||
|
||||
phase++;
|
||||
if (Creature* cr = me->SummonCreature(NPC_GREYMIST_HUNTER, me->GetPositionX()+irand(-5, 5), me->GetPositionY()+irand(-5, 5), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))
|
||||
cr->AI()->AttackStart(player);
|
||||
phase++;
|
||||
if (Creature* cr = me->SummonCreature(NPC_GREYMIST_HUNTER, me->GetPositionX()+irand(-5, 5), me->GetPositionY()+irand(-5, 5), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))
|
||||
cr->AI()->AttackStart(player);
|
||||
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->SetVisible(true);
|
||||
AttackStart(player);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->SetVisible(true);
|
||||
AttackStart(player);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!me->IsVisible())
|
||||
return;
|
||||
if (!me->IsVisible())
|
||||
return;
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_SUNDER_ARMOR:
|
||||
me->CastSpell(me->GetVictim(), SPELL_SUNDER_ARMOR, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SUNDER_ARMOR, 15000);
|
||||
break;
|
||||
case EVENT_SPELL_NET:
|
||||
me->CastSpell(me->GetVictim(), SPELL_NET, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_NET, 25000);
|
||||
break;
|
||||
}
|
||||
events.Update(diff);
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_SUNDER_ARMOR:
|
||||
me->CastSpell(me->GetVictim(), SPELL_SUNDER_ARMOR, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SUNDER_ARMOR, 15000);
|
||||
break;
|
||||
case EVENT_SPELL_NET:
|
||||
me->CastSpell(me->GetVictim(), SPELL_NET, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_NET, 25000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -513,10 +513,10 @@ public:
|
||||
|
||||
void AddSC_darkshore()
|
||||
{
|
||||
// Ours
|
||||
new npc_murkdeep();
|
||||
// Ours
|
||||
new npc_murkdeep();
|
||||
|
||||
// Theirs
|
||||
// Theirs
|
||||
new npc_kerlonian();
|
||||
new npc_prospector_remtravel();
|
||||
new npc_threshwackonator();
|
||||
|
||||
@@ -39,389 +39,389 @@ EndContentData */
|
||||
// Ours
|
||||
enum Caravan
|
||||
{
|
||||
QUEST_BODYGUARD_FOR_HIRE = 5821,
|
||||
QUEST_GIZELTON_CARAVAN = 5943,
|
||||
QUEST_BODYGUARD_FOR_HIRE = 5821,
|
||||
QUEST_GIZELTON_CARAVAN = 5943,
|
||||
|
||||
EVENT_RESUME_PATH = 1,
|
||||
EVENT_WAIT_FOR_ASSIST = 2,
|
||||
EVENT_RESTART_ESCORT = 3,
|
||||
EVENT_RESUME_PATH = 1,
|
||||
EVENT_WAIT_FOR_ASSIST = 2,
|
||||
EVENT_RESTART_ESCORT = 3,
|
||||
|
||||
NPC_CORK_GIZELTON = 11625,
|
||||
NPC_RIGGER_GIZELTON = 11626,
|
||||
NPC_CARAVAN_KODO = 11564,
|
||||
NPC_VENDOR_TRON = 12245,
|
||||
NPC_SUPER_SELLER = 12246,
|
||||
NPC_CORK_GIZELTON = 11625,
|
||||
NPC_RIGGER_GIZELTON = 11626,
|
||||
NPC_CARAVAN_KODO = 11564,
|
||||
NPC_VENDOR_TRON = 12245,
|
||||
NPC_SUPER_SELLER = 12246,
|
||||
|
||||
SAY_CARAVAN_LEAVE = 0,
|
||||
SAY_CARAVAN_HIRE = 1,
|
||||
SAY_CARAVAN_LEAVE = 0,
|
||||
SAY_CARAVAN_HIRE = 1,
|
||||
|
||||
MAX_CARAVAN_SUMMONS = 3,
|
||||
MAX_CARAVAN_SUMMONS = 3,
|
||||
|
||||
TIME_SHOP_STOP = 10*MINUTE*IN_MILLISECONDS,
|
||||
TIME_HIRE_STOP = 4*MINUTE*IN_MILLISECONDS,
|
||||
TIME_SHOP_STOP = 10*MINUTE*IN_MILLISECONDS,
|
||||
TIME_HIRE_STOP = 4*MINUTE*IN_MILLISECONDS,
|
||||
|
||||
// Ambush
|
||||
NPC_KOLKAR_WAYLAYER = 12976,
|
||||
NPC_KOLKAR_AMBUSHER = 12977,
|
||||
NPC_LESSER_INFERNAL = 4676,
|
||||
NPC_DOOMWARDER = 4677,
|
||||
NPC_NETHER = 4684,
|
||||
// Ambush
|
||||
NPC_KOLKAR_WAYLAYER = 12976,
|
||||
NPC_KOLKAR_AMBUSHER = 12977,
|
||||
NPC_LESSER_INFERNAL = 4676,
|
||||
NPC_DOOMWARDER = 4677,
|
||||
NPC_NETHER = 4684,
|
||||
|
||||
};
|
||||
|
||||
class npc_cork_gizelton : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_cork_gizelton() : CreatureScript("npc_cork_gizelton") { }
|
||||
public:
|
||||
npc_cork_gizelton() : CreatureScript("npc_cork_gizelton") { }
|
||||
|
||||
bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest)
|
||||
{
|
||||
if (quest->GetQuestId() == QUEST_BODYGUARD_FOR_HIRE)
|
||||
creature->AI()->SetGUID(player->GetGUID(), player->getFaction());
|
||||
bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest)
|
||||
{
|
||||
if (quest->GetQuestId() == QUEST_BODYGUARD_FOR_HIRE)
|
||||
creature->AI()->SetGUID(player->GetGUID(), player->getFaction());
|
||||
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_cork_gizeltonAI(creature);
|
||||
}
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_cork_gizeltonAI(creature);
|
||||
}
|
||||
|
||||
struct npc_cork_gizeltonAI : public npc_escortAI
|
||||
{
|
||||
npc_cork_gizeltonAI(Creature* creature) : npc_escortAI(creature)
|
||||
{
|
||||
memset(&summons, 0, sizeof(summons));
|
||||
}
|
||||
struct npc_cork_gizeltonAI : public npc_escortAI
|
||||
{
|
||||
npc_cork_gizeltonAI(Creature* creature) : npc_escortAI(creature)
|
||||
{
|
||||
memset(&summons, 0, sizeof(summons));
|
||||
}
|
||||
|
||||
EventMap events;
|
||||
uint64 summons[MAX_CARAVAN_SUMMONS];
|
||||
bool headNorth;
|
||||
EventMap events;
|
||||
uint64 summons[MAX_CARAVAN_SUMMONS];
|
||||
bool headNorth;
|
||||
|
||||
uint64 _playerGUID;
|
||||
uint32 _faction;
|
||||
uint64 _playerGUID;
|
||||
uint32 _faction;
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
_playerGUID = 0;
|
||||
_faction = 35;
|
||||
headNorth = true;
|
||||
me->setActive(true);
|
||||
events.ScheduleEvent(EVENT_RESTART_ESCORT, 0);
|
||||
}
|
||||
void Initialize()
|
||||
{
|
||||
_playerGUID = 0;
|
||||
_faction = 35;
|
||||
headNorth = true;
|
||||
me->setActive(true);
|
||||
events.ScheduleEvent(EVENT_RESTART_ESCORT, 0);
|
||||
}
|
||||
|
||||
void JustRespawned()
|
||||
{
|
||||
npc_escortAI::JustRespawned();
|
||||
Initialize();
|
||||
}
|
||||
void JustRespawned()
|
||||
{
|
||||
npc_escortAI::JustRespawned();
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
npc_escortAI::InitializeAI();
|
||||
Initialize();
|
||||
}
|
||||
void InitializeAI()
|
||||
{
|
||||
npc_escortAI::InitializeAI();
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
RemoveSummons();
|
||||
npc_escortAI::JustDied(killer);
|
||||
}
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
RemoveSummons();
|
||||
npc_escortAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
SummonsFollow();
|
||||
ImmuneFlagSet(false, 35);
|
||||
npc_escortAI::EnterEvadeMode();
|
||||
}
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
SummonsFollow();
|
||||
ImmuneFlagSet(false, 35);
|
||||
npc_escortAI::EnterEvadeMode();
|
||||
}
|
||||
|
||||
void CheckPlayer()
|
||||
{
|
||||
if (_playerGUID)
|
||||
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
|
||||
if (me->IsWithinDist(player, 60.0f))
|
||||
return;
|
||||
void CheckPlayer()
|
||||
{
|
||||
if (_playerGUID)
|
||||
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
|
||||
if (me->IsWithinDist(player, 60.0f))
|
||||
return;
|
||||
|
||||
_playerGUID = 0;
|
||||
_faction = 35;
|
||||
ImmuneFlagSet(false, _faction);
|
||||
}
|
||||
_playerGUID = 0;
|
||||
_faction = 35;
|
||||
ImmuneFlagSet(false, _faction);
|
||||
}
|
||||
|
||||
void SetGUID(uint64 playerGUID, int32 faction)
|
||||
{
|
||||
_playerGUID = playerGUID;
|
||||
_faction = faction;
|
||||
SetEscortPaused(false);
|
||||
if (Creature* active = !headNorth ? me : ObjectAccessor::GetCreature(*me, summons[0]))
|
||||
active->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
|
||||
events.CancelEvent(EVENT_WAIT_FOR_ASSIST);
|
||||
}
|
||||
void SetGUID(uint64 playerGUID, int32 faction)
|
||||
{
|
||||
_playerGUID = playerGUID;
|
||||
_faction = faction;
|
||||
SetEscortPaused(false);
|
||||
if (Creature* active = !headNorth ? me : ObjectAccessor::GetCreature(*me, summons[0]))
|
||||
active->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
|
||||
events.CancelEvent(EVENT_WAIT_FOR_ASSIST);
|
||||
}
|
||||
|
||||
void SetData(uint32 field, uint32 data)
|
||||
{
|
||||
if (field == 1 && data == 1)
|
||||
if (Player* player = me->SelectNearestPlayer(50.0f))
|
||||
SetGUID(player->GetGUID(), player->getFaction());
|
||||
}
|
||||
void SetData(uint32 field, uint32 data)
|
||||
{
|
||||
if (field == 1 && data == 1)
|
||||
if (Player* player = me->SelectNearestPlayer(50.0f))
|
||||
SetGUID(player->GetGUID(), player->getFaction());
|
||||
}
|
||||
|
||||
bool CheckCaravan()
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_CARAVAN_SUMMONS; ++i)
|
||||
{
|
||||
if (summons[i] == 0)
|
||||
{
|
||||
SummonHelpers();
|
||||
return false;
|
||||
}
|
||||
bool CheckCaravan()
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_CARAVAN_SUMMONS; ++i)
|
||||
{
|
||||
if (summons[i] == 0)
|
||||
{
|
||||
SummonHelpers();
|
||||
return false;
|
||||
}
|
||||
|
||||
Creature* summon = ObjectAccessor::GetCreature(*me, summons[i]);
|
||||
if (!summon || me->GetDistance2d(summon) > 25.0f)
|
||||
{
|
||||
SummonHelpers();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
Creature* summon = ObjectAccessor::GetCreature(*me, summons[i]);
|
||||
if (!summon || me->GetDistance2d(summon) > 25.0f)
|
||||
{
|
||||
SummonHelpers();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void RemoveSummons()
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_CARAVAN_SUMMONS; ++i)
|
||||
{
|
||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, summons[i]))
|
||||
summon->DespawnOrUnsummon();
|
||||
|
||||
summons[i] = 0;
|
||||
}
|
||||
}
|
||||
void RemoveSummons()
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_CARAVAN_SUMMONS; ++i)
|
||||
{
|
||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, summons[i]))
|
||||
summon->DespawnOrUnsummon();
|
||||
|
||||
summons[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void SummonHelpers()
|
||||
{
|
||||
RemoveSummons();
|
||||
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
|
||||
void SummonHelpers()
|
||||
{
|
||||
RemoveSummons();
|
||||
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
|
||||
|
||||
Creature* cr = NULL;
|
||||
if (cr = me->SummonCreature(NPC_RIGGER_GIZELTON, *me))
|
||||
{
|
||||
cr->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
|
||||
summons[0] = cr->GetGUID();
|
||||
}
|
||||
if (cr = me->SummonCreature(NPC_CARAVAN_KODO, *me))
|
||||
summons[1] = cr->GetGUID();
|
||||
if (cr = me->SummonCreature(NPC_CARAVAN_KODO, *me))
|
||||
summons[2] = cr->GetGUID();
|
||||
|
||||
SummonsFollow();
|
||||
}
|
||||
Creature* cr = NULL;
|
||||
if (cr = me->SummonCreature(NPC_RIGGER_GIZELTON, *me))
|
||||
{
|
||||
cr->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
|
||||
summons[0] = cr->GetGUID();
|
||||
}
|
||||
if (cr = me->SummonCreature(NPC_CARAVAN_KODO, *me))
|
||||
summons[1] = cr->GetGUID();
|
||||
if (cr = me->SummonCreature(NPC_CARAVAN_KODO, *me))
|
||||
summons[2] = cr->GetGUID();
|
||||
|
||||
SummonsFollow();
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature* creature, Unit*)
|
||||
{
|
||||
if (creature->GetGUID() == summons[0])
|
||||
summons[0] = 0;
|
||||
else if (creature->GetGUID() == summons[1])
|
||||
summons[1] = 0;
|
||||
else if (creature->GetGUID() == summons[2])
|
||||
summons[2] = 0;
|
||||
}
|
||||
void SummonedCreatureDies(Creature* creature, Unit*)
|
||||
{
|
||||
if (creature->GetGUID() == summons[0])
|
||||
summons[0] = 0;
|
||||
else if (creature->GetGUID() == summons[1])
|
||||
summons[1] = 0;
|
||||
else if (creature->GetGUID() == summons[2])
|
||||
summons[2] = 0;
|
||||
}
|
||||
|
||||
void SummonedCreatureDespawn(Creature* creature)
|
||||
{
|
||||
if (creature->GetGUID() == summons[0])
|
||||
summons[0] = 0;
|
||||
else if (creature->GetGUID() == summons[1])
|
||||
summons[1] = 0;
|
||||
else if (creature->GetGUID() == summons[2])
|
||||
summons[2] = 0;
|
||||
}
|
||||
void SummonedCreatureDespawn(Creature* creature)
|
||||
{
|
||||
if (creature->GetGUID() == summons[0])
|
||||
summons[0] = 0;
|
||||
else if (creature->GetGUID() == summons[1])
|
||||
summons[1] = 0;
|
||||
else if (creature->GetGUID() == summons[2])
|
||||
summons[2] = 0;
|
||||
}
|
||||
|
||||
void SummonsFollow()
|
||||
{
|
||||
float dist = 1.0f;
|
||||
for (uint8 i = 0; i < MAX_CARAVAN_SUMMONS; ++i)
|
||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, summons[i]))
|
||||
{
|
||||
summon->GetMotionMaster()->Clear(false);
|
||||
summon->StopMoving();
|
||||
summon->GetMotionMaster()->MoveFollow(me, dist, M_PI, MOTION_SLOT_ACTIVE);
|
||||
dist += (i == 1 ? 9.5f : 3.0f);
|
||||
}
|
||||
}
|
||||
void SummonsFollow()
|
||||
{
|
||||
float dist = 1.0f;
|
||||
for (uint8 i = 0; i < MAX_CARAVAN_SUMMONS; ++i)
|
||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, summons[i]))
|
||||
{
|
||||
summon->GetMotionMaster()->Clear(false);
|
||||
summon->StopMoving();
|
||||
summon->GetMotionMaster()->MoveFollow(me, dist, M_PI, MOTION_SLOT_ACTIVE);
|
||||
dist += (i == 1 ? 9.5f : 3.0f);
|
||||
}
|
||||
}
|
||||
|
||||
void RelocateSummons()
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_CARAVAN_SUMMONS; ++i)
|
||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, summons[i]))
|
||||
summon->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
|
||||
}
|
||||
void RelocateSummons()
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_CARAVAN_SUMMONS; ++i)
|
||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, summons[i]))
|
||||
summon->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
|
||||
}
|
||||
|
||||
void ImmuneFlagSet(bool remove, uint32 faction)
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_CARAVAN_SUMMONS; ++i)
|
||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, summons[i]))
|
||||
{
|
||||
summon->setFaction(faction);
|
||||
if (remove)
|
||||
summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
else
|
||||
summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
}
|
||||
if (remove)
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
else
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
me->setFaction(faction);
|
||||
}
|
||||
void ImmuneFlagSet(bool remove, uint32 faction)
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_CARAVAN_SUMMONS; ++i)
|
||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, summons[i]))
|
||||
{
|
||||
summon->setFaction(faction);
|
||||
if (remove)
|
||||
summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
else
|
||||
summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
}
|
||||
if (remove)
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
else
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
me->setFaction(faction);
|
||||
}
|
||||
|
||||
void WaypointReached(uint32 waypointId)
|
||||
{
|
||||
RelocateSummons();
|
||||
switch (waypointId)
|
||||
{
|
||||
// Finished north path
|
||||
case 52:
|
||||
me->SummonCreature(NPC_VENDOR_TRON, -694.61f, 1460.7f, 90.794f, 2.4f, TEMPSUMMON_TIMED_DESPAWN, TIME_SHOP_STOP+15*IN_MILLISECONDS);
|
||||
SetEscortPaused(true);
|
||||
events.ScheduleEvent(EVENT_RESUME_PATH, TIME_SHOP_STOP);
|
||||
CheckCaravan();
|
||||
break;
|
||||
// Finished south path
|
||||
case 193:
|
||||
me->SummonCreature(NPC_SUPER_SELLER, -1905.5f, 2463.3f, 61.52f, 5.87f, TEMPSUMMON_TIMED_DESPAWN, TIME_SHOP_STOP+15*IN_MILLISECONDS);
|
||||
SetEscortPaused(true);
|
||||
events.ScheduleEvent(EVENT_RESUME_PATH, TIME_SHOP_STOP);
|
||||
CheckCaravan();
|
||||
break;
|
||||
// North -> South - hire
|
||||
case 77:
|
||||
SetEscortPaused(true);
|
||||
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
|
||||
Talk(SAY_CARAVAN_HIRE);
|
||||
events.ScheduleEvent(EVENT_WAIT_FOR_ASSIST, TIME_HIRE_STOP);
|
||||
break;
|
||||
// Sout -> North - hire
|
||||
case 208:
|
||||
SetEscortPaused(true);
|
||||
if (Creature* rigger = ObjectAccessor::GetCreature(*me, summons[0]))
|
||||
{
|
||||
rigger->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
|
||||
rigger->AI()->Talk(SAY_CARAVAN_HIRE);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_WAIT_FOR_ASSIST, TIME_HIRE_STOP);
|
||||
break;
|
||||
// North -> South - complete
|
||||
case 103:
|
||||
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
|
||||
{
|
||||
if (CheckCaravan())
|
||||
player->GroupEventHappens(QUEST_BODYGUARD_FOR_HIRE, player);
|
||||
else
|
||||
player->FailQuest(QUEST_BODYGUARD_FOR_HIRE);
|
||||
}
|
||||
_playerGUID = 0;
|
||||
CheckPlayer();
|
||||
break;
|
||||
// South -> North - complete
|
||||
case 235:
|
||||
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
|
||||
{
|
||||
if (CheckCaravan())
|
||||
player->GroupEventHappens(QUEST_GIZELTON_CARAVAN, player);
|
||||
else
|
||||
player->FailQuest(QUEST_GIZELTON_CARAVAN);
|
||||
}
|
||||
_playerGUID = 0;
|
||||
CheckPlayer();
|
||||
break;
|
||||
// North -> South - spawn attackers
|
||||
case 83:
|
||||
case 93:
|
||||
case 100:
|
||||
{
|
||||
if (!_playerGUID)
|
||||
return;
|
||||
ImmuneFlagSet(true, _faction);
|
||||
Creature* cr = NULL;
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
{
|
||||
float o = (i*M_PI/2)+(M_PI/4);
|
||||
float x = me->GetPositionX()+cos(o)*15.0f;
|
||||
float y = me->GetPositionY()+sin(o)*15.0f;
|
||||
if (cr = me->SummonCreature((i%2 == 0 ? NPC_KOLKAR_WAYLAYER : NPC_KOLKAR_AMBUSHER),
|
||||
x, y, me->GetMap()->GetHeight(x, y, MAX_HEIGHT), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))
|
||||
cr->AI()->AttackStart(me);
|
||||
}
|
||||
if (cr)
|
||||
{
|
||||
AttackStart(cr);
|
||||
me->CallForHelp(50.0f);
|
||||
}
|
||||
break;
|
||||
}
|
||||
// South -> North - spawn attackers
|
||||
case 221:
|
||||
case 228:
|
||||
case 233:
|
||||
{
|
||||
if (!_playerGUID)
|
||||
return;
|
||||
ImmuneFlagSet(true, _faction);
|
||||
Creature* cr = NULL;
|
||||
for (uint8 i = 0; i < 3; ++i)
|
||||
{
|
||||
float o = i*2*M_PI/3;
|
||||
float x = me->GetPositionX()+cos(o)*10.0f;
|
||||
float y = me->GetPositionY()+sin(o)*10.0f;
|
||||
uint32 entry = NPC_LESSER_INFERNAL;
|
||||
if (i)
|
||||
entry = i == 1 ? NPC_DOOMWARDER : NPC_NETHER;
|
||||
void WaypointReached(uint32 waypointId)
|
||||
{
|
||||
RelocateSummons();
|
||||
switch (waypointId)
|
||||
{
|
||||
// Finished north path
|
||||
case 52:
|
||||
me->SummonCreature(NPC_VENDOR_TRON, -694.61f, 1460.7f, 90.794f, 2.4f, TEMPSUMMON_TIMED_DESPAWN, TIME_SHOP_STOP+15*IN_MILLISECONDS);
|
||||
SetEscortPaused(true);
|
||||
events.ScheduleEvent(EVENT_RESUME_PATH, TIME_SHOP_STOP);
|
||||
CheckCaravan();
|
||||
break;
|
||||
// Finished south path
|
||||
case 193:
|
||||
me->SummonCreature(NPC_SUPER_SELLER, -1905.5f, 2463.3f, 61.52f, 5.87f, TEMPSUMMON_TIMED_DESPAWN, TIME_SHOP_STOP+15*IN_MILLISECONDS);
|
||||
SetEscortPaused(true);
|
||||
events.ScheduleEvent(EVENT_RESUME_PATH, TIME_SHOP_STOP);
|
||||
CheckCaravan();
|
||||
break;
|
||||
// North -> South - hire
|
||||
case 77:
|
||||
SetEscortPaused(true);
|
||||
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
|
||||
Talk(SAY_CARAVAN_HIRE);
|
||||
events.ScheduleEvent(EVENT_WAIT_FOR_ASSIST, TIME_HIRE_STOP);
|
||||
break;
|
||||
// Sout -> North - hire
|
||||
case 208:
|
||||
SetEscortPaused(true);
|
||||
if (Creature* rigger = ObjectAccessor::GetCreature(*me, summons[0]))
|
||||
{
|
||||
rigger->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
|
||||
rigger->AI()->Talk(SAY_CARAVAN_HIRE);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_WAIT_FOR_ASSIST, TIME_HIRE_STOP);
|
||||
break;
|
||||
// North -> South - complete
|
||||
case 103:
|
||||
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
|
||||
{
|
||||
if (CheckCaravan())
|
||||
player->GroupEventHappens(QUEST_BODYGUARD_FOR_HIRE, player);
|
||||
else
|
||||
player->FailQuest(QUEST_BODYGUARD_FOR_HIRE);
|
||||
}
|
||||
_playerGUID = 0;
|
||||
CheckPlayer();
|
||||
break;
|
||||
// South -> North - complete
|
||||
case 235:
|
||||
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
|
||||
{
|
||||
if (CheckCaravan())
|
||||
player->GroupEventHappens(QUEST_GIZELTON_CARAVAN, player);
|
||||
else
|
||||
player->FailQuest(QUEST_GIZELTON_CARAVAN);
|
||||
}
|
||||
_playerGUID = 0;
|
||||
CheckPlayer();
|
||||
break;
|
||||
// North -> South - spawn attackers
|
||||
case 83:
|
||||
case 93:
|
||||
case 100:
|
||||
{
|
||||
if (!_playerGUID)
|
||||
return;
|
||||
ImmuneFlagSet(true, _faction);
|
||||
Creature* cr = NULL;
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
{
|
||||
float o = (i*M_PI/2)+(M_PI/4);
|
||||
float x = me->GetPositionX()+cos(o)*15.0f;
|
||||
float y = me->GetPositionY()+sin(o)*15.0f;
|
||||
if (cr = me->SummonCreature((i%2 == 0 ? NPC_KOLKAR_WAYLAYER : NPC_KOLKAR_AMBUSHER),
|
||||
x, y, me->GetMap()->GetHeight(x, y, MAX_HEIGHT), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))
|
||||
cr->AI()->AttackStart(me);
|
||||
}
|
||||
if (cr)
|
||||
{
|
||||
AttackStart(cr);
|
||||
me->CallForHelp(50.0f);
|
||||
}
|
||||
break;
|
||||
}
|
||||
// South -> North - spawn attackers
|
||||
case 221:
|
||||
case 228:
|
||||
case 233:
|
||||
{
|
||||
if (!_playerGUID)
|
||||
return;
|
||||
ImmuneFlagSet(true, _faction);
|
||||
Creature* cr = NULL;
|
||||
for (uint8 i = 0; i < 3; ++i)
|
||||
{
|
||||
float o = i*2*M_PI/3;
|
||||
float x = me->GetPositionX()+cos(o)*10.0f;
|
||||
float y = me->GetPositionY()+sin(o)*10.0f;
|
||||
uint32 entry = NPC_LESSER_INFERNAL;
|
||||
if (i)
|
||||
entry = i == 1 ? NPC_DOOMWARDER : NPC_NETHER;
|
||||
|
||||
if (cr = me->SummonCreature(entry, x, y, me->GetMap()->GetHeight(x, y, MAX_HEIGHT), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))
|
||||
cr->AI()->AttackStart(me);
|
||||
}
|
||||
if (cr)
|
||||
{
|
||||
AttackStart(cr);
|
||||
me->CallForHelp(50.0f);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 282:
|
||||
events.ScheduleEvent(EVENT_RESTART_ESCORT, 1000);
|
||||
break;
|
||||
if (cr = me->SummonCreature(entry, x, y, me->GetMap()->GetHeight(x, y, MAX_HEIGHT), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))
|
||||
cr->AI()->AttackStart(me);
|
||||
}
|
||||
if (cr)
|
||||
{
|
||||
AttackStart(cr);
|
||||
me->CallForHelp(50.0f);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 282:
|
||||
events.ScheduleEvent(EVENT_RESTART_ESCORT, 1000);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateEscortAI(uint32 diff)
|
||||
{
|
||||
events.Update(diff);
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_RESUME_PATH:
|
||||
SetEscortPaused(false);
|
||||
if (Creature* talker = headNorth ? me : ObjectAccessor::GetCreature(*me, summons[0]))
|
||||
talker->AI()->Talk(SAY_CARAVAN_LEAVE);
|
||||
void UpdateEscortAI(uint32 diff)
|
||||
{
|
||||
events.Update(diff);
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_RESUME_PATH:
|
||||
SetEscortPaused(false);
|
||||
if (Creature* talker = headNorth ? me : ObjectAccessor::GetCreature(*me, summons[0]))
|
||||
talker->AI()->Talk(SAY_CARAVAN_LEAVE);
|
||||
|
||||
headNorth = !headNorth;
|
||||
break;
|
||||
case EVENT_WAIT_FOR_ASSIST:
|
||||
SetEscortPaused(false);
|
||||
if (Creature* active = !headNorth ? me : ObjectAccessor::GetCreature(*me, summons[0]))
|
||||
active->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
|
||||
break;
|
||||
case EVENT_RESTART_ESCORT:
|
||||
CheckCaravan();
|
||||
SetDespawnAtEnd(false);
|
||||
Start(true, true, 0, 0, false, false, true);
|
||||
break;
|
||||
}
|
||||
headNorth = !headNorth;
|
||||
break;
|
||||
case EVENT_WAIT_FOR_ASSIST:
|
||||
SetEscortPaused(false);
|
||||
if (Creature* active = !headNorth ? me : ObjectAccessor::GetCreature(*me, summons[0]))
|
||||
active->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
|
||||
break;
|
||||
case EVENT_RESTART_ESCORT:
|
||||
CheckCaravan();
|
||||
SetDespawnAtEnd(false);
|
||||
Start(true, true, 0, 0, false, false, true);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -454,16 +454,16 @@ public:
|
||||
{
|
||||
npc_aged_dying_ancient_kodoAI(Creature* creature) : ScriptedAI(creature) {}
|
||||
|
||||
void JustRespawned()
|
||||
{
|
||||
me->UpdateEntry(RAND(NPC_AGED_KODO, NPC_DYING_KODO, NPC_ANCIENT_KODO), NULL, false);
|
||||
}
|
||||
void JustRespawned()
|
||||
{
|
||||
me->UpdateEntry(RAND(NPC_AGED_KODO, NPC_DYING_KODO, NPC_ANCIENT_KODO), NULL, false);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
{
|
||||
if (who->GetEntry() == NPC_SMEED && me->IsWithinDistInMap(who, 10.0f) && !me->HasAura(SPELL_KODO_KOMBO_GOSSIP))
|
||||
{
|
||||
me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
|
||||
me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
|
||||
me->GetMotionMaster()->Clear();
|
||||
|
||||
DoCast(me, SPELL_KODO_KOMBO_GOSSIP, true);
|
||||
@@ -480,10 +480,10 @@ public:
|
||||
&& (me->GetEntry() == NPC_AGED_KODO || me->GetEntry() == NPC_DYING_KODO || me->GetEntry() == NPC_ANCIENT_KODO))
|
||||
{
|
||||
me->UpdateEntry(NPC_TAMED_KODO, NULL, false);
|
||||
EnterEvadeMode();
|
||||
EnterEvadeMode();
|
||||
me->GetMotionMaster()->MoveFollow(caster, PET_FOLLOW_DIST, me->GetFollowAngle());
|
||||
|
||||
caster->CastSpell(caster, SPELL_KODO_KOMBO_PLAYER_BUFF, true);
|
||||
caster->CastSpell(caster, SPELL_KODO_KOMBO_PLAYER_BUFF, true);
|
||||
DoCast(me, SPELL_KODO_KOMBO_DESPAWN_BUFF, true);
|
||||
}
|
||||
}
|
||||
@@ -618,10 +618,10 @@ class go_demon_portal : public GameObjectScript
|
||||
|
||||
void AddSC_desolace()
|
||||
{
|
||||
// Ours
|
||||
new npc_cork_gizelton();
|
||||
// Ours
|
||||
new npc_cork_gizelton();
|
||||
|
||||
// Theirs
|
||||
// Theirs
|
||||
new npc_aged_dying_ancient_kodo();
|
||||
new npc_dalinda();
|
||||
new go_demon_portal();
|
||||
|
||||
@@ -187,9 +187,9 @@ public:
|
||||
{
|
||||
Damage = 0;
|
||||
|
||||
if (pDoneBy)
|
||||
if (Player* player = pDoneBy->GetCharmerOrOwnerPlayerOrPlayerItself())
|
||||
player->GroupEventHappens(QUEST_MISSING_DIPLO_PT16, me);
|
||||
if (pDoneBy)
|
||||
if (Player* player = pDoneBy->GetCharmerOrOwnerPlayerOrPlayerItself())
|
||||
player->GroupEventHappens(QUEST_MISSING_DIPLO_PT16, me);
|
||||
|
||||
Talk(EMOTE_SURRENDER);
|
||||
EnterEvadeMode();
|
||||
@@ -352,7 +352,7 @@ class spell_ooze_zap_channel_end : public SpellScriptLoader
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
if (Player* player = GetCaster()->ToPlayer())
|
||||
player->CastSpell(player, SPELL_OOZE_CHANNEL_CREDIT, true);
|
||||
Unit::Kill(GetHitUnit(), GetHitUnit());
|
||||
Unit::Kill(GetHitUnit(), GetHitUnit());
|
||||
}
|
||||
|
||||
void Register()
|
||||
|
||||
@@ -1258,26 +1258,26 @@ class go_wind_stone : public GameObjectScript
|
||||
|
||||
void SummonNPC(GameObject* go, Player* player, uint32 npc, uint32 spellId)
|
||||
{
|
||||
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
|
||||
if (!spellInfo)
|
||||
return;
|
||||
SpellInfo const* spellInfoTrigger = sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].TriggerSpell);
|
||||
if (!spellInfoTrigger)
|
||||
return;
|
||||
Spell* spell = new Spell(player, spellInfoTrigger, TRIGGERED_NONE);
|
||||
SpellCastResult result = spell->CheckCast(true);
|
||||
delete spell;
|
||||
if (result != SPELL_CAST_OK)
|
||||
{
|
||||
if (result == SPELL_FAILED_REAGENTS)
|
||||
{
|
||||
std::string accountName;
|
||||
AccountMgr::GetName(player->GetSession()->GetAccountId(), accountName);
|
||||
sWorld->BanAccount(BAN_ACCOUNT, accountName, "0s", "Wind Stone exploit", "Server");
|
||||
}
|
||||
return;
|
||||
}
|
||||
player->CastSpell(player, spellInfoTrigger->Id, false);
|
||||
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
|
||||
if (!spellInfo)
|
||||
return;
|
||||
SpellInfo const* spellInfoTrigger = sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].TriggerSpell);
|
||||
if (!spellInfoTrigger)
|
||||
return;
|
||||
Spell* spell = new Spell(player, spellInfoTrigger, TRIGGERED_NONE);
|
||||
SpellCastResult result = spell->CheckCast(true);
|
||||
delete spell;
|
||||
if (result != SPELL_CAST_OK)
|
||||
{
|
||||
if (result == SPELL_FAILED_REAGENTS)
|
||||
{
|
||||
std::string accountName;
|
||||
AccountMgr::GetName(player->GetSession()->GetAccountId(), accountName);
|
||||
sWorld->BanAccount(BAN_ACCOUNT, accountName, "0s", "Wind Stone exploit", "Server");
|
||||
}
|
||||
return;
|
||||
}
|
||||
player->CastSpell(player, spellInfoTrigger->Id, false);
|
||||
TempSummon* summons = go->SummonCreature(npc, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), player->GetOrientation() - M_PI, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10 * 60 * 1000);
|
||||
summons->CastSpell(summons, SPELL_SPAWN_IN, false);
|
||||
switch (summons->GetEntry())
|
||||
|
||||
@@ -347,15 +347,15 @@ public:
|
||||
|
||||
void EnterCombat(Unit* /*who*/) { }
|
||||
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
CleanUp();
|
||||
ScriptedAI::EnterEvadeMode();
|
||||
}
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
CleanUp();
|
||||
ScriptedAI::EnterEvadeMode();
|
||||
}
|
||||
|
||||
void CleanUp()
|
||||
{
|
||||
for (uint8 i = 0; i < 6; ++i) // unsummon challengers
|
||||
void CleanUp()
|
||||
{
|
||||
for (uint8 i = 0; i < 6; ++i) // unsummon challengers
|
||||
if (AffrayChallenger[i])
|
||||
if (Creature* creature = ObjectAccessor::GetCreature((*me), AffrayChallenger[i]))
|
||||
creature->DespawnOrUnsummon(1);
|
||||
@@ -363,7 +363,7 @@ public:
|
||||
if (BigWill) // unsummon bigWill
|
||||
if (Creature* creature = ObjectAccessor::GetCreature((*me), BigWill))
|
||||
creature->DespawnOrUnsummon(1);
|
||||
}
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
{
|
||||
@@ -380,19 +380,19 @@ public:
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (EventInProgress)
|
||||
{
|
||||
{
|
||||
Player* pWarrior = ObjectAccessor::GetPlayer(*me, PlayerGUID);
|
||||
if (!pWarrior || me->GetDistance2d(pWarrior) >= 200.0f)
|
||||
{
|
||||
EnterEvadeMode();
|
||||
{
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!pWarrior->IsAlive() && pWarrior->GetQuestStatus(1719) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
{
|
||||
Talk(SAY_TWIGGY_FLATHEAD_DOWN);
|
||||
pWarrior->FailQuest(1719);
|
||||
EnterEvadeMode();
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -402,7 +402,7 @@ public:
|
||||
pWarrior->GetPosition(x, y, z);
|
||||
|
||||
if (x >= -1684 && x <= -1674 && y >= -4334 && y <= -4324)
|
||||
{
|
||||
{
|
||||
pWarrior->AreaExploredOrEventHappens(1719);
|
||||
Talk(SAY_TWIGGY_FLATHEAD_BEGIN, pWarrior);
|
||||
|
||||
@@ -455,11 +455,11 @@ public:
|
||||
creature->setFaction(14);
|
||||
creature->AI()->AttackStart(pWarrior);
|
||||
}
|
||||
++Wave;
|
||||
++Wave;
|
||||
WaveTimer = 20000;
|
||||
}
|
||||
else if (Wave >= 6 && !EventBigWill)
|
||||
{
|
||||
{
|
||||
if (Creature* creature = me->SummonCreature(NPC_BIG_WILL, -1722, -4341, 6.12f, 6.26f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 480000))
|
||||
{
|
||||
BigWill = creature->GetGUID();
|
||||
@@ -476,7 +476,7 @@ public:
|
||||
{
|
||||
Talk(SAY_TWIGGY_FLATHEAD_OVER);
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
return;
|
||||
}
|
||||
else if (creature) // Makes BIG WILL attackable.
|
||||
{
|
||||
@@ -486,11 +486,11 @@ public:
|
||||
creature->setFaction(14);
|
||||
creature->AI()->AttackStart(pWarrior);
|
||||
}
|
||||
WaveTimer = 2000;
|
||||
WaveTimer = 2000;
|
||||
}
|
||||
}
|
||||
else
|
||||
WaveTimer -= diff;
|
||||
else
|
||||
WaveTimer -= diff;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,31 +39,31 @@ EndContentData */
|
||||
// Ours
|
||||
enum eStaveQuest
|
||||
{
|
||||
QUEST_STAVE_OF_THE_ANCIENTS = 7636,
|
||||
QUEST_STAVE_OF_THE_ANCIENTS = 7636,
|
||||
|
||||
NPC_SIMONE_NORMAL = 14527,
|
||||
NPC_FRANKLIN_NORMAL = 14529,
|
||||
NPC_ARTORIUS_NORMAL = 14531,
|
||||
NPC_NELSON_NORMAL = 14536,
|
||||
NPC_PRECIOUS = 14528,
|
||||
NPC_SIMONE_NORMAL = 14527,
|
||||
NPC_FRANKLIN_NORMAL = 14529,
|
||||
NPC_ARTORIUS_NORMAL = 14531,
|
||||
NPC_NELSON_NORMAL = 14536,
|
||||
NPC_PRECIOUS = 14528,
|
||||
|
||||
NPC_SIMONE_EVIL = 14533,
|
||||
NPC_FRANKLIN_EVIL = 14534,
|
||||
NPC_ARTORIUS_EVIL = 14535,
|
||||
NPC_NELSON_EVIL = 14530,
|
||||
NPC_PRECIOUS_EVIL = 14538,
|
||||
NPC_SIMONE_EVIL = 14533,
|
||||
NPC_FRANKLIN_EVIL = 14534,
|
||||
NPC_ARTORIUS_EVIL = 14535,
|
||||
NPC_NELSON_EVIL = 14530,
|
||||
NPC_PRECIOUS_EVIL = 14538,
|
||||
|
||||
EVENT_CHECK_PLAYER = 1,
|
||||
EVENT_SPELL_CHAIN_LIGHTNING = 23206,
|
||||
EVENT_SPELL_TEMPTRESS_KISS = 23205,
|
||||
EVENT_SPELL_DEMONIC_ENRAGE = 23257,
|
||||
EVENT_SPELL_ENTROPIC_STING = 23260,
|
||||
EVENT_SPELL_DEMONIC_DOOM = 23298,
|
||||
EVENT_SPELL_STINGING_TRAUMA = 23299,
|
||||
EVENT_SPELL_DREADFUL_FRIGHT = 23275,
|
||||
EVENT_CHECK_PLAYER = 1,
|
||||
EVENT_SPELL_CHAIN_LIGHTNING = 23206,
|
||||
EVENT_SPELL_TEMPTRESS_KISS = 23205,
|
||||
EVENT_SPELL_DEMONIC_ENRAGE = 23257,
|
||||
EVENT_SPELL_ENTROPIC_STING = 23260,
|
||||
EVENT_SPELL_DEMONIC_DOOM = 23298,
|
||||
EVENT_SPELL_STINGING_TRAUMA = 23299,
|
||||
EVENT_SPELL_DREADFUL_FRIGHT = 23275,
|
||||
|
||||
SPELL_FOOLS_PLIGHT = 23504,
|
||||
SPELL_SOUL_FLAME = 23272,
|
||||
SPELL_FOOLS_PLIGHT = 23504,
|
||||
SPELL_SOUL_FLAME = 23272,
|
||||
};
|
||||
|
||||
class npc_stave_of_the_ancients : public CreatureScript
|
||||
@@ -79,135 +79,135 @@ public:
|
||||
struct npc_stave_of_the_ancientsAI : public ScriptedAI
|
||||
{
|
||||
npc_stave_of_the_ancientsAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
changeEntry = me->GetEntry();
|
||||
switch (me->GetEntry())
|
||||
{
|
||||
case NPC_SIMONE_NORMAL: changeEntry = NPC_SIMONE_EVIL; break;
|
||||
case NPC_FRANKLIN_NORMAL: changeEntry = NPC_FRANKLIN_EVIL; break;
|
||||
case NPC_ARTORIUS_NORMAL: changeEntry = NPC_ARTORIUS_EVIL; break;
|
||||
case NPC_NELSON_NORMAL: changeEntry = NPC_NELSON_EVIL; break;
|
||||
case NPC_PRECIOUS: changeEntry = NPC_PRECIOUS_EVIL; break;
|
||||
}
|
||||
}
|
||||
{
|
||||
changeEntry = me->GetEntry();
|
||||
switch (me->GetEntry())
|
||||
{
|
||||
case NPC_SIMONE_NORMAL: changeEntry = NPC_SIMONE_EVIL; break;
|
||||
case NPC_FRANKLIN_NORMAL: changeEntry = NPC_FRANKLIN_EVIL; break;
|
||||
case NPC_ARTORIUS_NORMAL: changeEntry = NPC_ARTORIUS_EVIL; break;
|
||||
case NPC_NELSON_NORMAL: changeEntry = NPC_NELSON_EVIL; break;
|
||||
case NPC_PRECIOUS: changeEntry = NPC_PRECIOUS_EVIL; break;
|
||||
}
|
||||
}
|
||||
|
||||
uint64 playerGUID;
|
||||
EventMap events;
|
||||
uint32 changeEntry;
|
||||
bool damaged;
|
||||
uint64 playerGUID;
|
||||
EventMap events;
|
||||
uint32 changeEntry;
|
||||
bool damaged;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
if (me->GetOriginalEntry() != me->GetEntry())
|
||||
me->UpdateEntry(me->GetOriginalEntry());
|
||||
void Reset()
|
||||
{
|
||||
if (me->GetOriginalEntry() != me->GetEntry())
|
||||
me->UpdateEntry(me->GetOriginalEntry());
|
||||
|
||||
events.Reset();
|
||||
playerGUID = 0;
|
||||
damaged = false;
|
||||
}
|
||||
events.Reset();
|
||||
playerGUID = 0;
|
||||
damaged = false;
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* who, uint32&, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if (!damaged)
|
||||
{
|
||||
if (who && who->GetGUID() != playerGUID && (who->GetTypeId() == TYPEID_PLAYER || IS_PLAYER_GUID(who->GetOwnerGUID())))
|
||||
{
|
||||
damaged = true;
|
||||
me->CastSpell(who, SPELL_FOOLS_PLIGHT, true);
|
||||
}
|
||||
}
|
||||
else
|
||||
damaged = false;
|
||||
}
|
||||
void DamageTaken(Unit* who, uint32&, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if (!damaged)
|
||||
{
|
||||
if (who && who->GetGUID() != playerGUID && (who->GetTypeId() == TYPEID_PLAYER || IS_PLAYER_GUID(who->GetOwnerGUID())))
|
||||
{
|
||||
damaged = true;
|
||||
me->CastSpell(who, SPELL_FOOLS_PLIGHT, true);
|
||||
}
|
||||
}
|
||||
else
|
||||
damaged = false;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit*)
|
||||
{
|
||||
switch (changeEntry)
|
||||
{
|
||||
case NPC_SIMONE_EVIL:
|
||||
events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, 3000);
|
||||
events.ScheduleEvent(EVENT_SPELL_TEMPTRESS_KISS, 1000);
|
||||
break;
|
||||
case NPC_FRANKLIN_EVIL:
|
||||
events.ScheduleEvent(EVENT_SPELL_DEMONIC_ENRAGE, 3000);
|
||||
events.ScheduleEvent(EVENT_SPELL_ENTROPIC_STING, 5000);
|
||||
break;
|
||||
case NPC_ARTORIUS_EVIL:
|
||||
events.ScheduleEvent(EVENT_SPELL_DEMONIC_DOOM, 3000);
|
||||
events.ScheduleEvent(EVENT_SPELL_STINGING_TRAUMA, 5000);
|
||||
break;
|
||||
case NPC_NELSON_EVIL:
|
||||
me->CastSpell(me, SPELL_SOUL_FLAME, true);
|
||||
events.ScheduleEvent(EVENT_SPELL_DREADFUL_FRIGHT, 5000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
void EnterCombat(Unit*)
|
||||
{
|
||||
switch (changeEntry)
|
||||
{
|
||||
case NPC_SIMONE_EVIL:
|
||||
events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, 3000);
|
||||
events.ScheduleEvent(EVENT_SPELL_TEMPTRESS_KISS, 1000);
|
||||
break;
|
||||
case NPC_FRANKLIN_EVIL:
|
||||
events.ScheduleEvent(EVENT_SPELL_DEMONIC_ENRAGE, 3000);
|
||||
events.ScheduleEvent(EVENT_SPELL_ENTROPIC_STING, 5000);
|
||||
break;
|
||||
case NPC_ARTORIUS_EVIL:
|
||||
events.ScheduleEvent(EVENT_SPELL_DEMONIC_DOOM, 3000);
|
||||
events.ScheduleEvent(EVENT_SPELL_STINGING_TRAUMA, 5000);
|
||||
break;
|
||||
case NPC_NELSON_EVIL:
|
||||
me->CastSpell(me, SPELL_SOUL_FLAME, true);
|
||||
events.ScheduleEvent(EVENT_SPELL_DREADFUL_FRIGHT, 5000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
{
|
||||
if (me->GetEntry() != changeEntry && who->GetTypeId() == TYPEID_PLAYER && who->ToPlayer()->GetQuestStatus(QUEST_STAVE_OF_THE_ANCIENTS) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
playerGUID = who->GetGUID();
|
||||
me->UpdateEntry(changeEntry);
|
||||
events.ScheduleEvent(EVENT_CHECK_PLAYER, 5000);
|
||||
return;
|
||||
}
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
{
|
||||
if (me->GetEntry() != changeEntry && who->GetTypeId() == TYPEID_PLAYER && who->ToPlayer()->GetQuestStatus(QUEST_STAVE_OF_THE_ANCIENTS) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
playerGUID = who->GetGUID();
|
||||
me->UpdateEntry(changeEntry);
|
||||
events.ScheduleEvent(EVENT_CHECK_PLAYER, 5000);
|
||||
return;
|
||||
}
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events.Update(diff);
|
||||
uint32 eventId = events.GetEvent();
|
||||
if (eventId == EVENT_CHECK_PLAYER)
|
||||
{
|
||||
Player* player = ObjectAccessor::GetPlayer(*me, playerGUID);
|
||||
if (!player || !player->IsWithinDist2d(me, 60.0f))
|
||||
EnterEvadeMode();
|
||||
else
|
||||
events.RepeatEvent(5000);
|
||||
return;
|
||||
}
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events.Update(diff);
|
||||
uint32 eventId = events.GetEvent();
|
||||
if (eventId == EVENT_CHECK_PLAYER)
|
||||
{
|
||||
Player* player = ObjectAccessor::GetPlayer(*me, playerGUID);
|
||||
if (!player || !player->IsWithinDist2d(me, 60.0f))
|
||||
EnterEvadeMode();
|
||||
else
|
||||
events.RepeatEvent(5000);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SPELL_CHAIN_LIGHTNING:
|
||||
me->CastSpell(me->GetVictim(), eventId, false);
|
||||
events.RepeatEvent(7000);
|
||||
break;
|
||||
case EVENT_SPELL_TEMPTRESS_KISS:
|
||||
me->CastSpell(me->GetVictim(), eventId, false);
|
||||
events.RepeatEvent(45000);
|
||||
break;
|
||||
case EVENT_SPELL_DEMONIC_ENRAGE:
|
||||
me->CastSpell(me, eventId, false);
|
||||
events.RepeatEvent(20000);
|
||||
break;
|
||||
case EVENT_SPELL_ENTROPIC_STING:
|
||||
me->CastSpell(me->GetVictim(), eventId, false);
|
||||
events.RepeatEvent(20000);
|
||||
break;
|
||||
case EVENT_SPELL_DEMONIC_DOOM:
|
||||
me->CastSpell(me->GetVictim(), eventId, false);
|
||||
events.RepeatEvent(50000);
|
||||
break;
|
||||
case EVENT_SPELL_STINGING_TRAUMA:
|
||||
me->CastSpell(me->GetVictim(), eventId, false);
|
||||
events.RepeatEvent(20000);
|
||||
break;
|
||||
case EVENT_SPELL_DREADFUL_FRIGHT:
|
||||
me->CastSpell(me->GetVictim(), eventId, false);
|
||||
events.RepeatEvent(15000);
|
||||
break;
|
||||
}
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SPELL_CHAIN_LIGHTNING:
|
||||
me->CastSpell(me->GetVictim(), eventId, false);
|
||||
events.RepeatEvent(7000);
|
||||
break;
|
||||
case EVENT_SPELL_TEMPTRESS_KISS:
|
||||
me->CastSpell(me->GetVictim(), eventId, false);
|
||||
events.RepeatEvent(45000);
|
||||
break;
|
||||
case EVENT_SPELL_DEMONIC_ENRAGE:
|
||||
me->CastSpell(me, eventId, false);
|
||||
events.RepeatEvent(20000);
|
||||
break;
|
||||
case EVENT_SPELL_ENTROPIC_STING:
|
||||
me->CastSpell(me->GetVictim(), eventId, false);
|
||||
events.RepeatEvent(20000);
|
||||
break;
|
||||
case EVENT_SPELL_DEMONIC_DOOM:
|
||||
me->CastSpell(me->GetVictim(), eventId, false);
|
||||
events.RepeatEvent(50000);
|
||||
break;
|
||||
case EVENT_SPELL_STINGING_TRAUMA:
|
||||
me->CastSpell(me->GetVictim(), eventId, false);
|
||||
events.RepeatEvent(20000);
|
||||
break;
|
||||
case EVENT_SPELL_DREADFUL_FRIGHT:
|
||||
me->CastSpell(me->GetVictim(), eventId, false);
|
||||
events.RepeatEvent(15000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
};
|
||||
@@ -795,10 +795,10 @@ public:
|
||||
|
||||
void AddSC_winterspring()
|
||||
{
|
||||
// Ours
|
||||
new npc_stave_of_the_ancients();
|
||||
// Ours
|
||||
new npc_stave_of_the_ancients();
|
||||
|
||||
// Theirs
|
||||
// Theirs
|
||||
new npc_rivern_frostwind();
|
||||
new npc_ranshalla();
|
||||
new go_elune_fire();
|
||||
|
||||
Reference in New Issue
Block a user