fix(Scripts/Quest): Improve The Force of Neltharaku (#17088)

* fix(Scripts/quest): Improve The Force of Neltharaku

* update
This commit is contained in:
Grimgravy
2023-11-18 11:28:44 -03:00
committed by GitHub
parent d948a488cc
commit c6ae678382
3 changed files with 100 additions and 98 deletions

View File

@@ -426,133 +426,127 @@ public:
enum EnshlavedNetherwingDrake
{
// Quest
QUEST_THE_FORCE_OF_NELTHARAKU = 10854,
// Spells
SPELL_HIT_FORCE_OF_NELTHARAKU = 38762,
SPELL_FORCE_OF_NELTHARAKU = 38775,
// Creatures
NPC_DRAGONMAW_SUBJUGATOR = 21718,
NPC_ESCAPE_DUMMY = 22317
NPC_DRAGONMAW_WRANGLER = 21717,
NPC_ESCAPE_DUMMY = 22317,
EVENT_TAKE_OFF = 1,
EVENT_CREDIT_PLAYER = 2,
// Point
POINT_DESPAWN = 1
};
class npc_enslaved_netherwing_drake : public CreatureScript
struct npc_enslaved_netherwing_drake : public ScriptedAI
{
public:
npc_enslaved_netherwing_drake() : CreatureScript("npc_enslaved_netherwing_drake") { }
CreatureAI* GetAI(Creature* creature) const override
npc_enslaved_netherwing_drake(Creature* creature) : ScriptedAI(creature)
{
return new npc_enslaved_netherwing_drakeAI(creature);
Tapped = false;
Reset();
}
struct npc_enslaved_netherwing_drakeAI : public ScriptedAI
ObjectGuid PlayerGUID;
bool Tapped;
Player* GetPlayer() { return ObjectAccessor::GetPlayer(*me, PlayerGUID); }
void Reset() override
{
npc_enslaved_netherwing_drakeAI(Creature* creature) : ScriptedAI(creature)
if (!Tapped)
{
PlayerGUID.Clear();
Tapped = false;
Reset();
me->RestoreFaction();
me->SetReactState(REACT_AGGRESSIVE);
}
ObjectGuid PlayerGUID;
uint32 FlyTimer;
bool Tapped;
me->SetDisableGravity(false);
me->SetVisible(true);
}
void Reset() override
void JustDied(Unit* /*killer*/) override
{
Tapped = false;
me->RestoreFaction();
events.CancelEvent(EVENT_TAKE_OFF);
}
void SpellHit(Unit* caster, SpellInfo const* spell) override
{
Player* playerCaster = caster->ToPlayer();
if (!playerCaster)
return;
if (spell->Id == SPELL_HIT_FORCE_OF_NELTHARAKU && !Tapped &&
playerCaster->GetQuestStatus(QUEST_THE_FORCE_OF_NELTHARAKU) == QUEST_STATUS_INCOMPLETE)
{
if (!Tapped)
me->SetFaction(FACTION_ORC_DRAGONMAW);
Tapped = true;
PlayerGUID = caster->GetGUID();
FlyTimer = 1000;
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))
AttackStart(Dragonmaw);
else if (Unit* Dragonmaw = me->FindNearestCreature(NPC_DRAGONMAW_WRANGLER, 25.0f))
AttackStart(Dragonmaw);
events.ScheduleEvent(EVENT_TAKE_OFF, 2s);
}
}
void MovementInform(uint32 type, uint32 data) override
{
if (type == POINT_MOTION_TYPE && data == POINT_DESPAWN)
{
me->SetVisible(false);
me->SetDisableGravity(false);
me->SetVisible(true);
me->DespawnOrUnsummon();
}
}
void SpellHit(Unit* caster, SpellInfo const* spell) override
void UpdateAI(uint32 diff) override
{
events.Update(diff);
if (!UpdateVictim())
{
if (!caster)
return;
if (caster->GetTypeId() == TYPEID_PLAYER && spell->Id == SPELL_HIT_FORCE_OF_NELTHARAKU && !Tapped)
switch (events.ExecuteEvent())
{
Tapped = true;
PlayerGUID = caster->GetGUID();
me->SetFaction(FACTION_FLAYER_HUNTER); // Not sure if this is correct, it was taken off of Mordenai.
Unit* Dragonmaw = me->FindNearestCreature(NPC_DRAGONMAW_SUBJUGATOR, 50);
if (Dragonmaw)
case EVENT_TAKE_OFF:
{
me->AddThreat(Dragonmaw, 100000.0f);
AttackStart(Dragonmaw);
}
HostileReference* ref = me->GetThreatMgr().GetOnlineContainer().getReferenceByTarget(caster);
if (ref)
ref->removeReference();
}
}
void MovementInform(uint32 type, uint32 id) override
{
if (type != POINT_MOTION_TYPE)
return;
if (id == 1)
{
me->SetVisible(false);
me->SetDisableGravity(false);
Unit::DealDamage(me, me, me->GetHealth(), nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false);
me->RemoveCorpse();
}
me->DespawnOrUnsummon(1);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
{
if (Tapped)
{
if (FlyTimer <= diff)
Tapped = false;
Position pos;
if (Unit* EscapeDummy = me->FindNearestCreature(NPC_ESCAPE_DUMMY, 30))
pos = EscapeDummy->GetPosition();
else
{
Tapped = false;
if (PlayerGUID)
{
Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID);
if (player && player->GetQuestStatus(10854) == QUEST_STATUS_INCOMPLETE)
{
DoCast(player, SPELL_FORCE_OF_NELTHARAKU, true);
/*
float x, y, z;
me->GetPosition(x, y, z);
float dx, dy, dz;
me->GetRandomPoint(x, y, z, 20, dx, dy, dz);
dz += 20; // so it's in the air, not ground*/
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(1, pos);
}
}
pos = me->GetRandomNearPosition(20);
pos.m_positionZ += 25;
}
else FlyTimer -= diff;
}
return;
}
DoMeleeAttackIfReady();
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;
}
};
DoMeleeAttackIfReady();
}
};
/*#####
@@ -1847,7 +1841,7 @@ void AddSC_shadowmoon_valley()
new npc_invis_infernal_caster();
new npc_infernal_attacker();
new npc_mature_netherwing_drake();
new npc_enslaved_netherwing_drake();
RegisterCreatureAI(npc_enslaved_netherwing_drake);
new npc_dragonmaw_peon();
new npc_drake_dealer_hurlunk();
new npcs_flanis_swiftwing_and_kagrosh();