diff --git a/data/sql/updates/pending_db_world/rev_1643290179356130100.sql b/data/sql/updates/pending_db_world/rev_1643290179356130100.sql new file mode 100644 index 000000000..27956056a --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1643290179356130100.sql @@ -0,0 +1,64 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1643290179356130100'); + +-- npc kneel +DELETE FROM `creature_addon` WHERE (`guid` IN (102453, 102454, 102455, 102457, 102458, 102459, 102462, 102463, 102464, 102466)); +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(102453, 0, 0, 8, 257, 0, 0, NULL), +(102454, 0, 0, 8, 257, 0, 0, NULL), +(102455, 0, 0, 8, 257, 0, 0, NULL), +(102457, 0, 0, 8, 257, 0, 0, NULL), +(102458, 0, 0, 8, 257, 0, 0, NULL), +(102459, 0, 0, 8, 257, 0, 0, NULL), +(102462, 0, 0, 8, 257, 0, 0, NULL), +(102463, 0, 0, 8, 257, 0, 0, NULL), +(102464, 0, 0, 8, 257, 0, 0, NULL), +(102466, 0, 0, 8, 257, 0, 0, NULL); + +-- npc Wounded Skirmisher +DELETE FROM `creature` WHERE (`guid` IN (102453, 102454, 102455, 102456, 102457, 102458, 102459, 102460, 102461, 102462, 102463, 102464, 102466, 102467, 102469)); +INSERT INTO `creature` (`guid`, `id1`, `id2`, `id3`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`) VALUES +(102453, 27463, 0, 0, 571, 0, 0, 1, 1, 1, 4229.39, -2981.89, 283.151, 1.61792, 300, 0, 0, 9940, 0, 0, 0, 0, 0, '', 0), +(102454, 27463, 0, 0, 571, 0, 0, 1, 1, 1, 4134.07, -2897.23, 279.272, 5.12241, 300, 0, 0, 9940, 0, 0, 0, 0, 0, '', 0), +(102455, 27463, 0, 0, 571, 0, 0, 1, 1, 1, 4123.8, -2835.11, 284.196, 0.610865, 300, 0, 0, 9940, 0, 0, 0, 0, 0, '', 0), +(102456, 27463, 0, 0, 571, 0, 0, 1, 1, 1, 4000.98, -2847.93, 273.325, 6.03884, 300, 0, 0, 9940, 0, 0, 0, 0, 0, '', 0), +(102457, 27463, 0, 0, 571, 0, 0, 1, 1, 1, 4185.56, -2961.08, 283.319, 0.903392, 300, 0, 0, 9940, 0, 0, 0, 0, 0, '', 0), +(102458, 27463, 0, 0, 571, 0, 0, 1, 1, 1, 4017.75, -2835.31, 279.277, 1.47867, 300, 0, 0, 9940, 0, 0, 0, 0, 0, '', 0), +(102459, 27463, 0, 0, 571, 0, 0, 1, 1, 1, 4073.33, -2906.89, 278.332, 6.10865, 300, 0, 0, 9940, 0, 0, 0, 0, 0, '', 0), +(102460, 27463, 0, 0, 571, 0, 0, 1, 1, 1, 4085.95, -2846.31, 286.589, 2.94961, 300, 0, 0, 9940, 0, 0, 0, 0, 0, '', 0), +(102461, 27463, 0, 0, 571, 0, 0, 1, 1, 1, 4071.18, -2886.01, 281.6, 5.8294, 300, 0, 0, 9940, 0, 0, 0, 0, 0, '', 0), +(102462, 27463, 0, 0, 571, 0, 0, 1, 1, 1, 4074.98, -2940.5, 276.138, 4.22481, 300, 0, 0, 9940, 0, 0, 0, 0, 0, '', 0), +(102463, 27463, 0, 0, 571, 0, 0, 1, 1, 1, 4139.99, -3020.99, 285.459, 5.82814, 300, 0, 0, 9940, 0, 0, 0, 0, 0, '', 0), +(102464, 27463, 0, 0, 571, 0, 0, 1, 1, 1, 4166.57, -2964.73, 283.2, 2.63745, 300, 0, 0, 9940, 0, 0, 0, 0, 0, '', 0), +(102466, 27463, 0, 0, 571, 0, 0, 1, 1, 1, 4204.05, -3048.94, 280.839, 4.65053, 300, 0, 0, 9940, 0, 0, 0, 0, 0, '', 0), +(102467, 27463, 0, 0, 571, 0, 0, 1, 1, 1, 4057.32, -2822.2, 288.962, 3.4383, 300, 0, 0, 9940, 0, 0, 0, 0, 0, '', 0), +(102469, 27463, 0, 0, 571, 0, 0, 1, 1, 1, 4183.3, -2934.44, 283.114, 5.63741, 300, 0, 0, 9940, 0, 0, 0, 0, 0, '', 0); + +-- npc Skirmisher Corpse +DELETE FROM `creature` WHERE `guid`=91749; +INSERT INTO `creature` (`guid`, `id1`, `id2`, `id3`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`) VALUES +(91749, 27457, 0, 0, 571, 0, 0, 1, 1, 1, 4137.9, -3008.35, 285.667, 5.54491, 300, 0, 0, 4399, 0, 0, 0, 0, 0, '', 0); + +DELETE FROM `waypoint_data` WHERE `id`=274630; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(274630, 1, 4153.06, -2928.47, 282.58, 0, 0, 1, 0, 100, 0), +(274630, 2, 4184.53, -2909.76, 280.17, 0, 0, 1, 0, 100, 0); + +DELETE FROM `waypoint_data` WHERE `id`=274631; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(274631, 1, 4138.41, -2950.63, 282.92, 0, 0, 1, 0, 100, 0), +(274631, 2, 4153.06, -2928.47, 282.58, 0, 0, 1, 0, 100, 0), +(274631, 3, 4184.53, -2909.76, 280.17, 0, 0, 1, 0, 100, 0); + +DELETE FROM `waypoint_data` WHERE `id`=274632; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(274632, 1, 4184.53, -2909.76, 280.17, 0, 0, 1, 0, 100, 0); + +/* implementing both conditions */ + +DELETE FROM `spell_script_names` WHERE `spell_id`=48812 AND `ScriptName`='spell_renew_skirmisher'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(48812, 'spell_renew_skirmisher'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=17 AND `SourceGroup`=0 AND `SourceEntry`=48812; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(17,0,48812,0,0,31,1,3,27463,0,0,0,0,"","Heals a wounded skirmisher at Blue Sky Logging Ground."); diff --git a/src/server/game/AI/CreatureAI.h b/src/server/game/AI/CreatureAI.h index 55c65b16f..2f5880287 100644 --- a/src/server/game/AI/CreatureAI.h +++ b/src/server/game/AI/CreatureAI.h @@ -21,6 +21,7 @@ #include "Common.h" #include "Creature.h" #include "UnitAI.h" +#include "EventMap.h" class WorldObject; class Unit; @@ -67,6 +68,8 @@ class CreatureAI : public UnitAI protected: Creature* const me; + EventMap events; + bool UpdateVictim(); bool UpdateVictimWithGaze(); diff --git a/src/server/scripts/Northrend/zone_grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp index 9266a7ea8..1e0d546dd 100644 --- a/src/server/scripts/Northrend/zone_grizzly_hills.cpp +++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp @@ -25,37 +25,37 @@ #include "SpellInfo.h" #include "SpellScript.h" -// Theirs + // Theirs -/*###### -## Quest 12027: Mr. Floppy's Perilous Adventure -######*/ + /*###### + ## Quest 12027: Mr. Floppy's Perilous Adventure + ######*/ enum Floppy { // Creature - NPC_MRFLOPPY = 26589, - NPC_HUNGRY_WORG = 26586, - NPC_RAVENOUS_WORG = 26590, // RWORG - NPC_EMILY = 26588, + NPC_MRFLOPPY = 26589, + NPC_HUNGRY_WORG = 26586, + NPC_RAVENOUS_WORG = 26590, // RWORG + NPC_EMILY = 26588, // Quest - QUEST_PERILOUS_ADVENTURE = 12027, + QUEST_PERILOUS_ADVENTURE = 12027, // Spell - SPELL_MRFLOPPY = 47184, // vehicle aura + SPELL_MRFLOPPY = 47184, // vehicle aura // Text - SAY_WORGHAGGRO1 = 0, // Um... I think one of those wolves is back... - SAY_WORGHAGGRO2 = 1, // He's going for Mr. Floppy! - SAY_WORGRAGGRO3 = 2, // Oh, no! Look, it's another wolf, and it's a biiiiiig one! - SAY_WORGRAGGRO4 = 3, // He's gonna eat Mr. Floppy! You gotta help Mr. Floppy! You just gotta! - SAY_RANDOMAGGRO = 4, // There's a big meanie attacking Mr. Floppy! Help! - SAY_VICTORY1 = 5, // Let's get out of here before more wolves find us! - SAY_VICTORY2 = 6, // Don't go toward the light, Mr. Floppy! - SAY_VICTORY3 = 7, // Mr. Floppy, you're ok! Thank you so much for saving Mr. Floppy! - SAY_VICTORY4 = 8, // I think I see the camp! We're almost home, Mr. Floppy! Let's go! - TEXT_EMOTE_WP1 = 9, // Mr. Floppy revives - TEXT_EMOTE_AGGRO = 10, // The Ravenous Worg chomps down on Mr. Floppy - SAY_QUEST_ACCEPT = 11, // Are you ready, Mr. Floppy? Stay close to me and watch out for those wolves! - SAY_QUEST_COMPLETE = 12 // Thank you for helping me get back to the camp. Go tell Walter that I'm safe now! + SAY_WORGHAGGRO1 = 0, // Um... I think one of those wolves is back... + SAY_WORGHAGGRO2 = 1, // He's going for Mr. Floppy! + SAY_WORGRAGGRO3 = 2, // Oh, no! Look, it's another wolf, and it's a biiiiiig one! + SAY_WORGRAGGRO4 = 3, // He's gonna eat Mr. Floppy! You gotta help Mr. Floppy! You just gotta! + SAY_RANDOMAGGRO = 4, // There's a big meanie attacking Mr. Floppy! Help! + SAY_VICTORY1 = 5, // Let's get out of here before more wolves find us! + SAY_VICTORY2 = 6, // Don't go toward the light, Mr. Floppy! + SAY_VICTORY3 = 7, // Mr. Floppy, you're ok! Thank you so much for saving Mr. Floppy! + SAY_VICTORY4 = 8, // I think I see the camp! We're almost home, Mr. Floppy! Let's go! + TEXT_EMOTE_WP1 = 9, // Mr. Floppy revives + TEXT_EMOTE_AGGRO = 10, // The Ravenous Worg chomps down on Mr. Floppy + SAY_QUEST_ACCEPT = 11, // Are you ready, Mr. Floppy? Stay close to me and watch out for those wolves! + SAY_QUEST_COMPLETE = 12 // Thank you for helping me get back to the camp. Go tell Walter that I'm safe now! }; // emily @@ -84,102 +84,102 @@ public: switch (waypointId) { - case 9: - if (Creature* Mrfloppy = GetClosestCreatureWithEntry(me, NPC_MRFLOPPY, 100.0f)) - _mrfloppyGUID = Mrfloppy->GetGUID(); - break; - case 10: - if (ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) - { - Talk(SAY_WORGHAGGRO1); - 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: - if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) - Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); - break; - case 17: - if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) - Mrfloppy->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); - 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->SetReactState(REACT_PASSIVE); - RWORG->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - RWORG->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED); - _RavenousworgGUID = RWORG->GetGUID(); - } - break; - case 18: - if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) - { - if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) - RWORG->GetMotionMaster()->MovePoint(0, Mrfloppy->GetPositionX(), Mrfloppy->GetPositionY(), Mrfloppy->GetPositionZ()); - me->AddAura(SPELL_MRFLOPPY, Mrfloppy); - } - break; - case 19: - if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) - { - if (Mrfloppy->HasAura(SPELL_MRFLOPPY)) + case 9: + if (Creature* Mrfloppy = GetClosestCreatureWithEntry(me, NPC_MRFLOPPY, 100.0f)) + _mrfloppyGUID = Mrfloppy->GetGUID(); + break; + case 10: + if (ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) + { + Talk(SAY_WORGHAGGRO1); + 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)) { - if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) - Mrfloppy->EnterVehicle(RWORG); + worg->SetReactState(REACT_AGGRESSIVE); + worg->GetAI()->AttackStart(Mrfloppy); } - } - break; - case 20: + } + break; + case 11: + if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) + Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + break; + case 17: + if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) + Mrfloppy->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); + 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->SetReactState(REACT_PASSIVE); + RWORG->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + RWORG->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED); + _RavenousworgGUID = RWORG->GetGUID(); + } + break; + case 18: + if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) + { if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) - RWORG->HandleEmoteCommand(34); - break; - case 21: - if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) + RWORG->GetMotionMaster()->MovePoint(0, Mrfloppy->GetPositionX(), Mrfloppy->GetPositionY(), Mrfloppy->GetPositionZ()); + me->AddAura(SPELL_MRFLOPPY, Mrfloppy); + } + break; + case 19: + if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) + { + if (Mrfloppy->HasAura(SPELL_MRFLOPPY)) { if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) - { - Unit::Kill(RWORG, Mrfloppy); - Mrfloppy->ExitVehicle(); - RWORG->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - RWORG->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED); - RWORG->AI()->AttackStart(player); - Talk(SAY_VICTORY2); - } + Mrfloppy->EnterVehicle(RWORG); } - break; - case 22: - if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) + } + break; + case 20: + if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) + RWORG->HandleEmoteCommand(34); + break; + case 21: + if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) + { + if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) { - if (Mrfloppy->isDead()) - { - me->GetMotionMaster()->MovePoint(0, Mrfloppy->GetPositionX(), Mrfloppy->GetPositionY(), Mrfloppy->GetPositionZ()); - Mrfloppy->setDeathState(ALIVE); - Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); - Talk(SAY_VICTORY3); - } + Unit::Kill(RWORG, Mrfloppy); + Mrfloppy->ExitVehicle(); + RWORG->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + RWORG->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED); + RWORG->AI()->AttackStart(player); + Talk(SAY_VICTORY2); } - break; - case 24: - if (player) + } + break; + case 22: + if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) + { + if (Mrfloppy->isDead()) { - player->GroupEventHappens(QUEST_PERILOUS_ADVENTURE, me); - Talk(SAY_QUEST_COMPLETE, player); + me->GetMotionMaster()->MovePoint(0, Mrfloppy->GetPositionX(), Mrfloppy->GetPositionY(), Mrfloppy->GetPositionZ()); + Mrfloppy->setDeathState(ALIVE); + Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + Talk(SAY_VICTORY3); } - me->SetWalk(false); - break; - case 25: - Talk(SAY_VICTORY4); - break; - case 27: - me->DisappearAndDie(); - if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) - Mrfloppy->DisappearAndDie(); - break; + } + break; + case 24: + if (player) + { + player->GroupEventHappens(QUEST_PERILOUS_ADVENTURE, me); + Talk(SAY_QUEST_COMPLETE, player); + } + me->SetWalk(false); + break; + case 25: + Talk(SAY_VICTORY4); + break; + case 27: + me->DisappearAndDie(); + if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) + Mrfloppy->DisappearAndDie(); + break; } } @@ -506,66 +506,204 @@ enum Skirmisher { // Quest QUEST_OVERWHELMED = 12288, + // Spell SPELL_RENEW_SKIRMISHER = 48812, SPELL_KILL_CREDIT = 48813, + SPELL_CLEAVE = 15496, + SPELL_HAMSTRING = 9080, + SPELL_MORTAL_STRIKE = 32736, + // Text - SAY_RANDOM = 0 + SAY_RANDOM = 0, + + // EVENT + EVENT_WOUNDED_MOVE = 1, + EVENT_CLEAVE = 2, + EVENT_HAMSTRING = 3, + EVENT_MORTAL_STRIKE = 4, + + // Waypoints + WOUNDED_MOVE_1 = 274630, + WOUNDED_MOVE_2 = 274631, + WOUNDED_MOVE_3 = 274632 }; -class npc_wounded_skirmisher : public CreatureScript +struct npc_wounded_skirmisher : public CreatureAI { public: - npc_wounded_skirmisher() : CreatureScript("npc_wounded_skirmisher") { } - - struct npc_wounded_skirmisherAI : public ScriptedAI + npc_wounded_skirmisher(Creature* creature) : CreatureAI(creature) { - npc_wounded_skirmisherAI(Creature* creature) : ScriptedAI(creature) { } + Initialize(); + } - void Reset() override - { - _despawnTimer = 5000; - _playerGUID.Clear(); - } + void Initialize() + { + me->SetReactState(REACT_DEFENSIVE); + } - void MovementInform(uint32, uint32 id) override - { - if (id == 1) - me->DespawnOrUnsummon(_despawnTimer); - } + void Reset() override + { + Initialize(); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + } - void SpellHit(Unit* caster, SpellInfo const* spell) override + void EnterCombat(Unit* /*who*/) override + { + events.ScheduleEvent(EVENT_CLEAVE, urand(1000, 7000)); + events.ScheduleEvent(EVENT_HAMSTRING, urand(5000, 12000)); + events.ScheduleEvent(EVENT_MORTAL_STRIKE, urand(5000, 10000)); + } + + void SpellHit(Unit* caster, SpellInfo const* spell) override + { + Player* playerCaster = caster->ToPlayer(); + if (!playerCaster) + return; + + if (spell->Id == SPELL_RENEW_SKIRMISHER && playerCaster->GetQuestStatus(QUEST_OVERWHELMED) == QUEST_STATUS_INCOMPLETE) { - if (spell->Id == SPELL_RENEW_SKIRMISHER && caster->GetTypeId() == TYPEID_PLAYER - && caster->ToPlayer()->GetQuestStatus(QUEST_OVERWHELMED) == QUEST_STATUS_INCOMPLETE) + me->SetFacingToObject(caster); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + Talk(SAY_RANDOM, caster); + DoCast(caster, SPELL_KILL_CREDIT); + + if (!me->IsStandState()) { - DoCast(caster, SPELL_KILL_CREDIT); - Talk(SAY_RANDOM, caster); - if (me->IsStandState()) - me->GetMotionMaster()->MovePoint(1, me->GetPositionX() + 7, me->GetPositionY() + 7, me->GetPositionZ()); - else - { - me->SetStandState(UNIT_STAND_STATE_STAND); - me->DespawnOrUnsummon(_despawnTimer); - } + me->SetStandState(UNIT_STAND_STATE_STAND); + me->HandleEmoteCommand(EMOTE_ONESHOT_CHEER); + events.ScheduleEvent(EVENT_WOUNDED_MOVE, 3000); } } + } - void UpdateAI(uint32 /*diff*/) override - { - if (!UpdateVictim()) - return; - - DoMeleeAttackIfReady(); - } - private: - ObjectGuid _playerGUID; - uint32 _despawnTimer; - }; - - CreatureAI* GetAI(Creature* creature) const override + void UpdateAI(uint32 diff) override { - return new npc_wounded_skirmisherAI(creature); + events.Update(diff); + + switch (events.ExecuteEvent()) + { + case EVENT_WOUNDED_MOVE: + if (me->GetPositionY() == -2835.11f) + { + me->GetMotionMaster()->MovePath(WOUNDED_MOVE_1, false); + me->DespawnOrUnsummon(20000); + } + if (me->GetPositionY() == -2981.89f) + { + me->GetMotionMaster()->MovePath(WOUNDED_MOVE_3, false); + me->DespawnOrUnsummon(18000); + } + if (me->GetPositionY() == -2934.44f) + { + me->GetMotionMaster()->MovePath(WOUNDED_MOVE_3, false); + me->DespawnOrUnsummon(9000); + } + if (me->GetPositionY() == -3020.99f) + { + me->GetMotionMaster()->MovePath(WOUNDED_MOVE_1, false); + me->DespawnOrUnsummon(22000); + } + if (me->GetPositionY() == -2964.73f) + { + me->GetMotionMaster()->MovePath(WOUNDED_MOVE_2, false); + me->DespawnOrUnsummon(15000); + } + if (me->GetPositionY() == -2940.50f) + { + me->GetMotionMaster()->MovePath(WOUNDED_MOVE_1, false); + me->DespawnOrUnsummon(20000); + } + if (me->GetPositionY() == -2847.93f) + { + me->GetMotionMaster()->MovePath(WOUNDED_MOVE_1, false); + me->DespawnOrUnsummon(30000); + } + if (me->GetPositionY() == -2835.31f) + { + me->GetMotionMaster()->MovePath(WOUNDED_MOVE_1, false); + me->DespawnOrUnsummon(27000); + } + if (me->GetPositionY() == -2822.20f) + { + me->GetMotionMaster()->MovePath(WOUNDED_MOVE_1, false); + me->DespawnOrUnsummon(25000); + } + if (me->GetPositionY() == -2846.31f) + { + me->GetMotionMaster()->MovePath(WOUNDED_MOVE_1, false); + me->DespawnOrUnsummon(21000); + } + if (me->GetPositionY() == -2897.23f) + { + me->GetMotionMaster()->MovePath(WOUNDED_MOVE_3, false); + me->DespawnOrUnsummon(15000); + } + if (me->GetPositionY() == -2886.01f) + { + me->GetMotionMaster()->MovePath(WOUNDED_MOVE_3, false); + me->DespawnOrUnsummon(25000); + } + if (me->GetPositionY() == -2906.89f) + { + me->GetMotionMaster()->MovePath(WOUNDED_MOVE_3, false); + me->DespawnOrUnsummon(25000); + } + if (me->GetPositionY() == -3048.94f) + { + me->GetMotionMaster()->MovePath(WOUNDED_MOVE_2, false); + me->DespawnOrUnsummon(30000); + } + if (me->GetPositionY() == -2961.08f) + { + me->GetMotionMaster()->MovePath(WOUNDED_MOVE_2, false); + me->DespawnOrUnsummon(25000); + } + break; + case EVENT_CLEAVE: + me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); + events.RepeatEvent(urand(7000, 15000)); + break; + case EVENT_HAMSTRING: + me->CastSpell(me->GetVictim(), SPELL_HAMSTRING, false); + events.RepeatEvent(urand(9000, 15000)); + break; + case EVENT_MORTAL_STRIKE: + me->CastSpell(me->GetVictim(), SPELL_MORTAL_STRIKE, false); + events.RepeatEvent(urand(10000, 15000)); + break; + } + + if (!UpdateVictim()) + return; + + DoMeleeAttackIfReady(); + } +}; + +enum renewskirmisher +{ + NPC_WOUNDED_SKIRMISHER = 27463 +}; + +class spell_renew_skirmisher : public SpellScript +{ +public: + PrepareSpellScript(spell_renew_skirmisher); + + SpellCastResult CheckRequirement() + { + if (Unit* caster = GetCaster()) + if (Creature* wounded = caster->FindNearestCreature(NPC_WOUNDED_SKIRMISHER, 5.0f)) + if (!wounded->IsInCombat()) + return SPELL_CAST_OK; + + return SPELL_FAILED_CASTER_AURASTATE; + } + + void Register() override + { + OnCheckCast += SpellCheckCastFn(spell_renew_skirmisher::CheckRequirement); } }; @@ -1163,7 +1301,8 @@ void AddSC_grizzly_hills() new npc_outhouse_bunny(); new npc_tallhorn_stag(); new npc_amberpine_woodsman(); - new npc_wounded_skirmisher(); + RegisterCreatureAI(npc_wounded_skirmisher); + RegisterSpellScript(spell_renew_skirmisher); new npc_venture_co_straggler(); new npc_lake_frog(); new spell_shredder_delivery();