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
@@ -0,0 +1,2 @@
--
UPDATE `conditions` SET `SourceTypeOrReferenceId` = 17, `SourceGroup` = 0, `ConditionTarget` = 1, `Comment` = 'Releases the force of Neltharaku upon an enslaved netherwing drake.' WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceGroup` = 1) AND (`SourceEntry` = 38762) AND (`SourceId` = 0) AND (`ElseGroup` = 0) AND (`ConditionTypeOrReference` = 31) AND (`ConditionTarget` = 0) AND (`ConditionValue1` = 3) AND (`ConditionValue2` = 21722) AND (`ConditionValue3` = 0);
@@ -4614,6 +4614,12 @@ void SpellMgr::LoadSpellInfoCorrections()
spellInfo->MaxAffectedTargets = 1; spellInfo->MaxAffectedTargets = 1;
}); });
// Force of Neltharaku
ApplySpellFix({ 38762 }, [](SpellInfo* spellInfo)
{
spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY);
});
for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i)
{ {
SpellInfo* spellInfo = mSpellInfoMap[i]; SpellInfo* spellInfo = mSpellInfoMap[i];
@@ -426,111 +426,102 @@ public:
enum EnshlavedNetherwingDrake enum EnshlavedNetherwingDrake
{ {
// Quest
QUEST_THE_FORCE_OF_NELTHARAKU = 10854,
// Spells // Spells
SPELL_HIT_FORCE_OF_NELTHARAKU = 38762, SPELL_HIT_FORCE_OF_NELTHARAKU = 38762,
SPELL_FORCE_OF_NELTHARAKU = 38775, SPELL_FORCE_OF_NELTHARAKU = 38775,
// Creatures // Creatures
NPC_DRAGONMAW_SUBJUGATOR = 21718, 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: public:
npc_enslaved_netherwing_drake() : CreatureScript("npc_enslaved_netherwing_drake") { } npc_enslaved_netherwing_drake(Creature* creature) : ScriptedAI(creature)
CreatureAI* GetAI(Creature* creature) const override
{ {
return new npc_enslaved_netherwing_drakeAI(creature);
}
struct npc_enslaved_netherwing_drakeAI : public ScriptedAI
{
npc_enslaved_netherwing_drakeAI(Creature* creature) : ScriptedAI(creature)
{
PlayerGUID.Clear();
Tapped = false; Tapped = false;
Reset(); Reset();
} }
ObjectGuid PlayerGUID; ObjectGuid PlayerGUID;
uint32 FlyTimer;
bool Tapped; bool Tapped;
Player* GetPlayer() { return ObjectAccessor::GetPlayer(*me, PlayerGUID); }
void Reset() override void Reset() override
{ {
if (!Tapped) if (!Tapped)
me->SetFaction(FACTION_ORC_DRAGONMAW); {
me->RestoreFaction();
me->SetReactState(REACT_AGGRESSIVE);
}
FlyTimer = 1000;
me->SetDisableGravity(false); me->SetDisableGravity(false);
me->SetVisible(true); me->SetVisible(true);
} }
void JustDied(Unit* /*killer*/) override
{
Tapped = false;
me->RestoreFaction();
events.CancelEvent(EVENT_TAKE_OFF);
}
void SpellHit(Unit* caster, SpellInfo const* spell) override void SpellHit(Unit* caster, SpellInfo const* spell) override
{ {
if (!caster) Player* playerCaster = caster->ToPlayer();
if (!playerCaster)
return; return;
if (caster->GetTypeId() == TYPEID_PLAYER && 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)
{ {
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. 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 (Unit* Dragonmaw = me->FindNearestCreature(NPC_DRAGONMAW_SUBJUGATOR, 25.0f))
if (Dragonmaw) AttackStart(Dragonmaw);
{ else if (Unit* Dragonmaw = me->FindNearestCreature(NPC_DRAGONMAW_WRANGLER, 25.0f))
me->AddThreat(Dragonmaw, 100000.0f);
AttackStart(Dragonmaw); AttackStart(Dragonmaw);
}
HostileReference* ref = me->GetThreatMgr().GetOnlineContainer().getReferenceByTarget(caster); events.ScheduleEvent(EVENT_TAKE_OFF, 2s);
if (ref)
ref->removeReference();
} }
} }
void MovementInform(uint32 type, uint32 id) override void MovementInform(uint32 type, uint32 data) override
{ {
if (type != POINT_MOTION_TYPE) if (type == POINT_MOTION_TYPE && data == POINT_DESPAWN)
return;
if (id == 1)
{ {
me->SetVisible(false); me->SetVisible(false);
me->SetDisableGravity(false); me->SetDisableGravity(false);
Unit::DealDamage(me, me, me->GetHealth(), nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false); me->DespawnOrUnsummon();
me->RemoveCorpse();
} }
me->DespawnOrUnsummon(1);
} }
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
{ {
events.Update(diff);
if (!UpdateVictim()) if (!UpdateVictim())
{ {
if (Tapped) switch (events.ExecuteEvent())
{ {
if (FlyTimer <= diff) case EVENT_TAKE_OFF:
{ {
Tapped = false; 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; Position pos;
if (Unit* EscapeDummy = me->FindNearestCreature(NPC_ESCAPE_DUMMY, 30)) if (Unit* EscapeDummy = me->FindNearestCreature(NPC_ESCAPE_DUMMY, 30))
pos = EscapeDummy->GetPosition(); pos = EscapeDummy->GetPosition();
@@ -541,18 +532,21 @@ public:
} }
me->SetDisableGravity(true); me->SetDisableGravity(true);
me->GetMotionMaster()->MovePoint(1, pos); 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);
else FlyTimer -= diff; me->DespawnOrUnsummon(3s, 0s);
break;
} }
return; return;
} }
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
};
}; };
/*##### /*#####
@@ -1847,7 +1841,7 @@ void AddSC_shadowmoon_valley()
new npc_invis_infernal_caster(); new npc_invis_infernal_caster();
new npc_infernal_attacker(); new npc_infernal_attacker();
new npc_mature_netherwing_drake(); new npc_mature_netherwing_drake();
new npc_enslaved_netherwing_drake(); RegisterCreatureAI(npc_enslaved_netherwing_drake);
new npc_dragonmaw_peon(); new npc_dragonmaw_peon();
new npc_drake_dealer_hurlunk(); new npc_drake_dealer_hurlunk();
new npcs_flanis_swiftwing_and_kagrosh(); new npcs_flanis_swiftwing_and_kagrosh();