fix(Scripts/ShadowmoonValley): minor fixes to Enslaved Netherwing Drakes (#18883)

* init

* fixes
This commit is contained in:
Dan
2024-05-17 08:06:25 +02:00
committed by GitHub
parent 6874d5e61b
commit 3b4639aa19
@@ -439,9 +439,6 @@ enum EnshlavedNetherwingDrake
NPC_DRAGONMAW_WRANGLER = 21717, NPC_DRAGONMAW_WRANGLER = 21717,
NPC_ESCAPE_DUMMY = 22317, NPC_ESCAPE_DUMMY = 22317,
EVENT_TAKE_OFF = 1,
EVENT_CREDIT_PLAYER = 2,
// Point // Point
POINT_DESPAWN = 1 POINT_DESPAWN = 1
}; };
@@ -451,18 +448,14 @@ struct npc_enslaved_netherwing_drake : public ScriptedAI
public: public:
npc_enslaved_netherwing_drake(Creature* creature) : ScriptedAI(creature) npc_enslaved_netherwing_drake(Creature* creature) : ScriptedAI(creature)
{ {
Tapped = false; _tapped = false;
Reset(); Reset();
} }
ObjectGuid PlayerGUID;
bool Tapped;
Player* GetPlayer() { return ObjectAccessor::GetPlayer(*me, PlayerGUID); }
void Reset() override void Reset() override
{ {
if (!Tapped) scheduler.CancelAll();
if (!_tapped)
{ {
me->RestoreFaction(); me->RestoreFaction();
me->SetReactState(REACT_AGGRESSIVE); me->SetReactState(REACT_AGGRESSIVE);
@@ -474,9 +467,8 @@ public:
void JustDied(Unit* /*killer*/) override void JustDied(Unit* /*killer*/) override
{ {
Tapped = false; _tapped = false;
me->RestoreFaction(); me->RestoreFaction();
events.CancelEvent(EVENT_TAKE_OFF);
} }
void SpellHit(Unit* caster, SpellInfo const* spell) override void SpellHit(Unit* caster, SpellInfo const* spell) override
@@ -485,20 +477,45 @@ public:
if (!playerCaster) if (!playerCaster)
return; return;
if (spell->Id == SPELL_HIT_FORCE_OF_NELTHARAKU && !Tapped && if (spell->Id == SPELL_HIT_FORCE_OF_NELTHARAKU && !_tapped &&
playerCaster->GetQuestStatus(QUEST_THE_FORCE_OF_NELTHARAKU) == QUEST_STATUS_INCOMPLETE) playerCaster->GetQuestStatus(QUEST_THE_FORCE_OF_NELTHARAKU) == QUEST_STATUS_INCOMPLETE)
{ {
Tapped = true; _tapped = true;
PlayerGUID = caster->GetGUID(); _playerGUID = caster->GetGUID();
me->SetFaction(FACTION_FLAYER_HUNTER); // Not sure if this is correct, it was taken off of Mordenai. scheduler.Schedule(2s, [this](TaskContext)
{
me->SetFaction(FACTION_FLAYER_HUNTER); // Not sure if this is correct, it was taken off of Mordenai.
if (Unit* Dragonmaw = me->FindNearestCreature(NPC_DRAGONMAW_SUBJUGATOR, 25.0f)) if (Unit* dragonmaw = me->FindNearestCreature(NPC_DRAGONMAW_SUBJUGATOR, 25.0f))
AttackStart(Dragonmaw); AttackStart(dragonmaw);
else if (Unit* Dragonmaw = me->FindNearestCreature(NPC_DRAGONMAW_WRANGLER, 25.0f)) else if (Unit* dragonmaw = me->FindNearestCreature(NPC_DRAGONMAW_WRANGLER, 25.0f))
AttackStart(Dragonmaw); AttackStart(dragonmaw);
scheduler.Schedule(2s, [this](TaskContext)
{
_tapped = false;
Position pos;
if (Unit* escapeDummy = me->FindNearestCreature(NPC_ESCAPE_DUMMY, 30.0f))
pos = escapeDummy->GetPosition();
else
{
pos = me->GetRandomNearPosition(20.0f);
pos.m_positionZ += 25.0f;
}
events.ScheduleEvent(EVENT_TAKE_OFF, 2s); me->SetDisableGravity(true);
me->GetMotionMaster()->MovePoint(POINT_DESPAWN, pos);
me->SetReactState(REACT_PASSIVE);
scheduler.Schedule(100ms, [this](TaskContext)
{
if (Player* player = _GetPlayer())
{
DoCast(player, SPELL_FORCE_OF_NELTHARAKU, true);
}
me->DespawnOrUnsummon(3s, 0s);
});
});
});
} }
} }
@@ -514,40 +531,21 @@ public:
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
{ {
events.Update(diff); scheduler.Update(diff);
if (!UpdateVictim()) if (!UpdateVictim())
{
switch (events.ExecuteEvent())
{
case EVENT_TAKE_OFF:
{
Tapped = false;
Position pos;
if (Unit* EscapeDummy = me->FindNearestCreature(NPC_ESCAPE_DUMMY, 30))
pos = EscapeDummy->GetPosition();
else
{
pos = me->GetRandomNearPosition(20);
pos.m_positionZ += 25;
}
me->SetDisableGravity(true);
me->GetMotionMaster()->MovePoint(POINT_DESPAWN, pos);
me->SetReactState(REACT_PASSIVE);
events.ScheduleEvent(EVENT_CREDIT_PLAYER, 100ms);
break;
}
case EVENT_CREDIT_PLAYER:
DoCast(GetPlayer(), SPELL_FORCE_OF_NELTHARAKU, true);
me->DespawnOrUnsummon(3s, 0s);
break;
}
return; return;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
private:
bool _tapped;
ObjectGuid _playerGUID;
Player* _GetPlayer() { return ObjectAccessor::GetPlayer(*me, _playerGUID); }
}; };
/*##### /*#####