mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-19 03:45:43 +00:00
fix(Scripts/Quest): Improve The Force of Neltharaku (#17088)
* fix(Scripts/quest): Improve The Force of Neltharaku * update
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user