aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Spells/SpellMgr.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp128
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp41
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h3
4 files changed, 137 insertions, 37 deletions
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 582f13284bb..b258f01ccd5 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -3633,6 +3633,8 @@ void SpellMgr::LoadDbcDataCorrections()
case 49345: // Call Emerald Drake
spellInfo->Effect[1] = 0;
break;
+ case 24314: // Threatening Gaze
+ spellInfo->AuraInterruptFlags |= AURA_INTERRUPT_FLAG_CAST | AURA_INTERRUPT_FLAG_MOVE | AURA_INTERRUPT_FLAG_JUMP;
default:
break;
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
index acfa38e542d..195a3b198f6 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
@@ -25,6 +25,7 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "Spell.h"
#include "zulgurub.h"
enum Says
@@ -52,19 +53,22 @@ enum Spells
enum Events
{
- EVENT_CHECK_START = 1,
- EVENT_STARTED = 2,
- EVENT_OVERPOWER = 3,
- EVENT_MORTAL_STRIKE = 4,
- EVENT_WHIRLWIND = 5,
- EVENT_CHECK_OHGAN = 6,
- EVENT_WATCH_PLAYER = 7
+ EVENT_CHECK_SPEAKER = 1,
+ EVENT_CHECK_START = 2,
+ EVENT_STARTED = 3,
+ EVENT_OVERPOWER = 4,
+ EVENT_MORTAL_STRIKE = 5,
+ EVENT_WHIRLWIND = 6,
+ EVENT_CHECK_OHGAN = 7,
+ EVENT_WATCH_PLAYER = 8,
+ EVENT_CHARGE_PLAYER = 9
};
enum Misc
{
MODEL_OHGAN_MOUNT = 15271,
PATH_MANDOKIR = 492861,
+ POINT_MANDOKIR_END = 24,
CHAINED_SPIRT_COUNT = 20
};
@@ -92,6 +96,12 @@ Position const PosSummonChainedSpirits[CHAINED_SPIRT_COUNT] =
{ -12283.51f, -1924.839f, 133.5170f, 0.069813f }
};
+Position const PosMandokir[2] =
+{
+ { -12167.8f, -1927.25f, 153.73f, 3.76991f },
+ { -12197.86f, -1949.392f, 130.2745f, 0.0f }
+};
+
class boss_mandokir : public CreatureScript
{
public: boss_mandokir() : CreatureScript("boss_mandokir") {}
@@ -101,24 +111,35 @@ class boss_mandokir : public CreatureScript
boss_mandokirAI(Creature* creature) : BossAI(creature, DATA_MANDOKIR) {}
uint8 killCount;
+ uint64 chainedSpirtGUIDs[CHAINED_SPIRT_COUNT];
void Reset()
{
- _Reset();
- killCount = 0;
+ if (me->GetPositionZ() > 140.0f)
+ {
+ _Reset();
+ killCount = 0;
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
+ events.ScheduleEvent(EVENT_CHECK_START, 1000);
+ if (uint64 speakerGUID = instance->GetData64(NPC_SPEAKER))
+ if (Creature* speaker = Creature::GetCreature(*me, NPC_SPEAKER))
+ if (!speaker->isAlive())
+ speaker->Respawn(true);
+ }
+ summons.DespawnAll();
me->Mount(MODEL_OHGAN_MOUNT);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
- events.ScheduleEvent(EVENT_CHECK_START, 1000);
}
void JustDied(Unit* /*killer*/)
{
- _JustDied();
- }
-
- void Evade(Unit* /*killer*/)
- {
-
+ // Do not want to unsummon Ohgan
+ for (int i = 0; i < CHAINED_SPIRT_COUNT; ++i)
+ {
+ if (Creature* unsummon = Creature::GetCreature(*me, chainedSpirtGUIDs[i]))
+ unsummon->DespawnOrUnsummon();
+ }
+ instance->SetBossState(DATA_MANDOKIR, DONE);
+ instance->SaveToDB();
}
void EnterCombat(Unit* /*who*/)
@@ -129,14 +150,20 @@ class boss_mandokir : public CreatureScript
events.ScheduleEvent(EVENT_WHIRLWIND, urand(24000, 30000));
events.ScheduleEvent(EVENT_CHECK_OHGAN, 1000);
events.ScheduleEvent(EVENT_WATCH_PLAYER, urand(13000, 15000));
- me->SetSpeed(MOVE_RUN, false);
- me->GetMotionMaster()->Clear(true);
+ events.ScheduleEvent(EVENT_CHARGE_PLAYER, urand(33000, 38000));
+ me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
Talk(SAY_AGGRO);
me->Dismount();
// Summon Ohgan (Spell missing) TEMP HACK
- me->SummonCreature(NPC_OHGAN, me->getVictim()->GetPositionX(), me->getVictim()->GetPositionY(), me->getVictim()->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 35000);
+ me->SummonCreature(NPC_OHGAN, me->GetPositionX()-3, me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 35000);
+ // Summon Chained Spirits
for (int i = 0; i < CHAINED_SPIRT_COUNT; ++i)
- me->SummonCreature(NPC_CHAINED_SPIRT, PosSummonChainedSpirits[i], TEMPSUMMON_CORPSE_DESPAWN);
+ {
+ Creature* chainedSpirt = NULL;
+ chainedSpirt = me->SummonCreature(NPC_CHAINED_SPIRT, PosSummonChainedSpirits[i], TEMPSUMMON_CORPSE_DESPAWN);
+ chainedSpirtGUIDs[i] = chainedSpirt->GetGUID();
+ }
+ DoZoneInCombat();
}
void KilledUnit(Unit* victim)
@@ -156,9 +183,23 @@ class boss_mandokir : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void MovementInform(uint32 type, uint32 id)
{
+ if (type == WAYPOINT_MOTION_TYPE)
+ {
+ me->SetWalk(false);
+ if (id == POINT_MANDOKIR_END)
+ {
+ me->SetHomePosition(PosMandokir[0]);
+ if (instance)
+ instance->SetBossState(DATA_MANDOKIR, NOT_STARTED);
+ me->DespawnOrUnsummon(6000); // No idea how to respawn on wipe.
+ }
+ }
+ }
+ void UpdateAI(uint32 const diff)
+ {
events.Update(diff);
if (!UpdateVictim())
@@ -172,16 +213,14 @@ class boss_mandokir : public CreatureScript
if(instance)
if (instance->GetBossState(DATA_MANDOKIR) == SPECIAL)
{
- me->SetSpeed(MOVE_RUN, true);
- me->GetMotionMaster()->MovePoint(0, -12197.86f, -1949.392f, 130.2745f);
- events.ScheduleEvent(EVENT_STARTED, 3000);
+ me->GetMotionMaster()->MovePoint(0, PosMandokir[1].m_positionX, PosMandokir[1].m_positionY, PosMandokir[1].m_positionZ);
+ events.ScheduleEvent(EVENT_STARTED, 6000);
}
else
events.ScheduleEvent(EVENT_CHECK_START, 1000);
break;
case EVENT_STARTED:
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
- me->SetReactState(REACT_AGGRESSIVE);
me->GetMotionMaster()->MovePath(PATH_MANDOKIR,false);
break;
default:
@@ -222,14 +261,17 @@ class boss_mandokir : public CreatureScript
events.ScheduleEvent(EVENT_CHECK_OHGAN, 1000);
break;
case EVENT_WATCH_PLAYER:
- if (Unit* player = SelectTarget(SELECT_TARGET_RANDOM, 0, 40, true))
+ if (Unit* player = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
{
DoCast(player, SPELL_WATCH);
Talk(SAY_WATCH, player->GetGUID());
- // Not complete
}
events.ScheduleEvent(EVENT_WATCH_PLAYER, urand(12000, 15000));
break;
+ case EVENT_CHARGE_PLAYER:
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 40, true), SPELL_CHARGE);
+ events.ScheduleEvent(EVENT_CHARGE_PLAYER, urand(22000, 30000));
+ break;
default:
break;
}
@@ -369,9 +411,39 @@ class mob_vilebranch_speaker : public CreatureScript
}
};
+class spell_threatening_gaze : public SpellScriptLoader
+{
+ public:
+ spell_threatening_gaze() : SpellScriptLoader("spell_threatening_gaze") { }
+
+ class spell_threatening_gaze_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_threatening_gaze_AuraScript);
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (Unit* caster = GetCaster())
+ if(Unit* target = GetTarget())
+ if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE && GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEATH)
+ caster->CastSpell(target, SPELL_WATCH_CHARGE);
+ }
+
+ void Register()
+ {
+ OnEffectRemove += AuraEffectRemoveFn(spell_threatening_gaze_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_threatening_gaze_AuraScript();
+ }
+};
+
void AddSC_boss_mandokir()
{
new boss_mandokir();
new mob_ohgan();
new mob_vilebranch_speaker();
+ new spell_threatening_gaze();
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
index 48f1377da80..04af601868e 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
@@ -45,6 +45,7 @@ class instance_zulgurub : public InstanceMapScript
uint64 zathGUID;
uint64 thekalGUID;
uint64 jindoGUID;
+ uint64 speakerGUID;
void Initialize()
{
@@ -52,6 +53,7 @@ class instance_zulgurub : public InstanceMapScript
zathGUID = 0;
thekalGUID = 0;
jindoGUID = 0;
+ speakerGUID = 0;
}
bool IsEncounterInProgress() const
@@ -64,10 +66,25 @@ class instance_zulgurub : public InstanceMapScript
{
switch (creature->GetEntry())
{
- case NPC_ZEALOT_LORKHAN: lorKhanGUID = creature->GetGUID(); break;
- case NPC_ZEALOT_ZATH: zathGUID = creature->GetGUID(); break;
- case NPC_HIGH_PRIEST_THEKAL: thekalGUID = creature->GetGUID(); break;
- case NPC_JINDO_THE_HEXXER: jindoGUID = creature->GetGUID(); break;
+ case NPC_ZEALOT_LORKHAN:
+ lorKhanGUID = creature->GetGUID();
+ break;
+ case NPC_ZEALOT_ZATH:
+ zathGUID = creature->GetGUID();
+ break;
+ case NPC_HIGH_PRIEST_THEKAL:
+ thekalGUID = creature->GetGUID();
+ break;
+ case NPC_JINDO_THE_HEXXER:
+ jindoGUID = creature->GetGUID();
+ break;
+ case NPC_SPEAKER:
+ speakerGUID = creature->GetGUID();
+ break;
+ case NPC_MANDOKIR:
+ if (GetBossState(DATA_MANDOKIR) == DONE)
+ creature->DespawnOrUnsummon();
+ break;
}
}
@@ -75,10 +92,18 @@ class instance_zulgurub : public InstanceMapScript
{
switch (uiData)
{
- case DATA_LORKHAN: return lorKhanGUID;
- case DATA_ZATH: return zathGUID;
- case DATA_THEKAL: return thekalGUID;
- case DATA_JINDO: return jindoGUID;
+ case DATA_LORKHAN:
+ return lorKhanGUID;
+ break;
+ case DATA_ZATH:
+ return zathGUID;
+ break;
+ case DATA_THEKAL:
+ return thekalGUID;
+ break;
+ case DATA_JINDO:
+ return jindoGUID;
+ break;
}
return 0;
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
index 5871a203b00..a5e23dc2e3f 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
@@ -49,7 +49,8 @@ enum CreatureIds
NPC_SHADE_OF_JINDO = 14986,
NPC_SACRIFICED_TROLL = 14826,
NPC_OHGAN = 14988,
- NPC_CHAINED_SPIRT = 15117
+ NPC_CHAINED_SPIRT = 15117,
+ NPC_MANDOKIR = 11382
};
#endif