mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Scripts/CoS: implemented Infinite Corruptor, improvements in instance script and Meathook converted to BossAI
Guardian of Time should have some text, but I have not found anything in sniff. Also the whole event needs to be rewritten and improved.
This commit is contained in:
9
sql/updates/world/2014_09_12_02_world_misc.sql
Normal file
9
sql/updates/world/2014_09_12_02_world_misc.sql
Normal file
@@ -0,0 +1,9 @@
|
||||
DELETE FROM `creature_text` WHERE `entry`=26527;
|
||||
INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextId`) VALUES
|
||||
(26527, 0, 0, 'Oh, no! Adventurers, something awful has happened! A colleague of mine has been captured by the Infinite Dragonflight, and they''re doing something horrible to him! Keeping Arthas is still your highest priority, but if you act fast you could help save a Guardian of Time!', 15, 0, 100, 0, 0, 0, 'Chromie', 32670),
|
||||
(26527, 1, 0, 'Adventurers, you must hurry! The Guardian of Time cannot last for much longer!', 15, 0, 100, 0, 0, 0, 'Chromie', 32678),
|
||||
(26527, 2, 0, 'I can barely sense the Guardian of Time! His timeline is fading quickly!', 15, 0, 100, 0, 0, 0, 'Chromie', 32679);
|
||||
|
||||
DELETE FROM `conditions` WHERE `SourceEntry`=60422;
|
||||
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `Comment`) VALUES
|
||||
(13, 1, 60422, 0, 0, 31, 1, 3, 32281, 0, 0, 0, 0, 'Corruption of Time (60422) can hit only Guardian of Time');
|
||||
@@ -87,14 +87,14 @@ public:
|
||||
{
|
||||
Initialize();
|
||||
|
||||
instance->SetData(DATA_EPOCH_EVENT, NOT_STARTED);
|
||||
instance->SetBossState(DATA_EPOCH, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
instance->SetData(DATA_EPOCH_EVENT, IN_PROGRESS);
|
||||
instance->SetBossState(DATA_EPOCH, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -136,7 +136,7 @@ public:
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
|
||||
instance->SetData(DATA_EPOCH_EVENT, DONE);
|
||||
instance->SetBossState(DATA_EPOCH, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim) override
|
||||
|
||||
@@ -22,7 +22,9 @@
|
||||
enum Spells
|
||||
{
|
||||
SPELL_CORRUPTING_BLIGHT = 60588,
|
||||
SPELL_VOID_STRIKE = 60590
|
||||
SPELL_VOID_STRIKE = 60590,
|
||||
SPELL_CORRUPTION_OF_TIME_CHANNEL = 60422,
|
||||
SPELL_CORRUPTION_OF_TIME_TARGET = 60451
|
||||
};
|
||||
|
||||
enum Yells
|
||||
@@ -32,52 +34,78 @@ enum Yells
|
||||
SAY_FAIL = 2
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_CORRUPTING_BLIGHT = 1,
|
||||
EVENT_VOID_STRIKE
|
||||
};
|
||||
|
||||
class boss_infinite_corruptor : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_infinite_corruptor() : CreatureScript("boss_infinite_corruptor") { }
|
||||
public:
|
||||
boss_infinite_corruptor() : CreatureScript("boss_infinite_corruptor") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return GetInstanceAI<boss_infinite_corruptorAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_infinite_corruptorAI : public ScriptedAI
|
||||
{
|
||||
boss_infinite_corruptorAI(Creature* creature) : ScriptedAI(creature)
|
||||
struct boss_infinite_corruptorAI : public BossAI
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
boss_infinite_corruptorAI(Creature* creature) : BossAI(creature, DATA_INFINITE) { }
|
||||
|
||||
InstanceScript* instance;
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
|
||||
void Reset() override
|
||||
if (Creature* guardian = me->FindNearestCreature(NPC_GUARDIAN_OF_TIME, 100.0f))
|
||||
{
|
||||
DoCast((Unit*)NULL, SPELL_CORRUPTION_OF_TIME_CHANNEL, false);
|
||||
guardian->CastSpell(guardian, SPELL_CORRUPTION_OF_TIME_TARGET, false);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_CORRUPTING_BLIGHT, 7000);
|
||||
events.ScheduleEvent(EVENT_VOID_STRIKE, 5000);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
_JustDied();
|
||||
|
||||
if (Creature* guardian = me->FindNearestCreature(NPC_GUARDIAN_OF_TIME, 100.0f))
|
||||
{
|
||||
guardian->RemoveAurasDueToSpell(SPELL_CORRUPTION_OF_TIME_TARGET);
|
||||
guardian->DespawnOrUnsummon(5000);
|
||||
}
|
||||
|
||||
if (Creature* rift = me->FindNearestCreature(NPC_TIME_RIFT, 100.0f))
|
||||
rift->DespawnOrUnsummon();
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId) override
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_CORRUPTING_BLIGHT:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true))
|
||||
DoCast(target, SPELL_CORRUPTING_BLIGHT);
|
||||
events.ScheduleEvent(EVENT_CORRUPTING_BLIGHT, 17000);
|
||||
break;
|
||||
case EVENT_VOID_STRIKE:
|
||||
DoCastVictim(SPELL_VOID_STRIKE);
|
||||
events.ScheduleEvent(EVENT_VOID_STRIKE, 5000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
instance->SetData(DATA_INFINITE_EVENT, NOT_STARTED);
|
||||
return GetInstanceAI<boss_infinite_corruptorAI>(creature);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
instance->SetData(DATA_INFINITE_EVENT, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 /*diff*/) override
|
||||
{
|
||||
//Return since we have no target
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
instance->SetData(DATA_INFINITE_EVENT, DONE);
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
void AddSC_boss_infinite_corruptor()
|
||||
|
||||
@@ -26,15 +26,13 @@ Script Data End */
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "culling_of_stratholme.h"
|
||||
#include "Player.h"
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_CARRION_SWARM = 52720, //A cresting wave of chaotic magic splashes over enemies in front of the caster, dealing 3230 to 3570 Shadow damage and 380 to 420 Shadow damage every 3 sec. for 15 sec.
|
||||
H_SPELL_CARRION_SWARM = 58852,
|
||||
SPELL_MIND_BLAST = 52722, //Inflicts 4163 to 4837 Shadow damage to an enemy.
|
||||
H_SPELL_MIND_BLAST = 58850,
|
||||
SPELL_SLEEP = 52721, //Puts an enemy to sleep for up to 10 sec. Any damage caused will awaken the target.
|
||||
H_SPELL_SLEEP = 58849,
|
||||
SPELL_VAMPIRIC_TOUCH = 52723, //Heals the caster for half the damage dealt by a melee attack.
|
||||
SPELL_MAL_GANIS_KILL_CREDIT = 58124, // Quest credit
|
||||
SPELL_KILL_CREDIT = 58630 // Non-existing spell as encounter credit, created in spell_dbc
|
||||
@@ -75,7 +73,6 @@ public:
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
uiOutroStep = 0;
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
@@ -108,14 +105,13 @@ public:
|
||||
void Reset() override
|
||||
{
|
||||
Initialize();
|
||||
|
||||
instance->SetData(DATA_MAL_GANIS_EVENT, NOT_STARTED);
|
||||
instance->SetBossState(DATA_MAL_GANIS, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
instance->SetData(DATA_MAL_GANIS_EVENT, IN_PROGRESS);
|
||||
instance->SetBossState(DATA_MAL_GANIS, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* done_by, uint32 &damage) override
|
||||
@@ -159,7 +155,7 @@ public:
|
||||
{
|
||||
EnterEvadeMode();
|
||||
me->DisappearAndDie();
|
||||
instance->SetData(DATA_MAL_GANIS_EVENT, FAIL);
|
||||
instance->SetBossState(DATA_MAL_GANIS, FAIL);
|
||||
}
|
||||
|
||||
if (uiCarrionSwarmTimer < diff)
|
||||
@@ -197,7 +193,7 @@ public:
|
||||
switch (uiOutroStep)
|
||||
{
|
||||
case 1:
|
||||
Talk(SAY_ESCAPE_SPEECH_1);
|
||||
Talk(SAY_OUTRO);
|
||||
me->GetMotionMaster()->MoveTargetedHome();
|
||||
++uiOutroStep;
|
||||
uiOutroTimer = 8000;
|
||||
@@ -212,7 +208,7 @@ public:
|
||||
case 3:
|
||||
Talk(SAY_OUTRO);
|
||||
++uiOutroStep;
|
||||
uiOutroTimer = 16000;
|
||||
//uiOutroTimer = 16000;
|
||||
break;
|
||||
case 4:
|
||||
me->HandleEmoteCommand(33);
|
||||
@@ -232,7 +228,7 @@ public:
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
instance->SetData(DATA_MAL_GANIS_EVENT, DONE);
|
||||
instance->SetBossState(DATA_MAL_GANIS, DONE);
|
||||
DoCastAOE(SPELL_MAL_GANIS_KILL_CREDIT);
|
||||
// give achievement credit and LFG rewards to players. criteria use spell 58630 which doesn't exist, but it was created in spell_dbc
|
||||
DoCastAOE(SPELL_KILL_CREDIT);
|
||||
|
||||
@@ -15,14 +15,6 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* Script Data Start
|
||||
SDName: Boss meathook
|
||||
SDAuthor: Tartalo
|
||||
SD%Complete: 100
|
||||
SDComment: It may need timer adjustment
|
||||
SDCategory:
|
||||
Script Data End */
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "culling_of_stratholme.h"
|
||||
@@ -30,9 +22,7 @@ Script Data End */
|
||||
enum Spells
|
||||
{
|
||||
SPELL_CONSTRICTING_CHAINS = 52696, //Encases the targets in chains, dealing 1800 Physical damage every 1 sec. and stunning the target for 5 sec.
|
||||
H_SPELL_CONSTRICTING_CHAINS = 58823,
|
||||
SPELL_DISEASE_EXPULSION = 52666, //Meathook belches out a cloud of disease, dealing 1710 to 1890 Nature damage and interrupting the spell casting of nearby enemy targets for 4 sec.
|
||||
H_SPELL_DISEASE_EXPULSION = 58824,
|
||||
SPELL_FRENZY = 58841 //Increases the caster's Physical damage by 10% for 30 sec.
|
||||
};
|
||||
|
||||
@@ -44,96 +34,72 @@ enum Yells
|
||||
SAY_DEATH = 3
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_CHAIN = 1,
|
||||
EVENT_DISEASE,
|
||||
EVENT_FRENZY
|
||||
};
|
||||
|
||||
class boss_meathook : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_meathook() : CreatureScript("boss_meathook") { }
|
||||
public:
|
||||
boss_meathook() : CreatureScript("boss_meathook") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return GetInstanceAI<boss_meathookAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_meathookAI : public ScriptedAI
|
||||
{
|
||||
boss_meathookAI(Creature* creature) : ScriptedAI(creature)
|
||||
struct boss_meathookAI : public BossAI
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
Talk(SAY_SPAWN);
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
uiChainTimer = urand(12000, 17000); //seen on video 13, 17, 15, 12, 16
|
||||
uiDiseaseTimer = urand(2000, 4000); //approx 3s
|
||||
uiFrenzyTimer = urand(21000, 26000); //made it up
|
||||
}
|
||||
|
||||
uint32 uiChainTimer;
|
||||
uint32 uiDiseaseTimer;
|
||||
uint32 uiFrenzyTimer;
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Initialize();
|
||||
|
||||
instance->SetData(DATA_MEATHOOK_EVENT, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
instance->SetData(DATA_MEATHOOK_EVENT, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
//Return since we have no target
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (uiDiseaseTimer <= diff)
|
||||
boss_meathookAI(Creature* creature) : BossAI(creature, DATA_MEATHOOK)
|
||||
{
|
||||
DoCastAOE(SPELL_DISEASE_EXPULSION);
|
||||
uiDiseaseTimer = urand(1500, 4000);
|
||||
} else uiDiseaseTimer -= diff;
|
||||
Talk(SAY_SPAWN);
|
||||
}
|
||||
|
||||
if (uiFrenzyTimer <= diff)
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
DoCast(me, SPELL_FRENZY);
|
||||
uiFrenzyTimer = urand(21000, 26000);
|
||||
} else uiFrenzyTimer -= diff;
|
||||
Talk(SAY_AGGRO);
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_CHAIN, urand(12000, 17000));
|
||||
events.ScheduleEvent(EVENT_DISEASE, urand(2000, 4000));
|
||||
events.ScheduleEvent(EVENT_FRENZY, urand(21000, 26000));
|
||||
}
|
||||
|
||||
if (uiChainTimer <= diff)
|
||||
void ExecuteEvent(uint32 eventId) override
|
||||
{
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||
DoCast(target, SPELL_CONSTRICTING_CHAINS); //anyone but the tank
|
||||
uiChainTimer = urand(2000, 4000);
|
||||
} else uiChainTimer -= diff;
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_CHAIN:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
|
||||
DoCast(target, SPELL_CONSTRICTING_CHAINS);
|
||||
events.ScheduleEvent(EVENT_CHAIN, urand(2000, 4000));
|
||||
case EVENT_DISEASE:
|
||||
DoCastAOE(SPELL_DISEASE_EXPULSION);
|
||||
events.ScheduleEvent(EVENT_DISEASE, urand(1500, 4000));
|
||||
break;
|
||||
case EVENT_FRENZY:
|
||||
DoCast(me, SPELL_FRENZY);
|
||||
events.ScheduleEvent(EVENT_FRENZY, urand(21000, 26000));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
void KilledUnit(Unit* victim) override
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
|
||||
instance->SetData(DATA_MEATHOOK_EVENT, DONE);
|
||||
return GetInstanceAI<boss_meathookAI>(creature);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim) override
|
||||
{
|
||||
if (victim->GetTypeId() != TYPEID_PLAYER)
|
||||
return;
|
||||
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
void AddSC_boss_meathook()
|
||||
|
||||
@@ -89,14 +89,14 @@ public:
|
||||
{
|
||||
Initialize();
|
||||
|
||||
instance->SetData(DATA_SALRAMM_EVENT, NOT_STARTED);
|
||||
instance->SetBossState(DATA_SALRAMM, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
instance->SetData(DATA_SALRAMM_EVENT, IN_PROGRESS);
|
||||
instance->SetBossState(DATA_SALRAMM, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -145,7 +145,7 @@ public:
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
|
||||
instance->SetData(DATA_SALRAMM_EVENT, DONE);
|
||||
instance->SetBossState(DATA_SALRAMM, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim) override
|
||||
|
||||
@@ -103,7 +103,7 @@ enum Says
|
||||
|
||||
//Drakonian
|
||||
SAY_PHASE302 = 0,
|
||||
SAY_PHASE305 = 1,
|
||||
SAY_PHASE305 = 1
|
||||
};
|
||||
|
||||
enum NPCs
|
||||
@@ -111,7 +111,6 @@ enum NPCs
|
||||
NPC_INFINITE_ADVERSARY = 27742,
|
||||
NPC_INFINITE_HUNTER = 27743,
|
||||
NPC_INFINITE_AGENT = 27744,
|
||||
NPC_TIME_RIFT = 28409,
|
||||
NPC_ZOMBIE = 27737,
|
||||
NPC_GHOUL = 28249,
|
||||
NPC_NECROMANCER = 28200,
|
||||
@@ -128,7 +127,7 @@ enum NPCs
|
||||
NPC_CITY_MAN = 28167,
|
||||
NPC_CITY_MAN2 = 28169,
|
||||
NPC_CITY_MAN3 = 31126,
|
||||
NPC_CITY_MAN4 = 31127,
|
||||
NPC_CITY_MAN4 = 31127
|
||||
};
|
||||
|
||||
enum Spells
|
||||
@@ -138,7 +137,7 @@ enum Spells
|
||||
SPELL_EXORCISM_N = 52445,
|
||||
SPELL_EXORCISM_H = 58822,
|
||||
SPELL_HOLY_LIGHT = 52444,
|
||||
SPELL_ARCANE_DISRUPTION = 49590,
|
||||
SPELL_ARCANE_DISRUPTION = 49590
|
||||
};
|
||||
|
||||
enum GossipMenuArthas
|
||||
@@ -392,6 +391,7 @@ public:
|
||||
uint32 gossipStep;
|
||||
uint32 bossEvent;
|
||||
uint32 wave;
|
||||
uint32 WavesCounter;
|
||||
|
||||
uint64 utherGUID;
|
||||
uint64 jainaGUID;
|
||||
@@ -411,17 +411,19 @@ public:
|
||||
{
|
||||
Initialize();
|
||||
|
||||
instance->SetData(DATA_ARTHAS_EVENT, NOT_STARTED);
|
||||
switch (instance->GetData(DATA_ARTHAS_EVENT))
|
||||
{
|
||||
case NOT_STARTED:
|
||||
bStepping = true;
|
||||
step = 0;
|
||||
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
bossEvent = DATA_MEATHOOK_EVENT;
|
||||
gossipStep = 0;
|
||||
break;
|
||||
}
|
||||
instance->SetBossState(DATA_ARTHAS, NOT_STARTED);
|
||||
|
||||
bStepping = true;
|
||||
step = 0;
|
||||
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
bossEvent = DATA_MEATHOOK;
|
||||
gossipStep = 0;
|
||||
}
|
||||
|
||||
void AttackStart(Unit* who)
|
||||
{
|
||||
if (who && !who->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC))
|
||||
npc_escortAI::AttackStart(who);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
@@ -431,7 +433,7 @@ public:
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
instance->SetData(DATA_ARTHAS_EVENT, FAIL);
|
||||
instance->SetBossState(DATA_ARTHAS, FAIL);
|
||||
}
|
||||
|
||||
void SpawnTimeRift(uint32 timeRiftID, uint64* guidVector)
|
||||
@@ -488,16 +490,15 @@ public:
|
||||
case 11:
|
||||
case 22:
|
||||
case 23:
|
||||
case 26:
|
||||
case 55:
|
||||
case 56:
|
||||
SetHoldState(true);
|
||||
bStepping = true;
|
||||
break;
|
||||
case 7:
|
||||
if (Unit* cityman0 = me->SummonCreature(NPC_CITY_MAN, 2091.977f, 1275.021f, 140.757f, 0.558f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000))
|
||||
if (Unit* cityman0 = me->FindNearestCreature(NPC_CITY_MAN, 160.0f))
|
||||
citymenGUID[0] = cityman0->GetGUID();
|
||||
if (Unit* cityman1 = me->SummonCreature(NPC_CITY_MAN2, 2093.514f, 1275.842f, 140.408f, 3.801f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000))
|
||||
if (Unit* cityman1 = me->FindNearestCreature(NPC_CITY_MAN2, 160.0f))
|
||||
citymenGUID[1] = cityman1->GetGUID();
|
||||
break;
|
||||
case 8:
|
||||
@@ -534,10 +535,12 @@ public:
|
||||
case 21:
|
||||
Talk(SAY_PHASE301);
|
||||
break;
|
||||
case 25:
|
||||
case 26:
|
||||
SetRun(false);
|
||||
SpawnTimeRift(0, &infiniteDraconianGUID[0]);
|
||||
Talk(SAY_PHASE307);
|
||||
SetHoldState(true);
|
||||
bStepping = true;
|
||||
break;
|
||||
case 29:
|
||||
SetRun(false);
|
||||
@@ -565,8 +568,8 @@ public:
|
||||
Talk(SAY_PHASE403);
|
||||
break;
|
||||
case 36:
|
||||
if (GameObject* pGate = instance->instance->GetGameObject(instance->GetData64(DATA_SHKAF_GATE)))
|
||||
pGate->SetGoState(GO_STATE_ACTIVE);
|
||||
if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_SHKAF_GATE)))
|
||||
gate->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case 45:
|
||||
SetRun(true);
|
||||
@@ -575,18 +578,18 @@ public:
|
||||
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
SetHoldState(true);
|
||||
break;
|
||||
case 47:
|
||||
case 48:
|
||||
SetRun(false);
|
||||
Talk(SAY_PHASE405);
|
||||
break;
|
||||
case 48:
|
||||
case 49:
|
||||
SetRun(true);
|
||||
Talk(SAY_PHASE406);
|
||||
break;
|
||||
case 53:
|
||||
case 50:
|
||||
Talk(SAY_PHASE407);
|
||||
break;
|
||||
case 54:
|
||||
case 51:
|
||||
gossipStep = 5;
|
||||
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
SetHoldState(true);
|
||||
@@ -598,8 +601,6 @@ public:
|
||||
{
|
||||
npc_escortAI::UpdateAI(diff);
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
|
||||
if (bStepping)
|
||||
{
|
||||
if (phaseTimer <= diff)
|
||||
@@ -765,6 +766,9 @@ public:
|
||||
stalkerGUID = pStalker->GetGUID();
|
||||
me->SetTarget(stalkerGUID);
|
||||
}
|
||||
|
||||
instance->DoUpdateWorldState(WORLDSTATE_WAVE_COUNT, 0);
|
||||
|
||||
JumpToNextStep(1000);
|
||||
break;
|
||||
case 25:
|
||||
@@ -892,14 +896,15 @@ public:
|
||||
}
|
||||
Talk(SAY_PHASE209);
|
||||
|
||||
bossEvent = DATA_MEATHOOK_EVENT;
|
||||
instance->SetData(DATA_ARTHAS_EVENT, IN_PROGRESS);
|
||||
bossEvent = DATA_MEATHOOK;
|
||||
instance->SetBossState(DATA_ARTHAS, IN_PROGRESS);
|
||||
|
||||
me->SetReactState(REACT_DEFENSIVE);
|
||||
SetDespawnAtFar(false);
|
||||
JumpToNextStep(5000);
|
||||
break;
|
||||
case 41: //Summon wave group
|
||||
// Summon wave groups - start the Infinite Corruptor timer
|
||||
case 41:
|
||||
case 43:
|
||||
case 45:
|
||||
case 47:
|
||||
@@ -907,10 +912,15 @@ public:
|
||||
case 53:
|
||||
case 55:
|
||||
case 57:
|
||||
if (instance->GetData(bossEvent) != DONE)
|
||||
if (!wave && IsHeroic() && instance->GetData(DATA_INFINITE_COUNTER) == NOT_STARTED)
|
||||
instance->SetData(DATA_INFINITE_COUNTER, IN_PROGRESS);
|
||||
|
||||
if (instance->GetBossState(bossEvent) != DONE)
|
||||
{
|
||||
SpawnWaveGroup(wave, waveGUID);
|
||||
wave++;
|
||||
WavesCounter++;
|
||||
instance->DoUpdateWorldState(WORLDSTATE_WAVE_COUNT, WavesCounter);
|
||||
}
|
||||
JumpToNextStep(500);
|
||||
break;
|
||||
@@ -922,7 +932,7 @@ public:
|
||||
case 54:
|
||||
case 56:
|
||||
case 58:
|
||||
if (instance->GetData(bossEvent) != DONE)
|
||||
if (instance->GetBossState(bossEvent) != DONE)
|
||||
{
|
||||
uint32 mobCounter = 0;
|
||||
uint32 deadCounter = 0;
|
||||
@@ -946,12 +956,14 @@ public:
|
||||
break;
|
||||
case 49: //Summon Boss
|
||||
case 59:
|
||||
if (instance->GetData(bossEvent) != DONE)
|
||||
if (instance->GetBossState(bossEvent) != DONE)
|
||||
{
|
||||
WavesCounter++;
|
||||
instance->DoUpdateWorldState(WORLDSTATE_WAVE_COUNT, WavesCounter);
|
||||
uint32 uiBossID = 0;
|
||||
if (bossEvent == DATA_MEATHOOK_EVENT)
|
||||
if (bossEvent == DATA_MEATHOOK)
|
||||
uiBossID = NPC_MEATHOOK;
|
||||
else if (bossEvent == DATA_SALRAMM_EVENT)
|
||||
else if (bossEvent == DATA_SALRAMM)
|
||||
uiBossID = NPC_SALRAMM;
|
||||
|
||||
if (Unit* pBoss = me->SummonCreature(uiBossID, 2232.19f, 1331.933f, 126.662f, 3.15f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 900000))
|
||||
@@ -965,19 +977,19 @@ public:
|
||||
break;
|
||||
case 50: //Wait Boss death
|
||||
case 60:
|
||||
if (instance->GetData(bossEvent) == DONE)
|
||||
if (instance->GetBossState(bossEvent) == DONE)
|
||||
{
|
||||
JumpToNextStep(1000);
|
||||
if (bossEvent == DATA_MEATHOOK_EVENT)
|
||||
bossEvent = DATA_SALRAMM_EVENT;
|
||||
else if (bossEvent == DATA_SALRAMM_EVENT)
|
||||
if (bossEvent == DATA_MEATHOOK)
|
||||
bossEvent = DATA_SALRAMM;
|
||||
else if (bossEvent == DATA_SALRAMM)
|
||||
{
|
||||
SetHoldState(false);
|
||||
bStepping = false;
|
||||
bossEvent = DATA_EPOCH_EVENT;
|
||||
bossEvent = DATA_EPOCH;
|
||||
}
|
||||
}
|
||||
else if (instance->GetData(bossEvent) == FAIL)
|
||||
else if (instance->GetBossState(bossEvent) == FAIL)
|
||||
npc_escortAI::EnterEvadeMode();
|
||||
else
|
||||
phaseTimer = 10000;
|
||||
@@ -1074,9 +1086,12 @@ public:
|
||||
phaseTimer = 1000;
|
||||
else
|
||||
{
|
||||
if (step == 72) Talk(SAY_PHASE308);
|
||||
if (step == 74) Talk(SAY_PHASE308);
|
||||
if (step == 76) Talk(SAY_PHASE310);
|
||||
if (step == 72)
|
||||
Talk(SAY_PHASE308);
|
||||
if (step == 74)
|
||||
Talk(SAY_PHASE308);
|
||||
if (step == 76)
|
||||
Talk(SAY_PHASE310);
|
||||
SetHoldState(false);
|
||||
bStepping = false;
|
||||
SetRun(true);
|
||||
@@ -1097,7 +1112,7 @@ public:
|
||||
JumpToNextStep(1000);
|
||||
break;
|
||||
case 80:
|
||||
if (instance->GetData(DATA_EPOCH_EVENT) != DONE)
|
||||
if (instance->GetBossState(DATA_EPOCH) != DONE)
|
||||
{
|
||||
SpawnTimeRift(17, &epochGUID);
|
||||
if (Creature* epoch = ObjectAccessor::GetCreature(*me, epochGUID))
|
||||
@@ -1107,12 +1122,12 @@ public:
|
||||
JumpToNextStep(18000);
|
||||
break;
|
||||
case 81:
|
||||
if (instance->GetData(DATA_EPOCH_EVENT) != DONE)
|
||||
if (instance->GetBossState(DATA_EPOCH) != DONE)
|
||||
Talk(SAY_PHASE315);
|
||||
JumpToNextStep(6000);
|
||||
break;
|
||||
case 82:
|
||||
if (instance->GetData(DATA_EPOCH_EVENT) != DONE)
|
||||
if (instance->GetBossState(DATA_EPOCH) != DONE)
|
||||
{
|
||||
if (Creature* epoch = ObjectAccessor::GetCreature(*me, epochGUID))
|
||||
{
|
||||
@@ -1126,15 +1141,15 @@ public:
|
||||
JumpToNextStep(1000);
|
||||
break;
|
||||
case 83:
|
||||
if (instance->GetData(DATA_EPOCH_EVENT) == DONE)
|
||||
if (instance->GetBossState(DATA_EPOCH) == DONE)
|
||||
{
|
||||
gossipStep = 3;
|
||||
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
bStepping = false;
|
||||
bossEvent = DATA_MAL_GANIS_EVENT;
|
||||
bossEvent = DATA_MAL_GANIS;
|
||||
JumpToNextStep(15000);
|
||||
}
|
||||
else if (instance->GetData(DATA_EPOCH_EVENT) == FAIL)
|
||||
else if (instance->GetBossState(DATA_EPOCH) == FAIL)
|
||||
npc_escortAI::EnterEvadeMode();
|
||||
else
|
||||
phaseTimer = 10000;
|
||||
@@ -1153,8 +1168,8 @@ public:
|
||||
malganisGUID = malganis->GetGUID();
|
||||
malganis->SetReactState(REACT_PASSIVE);
|
||||
}
|
||||
if (GameObject* pGate = instance->instance->GetGameObject(instance->GetData64(DATA_MAL_GANIS_GATE_1)))
|
||||
pGate->SetGoState(GO_STATE_ACTIVE);
|
||||
if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_MAL_GANIS_GATE_1)))
|
||||
gate->SetGoState(GO_STATE_ACTIVE);
|
||||
SetHoldState(false);
|
||||
bStepping = false;
|
||||
JumpToNextStep(0);
|
||||
@@ -1174,12 +1189,12 @@ public:
|
||||
JumpToNextStep(1000);
|
||||
break;
|
||||
case 88:
|
||||
if (instance->GetData(DATA_MAL_GANIS_EVENT) == DONE)
|
||||
if (instance->GetBossState(DATA_MAL_GANIS) == DONE)
|
||||
{
|
||||
SetHoldState(false);
|
||||
JumpToNextStep(1000);
|
||||
}
|
||||
else if (instance->GetData(DATA_MAL_GANIS_EVENT) == FAIL)
|
||||
else if (instance->GetBossState(DATA_MAL_GANIS) == FAIL)
|
||||
npc_escortAI::EnterEvadeMode();
|
||||
else
|
||||
phaseTimer = 10000;
|
||||
@@ -1192,7 +1207,7 @@ public:
|
||||
JumpToNextStep(7000);
|
||||
break;
|
||||
case 90:
|
||||
instance->SetData(DATA_ARTHAS_EVENT, DONE); //Rewards: Achiev & Chest ;D
|
||||
instance->SetBossState(DATA_ARTHAS, DONE); //Rewards: Achiev & Chest ;D
|
||||
me->SetTarget(instance->GetData64(DATA_MAL_GANIS_GATE_2)); //Look behind
|
||||
Talk(SAY_PHASE504);
|
||||
bStepping = false;
|
||||
@@ -1214,6 +1229,8 @@ public:
|
||||
|
||||
if (HealthBelowPct(40))
|
||||
DoCast(me, SPELL_HOLY_LIGHT);
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -19,19 +19,10 @@
|
||||
#define DEF_CULLING_OF_STRATHOLME_H
|
||||
|
||||
#define DataHeader "CS"
|
||||
#define CoSScriptName "instance_culling_of_stratholme"
|
||||
uint32 const EncounterCount = 5;
|
||||
|
||||
enum Data
|
||||
{
|
||||
DATA_MEATHOOK_EVENT,
|
||||
DATA_SALRAMM_EVENT,
|
||||
DATA_EPOCH_EVENT,
|
||||
DATA_MAL_GANIS_EVENT,
|
||||
DATA_INFINITE_EVENT,
|
||||
DATA_ARTHAS_EVENT,
|
||||
DATA_CRATE_COUNT,
|
||||
};
|
||||
|
||||
enum Data64
|
||||
enum DataTypes
|
||||
{
|
||||
DATA_ARTHAS,
|
||||
DATA_MEATHOOK,
|
||||
@@ -39,28 +30,35 @@ enum Data64
|
||||
DATA_EPOCH,
|
||||
DATA_MAL_GANIS,
|
||||
DATA_INFINITE,
|
||||
DATA_CRATE_COUNT,
|
||||
DATA_SHKAF_GATE,
|
||||
DATA_MAL_GANIS_GATE_1,
|
||||
DATA_MAL_GANIS_GATE_2,
|
||||
DATA_EXIT_GATE,
|
||||
DATA_MAL_GANIS_CHEST
|
||||
DATA_MAL_GANIS_CHEST,
|
||||
DATA_INFINITE_COUNTER
|
||||
};
|
||||
|
||||
enum Creatures
|
||||
enum CreatureIds
|
||||
{
|
||||
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_CHROMIE_2 = 27915,
|
||||
NPC_GENERIC_BUNNY = 28960,
|
||||
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_CHROMIE = 26527,
|
||||
NPC_CHROMIE_2 = 27915,
|
||||
NPC_CHROMIE_3 = 30997,
|
||||
NPC_GENERIC_BUNNY = 28960,
|
||||
|
||||
NPC_TIME_RIFT = 28409,
|
||||
NPC_GUARDIAN_OF_TIME = 32281
|
||||
};
|
||||
|
||||
enum GameObjects
|
||||
enum GameObjectIds
|
||||
{
|
||||
GO_SHKAF_GATE = 188686,
|
||||
GO_MALGANIS_GATE_1 = 187711,
|
||||
@@ -69,7 +67,7 @@ enum GameObjects
|
||||
GO_MALGANIS_CHEST_N = 190663,
|
||||
GO_MALGANIS_CHEST_H = 193597,
|
||||
GO_SUSPICIOUS_CRATE = 190094,
|
||||
GO_PLAGUED_CRATE = 190095,
|
||||
GO_PLAGUED_CRATE = 190095
|
||||
};
|
||||
|
||||
enum WorldStatesCoT
|
||||
@@ -78,12 +76,28 @@ enum WorldStatesCoT
|
||||
WORLDSTATE_CRATES_REVEALED = 3480,
|
||||
WORLDSTATE_WAVE_COUNT = 3504,
|
||||
WORLDSTATE_TIME_GUARDIAN = 3931,
|
||||
WORLDSTATE_TIME_GUARDIAN_SHOW = 3932,
|
||||
WORLDSTATE_TIME_GUARDIAN_SHOW = 3932
|
||||
};
|
||||
|
||||
enum CrateSpells
|
||||
{
|
||||
SPELL_CRATES_CREDIT = 58109,
|
||||
SPELL_CRATES_CREDIT = 58109
|
||||
};
|
||||
|
||||
enum Texts
|
||||
{
|
||||
SAY_CRATES_COMPLETED = 0,
|
||||
// Chromie
|
||||
SAY_INFINITE_START = 0, // On Infinite Corruptor event start
|
||||
SAY_INFINITE = 1, // On Infinite Corruptor event at 5 minutes
|
||||
SAY_INFINITE_FAIL = 2, // On Infinite Corruptor event fail
|
||||
// Infinite Corruptor
|
||||
SAY_FAIL_EVENT = 2 // On Infinite Corruptor event fail
|
||||
};
|
||||
|
||||
enum InstanceEvents
|
||||
{
|
||||
EVENT_INFINITE_TIMER = 1
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -23,8 +23,6 @@
|
||||
#include "TemporarySummon.h"
|
||||
#include "SpellInfo.h"
|
||||
|
||||
#define MAX_ENCOUNTER 5
|
||||
|
||||
/* Culling of Stratholme encounters:
|
||||
0 - Meathook
|
||||
1 - Salramm the Fleshcrafter
|
||||
@@ -33,51 +31,51 @@
|
||||
4 - Infinite Corruptor (Heroic only)
|
||||
*/
|
||||
|
||||
enum Texts
|
||||
Position const ChromieSummonPos[] =
|
||||
{
|
||||
SAY_CRATES_COMPLETED = 0,
|
||||
{ 1813.298f, 1283.578f, 142.3258f, 3.878161f },
|
||||
{ 2273.725f, 1483.684f, 128.7205f, 6.057528f }
|
||||
};
|
||||
|
||||
Position const ChromieSummonPos = {1813.298f, 1283.578f, 142.3258f, 3.878161f};
|
||||
Position const InfiniteCorruptorPos = { 2335.47f, 1262.04f, 132.921f, 1.42079f };
|
||||
Position const TimeRiftPos = { 2334.626f, 1280.45f, 133.0066f, 1.727876f };
|
||||
Position const GuardianOfTimePos = { 2321.489f, 1268.383f, 132.8507f, 0.418879f };
|
||||
|
||||
DoorData const doorData[] =
|
||||
{
|
||||
{ GO_MALGANIS_GATE_2, DATA_MAL_GANIS, DOOR_TYPE_ROOM, BOUNDARY_NONE },
|
||||
{ GO_EXIT_GATE, DATA_MAL_GANIS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
|
||||
{ 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
|
||||
};
|
||||
|
||||
class instance_culling_of_stratholme : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_culling_of_stratholme() : InstanceMapScript("instance_culling_of_stratholme", 595) { }
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const override
|
||||
{
|
||||
return new instance_culling_of_stratholme_InstanceMapScript(map);
|
||||
}
|
||||
instance_culling_of_stratholme() : InstanceMapScript(CoSScriptName, 595) { }
|
||||
|
||||
struct instance_culling_of_stratholme_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_culling_of_stratholme_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
SetHeaders(DataHeader);
|
||||
_arthasGUID = 0;
|
||||
_meathookGUID = 0;
|
||||
_salrammGUID = 0;
|
||||
_epochGUID = 0;
|
||||
_malGanisGUID = 0;
|
||||
_infiniteGUID = 0;
|
||||
_shkafGateGUID = 0;
|
||||
SetBossNumber(EncounterCount);
|
||||
LoadDoorData(doorData);
|
||||
|
||||
_chromieGUID = 0;
|
||||
_arthasGUID = 0;
|
||||
_meathookGUID = 0;
|
||||
_salrammGUID = 0;
|
||||
_epochGUID = 0;
|
||||
_malGanisGUID = 0;
|
||||
_infiniteGUID = 0;
|
||||
_shkafGateGUID = 0;
|
||||
_malGanisGate1GUID = 0;
|
||||
_malGanisGate2GUID = 0;
|
||||
_exitGateGUID = 0;
|
||||
_exitGateGUID = 0;
|
||||
_malGanisChestGUID = 0;
|
||||
_genericBunnyGUID = 0;
|
||||
memset(&_encounterState[0], 0, sizeof(uint32) * MAX_ENCOUNTER);
|
||||
_crateCount = 0;
|
||||
}
|
||||
|
||||
bool IsEncounterInProgress() const override
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
if (_encounterState[i] == IN_PROGRESS)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
_genericBunnyGUID = 0;
|
||||
_crateCount = 0;
|
||||
_eventTimer = 0;
|
||||
}
|
||||
|
||||
void FillInitialWorldStates(WorldPacket& data) override
|
||||
@@ -93,6 +91,9 @@ class instance_culling_of_stratholme : public InstanceMapScript
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_CHROMIE:
|
||||
_chromieGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_ARTHAS:
|
||||
_arthasGUID = creature->GetGUID();
|
||||
break;
|
||||
@@ -110,10 +111,13 @@ class instance_culling_of_stratholme : public InstanceMapScript
|
||||
break;
|
||||
case NPC_INFINITE:
|
||||
_infiniteGUID = creature->GetGUID();
|
||||
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, 1);
|
||||
break;
|
||||
case NPC_GENERIC_BUNNY:
|
||||
_genericBunnyGUID = creature->GetGUID();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,17 +133,30 @@ class instance_culling_of_stratholme : public InstanceMapScript
|
||||
break;
|
||||
case GO_MALGANIS_GATE_2:
|
||||
_malGanisGate2GUID = go->GetGUID();
|
||||
AddDoor(go, true);
|
||||
break;
|
||||
case GO_EXIT_GATE:
|
||||
_exitGateGUID = go->GetGUID();
|
||||
if (_encounterState[3] == DONE)
|
||||
HandleGameObject(_exitGateGUID, true);
|
||||
AddDoor(go, true);
|
||||
break;
|
||||
case GO_MALGANIS_CHEST_N:
|
||||
case GO_MALGANIS_CHEST_H:
|
||||
_malGanisChestGUID = go->GetGUID();
|
||||
if (_encounterState[3] == DONE)
|
||||
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectRemove(GameObject* go) override
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_MALGANIS_GATE_2:
|
||||
case GO_EXIT_GATE:
|
||||
AddDoor(go, false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -148,36 +165,6 @@ class instance_culling_of_stratholme : public InstanceMapScript
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_MEATHOOK_EVENT:
|
||||
_encounterState[0] = data;
|
||||
break;
|
||||
case DATA_SALRAMM_EVENT:
|
||||
_encounterState[1] = data;
|
||||
break;
|
||||
case DATA_EPOCH_EVENT:
|
||||
_encounterState[2] = data;
|
||||
break;
|
||||
case DATA_MAL_GANIS_EVENT:
|
||||
_encounterState[3] = data;
|
||||
|
||||
switch (_encounterState[3])
|
||||
{
|
||||
case NOT_STARTED:
|
||||
HandleGameObject(_malGanisGate2GUID, true);
|
||||
break;
|
||||
case IN_PROGRESS:
|
||||
HandleGameObject(_malGanisGate2GUID, false);
|
||||
break;
|
||||
case DONE:
|
||||
HandleGameObject(_exitGateGUID, true);
|
||||
if (GameObject* go = instance->GetGameObject(_malGanisChestGUID))
|
||||
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DATA_INFINITE_EVENT:
|
||||
_encounterState[4] = data;
|
||||
break;
|
||||
case DATA_CRATE_COUNT:
|
||||
_crateCount = data;
|
||||
if (_crateCount == 5)
|
||||
@@ -186,34 +173,70 @@ class instance_culling_of_stratholme : public InstanceMapScript
|
||||
bunny->CastSpell(bunny, SPELL_CRATES_CREDIT, true);
|
||||
|
||||
// Summon Chromie and global whisper
|
||||
if (Creature* chromie = instance->SummonCreature(NPC_CHROMIE_2, ChromieSummonPos))
|
||||
if (Creature* chromie = instance->SummonCreature(NPC_CHROMIE_2, ChromieSummonPos[0]))
|
||||
if (!instance->GetPlayers().isEmpty())
|
||||
chromie->AI()->TalkToMap(SAY_CRATES_COMPLETED);
|
||||
}
|
||||
DoUpdateWorldState(WORLDSTATE_CRATES_REVEALED, _crateCount);
|
||||
break;
|
||||
case DATA_INFINITE_COUNTER:
|
||||
_infiniteCouterState = data;
|
||||
if (data == IN_PROGRESS)
|
||||
{
|
||||
if (!_infiniteGUID)
|
||||
{
|
||||
_eventTimer = 25;
|
||||
instance->SummonCreature(NPC_INFINITE, InfiniteCorruptorPos);
|
||||
instance->SummonCreature(NPC_TIME_RIFT, TimeRiftPos);
|
||||
instance->SummonCreature(NPC_GUARDIAN_OF_TIME, GuardianOfTimePos);
|
||||
events.ScheduleEvent(EVENT_INFINITE_TIMER, 1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 type, EncounterState state) override
|
||||
{
|
||||
if (!InstanceScript::SetBossState(type, state))
|
||||
return false;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case DATA_INFINITE:
|
||||
if (state == DONE)
|
||||
{
|
||||
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, 0);
|
||||
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN, 0);
|
||||
}
|
||||
break;
|
||||
case DATA_MAL_GANIS:
|
||||
if (state == DONE)
|
||||
{
|
||||
if (GameObject* go = instance->GetGameObject(_malGanisChestGUID))
|
||||
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
|
||||
instance->SummonCreature(NPC_CHROMIE_3, ChromieSummonPos[1]);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (data == DONE)
|
||||
SaveToDB();
|
||||
return true;
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type) const override
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_MEATHOOK_EVENT:
|
||||
return _encounterState[0];
|
||||
case DATA_SALRAMM_EVENT:
|
||||
return _encounterState[1];
|
||||
case DATA_EPOCH_EVENT:
|
||||
return _encounterState[2];
|
||||
case DATA_MAL_GANIS_EVENT:
|
||||
return _encounterState[3];
|
||||
case DATA_INFINITE_EVENT:
|
||||
return _encounterState[4];
|
||||
case DATA_CRATE_COUNT:
|
||||
return _crateCount;
|
||||
case DATA_INFINITE_COUNTER:
|
||||
return _infiniteCouterState;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -244,58 +267,70 @@ class instance_culling_of_stratholme : public InstanceMapScript
|
||||
return _exitGateGUID;
|
||||
case DATA_MAL_GANIS_CHEST:
|
||||
return _malGanisChestGUID;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string GetSaveData() override
|
||||
void Update(uint32 diff) override
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
events.Update(diff);
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "C S " << _encounterState[0] << ' ' << _encounterState[1] << ' '
|
||||
<< _encounterState[2] << ' ' << _encounterState[3] << ' ' << _encounterState[4];
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(const char* in) override
|
||||
{
|
||||
if (!in)
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_INFINITE_TIMER:
|
||||
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN, _eventTimer);
|
||||
|
||||
switch (_eventTimer)
|
||||
{
|
||||
case 25:
|
||||
if (instance->HavePlayers())
|
||||
if (Creature* chromie = instance->GetCreature(_chromieGUID))
|
||||
chromie->AI()->TalkToMap(SAY_INFINITE_START);
|
||||
break;
|
||||
case 5:
|
||||
if (instance->HavePlayers())
|
||||
if (Creature* chromie = instance->GetCreature(_chromieGUID))
|
||||
chromie->AI()->TalkToMap(SAY_INFINITE);
|
||||
break;
|
||||
case 0:
|
||||
if (instance->HavePlayers())
|
||||
if (Creature* chromie = instance->GetCreature(_chromieGUID))
|
||||
chromie->AI()->TalkToMap(SAY_INFINITE_FAIL);
|
||||
|
||||
if (Creature* infinite = instance->GetCreature(_infiniteGUID))
|
||||
{
|
||||
if (Creature* guardian = infinite->FindNearestCreature(NPC_GUARDIAN_OF_TIME, 100.0f))
|
||||
infinite->Kill(guardian);
|
||||
|
||||
if (Creature* rift = infinite->FindNearestCreature(NPC_TIME_RIFT, 100.0f))
|
||||
{
|
||||
infinite->GetMotionMaster()->MovePoint(0, rift->GetPositionX(), rift->GetPositionY(), rift->GetPositionZ());
|
||||
rift->DespawnOrUnsummon(3000);
|
||||
}
|
||||
|
||||
infinite->DespawnOrUnsummon(3000);
|
||||
infinite->AI()->Talk(SAY_FAIL_EVENT);
|
||||
}
|
||||
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, 0);
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_INFINITE_TIMER, 60000);
|
||||
--_eventTimer;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(in);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
uint16 data0, data1, data2, data3, data4;
|
||||
|
||||
std::istringstream loadStream(in);
|
||||
loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 >> data4;
|
||||
|
||||
if (dataHead1 == 'C' && dataHead2 == 'S')
|
||||
{
|
||||
_encounterState[0] = data0;
|
||||
_encounterState[1] = data1;
|
||||
_encounterState[2] = data2;
|
||||
_encounterState[3] = data3;
|
||||
_encounterState[4] = data4;
|
||||
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
if (_encounterState[i] == IN_PROGRESS)
|
||||
_encounterState[i] = NOT_STARTED;
|
||||
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
private:
|
||||
uint64 _chromieGUID;
|
||||
uint64 _arthasGUID;
|
||||
uint64 _meathookGUID;
|
||||
uint64 _salrammGUID;
|
||||
@@ -308,9 +343,18 @@ class instance_culling_of_stratholme : public InstanceMapScript
|
||||
uint64 _exitGateGUID;
|
||||
uint64 _malGanisChestGUID;
|
||||
uint64 _genericBunnyGUID;
|
||||
uint32 _encounterState[MAX_ENCOUNTER];
|
||||
|
||||
uint32 _crateCount;
|
||||
uint32 _eventTimer;
|
||||
uint32 _infiniteCouterState;
|
||||
|
||||
EventMap events;
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const override
|
||||
{
|
||||
return new instance_culling_of_stratholme_InstanceMapScript(map);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_culling_of_stratholme()
|
||||
|
||||
Reference in New Issue
Block a user