From fb6c2532158d5d8c58a1091b416eb5a2e44dbd89 Mon Sep 17 00:00:00 2001 From: killerwife Date: Thu, 2 Jan 2025 15:07:45 +0100 Subject: [PATCH] PetAI: Enable more extensive scripting for pets --- src/game/AI/BaseAI/PetAI.cpp | 24 +++++++++++++++++-- src/game/AI/BaseAI/PetAI.h | 1 + src/game/AI/BaseAI/UnitAI.h | 2 +- .../eastern_kingdoms/karazhan/chess_event.cpp | 2 +- .../scripts/outland/blades_edge_mountains.cpp | 2 +- .../scripts/outland/hellfire_peninsula.cpp | 2 +- .../scripts/outland/netherstorm.cpp | 2 +- 7 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/game/AI/BaseAI/PetAI.cpp b/src/game/AI/BaseAI/PetAI.cpp index 993c511da86..71455f421e3 100644 --- a/src/game/AI/BaseAI/PetAI.cpp +++ b/src/game/AI/BaseAI/PetAI.cpp @@ -35,7 +35,12 @@ int PetAI::Permissible(const Creature* creature) return PERMIT_BASE_NO; } -PetAI::PetAI(Creature* creature) : CreatureAI(creature), inCombat(false) +PetAI::PetAI(Creature* creature) : PetAI(creature, 0) +{ + +} + +PetAI::PetAI(Creature* creature, uint32 combatActions) : CreatureAI(creature, combatActions), inCombat(false) { m_followAngle = M_PI_F / 2; m_followDist = 1.5f; @@ -134,12 +139,19 @@ void PetAI::EnterEvadeMode() void PetAI::UpdateAI(const uint32 diff) { + Unit* owner = m_unit->GetMaster(); + + if (CanHandleCharm() && !owner) + { + CreatureAI::UpdateAI(diff); + return; + } + UpdateTimers(diff, m_creature->IsInCombat()); Creature* creature = (m_unit->GetTypeId() == TYPEID_UNIT) ? static_cast(m_unit) : nullptr; Pet* pet = (creature && creature->IsPet()) ? static_cast(m_unit) : nullptr; - Unit* owner = m_unit->GetMaster(); if (!owner) return; @@ -182,6 +194,8 @@ void PetAI::UpdateAI(const uint32 diff) charminfo->SetIsRetreating(); } + ExecuteActions(); + // Stop here if casting spell (No melee and no movement) if (m_unit->IsNonMeleeSpellCasted(false)) return; @@ -439,6 +453,12 @@ void PetAI::JustDied(Unit* killer) void PetAI::AttackedBy(Unit* attacker) { CharmInfo* charminfo = m_unit->GetCharmInfo(); + if (CanHandleCharm() && !charminfo) + { + CreatureAI::AttackedBy(attacker); + return; + } + MANGOS_ASSERT(charminfo); // when attacked, fight back if no victim unless we have a charm state set to passive diff --git a/src/game/AI/BaseAI/PetAI.h b/src/game/AI/BaseAI/PetAI.h index 9cde28f0388..e44a87fb4e4 100644 --- a/src/game/AI/BaseAI/PetAI.h +++ b/src/game/AI/BaseAI/PetAI.h @@ -31,6 +31,7 @@ class PetAI : public CreatureAI public: explicit PetAI(Creature* creature); + explicit PetAI(Creature* creature, uint32 combatActions); void MoveInLineOfSight(Unit* who) override; void AttackStart(Unit* who) override; diff --git a/src/game/AI/BaseAI/UnitAI.h b/src/game/AI/BaseAI/UnitAI.h index efb9cbac8dd..ea126281ab6 100644 --- a/src/game/AI/BaseAI/UnitAI.h +++ b/src/game/AI/BaseAI/UnitAI.h @@ -475,7 +475,7 @@ class UnitAI : public CombatActions virtual void JustStunnedTarget(SpellEntry const* spellInfo, Unit* victim) { JustStoppedMovementOfTarget(spellInfo, victim); } // AI selection - works in connection with IsPossessCharmType - virtual bool CanHandleCharm() { return false; } + virtual bool CanHandleCharm() const { return false; } virtual void JustGotCharmed(Unit* charmer) {} // Movement generator responses diff --git a/src/game/AI/ScriptDevAI/scripts/eastern_kingdoms/karazhan/chess_event.cpp b/src/game/AI/ScriptDevAI/scripts/eastern_kingdoms/karazhan/chess_event.cpp index 4c711a257d0..86d251eba9c 100644 --- a/src/game/AI/ScriptDevAI/scripts/eastern_kingdoms/karazhan/chess_event.cpp +++ b/src/game/AI/ScriptDevAI/scripts/eastern_kingdoms/karazhan/chess_event.cpp @@ -340,7 +340,7 @@ struct npc_chess_piece_genericAI : public Scripted_NoMovementAI void MoveInLineOfSight(Unit* /*pWho*/) override { } void AttackStart(Unit* /*pWho*/) override { } void EnterEvadeMode() override { } - bool CanHandleCharm() override { return true; } + bool CanHandleCharm() const override { return true; } void JustDied(Unit* /*pKiller*/) override { diff --git a/src/game/AI/ScriptDevAI/scripts/outland/blades_edge_mountains.cpp b/src/game/AI/ScriptDevAI/scripts/outland/blades_edge_mountains.cpp index f4bcd4466af..7fde7bfc029 100644 --- a/src/game/AI/ScriptDevAI/scripts/outland/blades_edge_mountains.cpp +++ b/src/game/AI/ScriptDevAI/scripts/outland/blades_edge_mountains.cpp @@ -1832,7 +1832,7 @@ struct npc_fel_cannon : public Scripted_NoMovementAI m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNINTERACTIBLE); } - bool CanHandleCharm() override { return true; } + bool CanHandleCharm() const override { return true; } void SpellHit(Unit* /*pCaster*/, const SpellEntry* pSpell) override { diff --git a/src/game/AI/ScriptDevAI/scripts/outland/hellfire_peninsula.cpp b/src/game/AI/ScriptDevAI/scripts/outland/hellfire_peninsula.cpp index b8ea4ecc32d..3da961d8c77 100644 --- a/src/game/AI/ScriptDevAI/scripts/outland/hellfire_peninsula.cpp +++ b/src/game/AI/ScriptDevAI/scripts/outland/hellfire_peninsula.cpp @@ -2362,7 +2362,7 @@ struct npc_razorthorn_ravager : public CombatAI } - bool CanHandleCharm() override { return true; } + bool CanHandleCharm() const override { return true; } void JustGotCharmed(Unit* /*charmer*/) override { diff --git a/src/game/AI/ScriptDevAI/scripts/outland/netherstorm.cpp b/src/game/AI/ScriptDevAI/scripts/outland/netherstorm.cpp index bd45053997b..7eb301b61f6 100644 --- a/src/game/AI/ScriptDevAI/scripts/outland/netherstorm.cpp +++ b/src/game/AI/ScriptDevAI/scripts/outland/netherstorm.cpp @@ -2766,7 +2766,7 @@ struct npc_scrap_reaverAI : ScriptedPetAI } - bool CanHandleCharm() override { return true; } + bool CanHandleCharm() const override { return true; } void JustRespawned() override {