aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-03-08 21:02:29 +0100
committerShauren <shauren.trinity@gmail.com>2024-03-08 21:02:29 +0100
commit1439535c6ac2ca8db13990e4fee29d4c1312f87a (patch)
tree16eb7f0c3b7ed9ff950d83f00e03e16a7723eb6c /src/server/game/Entities
parentd397b636d48f55b5e76d77c36ded33b2c8bbe295 (diff)
Core/Players: Extend Player::SendInitialVisiblePackets to work with all WorldObject types
Diffstat (limited to 'src/server/game/Entities')
-rw-r--r--src/server/game/Entities/Player/Player.cpp74
-rw-r--r--src/server/game/Entities/Player/Player.h4
2 files changed, 31 insertions, 47 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index cbe9326ce91..337055bf4ab 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -23780,26 +23780,6 @@ bool Player::IsVisibleGloballyFor(Player const* u) const
}
template<class T>
-inline void UpdateVisibilityOf_helper(GuidUnorderedSet& s64, T* target, std::set<Unit*>& /*v*/)
-{
- s64.insert(target->GetGUID());
-}
-
-template<>
-inline void UpdateVisibilityOf_helper(GuidUnorderedSet& s64, Creature* target, std::set<Unit*>& v)
-{
- s64.insert(target->GetGUID());
- v.insert(target);
-}
-
-template<>
-inline void UpdateVisibilityOf_helper(GuidUnorderedSet& s64, Player* target, std::set<Unit*>& v)
-{
- s64.insert(target->GetGUID());
- v.insert(target);
-}
-
-template<class T>
inline void BeforeVisibilityDestroy(T* /*t*/, Player* /*p*/) { }
template<>
@@ -23815,7 +23795,7 @@ void Player::UpdateVisibilityOf(Trinity::IteratorPair<WorldObject**> targets)
return;
UpdateData udata(GetMapId());
- std::set<Unit*> newVisibleUnits;
+ std::set<WorldObject*> newVisibleObjects;
for (WorldObject* target : targets)
{
@@ -23825,28 +23805,28 @@ void Player::UpdateVisibilityOf(Trinity::IteratorPair<WorldObject**> targets)
switch (target->GetTypeId())
{
case TYPEID_UNIT:
- UpdateVisibilityOf(target->ToCreature(), udata, newVisibleUnits);
+ UpdateVisibilityOf(target->ToCreature(), udata, newVisibleObjects);
break;
case TYPEID_PLAYER:
- UpdateVisibilityOf(target->ToPlayer(), udata, newVisibleUnits);
+ UpdateVisibilityOf(target->ToPlayer(), udata, newVisibleObjects);
break;
case TYPEID_GAMEOBJECT:
- UpdateVisibilityOf(target->ToGameObject(), udata, newVisibleUnits);
+ UpdateVisibilityOf(target->ToGameObject(), udata, newVisibleObjects);
break;
case TYPEID_DYNAMICOBJECT:
- UpdateVisibilityOf(target->ToDynObject(), udata, newVisibleUnits);
+ UpdateVisibilityOf(target->ToDynObject(), udata, newVisibleObjects);
break;
case TYPEID_CORPSE:
- UpdateVisibilityOf(target->ToCorpse(), udata, newVisibleUnits);
+ UpdateVisibilityOf(target->ToCorpse(), udata, newVisibleObjects);
break;
case TYPEID_AREATRIGGER:
- UpdateVisibilityOf(target->ToAreaTrigger(), udata, newVisibleUnits);
+ UpdateVisibilityOf(target->ToAreaTrigger(), udata, newVisibleObjects);
break;
case TYPEID_SCENEOBJECT:
- UpdateVisibilityOf(target->ToSceneObject(), udata, newVisibleUnits);
+ UpdateVisibilityOf(target->ToSceneObject(), udata, newVisibleObjects);
break;
case TYPEID_CONVERSATION:
- UpdateVisibilityOf(target->ToConversation(), udata, newVisibleUnits);
+ UpdateVisibilityOf(target->ToConversation(), udata, newVisibleObjects);
break;
default:
break;
@@ -23860,7 +23840,7 @@ void Player::UpdateVisibilityOf(Trinity::IteratorPair<WorldObject**> targets)
udata.BuildPacket(&packet);
SendDirectMessage(&packet);
- for (Unit* visibleUnit : newVisibleUnits)
+ for (WorldObject* visibleUnit : newVisibleObjects)
SendInitialVisiblePackets(visibleUnit);
}
@@ -23945,18 +23925,21 @@ void Player::UpdateTriggerVisibility()
SendDirectMessage(&packet);
}
-void Player::SendInitialVisiblePackets(Unit* target) const
+void Player::SendInitialVisiblePackets(WorldObject* target) const
{
- SendAurasForTarget(target);
- if (target->IsAlive())
+ if (Unit* targetUnit = target->ToUnit())
{
- if (target->HasUnitState(UNIT_STATE_MELEE_ATTACKING) && target->GetVictim())
- target->SendMeleeAttackStart(target->GetVictim());
+ SendAurasForTarget(targetUnit);
+ if (targetUnit->IsAlive())
+ {
+ if (targetUnit->HasUnitState(UNIT_STATE_MELEE_ATTACKING) && targetUnit->GetVictim())
+ targetUnit->SendMeleeAttackStart(targetUnit->GetVictim());
+ }
}
}
template<class T>
-void Player::UpdateVisibilityOf(T* target, UpdateData& data, std::set<Unit*>& visibleNow)
+void Player::UpdateVisibilityOf(T* target, UpdateData& data, std::set<WorldObject*>& visibleNow)
{
if (HaveAtClient(target))
{
@@ -23981,7 +23964,8 @@ void Player::UpdateVisibilityOf(T* target, UpdateData& data, std::set<Unit*>& vi
if (CanSeeOrDetect(target, false, true))
{
target->BuildCreateUpdateBlockForPlayer(&data, this);
- UpdateVisibilityOf_helper(m_clientGUIDs, target, visibleNow);
+ m_clientGUIDs.insert(target->GetGUID());
+ visibleNow.insert(target);
#ifdef TRINITY_DEBUG
TC_LOG_DEBUG("maps", "Object {} is visible now for player {}. Distance = {}", target->GetGUID().ToString(), GetGUID().ToString(), GetDistance(target));
@@ -23990,14 +23974,14 @@ void Player::UpdateVisibilityOf(T* target, UpdateData& data, std::set<Unit*>& vi
}
}
-template void Player::UpdateVisibilityOf(Player* target, UpdateData& data, std::set<Unit*>& visibleNow);
-template void Player::UpdateVisibilityOf(Creature* target, UpdateData& data, std::set<Unit*>& visibleNow);
-template void Player::UpdateVisibilityOf(Corpse* target, UpdateData& data, std::set<Unit*>& visibleNow);
-template void Player::UpdateVisibilityOf(GameObject* target, UpdateData& data, std::set<Unit*>& visibleNow);
-template void Player::UpdateVisibilityOf(DynamicObject* target, UpdateData& data, std::set<Unit*>& visibleNow);
-template void Player::UpdateVisibilityOf(AreaTrigger* target, UpdateData& data, std::set<Unit*>& visibleNow);
-template void Player::UpdateVisibilityOf(SceneObject* target, UpdateData& data, std::set<Unit*>& visibleNow);
-template void Player::UpdateVisibilityOf(Conversation* target, UpdateData& data, std::set<Unit*>& visibleNow);
+template void Player::UpdateVisibilityOf(Player* target, UpdateData& data, std::set<WorldObject*>& visibleNow);
+template void Player::UpdateVisibilityOf(Creature* target, UpdateData& data, std::set<WorldObject*>& visibleNow);
+template void Player::UpdateVisibilityOf(Corpse* target, UpdateData& data, std::set<WorldObject*>& visibleNow);
+template void Player::UpdateVisibilityOf(GameObject* target, UpdateData& data, std::set<WorldObject*>& visibleNow);
+template void Player::UpdateVisibilityOf(DynamicObject* target, UpdateData& data, std::set<WorldObject*>& visibleNow);
+template void Player::UpdateVisibilityOf(AreaTrigger* target, UpdateData& data, std::set<WorldObject*>& visibleNow);
+template void Player::UpdateVisibilityOf(SceneObject* target, UpdateData& data, std::set<WorldObject*>& visibleNow);
+template void Player::UpdateVisibilityOf(Conversation* target, UpdateData& data, std::set<WorldObject*>& visibleNow);
void Player::UpdateObjectVisibility(bool forced)
{
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index e5a39a319fc..4c33e4dae77 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2515,7 +2515,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player>
bool IsVisibleGloballyFor(Player const* player) const;
- void SendInitialVisiblePackets(Unit* target) const;
+ void SendInitialVisiblePackets(WorldObject* target) const;
void OnPhaseChange() override;
void UpdateObjectVisibility(bool forced = true) override;
void UpdateVisibilityForPlayer();
@@ -2524,7 +2524,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player>
void UpdateTriggerVisibility();
template<class T>
- void UpdateVisibilityOf(T* target, UpdateData& data, std::set<Unit*>& visibleNow);
+ void UpdateVisibilityOf(T* target, UpdateData& data, std::set<WorldObject*>& visibleNow);
std::array<uint8, MAX_MOVE_TYPE> m_forced_speed_changes;
uint8 m_movementForceModMagnitudeChanges;