diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp | 57 |
1 files changed, 55 insertions, 2 deletions
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp index ac48a02f538..7a3e7e2e738 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp @@ -28,6 +28,7 @@ EndScriptData */ #include "karazhan.h" #include "GameObject.h" #include "SpellInfo.h" +#include "Player.h" enum ShadeOfAran { @@ -40,7 +41,7 @@ enum ShadeOfAran SAY_KILL = 6, SAY_TIMEOVER = 7, SAY_DEATH = 8, -// SAY_ATIESH = 9, Unused + SAY_ATIESH = 9, //Spells SPELL_FROSTBOLT = 29954, @@ -79,6 +80,22 @@ enum SuperSpell SUPER_AE, }; +enum Items +{ + ITEM_ATIESH_MAGE = 22589, + ITEM_ATIESH_WARLOCK = 22630, + ITEM_ATIESH_PRIEST = 22631, + ITEM_ATIESH_DRUID = 22632, +}; + +uint32 const AtieshStaves[4] = +{ + ITEM_ATIESH_MAGE, + ITEM_ATIESH_WARLOCK, + ITEM_ATIESH_PRIEST, + ITEM_ATIESH_DRUID, +}; + class boss_shade_of_aran : public CreatureScript { public: @@ -91,7 +108,7 @@ public: struct boss_aranAI : public ScriptedAI { - boss_aranAI(Creature* creature) : ScriptedAI(creature) + boss_aranAI(Creature* creature) : ScriptedAI(creature), SeenAtiesh(false) { Initialize(); instance = creature->GetInstanceScript(); @@ -148,6 +165,7 @@ public: bool ElementalsSpawned; bool Drinking; bool DrinkInturrupted; + bool SeenAtiesh; void Reset() override { @@ -503,6 +521,41 @@ public: return; } } + + void MoveInLineOfSight(Unit* who) override + { + ScriptedAI::MoveInLineOfSight(who); + + if (SeenAtiesh || me->IsInCombat() || me->GetDistance2d(who) > me->GetAttackDistance(who) + 10.0f) + return; + + Player* player = who->ToPlayer(); + if (!player) + return; + + for (uint32 id : AtieshStaves) + { + if (!PlayerHasWeaponEquipped(player, id)) + continue; + + SeenAtiesh = true; + Talk(SAY_ATIESH); + me->SetFacingTo(me->GetAngle(player)); + me->ClearUnitState(UNIT_STATE_MOVING); + me->GetMotionMaster()->MoveDistract(7 * IN_MILLISECONDS); + break; + } + } + + private: + bool PlayerHasWeaponEquipped(Player* player, uint32 itemEntry) + { + Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); + if (item && item->GetEntry() == itemEntry) + return true; + + return false; + } }; }; |