diff options
-rw-r--r-- | src/server/game/AI/CreatureAI.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/TemporarySummon.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/TemporarySummon.h | 3 | ||||
-rw-r--r-- | src/server/scripts/Outland/zone_hellfire_peninsula.cpp | 28 |
4 files changed, 21 insertions, 14 deletions
diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp index 49ff7661302..b222d96985e 100644 --- a/src/server/game/AI/CreatureAI.cpp +++ b/src/server/game/AI/CreatureAI.cpp @@ -198,7 +198,7 @@ void CreatureAI::JustAppeared() if (TempSummon* summon = me->ToTempSummon()) { // Only apply this to specific types of summons - if (!summon->GetVehicle() && ShouldFollowOnSpawn(summon->m_Properties)) + if (!summon->GetVehicle() && ShouldFollowOnSpawn(summon->m_Properties) && summon->CanFollowOwner()) { if (Unit* owner = summon->GetCharmerOrOwner()) { diff --git a/src/server/game/Entities/Creature/TemporarySummon.cpp b/src/server/game/Entities/Creature/TemporarySummon.cpp index 7a3827694d3..27409d0209c 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.cpp +++ b/src/server/game/Entities/Creature/TemporarySummon.cpp @@ -29,7 +29,7 @@ TempSummon::TempSummon(SummonPropertiesEntry const* properties, WorldObject* owner, bool isWorldObject) : Creature(isWorldObject), m_Properties(properties), m_type(TEMPSUMMON_MANUAL_DESPAWN), -m_timer(0), m_lifetime(0) +m_timer(0), m_lifetime(0), m_canFollowOwner(true) { if (owner) m_summonerGUID = owner->GetGUID(); diff --git a/src/server/game/Entities/Creature/TemporarySummon.h b/src/server/game/Entities/Creature/TemporarySummon.h index c2d245744d2..04ca319f1dd 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.h +++ b/src/server/game/Entities/Creature/TemporarySummon.h @@ -60,6 +60,8 @@ class TC_GAME_API TempSummon : public Creature ObjectGuid GetSummonerGUID() const { return m_summonerGUID; } TempSummonType GetSummonType() const { return m_type; } uint32 GetTimer() const { return m_timer; } + bool CanFollowOwner() const { return m_canFollowOwner; } + void SetCanFollowOwner(bool can) { m_canFollowOwner = can; } SummonPropertiesEntry const* const m_Properties; @@ -69,6 +71,7 @@ class TC_GAME_API TempSummon : public Creature uint32 m_timer; uint32 m_lifetime; ObjectGuid m_summonerGUID; + bool m_canFollowOwner; }; class TC_GAME_API Minion : public TempSummon diff --git a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp index 9e9df90c9d6..0cac96a64b5 100644 --- a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp +++ b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp @@ -38,6 +38,7 @@ EndContentData */ #include "Player.h" #include "ScriptedEscortAI.h" #include "ScriptedGossip.h" +#include "TemporarySummon.h" /*###### ## npc_aeranas @@ -152,15 +153,21 @@ public: struct npc_ancestral_wolfAI : public EscortAI { - npc_ancestral_wolfAI(Creature* creature) : EscortAI(creature) + npc_ancestral_wolfAI(Creature* creature) : EscortAI(creature) { } + + void InitializeAI() override { - if (creature->GetOwner() && creature->GetOwner()->GetTypeId() == TYPEID_PLAYER) - Start(false, false, creature->GetOwner()->GetGUID()); + if (me->GetOwner() && me->GetOwner()->GetTypeId() == TYPEID_PLAYER) + { + EscortAI::Start(false, false, me->GetOwner()->GetGUID()); + + me->SetSpeedRate(MOVE_WALK, 1.5f); + + if (auto tempSummon = me->ToTempSummon()) + tempSummon->SetCanFollowOwner(false); + } else TC_LOG_ERROR("scripts", "TRINITY: npc_ancestral_wolf can not obtain owner or owner is not a player."); - - creature->SetSpeedRate(MOVE_WALK, 1.5f); - Reset(); } void Reset() override @@ -187,33 +194,31 @@ public: break; // Move Ryga into position case 48: - if (Creature* ryga = me->FindNearestCreature(NPC_RYGA,70)) + if (Creature* ryga = me->FindNearestCreature(NPC_RYGA, 70.0f)) { if (ryga->IsAlive() && !ryga->IsInCombat()) { ryga->SetWalk(true); ryga->SetSpeedRate(MOVE_WALK, 1.5f); ryga->GetMotionMaster()->MovePoint(0, 517.340698f, 3885.03975f, 190.455978f, true); - Reset(); } } break; // Ryga Kneels and welcomes spirit wolf case 50: - if (Creature* ryga = me->FindNearestCreature(NPC_RYGA,70)) + if (Creature* ryga = me->FindNearestCreature(NPC_RYGA, 70.0f)) { if (ryga->IsAlive() && !ryga->IsInCombat()) { ryga->SetFacingTo(0.776773f); ryga->SetStandState(UNIT_STAND_STATE_KNEEL); ryga->AI()->Talk(SAY_WOLF_WELCOME); - Reset(); } } break; // Ryga returns to spawn point case 51: - if (Creature* ryga = me->FindNearestCreature(NPC_RYGA,70)) + if (Creature* ryga = me->FindNearestCreature(NPC_RYGA, 70.0f)) { if (ryga->IsAlive() && !ryga->IsInCombat()) { @@ -222,7 +227,6 @@ public: ryga->SetHomePosition(fRetX, fRetY, fRetZ, fRetO); ryga->SetStandState(UNIT_STAND_STATE_STAND); ryga->GetMotionMaster()->MoveTargetedHome(); - Reset(); } } break; |