mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-22 02:04:52 +01:00
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Conflicts: src/server/game/Globals/ObjectMgr.cpp src/server/game/Maps/Map.cpp src/server/game/Quests/QuestDef.cpp
This commit is contained in:
@@ -25,7 +25,7 @@ enum Texts
|
||||
SAY_SLAY = 1,
|
||||
SAY_DEATH = 2,
|
||||
SAY_IMPENDING_DESPAIR = 3,
|
||||
SAY_DEFILING_HORROR = 4,
|
||||
SAY_DEFILING_HORROR = 4
|
||||
};
|
||||
|
||||
enum Spells
|
||||
@@ -33,8 +33,9 @@ enum Spells
|
||||
SPELL_QUIVERING_STRIKE = 72422,
|
||||
SPELL_IMPENDING_DESPAIR = 72426,
|
||||
SPELL_DEFILING_HORROR = 72435,
|
||||
SPELL_HOPELESSNESS = 72395,
|
||||
H_SPELL_HOPELESSNESS = 72390, /// @todo not in dbc. Add in DB.
|
||||
SPELL_HOPELESSNESS_1 = 72395,
|
||||
SPELL_HOPELESSNESS_2 = 72396,
|
||||
SPELL_HOPELESSNESS_3 = 72397
|
||||
};
|
||||
|
||||
enum Events
|
||||
@@ -42,99 +43,106 @@ enum Events
|
||||
EVENT_NONE,
|
||||
EVENT_QUIVERING_STRIKE,
|
||||
EVENT_IMPENDING_DESPAIR,
|
||||
EVENT_DEFILING_HORROR,
|
||||
EVENT_DEFILING_HORROR
|
||||
};
|
||||
|
||||
uint32 const HopelessnessHelper[3] = { SPELL_HOPELESSNESS_1, SPELL_HOPELESSNESS_2, SPELL_HOPELESSNESS_3 };
|
||||
|
||||
class boss_falric : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_falric() : CreatureScript("boss_falric") { }
|
||||
public:
|
||||
boss_falric() : CreatureScript("boss_falric") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return GetInstanceAI<boss_falricAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_falricAI : public boss_horAI
|
||||
{
|
||||
boss_falricAI(Creature* creature) : boss_horAI(creature) { }
|
||||
|
||||
uint8 uiHopelessnessCount;
|
||||
|
||||
void Reset() override
|
||||
struct boss_falricAI : public boss_horAI
|
||||
{
|
||||
boss_horAI::Reset();
|
||||
boss_falricAI(Creature* creature) : boss_horAI(creature, DATA_FALRIC) { }
|
||||
|
||||
uiHopelessnessCount = 0;
|
||||
|
||||
instance->SetBossState(DATA_FALRIC_EVENT, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
instance->SetBossState(DATA_FALRIC_EVENT, IN_PROGRESS);
|
||||
|
||||
events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 23000);
|
||||
events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 9000);
|
||||
events.ScheduleEvent(EVENT_DEFILING_HORROR, urand(25000, 45000)); /// @todo adjust timer.
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
|
||||
instance->SetBossState(DATA_FALRIC_EVENT, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) override
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
// Return since we have no target
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
void Reset() override
|
||||
{
|
||||
case EVENT_QUIVERING_STRIKE:
|
||||
DoCast(SPELL_QUIVERING_STRIKE);
|
||||
events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 10000);
|
||||
break;
|
||||
case EVENT_IMPENDING_DESPAIR:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
|
||||
{
|
||||
Talk(SAY_IMPENDING_DESPAIR);
|
||||
DoCast(target, SPELL_IMPENDING_DESPAIR);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 13000);
|
||||
break;
|
||||
case EVENT_DEFILING_HORROR:
|
||||
DoCast(SPELL_DEFILING_HORROR);
|
||||
events.ScheduleEvent(EVENT_DEFILING_HORROR, urand(25000, 45000)); /// @todo adjust timer.
|
||||
break;
|
||||
boss_horAI::Reset();
|
||||
_hopelessnessCount = 0;
|
||||
}
|
||||
|
||||
if ((uiHopelessnessCount < 1 && HealthBelowPct(66))
|
||||
|| (uiHopelessnessCount < 2 && HealthBelowPct(33))
|
||||
|| (uiHopelessnessCount < 3 && HealthBelowPct(10)))
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
uiHopelessnessCount++;
|
||||
DoCast(DUNGEON_MODE(SPELL_HOPELESSNESS, H_SPELL_HOPELESSNESS));
|
||||
Talk(SAY_AGGRO);
|
||||
DoZoneInCombat();
|
||||
instance->SetBossState(DATA_FALRIC, IN_PROGRESS);
|
||||
|
||||
events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 23000);
|
||||
events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 9000);
|
||||
events.ScheduleEvent(EVENT_DEFILING_HORROR, urand(21000, 39000));
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& damage) override
|
||||
{
|
||||
if ((_hopelessnessCount < 1 && me->HealthBelowPctDamaged(66, damage))
|
||||
|| (_hopelessnessCount < 2 && me->HealthBelowPctDamaged(33, damage))
|
||||
|| (_hopelessnessCount < 3 && me->HealthBelowPctDamaged(10, damage)))
|
||||
{
|
||||
if (_hopelessnessCount)
|
||||
me->RemoveOwnedAura(sSpellMgr->GetSpellIdForDifficulty(HopelessnessHelper[_hopelessnessCount - 1], me));
|
||||
DoCast(me, HopelessnessHelper[_hopelessnessCount]);
|
||||
++_hopelessnessCount;
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
events.Reset();
|
||||
instance->SetBossState(DATA_FALRIC, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_QUIVERING_STRIKE:
|
||||
DoCastVictim(SPELL_QUIVERING_STRIKE);
|
||||
events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 10000);
|
||||
break;
|
||||
case EVENT_IMPENDING_DESPAIR:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true))
|
||||
{
|
||||
Talk(SAY_IMPENDING_DESPAIR);
|
||||
DoCast(target, SPELL_IMPENDING_DESPAIR);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 13000);
|
||||
break;
|
||||
case EVENT_DEFILING_HORROR:
|
||||
DoCastAOE(SPELL_DEFILING_HORROR);
|
||||
events.ScheduleEvent(EVENT_DEFILING_HORROR, urand(21000, 39000));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
uint8 _hopelessnessCount;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return GetHallsOfReflectionAI<boss_falricAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_falric()
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "SpellScript.h"
|
||||
#include "SpellAuraEffects.h"
|
||||
#include "halls_of_reflection.h"
|
||||
|
||||
enum Texts
|
||||
@@ -33,6 +35,7 @@ enum Spells
|
||||
SPELL_WELL_OF_CORRUPTION = 72362,
|
||||
SPELL_CORRUPTED_FLESH = 72363,
|
||||
SPELL_SHARED_SUFFERING = 72368,
|
||||
SPELL_SHARED_SUFFERING_DISPEL = 72373
|
||||
};
|
||||
|
||||
enum Events
|
||||
@@ -41,93 +44,130 @@ enum Events
|
||||
EVENT_OBLITERATE,
|
||||
EVENT_WELL_OF_CORRUPTION,
|
||||
EVENT_CORRUPTED_FLESH,
|
||||
EVENT_SHARED_SUFFERING,
|
||||
EVENT_SHARED_SUFFERING
|
||||
};
|
||||
|
||||
class boss_marwyn : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_marwyn() : CreatureScript("boss_marwyn") { }
|
||||
public:
|
||||
boss_marwyn() : CreatureScript("boss_marwyn") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return GetInstanceAI<boss_marwynAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_marwynAI : public boss_horAI
|
||||
{
|
||||
boss_marwynAI(Creature* creature) : boss_horAI(creature) { }
|
||||
|
||||
void Reset() override
|
||||
struct boss_marwynAI : public boss_horAI
|
||||
{
|
||||
boss_horAI::Reset();
|
||||
boss_marwynAI(Creature* creature) : boss_horAI(creature, DATA_MARWYN) { }
|
||||
|
||||
instance->SetBossState(DATA_MARWYN_EVENT, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
instance->SetBossState(DATA_MARWYN_EVENT, IN_PROGRESS);
|
||||
|
||||
events.ScheduleEvent(EVENT_OBLITERATE, 30000); /// @todo Check timer
|
||||
events.ScheduleEvent(EVENT_WELL_OF_CORRUPTION, 13000);
|
||||
events.ScheduleEvent(EVENT_CORRUPTED_FLESH, 20000);
|
||||
events.ScheduleEvent(EVENT_SHARED_SUFFERING, 20000); /// @todo Check timer
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
|
||||
instance->SetBossState(DATA_MARWYN_EVENT, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) override
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
// Return since we have no target
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
void Reset() override
|
||||
{
|
||||
case EVENT_OBLITERATE:
|
||||
DoCast(SPELL_OBLITERATE);
|
||||
events.ScheduleEvent(EVENT_OBLITERATE, 30000);
|
||||
break;
|
||||
case EVENT_WELL_OF_CORRUPTION:
|
||||
DoCast(SPELL_WELL_OF_CORRUPTION);
|
||||
events.ScheduleEvent(EVENT_WELL_OF_CORRUPTION, 13000);
|
||||
break;
|
||||
case EVENT_CORRUPTED_FLESH:
|
||||
Talk(SAY_CORRUPTED_FLESH);
|
||||
DoCast(SPELL_CORRUPTED_FLESH);
|
||||
events.ScheduleEvent(EVENT_CORRUPTED_FLESH, 20000);
|
||||
break;
|
||||
case EVENT_SHARED_SUFFERING:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
|
||||
DoCast(target, SPELL_SHARED_SUFFERING);
|
||||
events.ScheduleEvent(EVENT_SHARED_SUFFERING, 20000);
|
||||
break;
|
||||
boss_horAI::Reset();
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
DoZoneInCombat();
|
||||
instance->SetBossState(DATA_MARWYN, IN_PROGRESS);
|
||||
|
||||
events.ScheduleEvent(EVENT_OBLITERATE, urand(8000, 13000));
|
||||
events.ScheduleEvent(EVENT_WELL_OF_CORRUPTION, 13000);
|
||||
events.ScheduleEvent(EVENT_CORRUPTED_FLESH, 20000);
|
||||
events.ScheduleEvent(EVENT_SHARED_SUFFERING, urand(14000, 15000));
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
events.Reset();
|
||||
instance->SetBossState(DATA_MARWYN, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_OBLITERATE:
|
||||
DoCastVictim(SPELL_OBLITERATE);
|
||||
events.ScheduleEvent(EVENT_OBLITERATE, urand(8000, 13000));
|
||||
break;
|
||||
case EVENT_WELL_OF_CORRUPTION:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
|
||||
DoCast(target, SPELL_WELL_OF_CORRUPTION);
|
||||
events.ScheduleEvent(EVENT_WELL_OF_CORRUPTION, 13000);
|
||||
break;
|
||||
case EVENT_CORRUPTED_FLESH:
|
||||
Talk(SAY_CORRUPTED_FLESH);
|
||||
DoCastAOE(SPELL_CORRUPTED_FLESH);
|
||||
events.ScheduleEvent(EVENT_CORRUPTED_FLESH, 20000);
|
||||
break;
|
||||
case EVENT_SHARED_SUFFERING:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
|
||||
DoCast(target, SPELL_SHARED_SUFFERING);
|
||||
events.ScheduleEvent(EVENT_SHARED_SUFFERING, urand(14000, 15000));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return GetHallsOfReflectionAI<boss_marwynAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
// 72368, 72369 - Shared Suffering
|
||||
class spell_marwyn_shared_suffering : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_marwyn_shared_suffering() : SpellScriptLoader("spell_marwyn_shared_suffering") { }
|
||||
|
||||
class spell_marwyn_shared_suffering_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_marwyn_shared_suffering_AuraScript);
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_ENEMY_SPELL)
|
||||
return;
|
||||
|
||||
if (Unit* caster = GetCaster())
|
||||
{
|
||||
int32 remainingDamage = aurEff->GetAmount() * (aurEff->GetTotalTicks() - aurEff->GetTickNumber());
|
||||
if (remainingDamage > 0)
|
||||
caster->CastCustomSpell(SPELL_SHARED_SUFFERING_DISPEL, SPELLVALUE_BASE_POINT1, remainingDamage, GetTarget(), TRIGGERED_FULL_MASK);
|
||||
}
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_marwyn_shared_suffering_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const override
|
||||
{
|
||||
return new spell_marwyn_shared_suffering_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_marwyn()
|
||||
{
|
||||
new boss_marwyn();
|
||||
new spell_marwyn_shared_suffering();
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -15,170 +15,231 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DEF_HALLS_OF_REFLECTION_H
|
||||
#define DEF_HALLS_OF_REFLECTION_H
|
||||
#ifndef HALLS_OF_REFLECTION_H_
|
||||
#define HALLS_OF_REFLECTION_H_
|
||||
|
||||
#define HoRScriptName "instance_halls_of_reflection"
|
||||
#define MAX_ENCOUNTER 3
|
||||
|
||||
uint32 const EncounterCount = 3;
|
||||
|
||||
/* Halls of Reflection encounters:
|
||||
0- Falric
|
||||
1- Marwyn
|
||||
2- The Lich King
|
||||
0 - Falric
|
||||
1 - Marwyn
|
||||
2 - The Lich King
|
||||
*/
|
||||
|
||||
enum Data
|
||||
enum DataTypes
|
||||
{
|
||||
DATA_FALRIC_EVENT = 0,
|
||||
DATA_MARWYN_EVENT = 1,
|
||||
DATA_LICHKING_EVENT = 2,
|
||||
DATA_FALRIC = 0,
|
||||
DATA_MARWYN = 1,
|
||||
DATA_THE_LICH_KING_ESCAPE = 2,
|
||||
|
||||
DATA_INTRO_EVENT = 3,
|
||||
DATA_FROSWORN_EVENT = 4,
|
||||
DATA_FROSTSWORN_GENERAL = 4,
|
||||
|
||||
DATA_WAVE_COUNT = 5,
|
||||
DATA_TEAM_IN_INSTANCE = 6,
|
||||
DATA_FROSTMOURNE = 7,
|
||||
DATA_FROSTWORN_DOOR = 8,
|
||||
DATA_ESCAPE_EVENT = 9,
|
||||
DATA_KORELN_LORALEN = 5,
|
||||
DATA_WAVE_COUNT = 6,
|
||||
DATA_TEAM_IN_INSTANCE = 7,
|
||||
DATA_FROSTMOURNE = 8,
|
||||
DATA_IMPENETRABLE_DOOR = 9,
|
||||
DATA_ESCAPE_LEADER = 10,
|
||||
DATA_SUMMONS = 11,
|
||||
DATA_ICEWALL = 12,
|
||||
DATA_CAVE_IN = 13
|
||||
DATA_ICEWALL = 11,
|
||||
DATA_ICEWALL_TARGET = 12,
|
||||
DATA_GUNSHIP = 13
|
||||
};
|
||||
|
||||
enum Creatures
|
||||
enum CreatureIds
|
||||
{
|
||||
NPC_JAINA_PART1 = 37221,
|
||||
NPC_SYLVANAS_PART1 = 37223,
|
||||
NPC_UTHER = 37225,
|
||||
NPC_LICH_KING_PART1 = 37226,
|
||||
NPC_LORALEN = 37779,
|
||||
NPC_KORELN = 37582,
|
||||
NPC_JAINA_INTRO = 37221,
|
||||
NPC_SYLVANAS_INTRO = 37223,
|
||||
NPC_UTHER = 37225,
|
||||
NPC_THE_LICH_KING_INTRO = 37226,
|
||||
NPC_KORELN = 37582,
|
||||
NPC_LORALEN = 37779,
|
||||
NPC_FROSTMOUNRE_ALTAR_BUNNY = 37704,
|
||||
|
||||
NPC_FALRIC = 38112,
|
||||
NPC_MARWYN = 38113,
|
||||
NPC_WAVE_MERCENARY = 38177,
|
||||
NPC_WAVE_FOOTMAN = 38173,
|
||||
NPC_WAVE_RIFLEMAN = 38176,
|
||||
NPC_WAVE_PRIEST = 38175,
|
||||
NPC_WAVE_MAGE = 38172,
|
||||
NPC_FALRIC = 38112,
|
||||
NPC_MARWYN = 38113,
|
||||
NPC_WAVE_MERCENARY = 38177,
|
||||
NPC_WAVE_FOOTMAN = 38173,
|
||||
NPC_WAVE_RIFLEMAN = 38176,
|
||||
NPC_WAVE_PRIEST = 38175,
|
||||
NPC_WAVE_MAGE = 38172,
|
||||
|
||||
NPC_FROSTWORN_GENERAL = 36723,
|
||||
NPC_REFLECTION = 37068, // 37107 for tank only?
|
||||
NPC_FROSTSWORN_GENERAL = 36723,
|
||||
NPC_REFLECTION = 37068, // 37107 for tank only?
|
||||
|
||||
NPC_JAINA_PART2 = 36955,
|
||||
NPC_SYLVANAS_PART2 = 37554,
|
||||
NPC_LICH_KING_PART2 = 36954,
|
||||
NPC_BARTLETT = 37182, // High Captain Justin Bartlett
|
||||
NPC_KORM = 37833, // Sky-Reaver Korm Blackscar
|
||||
NPC_ICE_WALL = 37014, // Ice Wall Target
|
||||
NPC_JAINA_ESCAPE = 36955,
|
||||
NPC_SYLVANAS_ESCAPE = 37554,
|
||||
NPC_THE_LICH_KING_ESCAPE = 36954,
|
||||
NPC_ICE_WALL_TARGET = 37014,
|
||||
|
||||
NPC_RAGING_GNOUL = 36940,
|
||||
NPC_RISEN_WITCH_DOCTOR = 36941,
|
||||
NPC_ABON = 37069
|
||||
NPC_RAGING_GHOUL = 36940,
|
||||
NPC_RISEN_WITCH_DOCTOR = 36941,
|
||||
NPC_LUMBERING_ABOMINATION = 37069,
|
||||
|
||||
NPC_GUNSHIP_CANNON_HORDE = 37593,
|
||||
NPC_JUSTIN_BARTLETT = 30344,
|
||||
NPC_KORM_BLACKSCAR = 30824,
|
||||
|
||||
NPC_WORLD_TRIGGER = 22515
|
||||
};
|
||||
|
||||
enum GameObjects
|
||||
enum GameObjectIds
|
||||
{
|
||||
GO_FROSTMOURNE = 202302,
|
||||
GO_ENTRANCE_DOOR = 201976,
|
||||
GO_FROSTWORN_DOOR = 197341,
|
||||
GO_ARTHAS_DOOR = 197342,
|
||||
//GO_ESCAPE_DOOR = 197343, // always open ?
|
||||
GO_FROSTMOURNE = 202302,
|
||||
GO_ENTRANCE_DOOR = 201976,
|
||||
GO_IMPENETRABLE_DOOR = 197341,
|
||||
GO_SHADOW_THRONE_DOOR = 197342,
|
||||
GO_ESCAPE_DOOR = 197343, // always open ?
|
||||
|
||||
GO_ICE_WALL = 201385,
|
||||
GO_CAVE = 201596,
|
||||
GO_ICE_WALL = 201385,
|
||||
GO_CAVE_IN = 201596,
|
||||
|
||||
GO_STAIRS_SKYBREAKER = 201709,
|
||||
GO_SKYBREAKER = 201598,
|
||||
GO_STAIRS_ORGRIM_HAMMER = 202211,
|
||||
GO_ORGRIM_HAMMER = 201599,
|
||||
GO_PORTAL = 202079,
|
||||
GO_THE_SKYBREAKER = 201598,
|
||||
GO_ORGRIMS_HAMMER = 201599,
|
||||
GO_THE_SKYBREAKER_STAIRS = 201709,
|
||||
GO_ORGRIMS_HAMMER_STAIRS = 202211,
|
||||
GO_PORTAL_TO_DALARAN = 195682,
|
||||
|
||||
GO_CAPTAIN_CHEST_HORDE_NORMAL = 202212, //3145
|
||||
GO_CAPTAIN_CHEST_ALLIANCE_NORMAL = 201710, //30357
|
||||
GO_CAPTAIN_CHEST_HORDE_HEROIC = 202337, //3246
|
||||
GO_CAPTAIN_CHEST_ALLIANCE_HEROIC = 202336, //3333
|
||||
GO_THE_CAPTAIN_CHEST_ALLIANCE_NORMAL = 201710,
|
||||
GO_THE_CAPTAIN_CHEST_HORDE_NORMAL = 202212,
|
||||
GO_THE_CAPTAIN_CHEST_ALLIANCE_HEROIC = 202336,
|
||||
GO_THE_CAPTAIN_CHEST_HORDE_HEROIC = 202337
|
||||
};
|
||||
|
||||
enum HorWorldStates
|
||||
enum Achievements
|
||||
{
|
||||
WORLD_STATE_HOR_WAVES_ENABLED = 4884,
|
||||
WORLD_STATE_HOR_WAVE_COUNT = 4882,
|
||||
ACHIEV_NOT_RETREATING_EVENT = 22615,
|
||||
SPELL_ACHIEV_CHECK = 72830
|
||||
};
|
||||
|
||||
// Common actions from Instance Script to Boss Script
|
||||
enum Actions
|
||||
{
|
||||
ACTION_ENTER_COMBAT,
|
||||
ACTION_START_ESCAPING,
|
||||
ACTION_WALL_BROKEN
|
||||
};
|
||||
|
||||
enum TrashGeneralSpells
|
||||
{
|
||||
// General spells
|
||||
SPELL_WELL_OF_SOULS = 72630, // cast when spawn(become visible)
|
||||
SPELL_SPIRIT_ACTIVATE = 72130, // cast when unit activates
|
||||
ACTION_ENTER_COMBAT = -668001,
|
||||
ACTION_START_PREFIGHT = -668002,
|
||||
ACTION_WALL_BROKEN = -668003,
|
||||
ACTION_GUNSHIP_ARRIVAL = -668004,
|
||||
ACTION_GUNSHIP_ARRIVAL_2 = -668005
|
||||
};
|
||||
|
||||
enum InstanceEvents
|
||||
{
|
||||
EVENT_SPAWN_WAVES = 1,
|
||||
EVENT_NEXT_WAVE = 2,
|
||||
EVENT_DO_WIPE = 3,
|
||||
EVENT_ADD_WAVE = 4,
|
||||
EVENT_SPAWN_WAVES = 1,
|
||||
EVENT_NEXT_WAVE = 2,
|
||||
EVENT_DO_WIPE = 3,
|
||||
EVENT_ADD_WAVE = 4,
|
||||
EVENT_SPAWN_ESCAPE_EVENT = 5
|
||||
};
|
||||
|
||||
enum InstanceEventIds
|
||||
{
|
||||
EVENT_GUNSHIP_ARRIVAL = 22709,
|
||||
EVENT_GUNSHIP_ARRIVAL_2 = 22714,
|
||||
EVENT_ICE_WALL_SUMMONED = 22795
|
||||
};
|
||||
|
||||
enum InstanceSpells
|
||||
{
|
||||
// Trash
|
||||
SPELL_WELL_OF_SOULS = 72630, // cast when spawn (become visible)
|
||||
SPELL_SPIRIT_ACTIVATE = 72130, // cast when unit activates
|
||||
|
||||
// Start Quests
|
||||
SPELL_START_HALLS_OF_REFLECTION_QUEST_A = 71351,
|
||||
SPELL_START_HALLS_OF_REFLECTION_QUEST_H = 71542,
|
||||
SPELL_START_HALLS_OF_REFLECTION_QUEST_AE = 72900,
|
||||
|
||||
// Quest Credits
|
||||
SPELL_CREDIT_FINDING_SYLVANAS = 71536,
|
||||
SPELL_CREDIT_FINDING_JAINA = 71538,
|
||||
SPELL_CREDIT_ESCAPING_ARTHAS = 71352,
|
||||
|
||||
// Gunship
|
||||
SPELL_GUNSHIP_CANNON_FIRE = 70017,
|
||||
SPELL_GUNSHIP_CANNON_FIRE_MISSILE_ALLIANCE = 70021,
|
||||
SPELL_GUNSHIP_CANNON_FIRE_MISSILE_HORDE = 70246
|
||||
};
|
||||
|
||||
enum InstanceWorldStates
|
||||
{
|
||||
WORLD_STATE_HOR_WAVES_ENABLED = 4884,
|
||||
WORLD_STATE_HOR_WAVE_COUNT = 4882
|
||||
};
|
||||
|
||||
enum InstanceYells
|
||||
{
|
||||
SAY_CAPTAIN_FIRE = 0,
|
||||
SAY_CAPTAIN_FINAL = 1
|
||||
};
|
||||
|
||||
// Base class for FALRIC and MARWYN
|
||||
// handled the summonList and the notification events to/from the InstanceScript
|
||||
struct boss_horAI : ScriptedAI
|
||||
struct boss_horAI : BossAI
|
||||
{
|
||||
boss_horAI(Creature* creature) : ScriptedAI(creature), summons(creature)
|
||||
{
|
||||
instance = me->GetInstanceScript();
|
||||
}
|
||||
boss_horAI(Creature* creature, uint32 bossId) : BossAI(creature, bossId) { }
|
||||
|
||||
InstanceScript* instance;
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
|
||||
void Reset()
|
||||
void Reset() override
|
||||
{
|
||||
events.Reset();
|
||||
_Reset();
|
||||
me->SetVisible(false);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
if (instance->GetData(DATA_WAVE_COUNT) != NOT_STARTED)
|
||||
instance->ProcessEvent(0, EVENT_DO_WIPE);
|
||||
instance->ProcessEvent(NULL, EVENT_DO_WIPE);
|
||||
}
|
||||
|
||||
void DoAction(int32 actionID)
|
||||
void DoAction(int32 actionId) override
|
||||
{
|
||||
switch (actionID)
|
||||
switch (actionId)
|
||||
{
|
||||
case ACTION_ENTER_COMBAT: // called by InstanceScript when boss shall enter in combat.
|
||||
case ACTION_ENTER_COMBAT: // called by InstanceScript when boss shall enter in combat.
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
|
||||
if (Unit* unit = me->SelectNearestTarget())
|
||||
AttackStart(unit);
|
||||
|
||||
DoZoneInCombat();
|
||||
DoZoneInCombat(me, 150.0f);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summoned)
|
||||
void JustSummoned(Creature* summon) override
|
||||
{
|
||||
summons.Summon(summoned);
|
||||
summons.Summon(summon);
|
||||
}
|
||||
};
|
||||
|
||||
class GameObjectDeleteDelayEvent : public BasicEvent
|
||||
{
|
||||
public:
|
||||
GameObjectDeleteDelayEvent(Unit* owner, uint64 gameObjectGUID) : _owner(owner), _gameObjectGUID(gameObjectGUID) { }
|
||||
|
||||
void DeleteGameObject()
|
||||
{
|
||||
if (GameObject* go = ObjectAccessor::GetGameObject(*_owner, _gameObjectGUID))
|
||||
go->Delete();
|
||||
}
|
||||
|
||||
bool Execute(uint64 /*execTime*/, uint32 /*diff*/) override
|
||||
{
|
||||
DeleteGameObject();
|
||||
return true;
|
||||
}
|
||||
|
||||
void Abort(uint64 /*execTime*/) override
|
||||
{
|
||||
DeleteGameObject();
|
||||
}
|
||||
|
||||
private:
|
||||
Unit* _owner;
|
||||
uint64 _gameObjectGUID;
|
||||
};
|
||||
|
||||
template<class AI>
|
||||
AI* GetHallsOfReflectionAI(Creature* creature)
|
||||
{
|
||||
return GetInstanceAI<AI>(creature, HoRScriptName);
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif // HALLS_OF_REFLECTION_H_
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1800,7 +1800,7 @@ class spell_icc_sprit_alarm : public SpellScriptLoader
|
||||
}
|
||||
|
||||
if (GameObject* trap = GetCaster()->FindNearestGameObject(trapId, 5.0f))
|
||||
trap->SetRespawnTime(trap->GetGOInfo()->trap.autoCloseTime);
|
||||
trap->SetRespawnTime(trap->GetGOInfo()->GetAutoCloseTime());
|
||||
|
||||
std::list<Creature*> wards;
|
||||
GetCaster()->GetCreatureListWithEntryInGrid(wards, NPC_DEATHBOUND_WARD, 150.0f);
|
||||
|
||||
Reference in New Issue
Block a user