aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNay <dnpd.dd@gmail.com>2013-01-21 20:42:02 +0000
committerNay <dnpd.dd@gmail.com>2013-01-21 20:42:02 +0000
commitebded74eeef9b7c4746522ac987b9caba2643b78 (patch)
tree6fe43a31031d6f3cdade1cfc4c52862ae6cf5200 /src
parent1e57543779014dfbb4c024cca25a434e2496e318 (diff)
parent77889806916bb001fbf25c3472474977b2925831 (diff)
Merge remote-tracking branch 'origin/master' into mmaps
Diffstat (limited to 'src')
-rw-r--r--src/server/collision/BoundingIntervalHierarchyWrapper.h18
-rw-r--r--src/server/game/Miscellaneous/Language.h4
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp403
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp77
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h22
7 files changed, 398 insertions, 128 deletions
diff --git a/src/server/collision/BoundingIntervalHierarchyWrapper.h b/src/server/collision/BoundingIntervalHierarchyWrapper.h
index 8a99078caab..315f3004306 100644
--- a/src/server/collision/BoundingIntervalHierarchyWrapper.h
+++ b/src/server/collision/BoundingIntervalHierarchyWrapper.h
@@ -33,11 +33,14 @@ class BIHWrap
{
const T* const* objects;
RayCallback& _callback;
+ uint32 objects_size;
- MDLCallback(RayCallback& callback, const T* const* objects_array ) : objects(objects_array), _callback(callback) {}
+ MDLCallback(RayCallback& callback, const T* const* objects_array, uint32 objects_size ) : objects(objects_array), _callback(callback), objects_size(objects_size) {}
bool operator() (const Ray& ray, uint32 Idx, float& MaxDist, bool /*stopAtFirst*/)
{
+ if (Idx >= objects_size)
+ return false;
if (const T* obj = objects[Idx])
return _callback(ray, *obj, MaxDist/*, stopAtFirst*/);
return false;
@@ -45,6 +48,8 @@ class BIHWrap
void operator() (const Vector3& p, uint32 Idx)
{
+ if (Idx >= objects_size)
+ return false;
if (const T* obj = objects[Idx])
_callback(p, *obj);
}
@@ -87,21 +92,24 @@ public:
m_objects.fastClear();
m_obj2Idx.getKeys(m_objects);
m_objects_to_push.getMembers(m_objects);
+ //assert that m_obj2Idx has all the keys
m_tree.build(m_objects, BoundsFunc::getBounds2);
}
template<typename RayCallback>
- void intersectRay(const Ray& ray, RayCallback& intersectCallback, float& maxDist) const
+ void intersectRay(const Ray& ray, RayCallback& intersectCallback, float& maxDist)
{
- MDLCallback<RayCallback> temp_cb(intersectCallback, m_objects.getCArray());
+ balance();
+ MDLCallback<RayCallback> temp_cb(intersectCallback, m_objects.getCArray(), m_objects.size());
m_tree.intersectRay(ray, temp_cb, maxDist, true);
}
template<typename IsectCallback>
- void intersectPoint(const Vector3& point, IsectCallback& intersectCallback) const
+ void intersectPoint(const Vector3& point, IsectCallback& intersectCallback)
{
- MDLCallback<IsectCallback> callback(intersectCallback, m_objects.getCArray());
+ balance();
+ MDLCallback<IsectCallback> callback(intersectCallback, m_objects.getCArray(), m_objects.size());
m_tree.intersectPoint(point, callback);
}
};
diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h
index 35b0a6f8569..039e8b816b3 100644
--- a/src/server/game/Miscellaneous/Language.h
+++ b/src/server/game/Miscellaneous/Language.h
@@ -742,7 +742,7 @@ enum TrinityStrings
LANG_COMMAND_CREATURESTORAGE_NOTFOUND = 818,
LANG_CHANNEL_CITY = 819,
-
+
LANG_NPCINFO_GOSSIP = 820,
LANG_NPCINFO_QUESTGIVER = 821,
LANG_NPCINFO_TRAINER_CLASS = 822,
@@ -766,7 +766,7 @@ enum TrinityStrings
LANG_NPCINFO_SPELLCLICK = 840,
LANG_NPCINFO_MAILBOX = 841,
LANG_NPCINFO_PLAYER_VEHICLE = 842,
-
+
// Room for in-game strings 843-999 not used
// Level 4 (CLI only commands)
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
index 51aab7c20d0..c2806c395f4 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 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
@@ -17,60 +16,74 @@
*/
/* ScriptData
-SDName: Boss_Arlokk
-SD%Complete: 95
-SDComment: Wrong cleave and red aura is missing.
-SDCategory: Zul'Gurub
+TCName: Boss_Arlokk
+TC%Complete: 95
+TCComment: Wrong cleave and red aura is missing not yet added.
+TCComment: Prowlers moving through wall hopefully mmaps will fix.
+TCComment: Can't test LOS until mmaps.
+TCCategory: Zul'Gurub
EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "SpellInfo.h"
#include "zulgurub.h"
enum Says
{
SAY_AGGRO = 0,
- SAY_FEAST_PANTHER = 1,
+ SAY_FEAST_PROWLER = 1,
SAY_DEATH = 2
};
enum Spells
{
- SPELL_SHADOW_WORD_PAIN = 23952,
- SPELL_GOUGE = 24698,
- SPELL_MARK = 24210,
- SPELL_CLEAVE = 26350, // Perhaps not right. Not a red aura...
- SPELL_PANTHER_TRANSFORM = 24190
+ SPELL_SHADOW_WORD_PAIN = 24212, // Corrected
+ SPELL_GOUGE = 12540, // Corrected
+ SPELL_MARK_OF_ARLOKK = 24210, // triggered spell 24211 Added to spell_dbc
+ SPELL_RAVAGE = 24213, // Corrected
+ SPELL_CLEAVE = 25174, // Searching for right spell
+ SPELL_PANTHER_TRANSFORM = 24190, // Transform to panther now used
+ SPELL_SUMMON_PROWLER = 24246, // Added to Spell_dbc
+ SPELL_VANISH_VISUAL = 24222, // Added
+ SPELL_VANISH = 24223, // Added
+ SPELL_SUPER_INVIS = 24235 // Added to Spell_dbc
};
enum Events
{
- EVENT_SHADOW_WORD_PAIN = 0,
- EVENT_GOUGE = 1,
- EVENT_MARK = 2,
- EVENT_CLEAVE = 3,
- EVENT_VANISH = 4,
- EVENT_VISIBLE = 5,
- EVENT_SUMMON = 6
+ EVENT_SHADOW_WORD_PAIN = 1,
+ EVENT_GOUGE = 2,
+ EVENT_MARK_OF_ARLOKK = 3,
+ EVENT_RAVAGE = 4,
+ EVENT_TRANSFORM = 5,
+ EVENT_VANISH = 6,
+ EVENT_VANISH_2 = 7,
+ EVENT_TRANSFORM_BACK = 8,
+ EVENT_VISIBLE = 9,
+ EVENT_SUMMON_PROWLERS = 10
};
enum Phases
{
- PHASE_ONE = 1,
- PHASE_TWO = 2
+ PHASE_ALL = 0,
+ PHASE_ONE = 1,
+ PHASE_TWO = 2
};
-enum ModelIds
+enum Weapon
{
- MODEL_ID_NORMAL = 15218,
- MODEL_ID_PANTHER = 15215,
- MODEL_ID_BLANK = 11686
+ WEAPON_DAGGER = 10616
};
-Position const PosSummonProwlers[2] =
+enum Misc
{
- { -11532.7998f, -1649.6734f, 41.4800f, 0.0f },
- { -11532.9970f, -1606.4840f, 41.2979f, 0.0f }
+ MAX_PROWLERS_PER_SIDE = 15
+};
+
+Position const PosMoveOnSpawn[1] =
+{
+ { -11561.9f, -1627.868f, 41.29941f, 0.0f }
};
class boss_arlokk : public CreatureScript
@@ -83,52 +96,88 @@ class boss_arlokk : public CreatureScript
void Reset()
{
- summonCount = 0;
- markedTargetGUID = 0;
- me->SetDisplayId(MODEL_ID_NORMAL);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ _summonCountA = 0;
+ _summonCountB = 0;
+ me->RemoveAllAuras();
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_DAGGER));
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(WEAPON_DAGGER));
+ if (instance)
+ {
+ if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_FORCEFIELD)))
+ gate->SetGoState(GO_STATE_READY);
+ me->SetWalk(false);
+ me->GetMotionMaster()->MovePoint(0, PosMoveOnSpawn[0]);
+ }
}
void JustDied(Unit* /*killer*/)
{
- _JustDied();
Talk(SAY_DEATH);
- me->SetDisplayId(MODEL_ID_NORMAL);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->RemoveAllAuras();
+ if (instance)
+ {
+ if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_FORCEFIELD)))
+ gate->SetGoState(GO_STATE_ACTIVE);
+ instance->SetBossState(DATA_ARLOKK, DONE);
+ }
}
void EnterCombat(Unit* /*who*/)
{
_EnterCombat();
- events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 8000, 0, PHASE_ONE);
- events.ScheduleEvent(EVENT_MARK, 35000, 0, PHASE_ONE);
- events.ScheduleEvent(EVENT_SUMMON, 5000);
- events.ScheduleEvent(EVENT_VANISH, 60000);
+ events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(7000, 9000), 0, PHASE_ONE);
+ events.ScheduleEvent(EVENT_GOUGE, urand(12000, 15000), 0, PHASE_ONE);
+ if (instance)
+ events.ScheduleEvent(EVENT_SUMMON_PROWLERS, 6000, 0, PHASE_ALL);
+ events.ScheduleEvent(EVENT_MARK_OF_ARLOKK, urand(9000, 11000), 0, PHASE_ALL);
+ events.ScheduleEvent(EVENT_TRANSFORM, urand(15000, 20000), 0, PHASE_ONE);
Talk(SAY_AGGRO);
- }
- void JustReachedHome()
- {
- instance->SetBossState(DATA_ARLOKK, NOT_STARTED);
- me->DespawnOrUnsummon();
+ // Sets up list of Panther spawners to cast on
+ std::list<Creature*> triggerList;
+ GetCreatureListWithEntryInGrid(triggerList, me, NPC_PANTHER_TRIGGER, 100.0f);
+ if (!triggerList.empty())
+ {
+ uint8 sideA = 0;
+ uint8 sideB = 0;
+ for (std::list<Creature*>::const_iterator itr = triggerList.begin(); itr != triggerList.end(); ++itr)
+ {
+ if (Creature* trigger = *itr)
+ {
+ if (trigger->GetPositionY() < -1625.0f)
+ {
+ _triggersSideAGUID[sideA] = trigger->GetGUID();
+ ++sideA;
+ }
+ else
+ {
+ _triggersSideBGUID[sideB] = trigger->GetGUID();
+ ++sideB;
+ }
+ }
+ }
+ }
}
- void DoSummonPhanters()
+ void EnterEvadeMode()
{
- if (summonCount > 30)
- return;
-
- if (markedTargetGUID)
- Talk(SAY_FEAST_PANTHER, markedTargetGUID);
- me->SummonCreature(NPC_ZULIAN_PROWLER, PosSummonProwlers[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- me->SummonCreature(NPC_ZULIAN_PROWLER, PosSummonProwlers[1], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
+ if (instance)
+ {
+ if (GameObject* object = me->GetMap()->GetGameObject(instance->GetData64(GO_FORCEFIELD)))
+ object->SetGoState(GO_STATE_ACTIVE);
+ if (GameObject* object = me->GetMap()->GetGameObject(instance->GetData64(GO_GONG_OF_BETHEKK)))
+ object->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ instance->SetBossState(DATA_ARLOKK, NOT_STARTED);
+ }
+ me->DespawnOrUnsummon(4000);
}
- void JustSummoned(Creature* summoned)
+ void SetData(uint32 id, uint32 /*value*/)
{
- if (Unit* markedTarget = Unit::GetUnit(*me, markedTargetGUID))
- summoned->AI()->AttackStart(markedTarget);
- ++summonCount;
+ if (id == 1)
+ --_summonCountA;
+ else if (id == 2)
+ --_summonCountB;
}
void UpdateAI(uint32 const diff)
@@ -147,47 +196,103 @@ class boss_arlokk : public CreatureScript
{
case EVENT_SHADOW_WORD_PAIN:
DoCastVictim(SPELL_SHADOW_WORD_PAIN, true);
- events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 15000, 0, PHASE_ONE);
- break;
- case EVENT_MARK:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
- DoCast(target, SPELL_MARK);
- events.ScheduleEvent(EVENT_MARK, 15000, 0, PHASE_ONE);
- break;
- case EVENT_CLEAVE:
- DoCastVictim(SPELL_SHADOW_WORD_PAIN, true);
- events.ScheduleEvent(EVENT_CLEAVE, 16000, 0, PHASE_TWO);
+ events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(5000, 7000), 0, PHASE_ONE);
break;
case EVENT_GOUGE:
- DoCastVictim(SPELL_SHADOW_WORD_PAIN, true);
- events.ScheduleEvent(EVENT_GOUGE, urand(17000, 27000), 0, PHASE_TWO);
+ DoCastVictim(SPELL_GOUGE, true);
break;
- case EVENT_SUMMON:
- DoSummonPhanters();
- events.ScheduleEvent(EVENT_SUMMON, 5000);
+ case EVENT_SUMMON_PROWLERS:
+ if (_summonCountA < MAX_PROWLERS_PER_SIDE)
+ {
+ if (Unit* trigger = me->GetUnit(*me, _triggersSideAGUID[urand(0, 4)]))
+ {
+ trigger->CastSpell(trigger, SPELL_SUMMON_PROWLER);
+ ++_summonCountA;
+ }
+ }
+ if (_summonCountB < MAX_PROWLERS_PER_SIDE)
+ {
+ if (Unit* trigger = me->GetUnit(*me, _triggersSideBGUID[urand(0, 4)]))
+ {
+ trigger->CastSpell(trigger, SPELL_SUMMON_PROWLER);
+ ++_summonCountB;
+ }
+ }
+ events.ScheduleEvent(EVENT_SUMMON_PROWLERS, 6000, 0, PHASE_ALL);
break;
- case EVENT_VANISH:
- me->SetDisplayId(MODEL_ID_BLANK);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- me->AttackStop();
- DoResetThreat();
- events.ScheduleEvent(EVENT_VISIBLE, 6000);
+ case EVENT_MARK_OF_ARLOKK:
+ {
+ Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, urand(1,3), 0.0f, false, -SPELL_MARK_OF_ARLOKK);
+ if (!target)
+ target = me->getVictim();
+ if (target)
+ {
+ DoCast(target, SPELL_MARK_OF_ARLOKK, true);
+ Talk(SAY_FEAST_PROWLER, target->GetGUID());
+ }
+ events.ScheduleEvent(EVENT_MARK_OF_ARLOKK, urand(120000, 130000));
break;
- case EVENT_VISIBLE:
+ }
+ case EVENT_TRANSFORM:
{
- me->SetDisplayId(MODEL_ID_PANTHER);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ DoCast(me, SPELL_PANTHER_TRANSFORM);
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(EQUIP_UNEQUIP));
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(EQUIP_UNEQUIP));
const CreatureTemplate* cinfo = me->GetCreatureTemplate();
me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35)));
me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35)));
me->UpdateDamagePhysical(BASE_ATTACK);
+ me->AttackStop();
+ DoResetThreat();
+ me->SetReactState(REACT_PASSIVE);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
+ DoCast(me, SPELL_VANISH_VISUAL);
+ DoCast(me, SPELL_VANISH);
+ events.ScheduleEvent(EVENT_VANISH, 1000, 0, PHASE_ONE);
+ break;
+ }
+ case EVENT_VANISH:
+ DoCast(me, SPELL_SUPER_INVIS);
+ me->SetWalk(false);
+ if (instance)
+ me->GetMotionMaster()->MovePoint(0, frand(-11551.0f, -11508.0f), frand(-1638.0f, -1617.0f), me->GetPositionZ());
+ events.ScheduleEvent(EVENT_VANISH_2, 9000, 0, PHASE_ONE);
+ break;
+ case EVENT_VANISH_2:
+ DoCast(me, SPELL_VANISH);
+ DoCast(me, SPELL_SUPER_INVIS);
+ events.ScheduleEvent(EVENT_VISIBLE, urand(7000, 10000), 0, PHASE_ONE);
+ break;
+ case EVENT_VISIBLE:
+ me->SetReactState(REACT_AGGRESSIVE);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
AttackStart(target);
- events.ScheduleEvent(EVENT_VANISH, 39000);
- events.ScheduleEvent(EVENT_CLEAVE, 0, PHASE_TWO);
- events.ScheduleEvent(EVENT_GOUGE, 14000, 0, PHASE_TWO);
+ me->RemoveAura(SPELL_SUPER_INVIS);
+ me->RemoveAura(SPELL_VANISH);
+ events.ScheduleEvent(EVENT_RAVAGE, urand(10000, 14000), 0, PHASE_TWO);
+ events.ScheduleEvent(EVENT_TRANSFORM_BACK, urand(15000, 18000), 0, PHASE_TWO);
events.SetPhase(PHASE_TWO);
break;
+ case EVENT_RAVAGE:
+ DoCastVictim(SPELL_RAVAGE, true);
+ events.ScheduleEvent(EVENT_RAVAGE, urand(10000, 14000), 0, PHASE_TWO);
+ break;
+ case EVENT_TRANSFORM_BACK:
+ {
+ me->RemoveAura(SPELL_PANTHER_TRANSFORM);
+ DoCast(me, SPELL_VANISH_VISUAL);
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_DAGGER));
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(WEAPON_DAGGER));
+ const CreatureTemplate* cinfo = me->GetCreatureTemplate();
+ me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg));
+ me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg));
+ me->UpdateDamagePhysical(BASE_ATTACK);
+ events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(4000, 7000), 0, PHASE_ONE);
+ events.ScheduleEvent(EVENT_GOUGE, urand(12000, 15000), 0, PHASE_ONE);
+ events.ScheduleEvent(EVENT_TRANSFORM, urand(16000, 20000), 0, PHASE_ONE);
+ events.SetPhase(PHASE_ONE);
+ break;
}
default:
break;
@@ -198,8 +303,10 @@ class boss_arlokk : public CreatureScript
}
private:
- uint32 summonCount;
- uint64 markedTargetGUID;
+ uint8 _summonCountA;
+ uint8 _summonCountB;
+ uint64 _triggersSideAGUID[5];
+ uint64 _triggersSideBGUID[5];
};
CreatureAI* GetAI(Creature* creature) const
@@ -208,20 +315,134 @@ class boss_arlokk : public CreatureScript
}
};
+/*######
+## npc_zulian_prowler
+######*/
+
+enum ZulianProwlerSpells
+{
+ SPELL_SNEAK_RANK_1_1 = 22766,
+ SPELL_SNEAK_RANK_1_2 = 7939, // Added to Spell_dbc
+ SPELL_MARK_OF_ARLOKK_TRIGGER = 24211 // Added to Spell_dbc
+};
+
+enum ZulianProwlerEvents
+{
+ EVENT_ATTACK = 1
+};
+
+Position const PosProwlerCenter[1] =
+{
+ { -11556.7f, -1631.344f, 41.2994f, 0.0f }
+};
+
+class npc_zulian_prowler : public CreatureScript
+{
+ public: npc_zulian_prowler() : CreatureScript("npc_zulian_prowler") {}
+
+ struct npc_zulian_prowlerAI : public ScriptedAI
+ {
+ npc_zulian_prowlerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
+
+ void Reset()
+ {
+ if (me->GetPositionY() < -1625.0f)
+ _sideData = 1;
+ else
+ _sideData = 2;
+
+ DoCast(me, SPELL_SNEAK_RANK_1_1);
+ DoCast(me, SPELL_SNEAK_RANK_1_2);
+
+ if (_instance)
+ if (Unit* arlokk = me->GetUnit(*me, _instance->GetData64(NPC_ARLOKK)))
+ me->GetMotionMaster()->MovePoint(0, arlokk->GetPositionX(), arlokk->GetPositionY(), arlokk->GetPositionZ());
+ _events.ScheduleEvent(EVENT_ATTACK, 6000);
+ }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ me->GetMotionMaster()->Clear(false);
+ me->RemoveAura(SPELL_SNEAK_RANK_1_1);
+ me->RemoveAura(SPELL_SNEAK_RANK_1_2);
+ }
+
+ void SpellHit(Unit* caster, SpellInfo const* spell)
+ {
+ if (spell->Id == SPELL_MARK_OF_ARLOKK_TRIGGER) // Should only hit if line of sight
+ me->Attack(caster, true);
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ if (_instance)
+ {
+ if (Unit* arlokk = me->GetUnit(*me, _instance->GetData64(NPC_ARLOKK)))
+ {
+ if (arlokk->isAlive())
+ arlokk->GetAI()->SetData(_sideData, 0);
+ }
+ }
+ me->DespawnOrUnsummon(4000);
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (UpdateVictim())
+ {
+ DoMeleeAttackIfReady();
+ return;
+ }
+
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_ATTACK:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0.0f, 100, false))
+ me->Attack(target, true);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ private:
+ int32 _sideData;
+ EventMap _events;
+ InstanceScript* _instance;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return GetZulGurubAI<npc_zulian_prowlerAI>(creature);
+ }
+};
+
+/*######
+## go_gong_of_bethekk
+######*/
+
+Position const PosSummonArlokk[1] =
+{
+ { -11507.22f, -1628.062f, 41.38264f, 3.159046f }
+};
+
class go_gong_of_bethekk : public GameObjectScript
{
public: go_gong_of_bethekk() : GameObjectScript("go_gong_of_bethekk") {}
bool OnGossipHello(Player* /*player*/, GameObject* go)
{
- if (InstanceScript* instance = go->GetInstanceScript())
+ if (go->GetInstanceScript())
{
- if (instance->GetBossState(DATA_ARLOKK) == DONE || instance->GetBossState(DATA_ARLOKK) == IN_PROGRESS)
- return true;
- instance->SetBossState(DATA_ARLOKK, IN_PROGRESS);
- return true;
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ go->SendCustomAnim(0);
+ go->SummonCreature(NPC_ARLOKK, PosSummonArlokk[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 600000);
}
-
return true;
}
};
@@ -229,6 +450,6 @@ class go_gong_of_bethekk : public GameObjectScript
void AddSC_boss_arlokk()
{
new boss_arlokk();
+ new npc_zulian_prowler();
new go_gong_of_bethekk();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp
index 70399b6934c..f3f12bc35c5 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp
@@ -112,4 +112,3 @@ void AddSC_boss_gahzranka()
{
new boss_gahzranka();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp
index 15228815d69..809403bb325 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp
@@ -121,4 +121,3 @@ void AddSC_boss_hazzarah()
{
new boss_hazzarah();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
index 19a2ba39578..01c5ef998f5 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
@@ -40,11 +40,14 @@ class instance_zulgurub : public InstanceMapScript
void Initialize()
{
- ZealotLorkhanGUID = 0;
- ZealotZathGUID = 0;
- HighPriestTekalGUID = 0;
- JindoTheHexxerGUID = 0;
- VilebranchSpeakerGUID = 0;
+ _zealotLorkhanGUID = 0;
+ _zealotZathGUID = 0;
+ _highPriestTekalGUID = 0;
+ _jindoTheHexxerGUID = 0;
+ _vilebranchSpeakerGUID = 0;
+ _arlokkGUID = 0;
+ _goForcefieldGUID = 0;
+ _goGongOfBethekkGUID = 0;
}
bool IsEncounterInProgress() const
@@ -58,23 +61,41 @@ class instance_zulgurub : public InstanceMapScript
switch (creature->GetEntry())
{
case NPC_ZEALOT_LORKHAN:
- ZealotLorkhanGUID = creature->GetGUID();
+ _zealotLorkhanGUID = creature->GetGUID();
break;
case NPC_ZEALOT_ZATH:
- ZealotZathGUID = creature->GetGUID();
+ _zealotZathGUID = creature->GetGUID();
break;
case NPC_HIGH_PRIEST_THEKAL:
- HighPriestTekalGUID = creature->GetGUID();
+ _highPriestTekalGUID = creature->GetGUID();
break;
case NPC_JINDO_THE_HEXXER:
- JindoTheHexxerGUID = creature->GetGUID();
+ _jindoTheHexxerGUID = creature->GetGUID();
break;
case NPC_VILEBRANCH_SPEAKER:
- VilebranchSpeakerGUID = creature->GetGUID();
+ _vilebranchSpeakerGUID = creature->GetGUID();
break;
- case NPC_MANDOKIR:
- if (GetBossState(DATA_MANDOKIR) == DONE)
- creature->DespawnOrUnsummon();
+ case NPC_ARLOKK:
+ _arlokkGUID = creature->GetGUID();
+ break;
+ }
+ }
+
+ void OnGameObjectCreate(GameObject* go)
+ {
+ switch (go->GetEntry())
+ {
+ case GO_FORCEFIELD:
+ _goForcefieldGUID = go->GetGUID();
+ break;
+ case GO_GONG_OF_BETHEKK:
+ _goGongOfBethekkGUID = go->GetGUID();
+ if (GetBossState(DATA_ARLOKK) == DONE)
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ else
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ break;
+ default:
break;
}
}
@@ -84,16 +105,25 @@ class instance_zulgurub : public InstanceMapScript
switch (uiData)
{
case DATA_LORKHAN:
- return ZealotLorkhanGUID;
+ return _zealotLorkhanGUID;
break;
case DATA_ZATH:
- return ZealotZathGUID;
+ return _zealotZathGUID;
break;
case DATA_THEKAL:
- return HighPriestTekalGUID;
+ return _highPriestTekalGUID;
break;
case DATA_JINDO:
- return JindoTheHexxerGUID;
+ return _jindoTheHexxerGUID;
+ break;
+ case NPC_ARLOKK:
+ return _arlokkGUID;
+ break;
+ case GO_FORCEFIELD:
+ return _goForcefieldGUID;
+ break;
+ case GO_GONG_OF_BETHEKK:
+ return _goGongOfBethekkGUID;
break;
}
return 0;
@@ -145,11 +175,14 @@ class instance_zulgurub : public InstanceMapScript
//If all High Priest bosses were killed. Lorkhan, Zath and Ohgan are added too.
//Storing Lorkhan, Zath and Thekal because we need to cast on them later. Jindo is needed for healfunction too.
- uint64 ZealotLorkhanGUID;
- uint64 ZealotZathGUID;
- uint64 HighPriestTekalGUID;
- uint64 JindoTheHexxerGUID;
- uint64 VilebranchSpeakerGUID;
+ uint64 _zealotLorkhanGUID;
+ uint64 _zealotZathGUID;
+ uint64 _highPriestTekalGUID;
+ uint64 _jindoTheHexxerGUID;
+ uint64 _vilebranchSpeakerGUID;
+ uint64 _arlokkGUID;
+ uint64 _goForcefieldGUID;
+ uint64 _goGongOfBethekkGUID;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
index 34680447cd7..77767153a96 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
@@ -36,23 +36,33 @@ enum DataTypes
DATA_EDGE_OF_MADNESS = 9, // Optional Event Edge of Madness - one of: Gri'lek, Renataki, Hazza'rah, or Wushoolay
DATA_LORKHAN = 10, // Zealot Lor'Khan add to High priest Thekal!
DATA_ZATH = 11, // Zealot Zath add to High priest Thekal!
- DATA_OHGAN = 12 // Bloodlord Mandokir's raptor mount
+ DATA_OHGAN = 12, // Bloodlord Mandokir's raptor mount
+ TYPE_EDGE_OF_MADNESS = 13 // Boss storage
};
enum CreatureIds
{
+ NPC_ARLOKK = 14515, // Arlokk Event
+ NPC_PANTHER_TRIGGER = 15091, // Arlokk Event
+ NPC_ZULIAN_PROWLER = 15101, // Arlokk Event
NPC_ZEALOT_LORKHAN = 11347,
NPC_ZEALOT_ZATH = 11348,
NPC_HIGH_PRIEST_THEKAL = 14509,
NPC_JINDO_THE_HEXXER = 11380,
NPC_NIGHTMARE_ILLUSION = 15163,
- NPC_ZULIAN_PROWLER = 15101,
- NPC_VILEBRANCH_SPEAKER = 11391,
NPC_SHADE_OF_JINDO = 14986,
NPC_SACRIFICED_TROLL = 14826,
- NPC_OHGAN = 14988,
- NPC_CHAINED_SPIRT = 15117,
- NPC_MANDOKIR = 11382
+ NPC_MANDOKIR = 11382, // Mandokir Event
+ NPC_OHGAN = 14988, // Mandokir Event
+ NPC_VILEBRANCH_SPEAKER = 11391, // Mandokir Event
+ NPC_CHAINED_SPIRT = 15117 // Mandokir Event
+
+};
+
+enum GameobjectIds
+{
+ GO_FORCEFIELD = 180497, // Arlokk Event
+ GO_GONG_OF_BETHEKK = 180526 // Arlokk Event
};
template<class AI>