From c6ae67838260e22bac6f8384a6f424d9204dbb57 Mon Sep 17 00:00:00 2001 From: Grimgravy Date: Sat, 18 Nov 2023 11:28:44 -0300 Subject: [PATCH] fix(Scripts/Quest): Improve The Force of Neltharaku (#17088) * fix(Scripts/quest): Improve The Force of Neltharaku * update --- .../rev_1693067253638563800.sql | 2 + .../game/Spells/SpellInfoCorrections.cpp | 6 + .../Outland/zone_shadowmoon_valley.cpp | 190 +++++++++--------- 3 files changed, 100 insertions(+), 98 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1693067253638563800.sql diff --git a/data/sql/updates/pending_db_world/rev_1693067253638563800.sql b/data/sql/updates/pending_db_world/rev_1693067253638563800.sql new file mode 100644 index 000000000..5e2522d50 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1693067253638563800.sql @@ -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); diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index d24c92fa2..a142b8f01 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -4614,6 +4614,12 @@ void SpellMgr::LoadSpellInfoCorrections() 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) { SpellInfo* spellInfo = mSpellInfoMap[i]; diff --git a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp index 6f77224f4..5880815d9 100644 --- a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp +++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp @@ -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();