aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatan Shukry <matanshukry@gmail.com>2021-02-17 01:42:53 +0200
committerGitHub <noreply@github.com>2021-02-17 00:42:53 +0100
commitd2641c4924022369d4af595925bf04d034db5d72 (patch)
tree981ce34b0b19f9820f359f32181cf763b7ce9cec /src
parent907fc00f191fe6e1c7ad0362c30b093f961bb6a7 (diff)
Core/Conditions: CONDITION_NEAR_CREATURE will exclude personal spawns that aren't the target's owner (#26102)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Creature/TemporarySummon.cpp9
-rw-r--r--src/server/game/Entities/Creature/TemporarySummon.h1
-rw-r--r--src/server/game/Entities/Object/Object.cpp5
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.h3
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;