fix(Scripts/Quest): improved Overwhelmed! (#10387)

This commit is contained in:
Grimgravy
2022-03-25 08:44:25 -03:00
committed by GitHub
parent f0eb6d36a3
commit c797cb0b93
3 changed files with 358 additions and 152 deletions
@@ -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.");
+3
View File
@@ -21,6 +21,7 @@
#include "Common.h" #include "Common.h"
#include "Creature.h" #include "Creature.h"
#include "UnitAI.h" #include "UnitAI.h"
#include "EventMap.h"
class WorldObject; class WorldObject;
class Unit; class Unit;
@@ -67,6 +68,8 @@ class CreatureAI : public UnitAI
protected: protected:
Creature* const me; Creature* const me;
EventMap events;
bool UpdateVictim(); bool UpdateVictim();
bool UpdateVictimWithGaze(); bool UpdateVictimWithGaze();
@@ -25,37 +25,37 @@
#include "SpellInfo.h" #include "SpellInfo.h"
#include "SpellScript.h" #include "SpellScript.h"
// Theirs // Theirs
/*###### /*######
## Quest 12027: Mr. Floppy's Perilous Adventure ## Quest 12027: Mr. Floppy's Perilous Adventure
######*/ ######*/
enum Floppy enum Floppy
{ {
// Creature // Creature
NPC_MRFLOPPY = 26589, NPC_MRFLOPPY = 26589,
NPC_HUNGRY_WORG = 26586, NPC_HUNGRY_WORG = 26586,
NPC_RAVENOUS_WORG = 26590, // RWORG NPC_RAVENOUS_WORG = 26590, // RWORG
NPC_EMILY = 26588, NPC_EMILY = 26588,
// Quest // Quest
QUEST_PERILOUS_ADVENTURE = 12027, QUEST_PERILOUS_ADVENTURE = 12027,
// Spell // Spell
SPELL_MRFLOPPY = 47184, // vehicle aura SPELL_MRFLOPPY = 47184, // vehicle aura
// Text // Text
SAY_WORGHAGGRO1 = 0, // Um... I think one of those wolves is back... SAY_WORGHAGGRO1 = 0, // Um... I think one of those wolves is back...
SAY_WORGHAGGRO2 = 1, // He's going for Mr. Floppy! 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_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_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_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_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_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_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! 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_WP1 = 9, // Mr. Floppy revives
TEXT_EMOTE_AGGRO = 10, // The Ravenous Worg chomps down on Mr. Floppy 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_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_QUEST_COMPLETE = 12 // Thank you for helping me get back to the camp. Go tell Walter that I'm safe now!
}; };
// emily // emily
@@ -84,102 +84,102 @@ public:
switch (waypointId) switch (waypointId)
{ {
case 9: case 9:
if (Creature* Mrfloppy = GetClosestCreatureWithEntry(me, NPC_MRFLOPPY, 100.0f)) if (Creature* Mrfloppy = GetClosestCreatureWithEntry(me, NPC_MRFLOPPY, 100.0f))
_mrfloppyGUID = Mrfloppy->GetGUID(); _mrfloppyGUID = Mrfloppy->GetGUID();
break; break;
case 10: case 10:
if (ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) if (ObjectAccessor::GetCreature(*me, _mrfloppyGUID))
{ {
Talk(SAY_WORGHAGGRO1); 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* 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* 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))
{ {
if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) worg->SetReactState(REACT_AGGRESSIVE);
Mrfloppy->EnterVehicle(RWORG); worg->GetAI()->AttackStart(Mrfloppy);
} }
} }
break; break;
case 20: 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)) if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID))
RWORG->HandleEmoteCommand(34); RWORG->GetMotionMaster()->MovePoint(0, Mrfloppy->GetPositionX(), Mrfloppy->GetPositionY(), Mrfloppy->GetPositionZ());
break; me->AddAura(SPELL_MRFLOPPY, Mrfloppy);
case 21: }
if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) break;
case 19:
if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID))
{
if (Mrfloppy->HasAura(SPELL_MRFLOPPY))
{ {
if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID))
{ Mrfloppy->EnterVehicle(RWORG);
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 22: break;
if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) 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()) Unit::Kill(RWORG, Mrfloppy);
{ Mrfloppy->ExitVehicle();
me->GetMotionMaster()->MovePoint(0, Mrfloppy->GetPositionX(), Mrfloppy->GetPositionY(), Mrfloppy->GetPositionZ()); RWORG->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
Mrfloppy->setDeathState(ALIVE); RWORG->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED);
Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); RWORG->AI()->AttackStart(player);
Talk(SAY_VICTORY3); Talk(SAY_VICTORY2);
}
} }
break; }
case 24: break;
if (player) case 22:
if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID))
{
if (Mrfloppy->isDead())
{ {
player->GroupEventHappens(QUEST_PERILOUS_ADVENTURE, me); me->GetMotionMaster()->MovePoint(0, Mrfloppy->GetPositionX(), Mrfloppy->GetPositionY(), Mrfloppy->GetPositionZ());
Talk(SAY_QUEST_COMPLETE, player); Mrfloppy->setDeathState(ALIVE);
Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
Talk(SAY_VICTORY3);
} }
me->SetWalk(false); }
break; break;
case 25: case 24:
Talk(SAY_VICTORY4); if (player)
break; {
case 27: player->GroupEventHappens(QUEST_PERILOUS_ADVENTURE, me);
me->DisappearAndDie(); Talk(SAY_QUEST_COMPLETE, player);
if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) }
Mrfloppy->DisappearAndDie(); me->SetWalk(false);
break; 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
QUEST_OVERWHELMED = 12288, QUEST_OVERWHELMED = 12288,
// Spell // Spell
SPELL_RENEW_SKIRMISHER = 48812, SPELL_RENEW_SKIRMISHER = 48812,
SPELL_KILL_CREDIT = 48813, SPELL_KILL_CREDIT = 48813,
SPELL_CLEAVE = 15496,
SPELL_HAMSTRING = 9080,
SPELL_MORTAL_STRIKE = 32736,
// Text // 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: public:
npc_wounded_skirmisher() : CreatureScript("npc_wounded_skirmisher") { } npc_wounded_skirmisher(Creature* creature) : CreatureAI(creature)
struct npc_wounded_skirmisherAI : public ScriptedAI
{ {
npc_wounded_skirmisherAI(Creature* creature) : ScriptedAI(creature) { } Initialize();
}
void Reset() override void Initialize()
{ {
_despawnTimer = 5000; me->SetReactState(REACT_DEFENSIVE);
_playerGUID.Clear(); }
}
void MovementInform(uint32, uint32 id) override void Reset() override
{ {
if (id == 1) Initialize();
me->DespawnOrUnsummon(_despawnTimer); 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 me->SetFacingToObject(caster);
&& caster->ToPlayer()->GetQuestStatus(QUEST_OVERWHELMED) == QUEST_STATUS_INCOMPLETE) 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); me->SetStandState(UNIT_STAND_STATE_STAND);
Talk(SAY_RANDOM, caster); me->HandleEmoteCommand(EMOTE_ONESHOT_CHEER);
if (me->IsStandState()) events.ScheduleEvent(EVENT_WOUNDED_MOVE, 3000);
me->GetMotionMaster()->MovePoint(1, me->GetPositionX() + 7, me->GetPositionY() + 7, me->GetPositionZ());
else
{
me->SetStandState(UNIT_STAND_STATE_STAND);
me->DespawnOrUnsummon(_despawnTimer);
}
} }
} }
}
void UpdateAI(uint32 /*diff*/) override void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
DoMeleeAttackIfReady();
}
private:
ObjectGuid _playerGUID;
uint32 _despawnTimer;
};
CreatureAI* GetAI(Creature* creature) const 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_outhouse_bunny();
new npc_tallhorn_stag(); new npc_tallhorn_stag();
new npc_amberpine_woodsman(); new npc_amberpine_woodsman();
new npc_wounded_skirmisher(); RegisterCreatureAI(npc_wounded_skirmisher);
RegisterSpellScript(spell_renew_skirmisher);
new npc_venture_co_straggler(); new npc_venture_co_straggler();
new npc_lake_frog(); new npc_lake_frog();
new spell_shredder_delivery(); new spell_shredder_delivery();