mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-25 11:21:58 +01:00
Merge branch 'master' of https://github.com/TrinityCore/TrinityCore into 4.3.4
Conflicts: src/server/authserver/Server/AuthSession.cpp src/server/game/Entities/Player/Player.cpp src/server/game/Server/WorldSocket.cpp
This commit is contained in:
@@ -70,6 +70,11 @@ class boss_arcanist_doan : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_POLYMORPH, 30 * IN_MILLISECONDS);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
@@ -119,7 +124,7 @@ class boss_arcanist_doan : public CreatureScript
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new boss_arcanist_doanAI(creature);
|
||||
return GetInstanceAI<boss_arcanist_doanAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
|
||||
* Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
@@ -25,79 +24,104 @@ EndScriptData */
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "scarlet_monastery.h"
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_CALLOFTHEGRAVE = 17831,
|
||||
SPELL_CALL_OF_THE_GRAVE = 17831,
|
||||
SPELL_TERRIFY = 7399,
|
||||
SPELL_SOULSIPHON = 7290
|
||||
SPELL_SOUL_SIPHON = 7290
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_CALL_OF_GRAVE = 1,
|
||||
EVENT_TERRIFY,
|
||||
EVENT_SOUL_SIPHON
|
||||
};
|
||||
|
||||
class boss_azshir_the_sleepless : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_azshir_the_sleepless() : CreatureScript("boss_azshir_the_sleepless") { }
|
||||
public:
|
||||
boss_azshir_the_sleepless() : CreatureScript("boss_azshir_the_sleepless") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new boss_azshir_the_sleeplessAI(creature);
|
||||
}
|
||||
|
||||
struct boss_azshir_the_sleeplessAI : public ScriptedAI
|
||||
{
|
||||
boss_azshir_the_sleeplessAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
uint32 SoulSiphon_Timer;
|
||||
uint32 CallOftheGrave_Timer;
|
||||
uint32 Terrify_Timer;
|
||||
|
||||
void Reset() override
|
||||
struct boss_azshir_the_sleeplessAI : public BossAI
|
||||
{
|
||||
SoulSiphon_Timer = 1;
|
||||
CallOftheGrave_Timer = 30000;
|
||||
Terrify_Timer = 20000;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override { }
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//If we are <50% hp cast Soul Siphon rank 1
|
||||
if (!HealthAbovePct(50) && !me->IsNonMeleeSpellCast(false))
|
||||
boss_azshir_the_sleeplessAI(Creature* creature) : BossAI(creature, DATA_AZSHIR)
|
||||
{
|
||||
//SoulSiphon_Timer
|
||||
if (SoulSiphon_Timer <= diff)
|
||||
_siphon = false;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
_siphon = false;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_CALL_OF_GRAVE, 30000);
|
||||
events.ScheduleEvent(EVENT_TERRIFY, 20000);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*done_by*/, uint32& /*damage*/) override
|
||||
{
|
||||
if (HealthBelowPct(50) && !_siphon)
|
||||
{
|
||||
DoCastVictim(SPELL_SOULSIPHON);
|
||||
DoCastVictim(SPELL_SOUL_SIPHON);
|
||||
events.ScheduleEvent(EVENT_SOUL_SIPHON, 20000);
|
||||
_siphon = true;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
//SoulSiphon_Timer = 20000;
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_CALL_OF_GRAVE:
|
||||
DoCastVictim(SPELL_CALL_OF_THE_GRAVE);
|
||||
events.ScheduleEvent(EVENT_CALL_OF_GRAVE, 30000);
|
||||
break;
|
||||
case EVENT_TERRIFY:
|
||||
DoCastVictim(SPELL_TERRIFY);
|
||||
events.ScheduleEvent(EVENT_TERRIFY, 20000);
|
||||
break;
|
||||
case EVENT_SOUL_SIPHON:
|
||||
DoCastVictim(SPELL_SOUL_SIPHON);
|
||||
events.ScheduleEvent(EVENT_SOUL_SIPHON, 20000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else SoulSiphon_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
//CallOfTheGrave_Timer
|
||||
if (CallOftheGrave_Timer <= diff)
|
||||
{
|
||||
DoCastVictim(SPELL_CALLOFTHEGRAVE);
|
||||
CallOftheGrave_Timer = 30000;
|
||||
}
|
||||
else CallOftheGrave_Timer -= diff;
|
||||
private:
|
||||
bool _siphon;
|
||||
};
|
||||
|
||||
//Terrify_Timer
|
||||
if (Terrify_Timer <= diff)
|
||||
{
|
||||
DoCastVictim(SPELL_TERRIFY);
|
||||
Terrify_Timer = 20000;
|
||||
}
|
||||
else Terrify_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return GetInstanceAI<boss_azshir_the_sleeplessAI>(creature);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
void AddSC_boss_azshir_the_sleepless()
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
|
||||
* Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
@@ -16,15 +15,9 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Bloodmage_Thalnos
|
||||
SD%Complete: 100
|
||||
SDComment:
|
||||
SDCategory: Scarlet Monastery
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "scarlet_monastery.h"
|
||||
|
||||
enum Yells
|
||||
{
|
||||
@@ -38,95 +31,102 @@ enum Spells
|
||||
SPELL_FLAMESHOCK = 8053,
|
||||
SPELL_SHADOWBOLT = 1106,
|
||||
SPELL_FLAMESPIKE = 8814,
|
||||
SPELL_FIRENOVA = 16079,
|
||||
SPELL_FIRENOVA = 16079
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_FLAME_SHOCK = 1,
|
||||
EVENT_SHADOW_BOLT,
|
||||
EVENT_FLAME_SPIKE,
|
||||
EVENT_FIRE_NOVA
|
||||
};
|
||||
|
||||
class boss_bloodmage_thalnos : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_bloodmage_thalnos() : CreatureScript("boss_bloodmage_thalnos") { }
|
||||
public:
|
||||
boss_bloodmage_thalnos() : CreatureScript("boss_bloodmage_thalnos") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new boss_bloodmage_thalnosAI(creature);
|
||||
}
|
||||
|
||||
struct boss_bloodmage_thalnosAI : public ScriptedAI
|
||||
{
|
||||
boss_bloodmage_thalnosAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
bool HpYell;
|
||||
uint32 FlameShock_Timer;
|
||||
uint32 ShadowBolt_Timer;
|
||||
uint32 FlameSpike_Timer;
|
||||
uint32 FireNova_Timer;
|
||||
|
||||
void Reset() override
|
||||
struct boss_bloodmage_thalnosAI : public BossAI
|
||||
{
|
||||
HpYell = false;
|
||||
FlameShock_Timer = 10000;
|
||||
ShadowBolt_Timer = 2000;
|
||||
FlameSpike_Timer = 8000;
|
||||
FireNova_Timer = 40000;
|
||||
}
|
||||
boss_bloodmage_thalnosAI(Creature* creature) : BossAI(creature, DATA_BLOODMAGE_THALNOS)
|
||||
{
|
||||
_hpYell = false;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
void Reset() override
|
||||
{
|
||||
_hpYell = false;
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_FLAME_SHOCK, 10000);
|
||||
events.ScheduleEvent(EVENT_SHADOW_BOLT, 2000);
|
||||
events.ScheduleEvent(EVENT_FLAME_SPIKE, 8000);
|
||||
events.ScheduleEvent(EVENT_FIRE_NOVA, 40000);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) override
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*done_by*/, uint32& /*damage*/) override
|
||||
{
|
||||
if (HealthBelowPct(35) && !_hpYell)
|
||||
{
|
||||
Talk(SAY_HEALTH);
|
||||
_hpYell = true;
|
||||
}
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId) override
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_FLAME_SHOCK:
|
||||
DoCastVictim(SPELL_FLAMESHOCK);
|
||||
events.ScheduleEvent(EVENT_FLAME_SHOCK, urand(10000, 15000));
|
||||
break;
|
||||
case EVENT_SHADOW_BOLT:
|
||||
DoCastVictim(SPELL_SHADOWBOLT);
|
||||
events.ScheduleEvent(EVENT_SHADOW_BOLT, 2000);
|
||||
break;
|
||||
case EVENT_FLAME_SPIKE:
|
||||
DoCastVictim(SPELL_FLAMESPIKE);
|
||||
events.ScheduleEvent(EVENT_FLAME_SPIKE, 30000);
|
||||
break;
|
||||
case EVENT_FIRE_NOVA:
|
||||
DoCastVictim(SPELL_FIRENOVA);
|
||||
events.ScheduleEvent(EVENT_FIRE_NOVA, 40000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
BossAI::UpdateAI(diff);
|
||||
}
|
||||
|
||||
private:
|
||||
bool _hpYell;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
return GetInstanceAI<boss_bloodmage_thalnosAI>(creature);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*Victim*/) override
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//If we are <35% hp
|
||||
if (!HpYell && !HealthAbovePct(35))
|
||||
{
|
||||
Talk(SAY_HEALTH);
|
||||
HpYell = true;
|
||||
}
|
||||
|
||||
//FlameShock_Timer
|
||||
if (FlameShock_Timer <= diff)
|
||||
{
|
||||
DoCastVictim(SPELL_FLAMESHOCK);
|
||||
FlameShock_Timer = urand(10000, 15000);
|
||||
}
|
||||
else FlameShock_Timer -= diff;
|
||||
|
||||
//FlameSpike_Timer
|
||||
if (FlameSpike_Timer <= diff)
|
||||
{
|
||||
DoCastVictim(SPELL_FLAMESPIKE);
|
||||
FlameSpike_Timer = 30000;
|
||||
}
|
||||
else FlameSpike_Timer -= diff;
|
||||
|
||||
//FireNova_Timer
|
||||
if (FireNova_Timer <= diff)
|
||||
{
|
||||
DoCastVictim(SPELL_FIRENOVA);
|
||||
FireNova_Timer = 40000;
|
||||
}
|
||||
else FireNova_Timer -= diff;
|
||||
|
||||
//ShadowBolt_Timer
|
||||
if (ShadowBolt_Timer <= diff)
|
||||
{
|
||||
DoCastVictim(SPELL_SHADOWBOLT);
|
||||
ShadowBolt_Timer = 2000;
|
||||
}
|
||||
else ShadowBolt_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
void AddSC_boss_bloodmage_thalnos()
|
||||
|
||||
@@ -155,13 +155,13 @@ public:
|
||||
{
|
||||
npc_wisp_invisAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Creaturetype = delay = spell = spell2 = 0;
|
||||
Creaturetype = delay = _spell = _spell2 = 0;
|
||||
}
|
||||
|
||||
uint32 Creaturetype;
|
||||
uint32 delay;
|
||||
uint32 spell;
|
||||
uint32 spell2;
|
||||
uint32 _spell;
|
||||
uint32 _spell2;
|
||||
void Reset() override { }
|
||||
void EnterCombat(Unit* /*who*/) override { }
|
||||
void SetType(uint32 _type)
|
||||
@@ -169,24 +169,24 @@ public:
|
||||
switch (Creaturetype = _type)
|
||||
{
|
||||
case 1:
|
||||
spell = SPELL_PUMPKIN_AURA_GREEN;
|
||||
_spell = SPELL_PUMPKIN_AURA_GREEN;
|
||||
break;
|
||||
case 2:
|
||||
delay = 15000;
|
||||
spell = SPELL_BODY_FLAME;
|
||||
spell2 = SPELL_DEATH;
|
||||
_spell = SPELL_BODY_FLAME;
|
||||
_spell2 = SPELL_DEATH;
|
||||
break;
|
||||
case 3:
|
||||
delay = 15000;
|
||||
spell = SPELL_SMOKE;
|
||||
_spell = SPELL_SMOKE;
|
||||
break;
|
||||
case 4:
|
||||
delay = 7000;
|
||||
spell2 = SPELL_WISP_BLUE;
|
||||
_spell2 = SPELL_WISP_BLUE;
|
||||
break;
|
||||
}
|
||||
if (spell)
|
||||
DoCast(me, spell);
|
||||
if (_spell)
|
||||
DoCast(me, _spell);
|
||||
}
|
||||
|
||||
void SpellHit(Unit* /*caster*/, const SpellInfo* spell) override
|
||||
@@ -196,7 +196,6 @@ public:
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
|
||||
{
|
||||
if (!who || Creaturetype != 1 || !who->isTargetableForAttack())
|
||||
return;
|
||||
@@ -212,8 +211,8 @@ public:
|
||||
if (delay <= diff)
|
||||
{
|
||||
me->RemoveAurasDueToSpell(SPELL_SMOKE);
|
||||
if (spell2)
|
||||
DoCast(me, spell2);
|
||||
if (_spell2)
|
||||
DoCast(me, _spell2);
|
||||
delay = 0;
|
||||
} else delay -= diff;
|
||||
}
|
||||
@@ -435,7 +434,7 @@ public:
|
||||
}
|
||||
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
|
||||
//instance->SetData(DATA_HORSEMAN_EVENT, NOT_STARTED);
|
||||
//instance->SetBossState(DATA_HORSEMAN_EVENT, NOT_STARTED);
|
||||
}
|
||||
|
||||
void FlyMode()
|
||||
@@ -471,7 +470,7 @@ public:
|
||||
break;
|
||||
}
|
||||
case 6:
|
||||
instance->SetData(GAMEOBJECT_PUMPKIN_SHRINE, 0); //hide gameobject
|
||||
instance->SetData(DATA_PUMPKIN_SHRINE, 0); //hide gameobject
|
||||
break;
|
||||
case 19:
|
||||
me->SetDisableGravity(false);
|
||||
@@ -493,7 +492,7 @@ public:
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
instance->SetData(DATA_HORSEMAN_EVENT, IN_PROGRESS);
|
||||
instance->SetBossState(DATA_HORSEMAN_EVENT, IN_PROGRESS);
|
||||
DoZoneInCombat();
|
||||
}
|
||||
|
||||
@@ -503,7 +502,6 @@ public:
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
|
||||
{
|
||||
if (withhead && Phase != 0)
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
@@ -567,7 +565,7 @@ public:
|
||||
flame->CastSpell(flame, SPELL_BODY_FLAME, false);
|
||||
if (Creature* wisp = DoSpawnCreature(WISP_INVIS, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 60000))
|
||||
ENSURE_AI(npc_wisp_invis::npc_wisp_invisAI, wisp->AI())->SetType(4);
|
||||
instance->SetData(DATA_HORSEMAN_EVENT, DONE);
|
||||
instance->SetBossState(DATA_HORSEMAN_EVENT, DONE);
|
||||
|
||||
Map::PlayerList const& players = me->GetMap()->GetPlayers();
|
||||
if (!players.isEmpty())
|
||||
@@ -852,7 +850,6 @@ public:
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
|
||||
{
|
||||
if (!who || !me->IsValidAttackTarget(who) || me->GetVictim())
|
||||
return;
|
||||
@@ -880,9 +877,9 @@ public:
|
||||
InstanceScript* instance = player->GetInstanceScript();
|
||||
if (instance)
|
||||
{
|
||||
if (instance->GetData(DATA_HORSEMAN_EVENT) != NOT_STARTED)
|
||||
if (instance->GetBossState(DATA_HORSEMAN_EVENT) != NOT_STARTED)
|
||||
return true;
|
||||
instance->SetData(DATA_HORSEMAN_EVENT, IN_PROGRESS);
|
||||
instance->SetBossState(DATA_HORSEMAN_EVENT, IN_PROGRESS);
|
||||
}
|
||||
/* if (soil->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER && player->getLevel() > 64)
|
||||
{
|
||||
|
||||
@@ -26,6 +26,7 @@ EndScriptData */
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedEscortAI.h"
|
||||
#include "scarlet_monastery.h"
|
||||
|
||||
enum Says
|
||||
{
|
||||
@@ -44,89 +45,103 @@ enum Spells
|
||||
SPELL_FRENZY = 8269
|
||||
};
|
||||
|
||||
enum Entry
|
||||
enum Npcs
|
||||
{
|
||||
ENTRY_SCARLET_TRAINEE = 6575,
|
||||
ENTRY_SCARLET_MYRMIDON = 4295
|
||||
NPC_SCARLET_TRAINEE = 6575,
|
||||
NPC_SCARLET_MYRMIDON = 4295
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_CLEAVE = 1,
|
||||
EVENT_WHIRLWIND
|
||||
};
|
||||
|
||||
Position const ScarletTraineePos = { 1939.18f, -431.58f, 17.09f, 6.22f };
|
||||
|
||||
class boss_herod : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_herod() : CreatureScript("boss_herod") { }
|
||||
public:
|
||||
boss_herod() : CreatureScript("boss_herod") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new boss_herodAI(creature);
|
||||
}
|
||||
|
||||
struct boss_herodAI : public ScriptedAI
|
||||
{
|
||||
boss_herodAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
bool Enrage;
|
||||
|
||||
uint32 Cleave_Timer;
|
||||
uint32 Whirlwind_Timer;
|
||||
|
||||
void Reset() override
|
||||
struct boss_herodAI : public BossAI
|
||||
{
|
||||
Enrage = false;
|
||||
Cleave_Timer = 12000;
|
||||
Whirlwind_Timer = 60000;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
DoCast(me, SPELL_RUSHINGCHARGE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) override
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
for (uint8 i = 0; i < 20; ++i)
|
||||
me->SummonCreature(ENTRY_SCARLET_TRAINEE, 1939.18f, -431.58f, 17.09f, 6.22f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 600000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//If we are <30% hp goes Enraged
|
||||
if (!Enrage && !HealthAbovePct(30) && !me->IsNonMeleeSpellCast(false))
|
||||
boss_herodAI(Creature* creature) : BossAI(creature, DATA_HEROD)
|
||||
{
|
||||
Talk(EMOTE_ENRAGE);
|
||||
Talk(SAY_ENRAGE);
|
||||
DoCast(me, SPELL_FRENZY);
|
||||
Enrage = true;
|
||||
_enrage = false;
|
||||
}
|
||||
|
||||
//Cleave_Timer
|
||||
if (Cleave_Timer <= diff)
|
||||
void Reset() override
|
||||
{
|
||||
DoCastVictim(SPELL_CLEAVE);
|
||||
Cleave_Timer = 12000;
|
||||
_enrage = false;
|
||||
_Reset();
|
||||
}
|
||||
else Cleave_Timer -= diff;
|
||||
|
||||
// Whirlwind_Timer
|
||||
if (Whirlwind_Timer <= diff)
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
Talk(SAY_WHIRLWIND);
|
||||
DoCastVictim(SPELL_WHIRLWIND);
|
||||
Whirlwind_Timer = 30000;
|
||||
}
|
||||
else Whirlwind_Timer -= diff;
|
||||
Talk(SAY_AGGRO);
|
||||
DoCast(me, SPELL_RUSHINGCHARGE);
|
||||
_EnterCombat();
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 12000);
|
||||
events.ScheduleEvent(EVENT_WHIRLWIND, 60000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) override
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
|
||||
for (uint8 i = 0; i < 20; ++i)
|
||||
me->SummonCreature(NPC_SCARLET_TRAINEE, ScarletTraineePos, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 600000);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*done_by*/, uint32& /*damage*/) override
|
||||
{
|
||||
if (HealthBelowPct(30) && !_enrage)
|
||||
{
|
||||
Talk(EMOTE_ENRAGE);
|
||||
Talk(SAY_ENRAGE);
|
||||
DoCast(me, SPELL_FRENZY);
|
||||
_enrage = true;
|
||||
}
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId) override
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_CLEAVE:
|
||||
DoCastVictim(SPELL_CLEAVE);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 12000);
|
||||
break;
|
||||
case EVENT_WHIRLWIND:
|
||||
Talk(SAY_WHIRLWIND);
|
||||
DoCastVictim(SPELL_WHIRLWIND);
|
||||
events.ScheduleEvent(EVENT_WHIRLWIND, 30000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
BossAI::UpdateAI(diff);
|
||||
}
|
||||
|
||||
private:
|
||||
bool _enrage;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return GetInstanceAI<boss_herodAI>(creature);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class npc_scarlet_trainee : public CreatureScript
|
||||
|
||||
@@ -25,6 +25,7 @@ EndScriptData */
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "scarlet_monastery.h"
|
||||
|
||||
enum Spells
|
||||
{
|
||||
@@ -43,12 +44,15 @@ public:
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new boss_high_inquisitor_fairbanksAI(creature);
|
||||
return GetInstanceAI<boss_high_inquisitor_fairbanksAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_high_inquisitor_fairbanksAI : public ScriptedAI
|
||||
{
|
||||
boss_high_inquisitor_fairbanksAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
boss_high_inquisitor_fairbanksAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
uint32 CurseOfBlood_Timer;
|
||||
uint32 DispelMagic_Timer;
|
||||
@@ -57,6 +61,7 @@ public:
|
||||
uint32 Sleep_Timer;
|
||||
uint32 Dispel_Timer;
|
||||
bool PowerWordShield;
|
||||
InstanceScript* instance;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
@@ -69,12 +74,19 @@ public:
|
||||
PowerWordShield = false;
|
||||
me->SetStandState(UNIT_STAND_STATE_DEAD);
|
||||
me->SetUInt32Value(UNIT_FIELD_BYTES_1, 7);
|
||||
instance->SetBossState(DATA_HIGH_INQUISITOR_FAIRBANKS, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
|
||||
instance->SetBossState(DATA_HIGH_INQUISITOR_FAIRBANKS, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
instance->SetBossState(DATA_HIGH_INQUISITOR_FAIRBANKS, DONE);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
|
||||
* Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
@@ -16,15 +15,9 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Houndmaster_Loksey
|
||||
SD%Complete: 100
|
||||
SDComment:
|
||||
SDCategory: Scarlet Monastery
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "scarlet_monastery.h"
|
||||
|
||||
enum Yells
|
||||
{
|
||||
@@ -37,47 +30,60 @@ enum Spells
|
||||
SPELL_BLOODLUST = 6742
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_BLOODLUST = 1
|
||||
};
|
||||
|
||||
class boss_houndmaster_loksey : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_houndmaster_loksey() : CreatureScript("boss_houndmaster_loksey") { }
|
||||
public:
|
||||
boss_houndmaster_loksey() : CreatureScript("boss_houndmaster_loksey") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new boss_houndmaster_lokseyAI(creature);
|
||||
}
|
||||
|
||||
struct boss_houndmaster_lokseyAI : public ScriptedAI
|
||||
{
|
||||
boss_houndmaster_lokseyAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
uint32 BloodLust_Timer;
|
||||
|
||||
void Reset() override
|
||||
struct boss_houndmaster_lokseyAI : public BossAI
|
||||
{
|
||||
BloodLust_Timer = 20000;
|
||||
}
|
||||
boss_houndmaster_lokseyAI(Creature* creature) : BossAI(creature, DATA_HOUNDMASTER_LOKSEY) { }
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (BloodLust_Timer <= diff)
|
||||
void Reset() override
|
||||
{
|
||||
DoCast(me, SPELL_BLOODLUST);
|
||||
BloodLust_Timer = 20000;
|
||||
_Reset();
|
||||
}
|
||||
else BloodLust_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_BLOODLUST, 20000);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId) override
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_BLOODLUST:
|
||||
DoCast(me, SPELL_BLOODLUST);
|
||||
events.ScheduleEvent(EVENT_BLOODLUST, 20000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
BossAI::UpdateAI(diff);
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return GetInstanceAI<boss_houndmaster_lokseyAI>(creature);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
void AddSC_boss_houndmaster_loksey()
|
||||
|
||||
@@ -69,11 +69,13 @@ public:
|
||||
ShadowWordPain_Timer = 5000;
|
||||
Yell60 = false;
|
||||
Yell30 = false;
|
||||
instance->SetBossState(DATA_INTERROGATOR_VISHAS, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
instance->SetBossState(DATA_INTERROGATOR_VISHAS, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*Victim*/) override
|
||||
@@ -86,6 +88,7 @@ public:
|
||||
//Any other Actions to do with vorrel? setStandState?
|
||||
if (Creature* vorrel = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_VORREL)))
|
||||
vorrel->AI()->Talk(SAY_TRIGGER_VORREL);
|
||||
instance->SetBossState(DATA_INTERROGATOR_VISHAS, DONE);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
|
||||
@@ -95,7 +95,7 @@ public:
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
|
||||
if (me->IsAlive())
|
||||
instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, NOT_STARTED);
|
||||
instance->SetBossState(DATA_MOGRAINE_AND_WHITE_EVENT, NOT_STARTED);
|
||||
|
||||
_bHasDied = false;
|
||||
_bHeal = false;
|
||||
@@ -104,8 +104,8 @@ public:
|
||||
|
||||
void JustReachedHome() override
|
||||
{
|
||||
if (instance->GetData(TYPE_MOGRAINE_AND_WHITE_EVENT) != NOT_STARTED)
|
||||
instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, FAIL);
|
||||
if (instance->GetBossState(DATA_MOGRAINE_AND_WHITE_EVENT) != NOT_STARTED)
|
||||
instance->SetBossState(DATA_MOGRAINE_AND_WHITE_EVENT, FAIL);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
@@ -129,7 +129,7 @@ public:
|
||||
//On first death, fake death and open door, as well as initiate whitemane if exist
|
||||
if (Unit* Whitemane = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_WHITEMANE)))
|
||||
{
|
||||
instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, IN_PROGRESS);
|
||||
instance->SetBossState(DATA_MOGRAINE_AND_WHITE_EVENT, IN_PROGRESS);
|
||||
|
||||
Whitemane->GetMotionMaster()->MovePoint(1, 1163.113370f, 1398.856812f, 32.527786f);
|
||||
|
||||
@@ -163,7 +163,7 @@ public:
|
||||
Talk(SAY_MO_RESURRECTED);
|
||||
_bFakeDeath = false;
|
||||
|
||||
instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, SPECIAL);
|
||||
instance->SetBossState(DATA_MOGRAINE_AND_WHITE_EVENT, SPECIAL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -172,7 +172,7 @@ public:
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (_bHasDied && !_bHeal && instance->GetData(TYPE_MOGRAINE_AND_WHITE_EVENT) == SPECIAL)
|
||||
if (_bHasDied && !_bHeal && instance->GetBossState(DATA_MOGRAINE_AND_WHITE_EVENT) == SPECIAL)
|
||||
{
|
||||
//On resurrection, stop fake death and heal whitemane and resume fight
|
||||
if (Unit* Whitemane = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_WHITEMANE)))
|
||||
@@ -254,12 +254,12 @@ public:
|
||||
_bCanResurrect = false;
|
||||
|
||||
if (me->IsAlive())
|
||||
instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, NOT_STARTED);
|
||||
instance->SetBossState(DATA_MOGRAINE_AND_WHITE_EVENT, NOT_STARTED);
|
||||
}
|
||||
|
||||
void AttackStart(Unit* who) override
|
||||
{
|
||||
if (instance->GetData(TYPE_MOGRAINE_AND_WHITE_EVENT) == NOT_STARTED)
|
||||
if (instance->GetBossState(DATA_MOGRAINE_AND_WHITE_EVENT) == NOT_STARTED)
|
||||
return;
|
||||
|
||||
ScriptedAI::AttackStart(who);
|
||||
|
||||
@@ -25,84 +25,87 @@ EndScriptData */
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "scarlet_monastery.h"
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_LICHSLAP = 28873,
|
||||
SPELL_FROSTBOLTVOLLEY = 8398,
|
||||
SPELL_FROSTBOLT_VOLLEY = 8398,
|
||||
SPELL_MINDFLAY = 17313,
|
||||
SPELL_FROSTNOVA = 15531
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_LICH_SLAP = 1,
|
||||
EVENT_FROSTBOLT_VOLLEY,
|
||||
EVENT_MIND_FLAY,
|
||||
EVENT_FROST_NOVA
|
||||
};
|
||||
|
||||
class boss_scorn : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_scorn() : CreatureScript("boss_scorn") { }
|
||||
public:
|
||||
boss_scorn() : CreatureScript("boss_scorn") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new boss_scornAI(creature);
|
||||
}
|
||||
|
||||
struct boss_scornAI : public ScriptedAI
|
||||
{
|
||||
boss_scornAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
uint32 LichSlap_Timer;
|
||||
uint32 FrostboltVolley_Timer;
|
||||
uint32 MindFlay_Timer;
|
||||
uint32 FrostNova_Timer;
|
||||
|
||||
void Reset() override
|
||||
struct boss_scornAI : public BossAI
|
||||
{
|
||||
LichSlap_Timer = 45000;
|
||||
FrostboltVolley_Timer = 30000;
|
||||
MindFlay_Timer = 30000;
|
||||
FrostNova_Timer = 30000;
|
||||
}
|
||||
boss_scornAI(Creature* creature) : BossAI(creature, DATA_SCORN) { }
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override { }
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_LICH_SLAP, 45000);
|
||||
events.ScheduleEvent(EVENT_FROSTBOLT_VOLLEY, 30000);
|
||||
events.ScheduleEvent(EVENT_MIND_FLAY, 30000);
|
||||
events.ScheduleEvent(EVENT_FROST_NOVA, 30000);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId) override
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_LICH_SLAP:
|
||||
DoCastVictim(SPELL_LICHSLAP);
|
||||
events.ScheduleEvent(EVENT_LICH_SLAP, 45000);
|
||||
break;
|
||||
case EVENT_FROSTBOLT_VOLLEY:
|
||||
DoCastVictim(SPELL_FROSTBOLT_VOLLEY);
|
||||
events.ScheduleEvent(EVENT_FROSTBOLT_VOLLEY, 20000);
|
||||
break;
|
||||
case EVENT_MIND_FLAY:
|
||||
DoCastVictim(SPELL_MINDFLAY);
|
||||
events.ScheduleEvent(EVENT_MIND_FLAY, 20000);
|
||||
break;
|
||||
case EVENT_FROST_NOVA:
|
||||
DoCastVictim(SPELL_FROSTNOVA);
|
||||
events.ScheduleEvent(EVENT_FROST_NOVA, 15000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
BossAI::UpdateAI(diff);
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//LichSlap_Timer
|
||||
if (LichSlap_Timer <= diff)
|
||||
{
|
||||
DoCastVictim(SPELL_LICHSLAP);
|
||||
LichSlap_Timer = 45000;
|
||||
}
|
||||
else LichSlap_Timer -= diff;
|
||||
|
||||
//FrostboltVolley_Timer
|
||||
if (FrostboltVolley_Timer <= diff)
|
||||
{
|
||||
DoCastVictim(SPELL_FROSTBOLTVOLLEY);
|
||||
FrostboltVolley_Timer = 20000;
|
||||
}
|
||||
else FrostboltVolley_Timer -= diff;
|
||||
|
||||
//MindFlay_Timer
|
||||
if (MindFlay_Timer <= diff)
|
||||
{
|
||||
DoCastVictim(SPELL_MINDFLAY);
|
||||
MindFlay_Timer = 20000;
|
||||
}
|
||||
else MindFlay_Timer -= diff;
|
||||
|
||||
//FrostNova_Timer
|
||||
if (FrostNova_Timer <= diff)
|
||||
{
|
||||
DoCastVictim(SPELL_FROSTNOVA);
|
||||
FrostNova_Timer = 15000;
|
||||
}
|
||||
else FrostNova_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
return GetInstanceAI<boss_scornAI>(creature);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
void AddSC_boss_scorn()
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
|
||||
* Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
@@ -16,146 +15,205 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Instance_Scarlet_Monastery
|
||||
SD%Complete: 50
|
||||
SDComment:
|
||||
SDCategory: Scarlet Monastery
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "InstanceScript.h"
|
||||
#include "scarlet_monastery.h"
|
||||
|
||||
enum Entry
|
||||
DoorData const doorData[] =
|
||||
{
|
||||
ENTRY_PUMPKIN_SHRINE = 186267,
|
||||
ENTRY_HORSEMAN = 23682,
|
||||
ENTRY_HEAD = 23775,
|
||||
ENTRY_PUMPKIN = 23694
|
||||
{ GO_HIGH_INQUISITORS_DOOR, DATA_MOGRAINE_AND_WHITE_EVENT, DOOR_TYPE_ROOM, BOUNDARY_NONE },
|
||||
{ 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
|
||||
};
|
||||
|
||||
#define MAX_ENCOUNTER 2
|
||||
|
||||
class instance_scarlet_monastery : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_scarlet_monastery() : InstanceMapScript("instance_scarlet_monastery", 189) { }
|
||||
public:
|
||||
instance_scarlet_monastery() : InstanceMapScript("instance_scarlet_monastery", 189) { }
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const override
|
||||
{
|
||||
return new instance_scarlet_monastery_InstanceMapScript(map);
|
||||
}
|
||||
|
||||
struct instance_scarlet_monastery_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_scarlet_monastery_InstanceMapScript(Map* map) : InstanceScript(map) { }
|
||||
|
||||
uint64 PumpkinShrineGUID;
|
||||
uint64 HorsemanGUID;
|
||||
uint64 HeadGUID;
|
||||
std::set<uint64> HorsemanAdds;
|
||||
|
||||
uint64 MograineGUID;
|
||||
uint64 WhitemaneGUID;
|
||||
uint64 VorrelGUID;
|
||||
uint64 DoorHighInquisitorGUID;
|
||||
|
||||
uint32 encounter[MAX_ENCOUNTER];
|
||||
|
||||
void Initialize() override
|
||||
struct instance_scarlet_monastery_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
memset(&encounter, 0, sizeof(encounter));
|
||||
|
||||
PumpkinShrineGUID = 0;
|
||||
HorsemanGUID = 0;
|
||||
HeadGUID = 0;
|
||||
HorsemanAdds.clear();
|
||||
|
||||
MograineGUID = 0;
|
||||
WhitemaneGUID = 0;
|
||||
VorrelGUID = 0;
|
||||
DoorHighInquisitorGUID = 0;
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go) override
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
instance_scarlet_monastery_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
case ENTRY_PUMPKIN_SHRINE: PumpkinShrineGUID = go->GetGUID();break;
|
||||
case 104600: DoorHighInquisitorGUID = go->GetGUID(); break;
|
||||
SetBossNumber(EncounterCount);
|
||||
LoadDoorData(doorData);
|
||||
|
||||
PumpkinShrineGUID = 0;
|
||||
HorsemanGUID = 0;
|
||||
HeadGUID = 0;
|
||||
MograineGUID = 0;
|
||||
WhitemaneGUID = 0;
|
||||
VorrelGUID = 0;
|
||||
|
||||
HorsemanAdds.clear();
|
||||
}
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature) override
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
void OnGameObjectCreate(GameObject* go) override
|
||||
{
|
||||
case ENTRY_HORSEMAN: HorsemanGUID = creature->GetGUID(); break;
|
||||
case ENTRY_HEAD: HeadGUID = creature->GetGUID(); break;
|
||||
case ENTRY_PUMPKIN: HorsemanAdds.insert(creature->GetGUID());break;
|
||||
case 3976: MograineGUID = creature->GetGUID(); break;
|
||||
case 3977: WhitemaneGUID = creature->GetGUID(); break;
|
||||
case 3981: VorrelGUID = creature->GetGUID(); break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data) override
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_MOGRAINE_AND_WHITE_EVENT:
|
||||
if (data == IN_PROGRESS)
|
||||
DoUseDoorOrButton(DoorHighInquisitorGUID);
|
||||
if (data == FAIL)
|
||||
DoUseDoorOrButton(DoorHighInquisitorGUID);
|
||||
|
||||
encounter[0] = data;
|
||||
break;
|
||||
case GAMEOBJECT_PUMPKIN_SHRINE:
|
||||
HandleGameObject(PumpkinShrineGUID, false);
|
||||
break;
|
||||
case DATA_HORSEMAN_EVENT:
|
||||
encounter[1] = data;
|
||||
if (data == DONE)
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
for (std::set<uint64>::const_iterator itr = HorsemanAdds.begin(); itr != HorsemanAdds.end(); ++itr)
|
||||
{
|
||||
Creature* add = instance->GetCreature(*itr);
|
||||
if (add && add->IsAlive())
|
||||
add->Kill(add);
|
||||
}
|
||||
HorsemanAdds.clear();
|
||||
HandleGameObject(PumpkinShrineGUID, false);
|
||||
case GO_PUMPKIN_SHRINE:
|
||||
PumpkinShrineGUID = go->GetGUID();
|
||||
break;
|
||||
case GO_HIGH_INQUISITORS_DOOR:
|
||||
AddDoor(go, true);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 type) const override
|
||||
{
|
||||
switch (type)
|
||||
void OnGameObjectRemove(GameObject* go) override
|
||||
{
|
||||
//case GAMEOBJECT_PUMPKIN_SHRINE: return PumpkinShrineGUID;
|
||||
//case DATA_HORSEMAN: return HorsemanGUID;
|
||||
//case DATA_HEAD: return HeadGUID;
|
||||
case DATA_MOGRAINE: return MograineGUID;
|
||||
case DATA_WHITEMANE: return WhitemaneGUID;
|
||||
case DATA_VORREL: return VorrelGUID;
|
||||
case DATA_DOOR_WHITEMANE: return DoorHighInquisitorGUID;
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_HIGH_INQUISITORS_DOOR:
|
||||
AddDoor(go, false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type) const override
|
||||
void OnCreatureCreate(Creature* creature) override
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_HORSEMAN:
|
||||
HorsemanGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_HEAD:
|
||||
HeadGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_PUMPKIN:
|
||||
HorsemanAdds.insert(creature->GetGUID());
|
||||
break;
|
||||
case NPC_MOGRAINE:
|
||||
MograineGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_WHITEMANE:
|
||||
WhitemaneGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_VORREL:
|
||||
VorrelGUID = creature->GetGUID();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 /*data*/) override
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_PUMPKIN_SHRINE:
|
||||
HandleGameObject(PumpkinShrineGUID, false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 type, EncounterState state) override
|
||||
{
|
||||
if (!InstanceScript::SetBossState(type, state))
|
||||
return false;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case DATA_HORSEMAN_EVENT:
|
||||
if (state == DONE)
|
||||
{
|
||||
for (uint64 guid : HorsemanAdds)
|
||||
{
|
||||
Creature* add = instance->GetCreature(guid);
|
||||
if (add && add->IsAlive())
|
||||
add->Kill(add);
|
||||
}
|
||||
HorsemanAdds.clear();
|
||||
HandleGameObject(PumpkinShrineGUID, false);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 type) const override
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_MOGRAINE:
|
||||
return MograineGUID;
|
||||
case DATA_WHITEMANE:
|
||||
return WhitemaneGUID;
|
||||
case DATA_VORREL:
|
||||
return VorrelGUID;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string GetSaveData() override
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "S M " << GetBossSaveData();
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(const char* str) override
|
||||
{
|
||||
if (!str)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(str);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(str);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'S' && dataHead2 == 'M')
|
||||
{
|
||||
for (uint8 i = 0; i < EncounterCount; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
protected:
|
||||
uint64 PumpkinShrineGUID;
|
||||
uint64 HorsemanGUID;
|
||||
uint64 HeadGUID;
|
||||
uint64 MograineGUID;
|
||||
uint64 WhitemaneGUID;
|
||||
uint64 VorrelGUID;
|
||||
|
||||
std::set<uint64> HorsemanAdds;
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const override
|
||||
{
|
||||
if (type == TYPE_MOGRAINE_AND_WHITE_EVENT)
|
||||
return encounter[0];
|
||||
if (type == DATA_HORSEMAN_EVENT)
|
||||
return encounter[1];
|
||||
return 0;
|
||||
return new instance_scarlet_monastery_InstanceMapScript(map);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
void AddSC_instance_scarlet_monastery()
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
|
||||
* Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
@@ -19,19 +18,43 @@
|
||||
#ifndef SCARLET_M_
|
||||
#define SCARLET_M_
|
||||
|
||||
uint32 const EncounterCount = 10;
|
||||
|
||||
enum DataTypes
|
||||
{
|
||||
TYPE_MOGRAINE_AND_WHITE_EVENT = 1,
|
||||
|
||||
DATA_MOGRAINE_AND_WHITE_EVENT = 1,
|
||||
DATA_MOGRAINE = 2,
|
||||
DATA_WHITEMANE = 3,
|
||||
DATA_DOOR_WHITEMANE = 4,
|
||||
|
||||
DATA_HORSEMAN_EVENT = 5,
|
||||
GAMEOBJECT_PUMPKIN_SHRINE = 6,
|
||||
DATA_HORSEMAN_EVENT = 4,
|
||||
DATA_PUMPKIN_SHRINE = 5,
|
||||
|
||||
DATA_VORREL = 7,
|
||||
DATA_ARCANIST_DOAN = 8
|
||||
DATA_VORREL = 6,
|
||||
DATA_ARCANIST_DOAN = 7,
|
||||
DATA_AZSHIR = 8,
|
||||
DATA_BLOODMAGE_THALNOS = 9,
|
||||
DATA_HEROD = 10,
|
||||
DATA_HIGH_INQUISITOR_FAIRBANKS = 11,
|
||||
DATA_HOUNDMASTER_LOKSEY = 12,
|
||||
DATA_INTERROGATOR_VISHAS = 13,
|
||||
DATA_SCORN = 14
|
||||
};
|
||||
|
||||
enum CreatureIds
|
||||
{
|
||||
NPC_MOGRAINE = 3976,
|
||||
NPC_WHITEMANE = 3977,
|
||||
NPC_VORREL = 3981,
|
||||
|
||||
NPC_HORSEMAN = 23682,
|
||||
NPC_HEAD = 23775,
|
||||
NPC_PUMPKIN = 23694
|
||||
};
|
||||
|
||||
enum GameObjectIds
|
||||
{
|
||||
GO_HIGH_INQUISITORS_DOOR = 104600,
|
||||
GO_PUMPKIN_SHRINE = 186267
|
||||
};
|
||||
|
||||
#endif // SCARLET_M_
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -15,13 +15,12 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "InstanceScript.h"
|
||||
#include "Player.h"
|
||||
#include "WorldPacket.h"
|
||||
#include "SpellScript.h"
|
||||
#include "ulduar.h"
|
||||
#include "Player.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "SpellScript.h"
|
||||
#include "WorldPacket.h"
|
||||
|
||||
static DoorData const doorData[] =
|
||||
{
|
||||
@@ -32,6 +31,9 @@ static DoorData const doorData[] =
|
||||
{ GO_HODIR_ENTRANCE, BOSS_HODIR, DOOR_TYPE_ROOM, BOUNDARY_E },
|
||||
{ GO_HODIR_DOOR, BOSS_HODIR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
|
||||
{ GO_HODIR_ICE_DOOR, BOSS_HODIR, DOOR_TYPE_PASSAGE, BOUNDARY_W },
|
||||
{ GO_MIMIRON_DOOR_1, BOSS_MIMIRON, DOOR_TYPE_ROOM, BOUNDARY_W },
|
||||
{ GO_MIMIRON_DOOR_2, BOSS_MIMIRON, DOOR_TYPE_ROOM, BOUNDARY_E },
|
||||
{ GO_MIMIRON_DOOR_3, BOSS_MIMIRON, DOOR_TYPE_ROOM, BOUNDARY_S },
|
||||
{ GO_VEZAX_DOOR, BOSS_VEZAX, DOOR_TYPE_PASSAGE, BOUNDARY_E },
|
||||
{ GO_YOGG_SARON_DOOR, BOSS_YOGG_SARON, DOOR_TYPE_ROOM, BOUNDARY_S },
|
||||
{ GO_DOODAD_UL_SIGILDOOR_03, BOSS_ALGALON, DOOR_TYPE_ROOM, BOUNDARY_W },
|
||||
@@ -70,11 +72,14 @@ class instance_ulduar : public InstanceMapScript
|
||||
uint64 AssemblyGUIDs[3];
|
||||
uint64 KologarnGUID;
|
||||
uint64 AuriayaGUID;
|
||||
uint64 MimironGUID;
|
||||
uint64 HodirGUID;
|
||||
uint64 ThorimGUID;
|
||||
uint64 FreyaGUID;
|
||||
uint64 ElderGUIDs[3];
|
||||
uint64 MimironGUID;
|
||||
uint64 MimironVehicleGUIDs[3];
|
||||
uint64 MimironComputerGUID;
|
||||
uint64 MimironWorldTriggerGUID;
|
||||
uint64 VezaxGUID;
|
||||
uint64 YoggSaronGUID;
|
||||
uint64 VoiceOfYoggSaronGUID;
|
||||
@@ -92,6 +97,9 @@ class instance_ulduar : public InstanceMapScript
|
||||
uint64 ThorimChestGUID;
|
||||
uint64 HodirRareCacheGUID;
|
||||
uint64 HodirChestGUID;
|
||||
uint64 MimironTramGUID;
|
||||
uint64 MimironElevatorGUID;
|
||||
uint64 MimironButtonGUID;
|
||||
uint64 BrainRoomDoorGUIDs[3];
|
||||
uint64 AlgalonSigilDoorGUID[3];
|
||||
uint64 AlgalonFloorGUID[2];
|
||||
@@ -126,6 +134,8 @@ class instance_ulduar : public InstanceMapScript
|
||||
KologarnGUID = 0;
|
||||
AuriayaGUID = 0;
|
||||
MimironGUID = 0;
|
||||
MimironComputerGUID = 0;
|
||||
MimironWorldTriggerGUID = 0;
|
||||
HodirGUID = 0;
|
||||
ThorimGUID = 0;
|
||||
FreyaGUID = 0;
|
||||
@@ -140,6 +150,9 @@ class instance_ulduar : public InstanceMapScript
|
||||
ThorimChestGUID = 0;
|
||||
HodirRareCacheGUID = 0;
|
||||
HodirChestGUID = 0;
|
||||
MimironTramGUID = 0;
|
||||
MimironElevatorGUID = 0;
|
||||
MimironButtonGUID = 0;
|
||||
LeviathanGateGUID = 0;
|
||||
AlgalonUniverseGUID = 0;
|
||||
AlgalonTrapdoorGUID = 0;
|
||||
@@ -166,6 +179,7 @@ class instance_ulduar : public InstanceMapScript
|
||||
memset(AssemblyGUIDs, 0, sizeof(AssemblyGUIDs));
|
||||
memset(RazorHarpoonGUIDs, 0, sizeof(RazorHarpoonGUIDs));
|
||||
memset(ElderGUIDs, 0, sizeof(ElderGUIDs));
|
||||
memset(MimironVehicleGUIDs, 0, sizeof(MimironVehicleGUIDs));
|
||||
memset(BrainRoomDoorGUIDs, 0, sizeof(BrainRoomDoorGUIDs));
|
||||
memset(KeeperGUIDs, 0, sizeof(KeeperGUIDs));
|
||||
memset(_summonObservationRingKeeper, false, sizeof(_summonObservationRingKeeper));
|
||||
@@ -289,9 +303,6 @@ class instance_ulduar : public InstanceMapScript
|
||||
case NPC_AURIAYA:
|
||||
AuriayaGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_MIMIRON:
|
||||
MimironGUID = creature->GetGUID();
|
||||
break;
|
||||
|
||||
// Hodir
|
||||
case NPC_HODIR:
|
||||
@@ -354,6 +365,26 @@ class instance_ulduar : public InstanceMapScript
|
||||
creature->DespawnOrUnsummon();
|
||||
break;
|
||||
|
||||
// Mimiron
|
||||
case NPC_MIMIRON:
|
||||
MimironGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_LEVIATHAN_MKII:
|
||||
MimironVehicleGUIDs[0] = creature->GetGUID();
|
||||
break;
|
||||
case NPC_VX_001:
|
||||
MimironVehicleGUIDs[1] = creature->GetGUID();
|
||||
break;
|
||||
case NPC_AERIAL_COMMAND_UNIT:
|
||||
MimironVehicleGUIDs[2] = creature->GetGUID();
|
||||
break;
|
||||
case NPC_COMPUTER:
|
||||
MimironComputerGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_WORLD_TRIGGER_MIMIRON:
|
||||
MimironWorldTriggerGUID = creature->GetGUID();
|
||||
break;
|
||||
|
||||
case NPC_VEZAX:
|
||||
VezaxGUID = creature->GetGUID();
|
||||
break;
|
||||
@@ -470,6 +501,15 @@ class instance_ulduar : public InstanceMapScript
|
||||
case GO_HODIR_CHEST:
|
||||
HodirChestGUID = gameObject->GetGUID();
|
||||
break;
|
||||
case GO_MIMIRON_TRAM:
|
||||
MimironTramGUID = gameObject->GetGUID();
|
||||
break;
|
||||
case GO_MIMIRON_ELEVATOR:
|
||||
MimironElevatorGUID = gameObject->GetGUID();
|
||||
break;
|
||||
case GO_MIMIRON_BUTTON:
|
||||
MimironButtonGUID = gameObject->GetGUID();
|
||||
break;
|
||||
case GO_LEVIATHAN_GATE:
|
||||
LeviathanGateGUID = gameObject->GetGUID();
|
||||
if (GetBossState(BOSS_LEVIATHAN) == DONE)
|
||||
@@ -482,6 +522,9 @@ class instance_ulduar : public InstanceMapScript
|
||||
case GO_HODIR_ENTRANCE:
|
||||
case GO_HODIR_DOOR:
|
||||
case GO_HODIR_ICE_DOOR:
|
||||
case GO_MIMIRON_DOOR_1:
|
||||
case GO_MIMIRON_DOOR_2:
|
||||
case GO_MIMIRON_DOOR_3:
|
||||
case GO_VEZAX_DOOR:
|
||||
case GO_YOGG_SARON_DOOR:
|
||||
AddDoor(gameObject, true);
|
||||
@@ -566,6 +609,9 @@ class instance_ulduar : public InstanceMapScript
|
||||
case GO_HODIR_ENTRANCE:
|
||||
case GO_HODIR_DOOR:
|
||||
case GO_HODIR_ICE_DOOR:
|
||||
case GO_MIMIRON_DOOR_1:
|
||||
case GO_MIMIRON_DOOR_2:
|
||||
case GO_MIMIRON_DOOR_3:
|
||||
case GO_VEZAX_DOOR:
|
||||
case GO_YOGG_SARON_DOOR:
|
||||
case GO_DOODAD_UL_SIGILDOOR_03:
|
||||
@@ -774,6 +820,10 @@ class instance_ulduar : public InstanceMapScript
|
||||
break;
|
||||
case DATA_UNBROKEN:
|
||||
Unbroken = data != 0;
|
||||
break;
|
||||
case DATA_MIMIRON_ELEVATOR:
|
||||
if (GameObject* gameObject = instance->GetGameObject(MimironElevatorGUID))
|
||||
gameObject->SetGoState((GOState)data);
|
||||
break;
|
||||
case DATA_ILLUSION:
|
||||
illusion = data;
|
||||
@@ -846,8 +896,6 @@ class instance_ulduar : public InstanceMapScript
|
||||
return KologarnGUID;
|
||||
case BOSS_AURIAYA:
|
||||
return AuriayaGUID;
|
||||
case BOSS_MIMIRON:
|
||||
return MimironGUID;
|
||||
case BOSS_HODIR:
|
||||
return HodirGUID;
|
||||
case BOSS_THORIM:
|
||||
@@ -863,6 +911,22 @@ class instance_ulduar : public InstanceMapScript
|
||||
case BOSS_STONEBARK:
|
||||
return ElderGUIDs[2];
|
||||
|
||||
// Mimiron
|
||||
case BOSS_MIMIRON:
|
||||
return MimironGUID;
|
||||
case DATA_LEVIATHAN_MK_II:
|
||||
return MimironVehicleGUIDs[0];
|
||||
case DATA_VX_001:
|
||||
return MimironVehicleGUIDs[1];
|
||||
case DATA_AERIAL_COMMAND_UNIT:
|
||||
return MimironVehicleGUIDs[2];
|
||||
case DATA_COMPUTER:
|
||||
return MimironComputerGUID;
|
||||
case DATA_MIMIRON_WORLD_TRIGGER:
|
||||
return MimironWorldTriggerGUID;
|
||||
case DATA_MIMIRON_BUTTON:
|
||||
return MimironButtonGUID;
|
||||
|
||||
case BOSS_VEZAX:
|
||||
return VezaxGUID;
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#ifndef DEF_ULDUAR_H
|
||||
#define DEF_ULDUAR_H
|
||||
|
||||
#include "InstanceScript.h"
|
||||
#include "ObjectMgr.h"
|
||||
#define UlduarScriptName "instance_ulduar"
|
||||
|
||||
@@ -83,6 +84,18 @@ enum UlduarNPCs
|
||||
NPC_LEVIATHAN_MKII = 33432,
|
||||
NPC_VX_001 = 33651,
|
||||
NPC_AERIAL_COMMAND_UNIT = 33670,
|
||||
NPC_ASSAULT_BOT = 34057,
|
||||
NPC_BOMB_BOT = 33836,
|
||||
NPC_JUNK_BOT = 33855,
|
||||
NPC_EMERGENCY_FIRE_BOT = 34147,
|
||||
NPC_FROST_BOMB = 34149,
|
||||
NPC_BURST_TARGET = 34211,
|
||||
NPC_FLAME = 34363,
|
||||
NPC_FLAME_SPREAD = 34121,
|
||||
NPC_DB_TARGET = 33576,
|
||||
NPC_ROCKET_MIMIRON_VISUAL = 34050,
|
||||
NPC_WORLD_TRIGGER_MIMIRON = 21252,
|
||||
NPC_COMPUTER = 34143,
|
||||
|
||||
// Freya's Keepers
|
||||
NPC_IRONBRANCH = 32913,
|
||||
@@ -204,6 +217,18 @@ enum UlduarGameObjects
|
||||
GO_THORIM_CHEST_HERO = 194315,
|
||||
GO_THORIM_CHEST = 194314,
|
||||
|
||||
// Mimiron
|
||||
GO_MIMIRON_TRAM = 194675,
|
||||
GO_MIMIRON_ELEVATOR = 194749,
|
||||
GO_MIMIRON_BUTTON = 194739,
|
||||
GO_MIMIRON_DOOR_1 = 194774,
|
||||
GO_MIMIRON_DOOR_2 = 194775,
|
||||
GO_MIMIRON_DOOR_3 = 194776,
|
||||
GO_CACHE_OF_INNOVATION = 194789,
|
||||
GO_CACHE_OF_INNOVATION_FIREFIGHTER = 194957,
|
||||
GO_CACHE_OF_INNOVATION_HERO = 194956,
|
||||
GO_CACHE_OF_INNOVATION_FIREFIGHTER_HERO = 194958,
|
||||
|
||||
// Vezax
|
||||
GO_VEZAX_DOOR = 194750,
|
||||
|
||||
@@ -292,6 +317,16 @@ enum UlduarData
|
||||
// Hodir
|
||||
DATA_HODIR_RARE_CACHE,
|
||||
|
||||
// Mimiron
|
||||
DATA_LEVIATHAN_MK_II,
|
||||
DATA_VX_001,
|
||||
DATA_AERIAL_COMMAND_UNIT,
|
||||
DATA_COMPUTER,
|
||||
DATA_MIMIRON_WORLD_TRIGGER,
|
||||
DATA_MIMIRON_ELEVATOR,
|
||||
DATA_MIMIRON_TRAM,
|
||||
DATA_MIMIRON_BUTTON,
|
||||
|
||||
// Yogg-Saron
|
||||
DATA_VOICE_OF_YOGG_SARON,
|
||||
DATA_SARA,
|
||||
|
||||
@@ -18,12 +18,11 @@
|
||||
/* ScriptData
|
||||
SDName: Sholazar_Basin
|
||||
SD%Complete: 100
|
||||
SDComment: Quest support: 12570, 12573, 12621, 12726
|
||||
SDComment: Quest support: 12573, 12621, 12726
|
||||
SDCategory: Sholazar_Basin
|
||||
EndScriptData */
|
||||
|
||||
/* ContentData
|
||||
npc_injured_rainspeaker_oracle
|
||||
npc_vekjik
|
||||
avatar_of_freya
|
||||
npc_haiphoon (Quest: "Song of Wind and Water")
|
||||
@@ -39,141 +38,6 @@ EndContentData */
|
||||
#include "CombatAI.h"
|
||||
#include "Player.h"
|
||||
|
||||
/*######
|
||||
## npc_injured_rainspeaker_oracle
|
||||
######*/
|
||||
|
||||
#define GOSSIP_ITEM1 "I am ready to travel to your village now."
|
||||
|
||||
enum Rainspeaker
|
||||
{
|
||||
SAY_START_IRO = 0,
|
||||
SAY_QUEST_ACCEPT_IRO = 1,
|
||||
SAY_END_IRO = 2,
|
||||
|
||||
QUEST_FORTUNATE_MISUNDERSTANDINGS = 12570,
|
||||
FACTION_ESCORTEE_A = 774,
|
||||
FACTION_ESCORTEE_H = 775
|
||||
};
|
||||
|
||||
class npc_injured_rainspeaker_oracle : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_injured_rainspeaker_oracle() : CreatureScript("npc_injured_rainspeaker_oracle") { }
|
||||
|
||||
struct npc_injured_rainspeaker_oracleAI : public npc_escortAI
|
||||
{
|
||||
npc_injured_rainspeaker_oracleAI(Creature* creature) : npc_escortAI(creature) { c_guid = creature->GetGUID(); }
|
||||
|
||||
uint64 c_guid;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
me->RestoreFaction();
|
||||
// if we will have other way to assign this to only one npc remove this part
|
||||
if (GUID_LOPART(me->GetGUID()) != 101030)
|
||||
{
|
||||
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
|
||||
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
}
|
||||
}
|
||||
|
||||
void WaypointReached(uint32 waypointId) override
|
||||
{
|
||||
Player* player = GetPlayerForEscort();
|
||||
if (!player)
|
||||
return;
|
||||
|
||||
switch (waypointId)
|
||||
{
|
||||
case 1:
|
||||
SetRun();
|
||||
break;
|
||||
case 10:
|
||||
case 11:
|
||||
case 12:
|
||||
case 13:
|
||||
case 14:
|
||||
case 15:
|
||||
case 16:
|
||||
case 17:
|
||||
case 18:
|
||||
me->RemoveUnitMovementFlag(MOVEMENTFLAG_FALLING);
|
||||
me->SetSpeed(MOVE_SWIM, 0.85f, true);
|
||||
me->SetSwim(true);
|
||||
me->SetDisableGravity(true);
|
||||
break;
|
||||
case 19:
|
||||
me->GetMotionMaster()->MoveFall();
|
||||
break;
|
||||
case 28:
|
||||
player->GroupEventHappens(QUEST_FORTUNATE_MISUNDERSTANDINGS, me);
|
||||
// me->RestoreFaction();
|
||||
Talk(SAY_END_IRO);
|
||||
SetRun(false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
if (!HasEscortState(STATE_ESCORT_ESCORTING))
|
||||
return;
|
||||
|
||||
if (Player* player = GetPlayerForEscort())
|
||||
{
|
||||
if (player->GetQuestStatus(QUEST_FORTUNATE_MISUNDERSTANDINGS) != QUEST_STATUS_COMPLETE)
|
||||
player->FailQuest(QUEST_FORTUNATE_MISUNDERSTANDINGS);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
bool OnGossipHello(Player* player, Creature* creature) override
|
||||
{
|
||||
if (creature->IsQuestGiver())
|
||||
player->PrepareQuestMenu(creature->GetGUID());
|
||||
|
||||
if (player->GetQuestStatus(QUEST_FORTUNATE_MISUNDERSTANDINGS) == QUEST_STATUS_INCOMPLETE)
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
|
||||
|
||||
player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
|
||||
{
|
||||
player->PlayerTalkClass->ClearMenus();
|
||||
if (action == GOSSIP_ACTION_INFO_DEF+1)
|
||||
{
|
||||
ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
|
||||
ENSURE_AI(npc_escortAI, (creature->AI()))->SetMaxPlayerDistance(35.0f);
|
||||
creature->AI()->Talk(SAY_START_IRO);
|
||||
|
||||
switch (player->GetTeam()){
|
||||
case ALLIANCE:
|
||||
creature->setFaction(FACTION_ESCORTEE_A);
|
||||
break;
|
||||
case HORDE:
|
||||
creature->setFaction(FACTION_ESCORTEE_H);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool OnQuestAccept(Player* /*player*/, Creature* creature, Quest const* /*_Quest*/) override
|
||||
{
|
||||
creature->AI()->Talk(SAY_QUEST_ACCEPT_IRO);
|
||||
return false;
|
||||
}
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new npc_injured_rainspeaker_oracleAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
/*######
|
||||
## npc_vekjik
|
||||
######*/
|
||||
@@ -1143,7 +1007,6 @@ public:
|
||||
|
||||
void AddSC_sholazar_basin()
|
||||
{
|
||||
new npc_injured_rainspeaker_oracle();
|
||||
new npc_vekjik();
|
||||
new npc_avatar_of_freya();
|
||||
new npc_bushwhacker();
|
||||
|
||||
Reference in New Issue
Block a user