diff options
| author | offl <11556157+offl@users.noreply.github.com> | 2021-07-11 14:55:47 +0300 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2022-03-11 15:25:17 +0100 |
| commit | 72ea274df845cced9975bf788ff8dcfab5b643cb (patch) | |
| tree | 543a1d3285242673dabf5f0362bc7819d8c085cc /src | |
| parent | 779053ab908029b31ed5ef3e8ae6f2e242b6cc30 (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.cpp | 168 | ||||
| -rw-r--r-- | src/server/scripts/Pet/pet_generic.cpp | 119 | ||||
| -rw-r--r-- | src/server/scripts/Pet/pet_hunter.cpp | 151 |
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); } |
