mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-20 09:17:36 +01:00
Core/Script: Fix quest Rescue the Survivors!
This commit is contained in:
@@ -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);
|
||||
|
||||
_playerGUID = Caster->GetGUID();
|
||||
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
|
||||
player->KilledMonsterCredit(me->GetEntry());
|
||||
|
||||
me->SetFacingToObject(Caster);
|
||||
DoCast(me, SPELL_STUNNED, true);
|
||||
|
||||
pCaster = Caster->GetGUID();
|
||||
|
||||
SayThanksTimer = 5000;
|
||||
_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;
|
||||
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 (RunAwayTimer)
|
||||
{
|
||||
if (RunAwayTimer <= diff)
|
||||
me->DespawnOrUnsummon();
|
||||
else
|
||||
RunAwayTimer -= diff;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user