diff options
-rw-r--r-- | src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp | 121 |
1 files changed, 60 insertions, 61 deletions
diff --git a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp index 4b0a551f229..a98aaa30da5 100644 --- a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp +++ b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp @@ -48,12 +48,17 @@ EndContentData */ enum draeneiSurvivor { - SAY_HEAL = 0, - SAY_HELP = 1, - SPELL_IRRIDATION = 35046, - SPELL_STUNNED = 28630 + SAY_THANK_FOR_HEAL = 0, + SAY_ASK_FOR_HELP = 1, + SPELL_IRRIDATION = 35046, + SPELL_STUNNED = 28630, + EVENT_CAN_ASK_FOR_HELP = 1, + EVENT_THANK_PLAYER = 2, + EVENT_RUN_AWAY = 3 }; +Position const CrashSite = { -4115.25f, -13754.75f }; + class npc_draenei_survivor : public CreatureScript { public: @@ -68,26 +73,16 @@ public: void Initialize() { - pCaster.Clear(); - - SayThanksTimer = 0; - RunAwayTimer = 0; - SayHelpTimer = 10000; - - CanSayHelp = true; + _playerGUID.Clear(); + _canAskForHelp = true; + _canUpdateEvents = false; + _tappedBySpell = false; } - ObjectGuid pCaster; - - uint32 SayThanksTimer; - uint32 RunAwayTimer; - uint32 SayHelpTimer; - - bool CanSayHelp; - void Reset() override { Initialize(); + _events.Reset(); DoCast(me, SPELL_IRRIDATION, true); @@ -101,72 +96,76 @@ public: void MoveInLineOfSight(Unit* who) override { - if (CanSayHelp && who->GetTypeId() == TYPEID_PLAYER && me->IsFriendlyTo(who) && me->IsWithinDistInMap(who, 25.0f)) + if (_canAskForHelp && who->GetTypeId() == TYPEID_PLAYER && me->IsFriendlyTo(who) && me->IsWithinDistInMap(who, 25.0f)) { //Random switch between 4 texts - Talk(SAY_HELP, who); + Talk(SAY_ASK_FOR_HELP); - SayHelpTimer = 20000; - CanSayHelp = false; + _events.ScheduleEvent(EVENT_CAN_ASK_FOR_HELP, Seconds(16), Seconds(20)); + _canAskForHelp = false; + _canUpdateEvents = true; } } void SpellHit(Unit* Caster, const SpellInfo* Spell) override { - if (Spell->SpellFamilyFlags[2] & 0x080000000) + if (Spell->SpellFamilyFlags[2] & 0x080000000 && !_tappedBySpell) { + _events.Reset(); + _tappedBySpell = true; + _canAskForHelp = false; + _canUpdateEvents = true; + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE); me->SetStandState(UNIT_STAND_STATE_STAND); - DoCast(me, SPELL_STUNNED, true); + _playerGUID = Caster->GetGUID(); + if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + player->KilledMonsterCredit(me->GetEntry()); - pCaster = Caster->GetGUID(); - - SayThanksTimer = 5000; + me->SetFacingToObject(Caster); + DoCast(me, SPELL_STUNNED, true); + _events.ScheduleEvent(EVENT_THANK_PLAYER, Seconds(4)); } } void UpdateAI(uint32 diff) override { - if (SayThanksTimer) + if (!_canUpdateEvents) + return; + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) { - if (SayThanksTimer <= diff) + switch (eventId) { + case EVENT_CAN_ASK_FOR_HELP: + _canAskForHelp = true; + _canUpdateEvents = false; + break; + case EVENT_THANK_PLAYER: me->RemoveAurasDueToSpell(SPELL_IRRIDATION); - - if (Player* player = ObjectAccessor::GetPlayer(*me, pCaster)) - { - Talk(SAY_HEAL, player); - - player->TalkedToCreature(me->GetEntry(), me->GetGUID()); - } - + if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + Talk(SAY_THANK_FOR_HEAL, player); + _events.ScheduleEvent(EVENT_RUN_AWAY, Seconds(10)); + break; + case EVENT_RUN_AWAY: me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MovePoint(0, -4115.053711f, -13754.831055f, 73.508949f); - - RunAwayTimer = 10000; - SayThanksTimer = 0; - } else SayThanksTimer -= diff; - - return; - } - - if (RunAwayTimer) - { - if (RunAwayTimer <= diff) - me->DespawnOrUnsummon(); - else - RunAwayTimer -= diff; - - return; + me->GetMotionMaster()->MovePoint(0, me->GetPositionX() + (std::cos(me->GetAngle(CrashSite)) * 28.0f), me->GetPositionY() + (std::sin(me->GetAngle(CrashSite)) * 28.0f), me->GetPositionZ() + 1.0f); + me->DespawnOrUnsummon(Seconds(4)); + break; + default: + break; + } } - - if (SayHelpTimer <= diff) - { - CanSayHelp = true; - SayHelpTimer = 20000; - } else SayHelpTimer -= diff; } + private: + EventMap _events; + bool _canUpdateEvents; + bool _tappedBySpell; + bool _canAskForHelp; + ObjectGuid _playerGUID; }; CreatureAI* GetAI(Creature* creature) const override |