aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoroffl <11556157+offl@users.noreply.github.com>2021-07-11 14:55:47 +0300
committerShauren <shauren.trinity@gmail.com>2022-03-11 15:25:17 +0100
commit72ea274df845cced9975bf788ff8dcfab5b643cb (patch)
tree543a1d3285242673dabf5f0362bc7819d8c085cc /src
parent779053ab908029b31ed5ef3e8ae6f2e242b6cc30 (diff)
Scripts/Pet: Update pet scripts to new register model (1/2) (#26661)
(cherry picked from commit 51c94fed9a87652b6c0372b20a54ecd51beb1a06)
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Pet/pet_dk.cpp168
-rw-r--r--src/server/scripts/Pet/pet_generic.cpp119
-rw-r--r--src/server/scripts/Pet/pet_hunter.cpp151
3 files changed, 197 insertions, 241 deletions
diff --git a/src/server/scripts/Pet/pet_dk.cpp b/src/server/scripts/Pet/pet_dk.cpp
index 2f77f392ed9..de738187eb9 100644
--- a/src/server/scripts/Pet/pet_dk.cpp
+++ b/src/server/scripts/Pet/pet_dk.cpp
@@ -34,111 +34,89 @@ enum DeathKnightSpells
SPELL_DK_SANCTUARY = 54661
};
-class npc_pet_dk_ebon_gargoyle : public CreatureScript
+struct npc_pet_dk_ebon_gargoyle : CasterAI
{
- public:
- npc_pet_dk_ebon_gargoyle() : CreatureScript("npc_pet_dk_ebon_gargoyle") { }
-
- struct npc_pet_dk_ebon_gargoyleAI : CasterAI
+ npc_pet_dk_ebon_gargoyle(Creature* creature) : CasterAI(creature) { }
+
+ void InitializeAI() override
+ {
+ CasterAI::InitializeAI();
+ ObjectGuid ownerGuid = me->GetOwnerGUID();
+ if (!ownerGuid)
+ return;
+
+ // Find victim of Summon Gargoyle spell
+ std::list<Unit*> targets;
+ Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(me, me, 30.0f);
+ Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(me, targets, u_check);
+ Cell::VisitAllObjects(me, searcher, 30.0f);
+ for (Unit* target : targets)
{
- npc_pet_dk_ebon_gargoyleAI(Creature* creature) : CasterAI(creature) { }
-
- void InitializeAI() override
- {
- CasterAI::InitializeAI();
- ObjectGuid ownerGuid = me->GetOwnerGUID();
- if (!ownerGuid)
- return;
-
- // Find victim of Summon Gargoyle spell
- std::list<Unit*> targets;
- Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(me, me, 30.0f);
- Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(me, targets, u_check);
- Cell::VisitAllObjects(me, searcher, 30.0f);
- for (Unit* target : targets)
- {
- if (target->HasAura(SPELL_DK_SUMMON_GARGOYLE_1, ownerGuid))
- {
- me->Attack(target, false);
- break;
- }
- }
- }
-
- void JustDied(Unit* /*killer*/) override
+ if (target->HasAura(SPELL_DK_SUMMON_GARGOYLE_1, ownerGuid))
{
- // Stop Feeding Gargoyle when it dies
- if (Unit* owner = me->GetOwner())
- owner->RemoveAurasDueToSpell(SPELL_DK_SUMMON_GARGOYLE_2);
+ me->Attack(target, false);
+ break;
}
-
- // Fly away when dismissed
- void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
- {
- if (spellInfo->Id != SPELL_DK_DISMISS_GARGOYLE || !me->IsAlive())
- return;
-
- Unit* owner = me->GetOwner();
- if (!owner || owner != caster)
- return;
-
- // Stop Fighting
- me->AddUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
-
- // Sanctuary
- me->CastSpell(me, SPELL_DK_SANCTUARY, true);
- me->SetReactState(REACT_PASSIVE);
-
- //! HACK: Creature's can't have MOVEMENTFLAG_FLYING
- // Fly Away
- me->SetCanFly(true);
- me->SetSpeedRate(MOVE_FLIGHT, 0.75f);
- me->SetSpeedRate(MOVE_RUN, 0.75f);
- float x = me->GetPositionX() + 20 * std::cos(me->GetOrientation());
- float y = me->GetPositionY() + 20 * std::sin(me->GetOrientation());
- float z = me->GetPositionZ() + 40;
- me->GetMotionMaster()->Clear();
- me->GetMotionMaster()->MovePoint(0, x, y, z);
-
- // Despawn as soon as possible
- me->DespawnOrUnsummon(Seconds(4));
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_pet_dk_ebon_gargoyleAI(creature);
}
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ // Stop Feeding Gargoyle when it dies
+ if (Unit* owner = me->GetOwner())
+ owner->RemoveAurasDueToSpell(SPELL_DK_SUMMON_GARGOYLE_2);
+ }
+
+ // Fly away when dismissed
+ void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
+ {
+ if (spellInfo->Id != SPELL_DK_DISMISS_GARGOYLE || !me->IsAlive())
+ return;
+
+ Unit* owner = me->GetOwner();
+ if (!owner || owner != caster)
+ return;
+
+ // Stop Fighting
+ me->AddUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
+
+ // Sanctuary
+ me->CastSpell(me, SPELL_DK_SANCTUARY, true);
+ me->SetReactState(REACT_PASSIVE);
+
+ //! HACK: Creature's can't have MOVEMENTFLAG_FLYING
+ // Fly Away
+ me->SetCanFly(true);
+ me->SetSpeedRate(MOVE_FLIGHT, 0.75f);
+ me->SetSpeedRate(MOVE_RUN, 0.75f);
+ float x = me->GetPositionX() + 20 * std::cos(me->GetOrientation());
+ float y = me->GetPositionY() + 20 * std::sin(me->GetOrientation());
+ float z = me->GetPositionZ() + 40;
+ me->GetMotionMaster()->Clear();
+ me->GetMotionMaster()->MovePoint(0, x, y, z);
+
+ // Despawn as soon as possible
+ me->DespawnOrUnsummon(Seconds(4));
+ }
};
-class npc_pet_dk_guardian : public CreatureScript
+struct npc_pet_dk_guardian : public AggressorAI
{
- public:
- npc_pet_dk_guardian() : CreatureScript("npc_pet_dk_guardian") { }
-
- struct npc_pet_dk_guardianAI : public AggressorAI
- {
- npc_pet_dk_guardianAI(Creature* creature) : AggressorAI(creature) { }
-
- bool CanAIAttack(Unit const* target) const override
- {
- if (!target)
- return false;
- Unit* owner = me->GetOwner();
- if (owner && !target->IsInCombatWith(owner))
- return false;
- return AggressorAI::CanAIAttack(target);
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_pet_dk_guardianAI(creature);
- }
+ npc_pet_dk_guardian(Creature* creature) : AggressorAI(creature) { }
+
+ bool CanAIAttack(Unit const* target) const override
+ {
+ if (!target)
+ return false;
+ Unit* owner = me->GetOwner();
+ if (owner && !target->IsInCombatWith(owner))
+ return false;
+ return AggressorAI::CanAIAttack(target);
+ }
};
void AddSC_deathknight_pet_scripts()
{
- new npc_pet_dk_ebon_gargoyle();
- new npc_pet_dk_guardian();
+ RegisterCreatureAI(npc_pet_dk_ebon_gargoyle);
+ RegisterCreatureAI(npc_pet_dk_guardian);
}
diff --git a/src/server/scripts/Pet/pet_generic.cpp b/src/server/scripts/Pet/pet_generic.cpp
index a9fd0c349ef..813e9eba947 100644
--- a/src/server/scripts/Pet/pet_generic.cpp
+++ b/src/server/scripts/Pet/pet_generic.cpp
@@ -22,7 +22,6 @@
/* ContentData
npc_pet_gen_pandaren_monk 100% Pandaren Monk drinks and bows with you
- npc_pet_gen_mojo 100% Mojo follows you when you kiss it
EndContentData */
#include "ScriptMgr.h"
@@ -41,86 +40,76 @@ enum PandarenMonkMisc
EVENT_DRINK = 4
};
-class npc_pet_gen_pandaren_monk : public CreatureScript
+struct npc_pet_gen_pandaren_monk : public NullCreatureAI
{
-public:
- npc_pet_gen_pandaren_monk() : CreatureScript("npc_pet_gen_pandaren_monk") {}
+ npc_pet_gen_pandaren_monk(Creature* creature) : NullCreatureAI(creature) { }
- struct npc_pet_gen_pandaren_monkAI : public NullCreatureAI
+ void Reset() override
{
- npc_pet_gen_pandaren_monkAI(Creature* creature) : NullCreatureAI(creature) { }
+ _events.Reset();
+ _events.ScheduleEvent(EVENT_FOCUS, 1s);
+ }
+
+ void EnterEvadeMode(EvadeReason why) override
+ {
+ if (!_EnterEvadeMode(why))
+ return;
+
+ Reset();
+ }
+
+ void ReceiveEmote(Player* /*player*/, uint32 emote) override
+ {
+ me->InterruptSpell(CURRENT_CHANNELED_SPELL);
+ me->StopMoving();
- void Reset() override
+ switch (emote)
{
- _events.Reset();
+ case TEXT_EMOTE_BOW:
_events.ScheduleEvent(EVENT_FOCUS, 1s);
+ break;
+ case TEXT_EMOTE_DRINK:
+ _events.ScheduleEvent(EVENT_DRINK, 1s);
+ break;
}
+ }
- void EnterEvadeMode(EvadeReason why) override
- {
- if (!_EnterEvadeMode(why))
- return;
+ void UpdateAI(uint32 diff) override
+ {
+ _events.Update(diff);
- Reset();
- }
+ if (Unit* owner = me->GetCharmerOrOwner())
+ if (!me->IsWithinDist(owner, 30.f))
+ me->InterruptSpell(CURRENT_CHANNELED_SPELL);
- void ReceiveEmote(Player* /*player*/, uint32 emote) override
+ while (uint32 eventId = _events.ExecuteEvent())
{
- me->InterruptSpell(CURRENT_CHANNELED_SPELL);
- me->StopMoving();
-
- switch (emote)
+ switch (eventId)
{
- case TEXT_EMOTE_BOW:
- _events.ScheduleEvent(EVENT_FOCUS, 1s);
+ case EVENT_FOCUS:
+ if (Unit* owner = me->GetCharmerOrOwner())
+ me->SetFacingToObject(owner);
+ _events.ScheduleEvent(EVENT_EMOTE, 1s);
break;
- case TEXT_EMOTE_DRINK:
- _events.ScheduleEvent(EVENT_DRINK, 1s);
+ case EVENT_EMOTE:
+ me->HandleEmoteCommand(EMOTE_ONESHOT_BOW);
+ _events.ScheduleEvent(EVENT_FOLLOW, 1s);
+ break;
+ case EVENT_FOLLOW:
+ if (Unit* owner = me->GetCharmerOrOwner())
+ me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
+ break;
+ case EVENT_DRINK:
+ me->CastSpell(me, SPELL_PANDAREN_MONK, false);
+ break;
+ default:
break;
}
}
-
- void UpdateAI(uint32 diff) override
- {
- _events.Update(diff);
-
- if (Unit* owner = me->GetCharmerOrOwner())
- if (!me->IsWithinDist(owner, 30.f))
- me->InterruptSpell(CURRENT_CHANNELED_SPELL);
-
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_FOCUS:
- if (Unit* owner = me->GetCharmerOrOwner())
- me->SetFacingToObject(owner);
- _events.ScheduleEvent(EVENT_EMOTE, 1s);
- break;
- case EVENT_EMOTE:
- me->HandleEmoteCommand(EMOTE_ONESHOT_BOW);
- _events.ScheduleEvent(EVENT_FOLLOW, 1s);
- break;
- case EVENT_FOLLOW:
- if (Unit* owner = me->GetCharmerOrOwner())
- me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
- break;
- case EVENT_DRINK:
- me->CastSpell(me, SPELL_PANDAREN_MONK, false);
- break;
- default:
- break;
- }
- }
- }
- private:
- EventMap _events;
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_pet_gen_pandaren_monkAI(creature);
}
+
+private:
+ EventMap _events;
};
enum SoulTrader
@@ -178,7 +167,7 @@ struct npc_pet_lich : public ScriptedAI
void AddSC_generic_pet_scripts()
{
- new npc_pet_gen_pandaren_monk();
+ RegisterCreatureAI(npc_pet_gen_pandaren_monk);
RegisterCreatureAI(npc_pet_gen_soul_trader);
RegisterCreatureAI(npc_pet_lich);
}
diff --git a/src/server/scripts/Pet/pet_hunter.cpp b/src/server/scripts/Pet/pet_hunter.cpp
index 38bb2bb599c..8174003568e 100644
--- a/src/server/scripts/Pet/pet_hunter.cpp
+++ b/src/server/scripts/Pet/pet_hunter.cpp
@@ -37,104 +37,93 @@ enum HunterCreatures
NPC_HUNTER_VIPER = 19921
};
-class npc_pet_hunter_snake_trap : public CreatureScript
+struct npc_pet_hunter_snake_trap : public ScriptedAI
{
- public:
- npc_pet_hunter_snake_trap() : CreatureScript("npc_pet_hunter_snake_trap") { }
+ npc_pet_hunter_snake_trap(Creature* creature) : ScriptedAI(creature), _isViper(false), _spellTimer(0) { }
- struct npc_pet_hunter_snake_trapAI : public ScriptedAI
- {
- npc_pet_hunter_snake_trapAI(Creature* creature) : ScriptedAI(creature), _isViper(false), _spellTimer(0) { }
+ void JustEngagedWith(Unit* /*who*/) override { }
+
+ void JustAppeared() override
+ {
+ _isViper = me->GetEntry() == NPC_HUNTER_VIPER ? true : false;
+
+ me->SetMaxHealth(uint32(107 * (me->GetLevel() - 40) * 0.025f));
+ // Add delta to make them not all hit the same time
+ me->SetBaseAttackTime(BASE_ATTACK, me->GetBaseAttackTime(BASE_ATTACK) + urandms(0,6));
+
+ if (!_isViper && !me->HasAura(SPELL_HUNTER_DEADLY_POISON_PASSIVE))
+ DoCast(me, SPELL_HUNTER_DEADLY_POISON_PASSIVE, true);
+ }
+
+ // Redefined for random target selection:
+ void MoveInLineOfSight(Unit* /*who*/) override { }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (me->GetVictim() && me->GetVictim()->HasBreakableByDamageCrowdControlAura())
+ { // don't break cc
+ me->GetThreatManager().ClearFixate();
+ me->InterruptNonMeleeSpells(false);
+ me->AttackStop();
+ return;
+ }
+
+ if (me->IsSummon() && !me->GetThreatManager().GetFixateTarget())
+ { // find new target
+ Unit* summoner = me->ToTempSummon()->GetSummonerUnit();
- void JustEngagedWith(Unit* /*who*/) override { }
+ std::vector<Unit*> targets;
- void JustAppeared() override
+ auto addTargetIfValid = [this, &targets, summoner](CombatReference* ref) mutable
{
- _isViper = me->GetEntry() == NPC_HUNTER_VIPER ? true : false;
+ Unit* enemy = ref->GetOther(summoner);
+ if (!enemy->HasBreakableByDamageCrowdControlAura() && me->CanCreatureAttack(enemy) && me->IsWithinDistInMap(enemy, me->GetAttackDistance(enemy)))
+ targets.push_back(enemy);
+ };
- me->SetMaxHealth(uint32(107 * (me->GetLevel() - 40) * 0.025f));
- // Add delta to make them not all hit the same time
- me->SetBaseAttackTime(BASE_ATTACK, me->GetBaseAttackTime(BASE_ATTACK) + urandms(0,6));
+ for (std::pair<ObjectGuid const, PvPCombatReference*> const& pair : summoner->GetCombatManager().GetPvPCombatRefs())
+ addTargetIfValid(pair.second);
- if (!_isViper && !me->HasAura(SPELL_HUNTER_DEADLY_POISON_PASSIVE))
- DoCast(me, SPELL_HUNTER_DEADLY_POISON_PASSIVE, true);
- }
+ if (targets.empty())
+ for (std::pair<ObjectGuid const, CombatReference*> const& pair : summoner->GetCombatManager().GetPvECombatRefs())
+ addTargetIfValid(pair.second);
- // Redefined for random target selection:
- void MoveInLineOfSight(Unit* /*who*/) override { }
+ for (Unit* target : targets)
+ me->EngageWithTarget(target);
- void UpdateAI(uint32 diff) override
+ if (!targets.empty())
{
- if (me->GetVictim() && me->GetVictim()->HasBreakableByDamageCrowdControlAura())
- { // don't break cc
- me->GetThreatManager().ClearFixate();
- me->InterruptNonMeleeSpells(false);
- me->AttackStop();
- return;
- }
-
- if (me->IsSummon() && !me->GetThreatManager().GetFixateTarget())
- { // find new target
- Unit* summoner = me->ToTempSummon()->GetSummonerUnit();
-
- std::vector<Unit*> targets;
-
- auto addTargetIfValid = [this, &targets, summoner](CombatReference* ref) mutable
- {
- Unit* enemy = ref->GetOther(summoner);
- if (!enemy->HasBreakableByDamageCrowdControlAura() && me->CanCreatureAttack(enemy) && me->IsWithinDistInMap(enemy, me->GetAttackDistance(enemy)))
- targets.push_back(enemy);
- };
-
- for (std::pair<ObjectGuid const, PvPCombatReference*> const& pair : summoner->GetCombatManager().GetPvPCombatRefs())
- addTargetIfValid(pair.second);
-
- if (targets.empty())
- for (std::pair<ObjectGuid const, CombatReference*> const& pair : summoner->GetCombatManager().GetPvECombatRefs())
- addTargetIfValid(pair.second);
-
- for (Unit* target : targets)
- me->EngageWithTarget(target);
-
- if (!targets.empty())
- {
- Unit* target = Trinity::Containers::SelectRandomContainerElement(targets);
- me->GetThreatManager().FixateTarget(target);
- }
- }
-
- if (!UpdateVictim())
- return;
-
- // Viper
- if (_isViper)
- {
- if (_spellTimer <= diff)
- {
- if (!urand(0, 2)) // 33% chance to cast
- DoCastVictim(RAND(SPELL_HUNTER_MIND_NUMBING_POISON, SPELL_HUNTER_CRIPPLING_POISON));
-
- _spellTimer = 3000;
- }
- else
- _spellTimer -= diff;
- }
-
- DoMeleeAttackIfReady();
+ Unit* target = Trinity::Containers::SelectRandomContainerElement(targets);
+ me->GetThreatManager().FixateTarget(target);
}
+ }
- private:
- bool _isViper;
- uint32 _spellTimer;
- };
+ if (!UpdateVictim())
+ return;
- CreatureAI* GetAI(Creature* creature) const override
+ // Viper
+ if (_isViper)
{
- return new npc_pet_hunter_snake_trapAI(creature);
+ if (_spellTimer <= diff)
+ {
+ if (!urand(0, 2)) // 33% chance to cast
+ DoCastVictim(RAND(SPELL_HUNTER_MIND_NUMBING_POISON, SPELL_HUNTER_CRIPPLING_POISON));
+
+ _spellTimer = 3000;
+ }
+ else
+ _spellTimer -= diff;
}
+
+ DoMeleeAttackIfReady();
+ }
+
+private:
+ bool _isViper;
+ uint32 _spellTimer;
};
void AddSC_hunter_pet_scripts()
{
- new npc_pet_hunter_snake_trap();
+ RegisterCreatureAI(npc_pet_hunter_snake_trap);
}