diff --git a/src/server/game/Entities/Creature/TemporarySummon.cpp b/src/server/game/Entities/Creature/TemporarySummon.cpp index c06965a615..ad6327f419 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.cpp +++ b/src/server/game/Entities/Creature/TemporarySummon.cpp @@ -26,7 +26,7 @@ TempSummon::TempSummon(SummonPropertiesEntry const* properties, Unit* owner, bool isWorldObject) : Creature(isWorldObject), m_Properties(properties), m_type(TEMPSUMMON_MANUAL_DESPAWN), -m_timer(0), m_lifetime(0), m_visibleBySummonerOnly(false) +m_timer(0), m_lifetime(0) { if (owner) m_summonerGUID = owner->GetGUID(); @@ -44,15 +44,6 @@ Creature* TempSummon::GetSummonerCreatureBase() const return m_summonerGUID ? 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 d78ba1b462..1a9069ab42 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.h +++ b/src/server/game/Entities/Creature/TemporarySummon.h @@ -87,17 +87,12 @@ class TC_GAME_API TempSummon : public Creature TempSummonType const& GetSummonType() { return m_type; } uint32 GetTimer() const { return m_timer; } - 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: TempSummonType m_type; uint32 m_timer; uint32 m_lifetime; ObjectGuid m_summonerGUID; - bool m_visibleBySummonerOnly; }; class TC_GAME_API Minion : public TempSummon diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index f0e25d48c2..3848b99405 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -304,10 +304,6 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject void SetSpawnId(uint32 spawnId) { m_spawnId = spawnId; } - void SetVisibleByUnitOnly(ObjectGuid unit) { m_visibleByUnitOnly = unit; } - bool IsVisibleByUnitOnly() const { return !m_visibleByUnitOnly.IsEmpty(); } - ObjectGuid GetVisibleByUnitOnly() const { return m_visibleByUnitOnly; } - protected: GameObjectModel* CreateModel(); void UpdateModel(); // updates model in case displayId were changed @@ -366,6 +362,5 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject GameObjectAI* m_AI; bool m_respawnCompatibilityMode; bool _triggerJustAppeared; - ObjectGuid m_visibleByUnitOnly; }; #endif diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index b0d6930ea7..2133747cda 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1731,6 +1731,9 @@ bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth, boo if (this == obj) return true; + if (!obj->GetPrivateObjectOwner().IsEmpty()) + return GetGUID() == obj->GetPrivateObjectOwner() || GetPrivateObjectOwner() == obj->GetPrivateObjectOwner(); + if (obj->IsNeverVisible() || CanNeverSee(obj)) return false; @@ -1766,18 +1769,8 @@ bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth, boo WorldObject const* viewpoint = this; if (Player const* player = this->ToPlayer()) - { viewpoint = player->GetViewpoint(); - if (Creature const* creature = obj->ToCreature()) - if (TempSummon::IsPersonalSummonOfAnotherPlayer(creature, GetGUID())) - return false; - } - - if (GameObject const* go = obj->ToGameObject()) - if (go->IsVisibleByUnitOnly() && GetGUID() != go->GetVisibleByUnitOnly()) - return false; - if (!viewpoint) viewpoint = this; @@ -2010,7 +2003,7 @@ void WorldObject::AddObjectToRemoveList() map->AddObjectToRemoveList(this); } -TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties /*= nullptr*/, uint32 duration /*= 0*/, Unit* summoner /*= nullptr*/, uint32 spellId /*= 0*/, uint32 vehId /*= 0*/, bool visibleBySummonerOnly /*= false*/, uint32 health /*= 0*/) +TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties /*= nullptr*/, uint32 duration /*= 0*/, Unit* summoner /*= nullptr*/, uint32 spellId /*= 0*/, uint32 vehId /*= 0*/, bool personalSpawn /*= false*/, uint32 health /*= 0*/) { uint32 mask = UNIT_MASK_SUMMON; if (properties) @@ -2109,7 +2102,8 @@ TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropert summon->SetUInt32Value(UNIT_CREATED_BY_SPELL, spellId); summon->SetHomePosition(pos); summon->InitStats(duration); - summon->SetVisibleBySummonerOnly(visibleBySummonerOnly); + if (personalSpawn && summoner) + summon->SetPrivateObjectOwner(summoner->IsPrivateObject() ? summoner->GetPrivateObjectOwner() : summoner->GetGUID()); // Handle health argument (totem health via base points) if (health) @@ -2168,11 +2162,11 @@ void WorldObject::ClearZoneScript() m_zoneScript = nullptr; } -TempSummon* WorldObject::SummonCreature(uint32 entry, Position const& pos, TempSummonType despawnType /*= TEMPSUMMON_MANUAL_DESPAWN*/, uint32 despawnTime /*= 0*/, uint32 vehId /*= 0*/, bool visibleBySummonerOnly /*= false*/) +TempSummon* WorldObject::SummonCreature(uint32 entry, Position const& pos, TempSummonType despawnType /*= TEMPSUMMON_MANUAL_DESPAWN*/, uint32 despawnTime /*= 0*/, uint32 vehId /*= 0*/, bool personalSpawn /*= false*/) { if (Map* map = FindMap()) { - if (TempSummon* summon = map->SummonCreature(entry, pos, nullptr, despawnTime, ToUnit(), 0, vehId, visibleBySummonerOnly)) + if (TempSummon* summon = map->SummonCreature(entry, pos, nullptr, despawnTime, ToUnit(), 0, vehId, personalSpawn)) { summon->SetTempSummonType(despawnType); return summon; @@ -2182,13 +2176,13 @@ TempSummon* WorldObject::SummonCreature(uint32 entry, Position const& pos, TempS return nullptr; } -TempSummon* WorldObject::SummonCreature(uint32 id, float x, float y, float z, float o /*= 0*/, TempSummonType despawnType /*= TEMPSUMMON_MANUAL_DESPAWN*/, uint32 despawnTime /*= 0*/, bool visibleBySummonerOnly /*= false*/) +TempSummon* WorldObject::SummonCreature(uint32 id, float x, float y, float z, float o /*= 0*/, TempSummonType despawnType /*= TEMPSUMMON_MANUAL_DESPAWN*/, uint32 despawnTime /*= 0*/, bool personalSpawn /*= false*/) { if (!x && !y && !z) GetClosePoint(x, y, z, GetCombatReach()); if (!o) o = GetOrientation(); - return SummonCreature(id, { x, y, z, o }, despawnType, despawnTime, 0, visibleBySummonerOnly); + return SummonCreature(id, { x, y, z, o }, despawnType, despawnTime, 0, personalSpawn); } GameObject* WorldObject::SummonGameObject(uint32 entry, Position const& pos, QuaternionData const& rot, uint32 respawnTime, GOSummonType summonType) diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 251342d5d3..c7d03bcd69 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -245,7 +245,7 @@ class GridObject GridReference _gridRef; }; -template +template class FlaggedValuesArray32 { public: @@ -401,9 +401,9 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation void ClearZoneScript(); ZoneScript* GetZoneScript() const { return m_zoneScript; } - TempSummon* SummonCreature(uint32 entry, Position const& pos, TempSummonType despawnType = TEMPSUMMON_MANUAL_DESPAWN, uint32 despawnTime = 0, uint32 vehId = 0, bool visibleBySummonerOnly = false); - TempSummon* SummonCreature(uint32 entry, Position const& pos, TempSummonType despawnType, Milliseconds despawnTime, uint32 vehId = 0, bool visibleBySummonerOnly = false) { return SummonCreature(entry, pos, despawnType, uint32(despawnTime.count()), vehId, visibleBySummonerOnly); } - TempSummon* SummonCreature(uint32 entry, float x, float y, float z, float o = 0, TempSummonType despawnType = TEMPSUMMON_MANUAL_DESPAWN, uint32 despawnTime = 0, bool visibleBySummonerOnly = false); + TempSummon* SummonCreature(uint32 entry, Position const& pos, TempSummonType despawnType = TEMPSUMMON_MANUAL_DESPAWN, uint32 despawnTime = 0, uint32 vehId = 0, bool personalSpawn = false); + TempSummon* SummonCreature(uint32 entry, Position const& pos, TempSummonType despawnType, Milliseconds despawnTime, uint32 vehId = 0, bool personalSpawn = false) { return SummonCreature(entry, pos, despawnType, uint32(despawnTime.count()), vehId, personalSpawn); } + TempSummon* SummonCreature(uint32 entry, float x, float y, float z, float o = 0, TempSummonType despawnType = TEMPSUMMON_MANUAL_DESPAWN, uint32 despawnTime = 0, bool personalSpawn = false); GameObject* SummonGameObject(uint32 entry, Position const& pos, QuaternionData const& rot, uint32 respawnTime /* s */, GOSummonType summonType = GO_SUMMON_TIMED_OR_CORPSE_DESPAWN); GameObject* SummonGameObject(uint32 entry, float x, float y, float z, float ang, QuaternionData const& rot, uint32 respawnTime /* s */); @@ -486,6 +486,11 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation uint16 GetMeleeAnimKitId() const { return m_meleeAnimKitId; } void SetMeleeAnimKitId(uint16 animKitId); + // Watcher + bool IsPrivateObject() const { return !_privateObjectOwner.IsEmpty(); } + ObjectGuid GetPrivateObjectOwner() const { return _privateObjectOwner; } + void SetPrivateObjectOwner(ObjectGuid const& owner) { _privateObjectOwner = owner; } + protected: std::string m_name; bool m_isActive; @@ -526,6 +531,9 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation int32 _dbPhase; uint16 m_notifyflags; + + ObjectGuid _privateObjectOwner; + virtual bool _IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D, bool incOwnRadius = true, bool incTargetRadius = true) const; bool CanNeverSee(WorldObject const* obj) const; diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index 4c71dd7307..6b42da337b 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -1278,7 +1278,7 @@ namespace Trinity bool operator()(Creature* u) { - if (u->getDeathState() != DEAD && u->GetEntry() == i_entry && u->IsAlive() == i_alive && u->GetGUID() != i_obj.GetGUID() && i_obj.IsWithinDistInMap(u, i_range) && !TempSummon::IsPersonalSummonOfAnotherPlayer(u, i_obj.GetGUID())) + if (u->getDeathState() != DEAD && u->GetEntry() == i_entry && u->IsAlive() == i_alive && u->GetGUID() != i_obj.GetGUID() && i_obj.IsWithinDistInMap(u, i_range) && u->CanSeeOrDetect(&i_obj)) { i_range = i_obj.GetDistance(u); // use found unit range as new range limit for next check return true; diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 1880c26472..fa770b19bb 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -531,7 +531,7 @@ class TC_GAME_API Map : public GridRefManager void UpdateIteratorBack(Player* player); - TempSummon* SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties = nullptr, uint32 duration = 0, Unit* summoner = nullptr, uint32 spellId = 0, uint32 vehId = 0, bool visibleOnlyBySummoner = false, uint32 health = 0); + TempSummon* SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties = nullptr, uint32 duration = 0, Unit* summoner = nullptr, uint32 spellId = 0, uint32 vehId = 0, bool personalSpawn = false, uint32 health = 0); void SummonCreatureGroup(uint8 group, std::list* list = nullptr); Player* GetPlayer(ObjectGuid const& guid); AreaTrigger* GetAreaTrigger(ObjectGuid const& guid); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 72cf9cc5a0..af6dfba778 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -5565,7 +5565,7 @@ void Spell::EffectSummonPersonalGameObject(SpellEffIndex effIndex) go->SetRespawnTime(duration > 0 ? duration / IN_MILLISECONDS : 0); go->SetSpellId(m_spellInfo->Id); - go->SetVisibleByUnitOnly(m_caster->GetGUID()); + go->SetPrivateObjectOwner(m_caster->GetGUID()); ExecuteLogEffectSummonObject(effIndex, go);