From 9bf56aa12409f1d0557ac77a377b0938e1378730 Mon Sep 17 00:00:00 2001 From: Poszer <41213210+poszer@users.noreply.github.com> Date: Mon, 7 Jan 2019 12:19:56 +0100 Subject: [PATCH] Core/Quest: Mr.Floppy's Perilous Adventure Quest (#1158) --- .../rev_1546128548989877900.sql | 4 + .../scripts/Northrend/zone_grizzly_hills.cpp | 74 +++++++++++++++++-- 2 files changed, 70 insertions(+), 8 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1546128548989877900.sql diff --git a/data/sql/updates/pending_db_world/rev_1546128548989877900.sql b/data/sql/updates/pending_db_world/rev_1546128548989877900.sql new file mode 100644 index 000000000..71c8d2019 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1546128548989877900.sql @@ -0,0 +1,4 @@ +INSERT INTO version_db_world (`sql_rev`) VALUES ('1546128548989877900'); + +UPDATE `creature_template` SET `VehicleId` = 0 WHERE `entry` = 26586; +UPDATE `creature_template` SET `ScriptName` = 'npc_ravenous_worg' WHERE `entry` = 26590; diff --git a/src/server/scripts/Northrend/zone_grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp index 435732d09..c7bd0c8cd 100644 --- a/src/server/scripts/Northrend/zone_grizzly_hills.cpp +++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp @@ -140,7 +140,12 @@ public: if (ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) { Talk(SAY_WORGHAGGRO1); - me->SummonCreature(NPC_HUNGRY_WORG, me->GetPositionX()+5, me->GetPositionY()+2, me->GetPositionZ()+1, 3.229f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); + if (Creature* worg = me->SummonCreature(NPC_HUNGRY_WORG, me->GetPositionX() + 5, me->GetPositionY() + 2, me->GetPositionZ() + 1, 3.229f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000)) + if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) + { + worg->SetReactState(REACT_AGGRESSIVE); + worg->GetAI()->AttackStart(Mrfloppy); + } } break; case 11: @@ -153,7 +158,9 @@ public: Talk(SAY_WORGRAGGRO3); if (Creature* RWORG = me->SummonCreature(NPC_RAVENOUS_WORG, me->GetPositionX()+10, me->GetPositionY()+8, me->GetPositionZ()+2, 3.229f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000)) { - RWORG->setFaction(35); + RWORG->SetReactState(REACT_PASSIVE); + RWORG->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + RWORG->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED); _RavenousworgGUID = RWORG->GetGUID(); } break; @@ -162,7 +169,7 @@ public: { if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) RWORG->GetMotionMaster()->MovePoint(0, Mrfloppy->GetPositionX(), Mrfloppy->GetPositionY(), Mrfloppy->GetPositionZ()); - DoCast(Mrfloppy, SPELL_MRFLOPPY); + me->AddAura(SPELL_MRFLOPPY, Mrfloppy); } break; case 19: @@ -186,8 +193,9 @@ public: { Unit::Kill(RWORG, Mrfloppy); Mrfloppy->ExitVehicle(); - RWORG->setFaction(14); - RWORG->GetMotionMaster()->MovePoint(0, RWORG->GetPositionX()+10, RWORG->GetPositionY()+80, RWORG->GetPositionZ()); + RWORG->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + RWORG->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED); + RWORG->AI()->AttackStart(player); Talk(SAY_VICTORY2); } } @@ -197,8 +205,6 @@ public: { if (Mrfloppy->isDead()) { - if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) - RWORG->DisappearAndDie(); me->GetMotionMaster()->MovePoint(0, Mrfloppy->GetPositionX(), Mrfloppy->GetPositionY(), Mrfloppy->GetPositionZ()); Mrfloppy->setDeathState(ALIVE); Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); @@ -291,7 +297,11 @@ public: } } - void EnterEvadeMode() { } + void EnterEvadeMode() + { + if (Creature* Emily = GetClosestCreatureWithEntry(me, NPC_EMILY, 50.0f)) + me->GetMotionMaster()->MoveFollow(Emily, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + } void MoveInLineOfSight(Unit* /*who*/) { } @@ -309,6 +319,54 @@ public: } }; +// Ravenous Worg +class npc_ravenous_worg : public CreatureScript +{ +public: + npc_ravenous_worg() : CreatureScript("npc_ravenous_worg") { } + + struct npc_ravenous_worgAI : public CombatAI + { + npc_ravenous_worgAI(Creature* creature) : CombatAI(creature) + { + _pacified = false; + _attack = false; + } + + void AttackStart(Unit* who) + { + if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED)) + _pacified = true; + + if (_pacified && !me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED)) + _attack = true; + + if (_attack) + CombatAI::AttackStart(who); + } + + void UpdateAI(uint32 diff) + { + if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED)) + _pacified = true; + + if (_pacified && !me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED)) + _attack = true; + + CombatAI::UpdateAI(diff); + } + + private: + bool _pacified; + bool _attack; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_ravenous_worgAI(creature); + } +}; + /*###### ## Quest 12227: Doing Your Duty ######*/