diff options
4 files changed, 14 insertions, 4 deletions
diff --git a/src/server/game/Entities/Creature/TemporarySummon.cpp b/src/server/game/Entities/Creature/TemporarySummon.cpp index e522e1c3365..80523ae6bef 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.cpp +++ b/src/server/game/Entities/Creature/TemporarySummon.cpp @@ -44,6 +44,15 @@ Creature* TempSummon::GetSummonerCreatureBase() const return !m_summonerGUID.IsEmpty() ? ObjectAccessor::GetCreature(*this, m_summonerGUID) : nullptr; } +bool TempSummon::IsPersonalSummonOfAnotherPlayer(Creature const* summon, ObjectGuid playerToCheck) +{ + if (TempSummon const* tempSummon = summon->ToTempSummon()) + if (tempSummon->IsVisibleBySummonerOnly() && playerToCheck != tempSummon->GetSummonerGUID()) + return true; + + return false; +} + void TempSummon::Update(uint32 diff) { Creature::Update(diff); diff --git a/src/server/game/Entities/Creature/TemporarySummon.h b/src/server/game/Entities/Creature/TemporarySummon.h index b2837e951cd..9b6df4d6b34 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.h +++ b/src/server/game/Entities/Creature/TemporarySummon.h @@ -61,6 +61,7 @@ class TC_GAME_API TempSummon : public Creature void SetVisibleBySummonerOnly(bool visibleBySummonerOnly) { m_visibleBySummonerOnly = visibleBySummonerOnly; } bool IsVisibleBySummonerOnly() const { return m_visibleBySummonerOnly; } + static bool IsPersonalSummonOfAnotherPlayer(Creature const* summon, ObjectGuid playerToCheck); SummonPropertiesEntry const* const m_Properties; private: diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 7e9ce1fff40..9b3a730d8b4 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1448,9 +1448,8 @@ bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth, boo viewpoint = player->GetViewpoint(); if (Creature const* creature = obj->ToCreature()) - if (TempSummon const* tempSummon = creature->ToTempSummon()) - if (tempSummon->IsVisibleBySummonerOnly() && GetGUID() != tempSummon->GetSummonerGUID()) - return false; + if (TempSummon::IsPersonalSummonOfAnotherPlayer(creature, GetGUID())) + return false; } if (GameObject const* go = obj->ToGameObject()) diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index 98d125a27e8..0e7ff928b7f 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -28,6 +28,7 @@ #include "Player.h" #include "Spell.h" #include "SpellInfo.h" +#include "TemporarySummon.h" #include "UnitAI.h" #include "UpdateData.h" @@ -1312,7 +1313,7 @@ namespace Trinity bool operator()(Creature* u) { - if (u->getDeathState() != DEAD && u->GetEntry() == i_entry && u->IsAlive() == i_alive && i_obj.IsWithinDistInMap(u, i_range)) + if (u->getDeathState() != DEAD && u->GetEntry() == i_entry && u->IsAlive() == i_alive && i_obj.IsWithinDistInMap(u, i_range) && !TempSummon::IsPersonalSummonOfAnotherPlayer(u, i_obj.GetGUID())) { i_range = i_obj.GetDistance(u); // use found unit range as new range limit for next check return true; |