Skip to content

Commit

Permalink
Visibility: Fix interaction of infinite objects with phasing
Browse files Browse the repository at this point in the history
  • Loading branch information
killerwife committed Mar 9, 2025
1 parent c0e1729 commit f3cf0ce
Show file tree
Hide file tree
Showing 7 changed files with 42 additions and 3 deletions.
2 changes: 1 addition & 1 deletion src/game/Entities/GameObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1216,7 +1216,7 @@ bool GameObject::isVisibleForInState(Player const* u, WorldObject const* viewPoi
}
}

if (GetVisibilityData().IsInfiniteVisibility())
if (GetVisibilityData().IsInfiniteVisibility() && InSamePhase(viewPoint))
return true;

// check distance
Expand Down
2 changes: 2 additions & 0 deletions src/game/Entities/Player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21337,6 +21337,8 @@ void Player::SetPhaseMask(uint32 newPhaseMask, bool update)
if (Unit* vehicle = const_cast<Unit*>(FindRootVehicle()))
vehicle->SetPhaseMask(newPhaseMask, update);
GetSession()->SendSetPhaseShift(GetPhaseMask());

m_pendingPhaseChange = true;
}

void Player::InitPrimaryProfessions()
Expand Down
3 changes: 3 additions & 0 deletions src/game/Entities/Player.h
Original file line number Diff line number Diff line change
Expand Up @@ -2617,6 +2617,8 @@ class Player : public Unit
void SetLastData(uint32 dbGuid, bool gameobject) { m_lastDbGuid = dbGuid; m_lastGameObject = gameobject; }

bool IsMirrorTimerActive(MirrorTimer::Type timer) const;
bool IsPendingPhaseChange() const { return m_pendingPhaseChange; }
void RemovePendingPhaseChange() { m_pendingPhaseChange = false; }
protected:
/*********************************************************/
/*** BATTLEGROUND SYSTEM ***/
Expand Down Expand Up @@ -2995,6 +2997,7 @@ class Player : public Unit
bool m_pendingMountAuraFlying;
bool m_pendingDismount;
bool m_pendingTaxi;
bool m_pendingPhaseChange;
};

void AddItemsSetItem(Player* player, Item* item);
Expand Down
4 changes: 3 additions & 1 deletion src/game/Entities/Unit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9271,9 +9271,11 @@ bool Unit::IsVisibleForOrDetect(Unit const* u, WorldObject const* viewPoint, boo
// Any units far than max visible distance for viewer or not in our map are not visible too
if (!at_same_transport && !GetVisibilityData().IsInfiniteVisibility()) // distance for show player/pet/creature (no transport case)
{
if (!IsWithinDistInMap(viewPoint, u->GetVisibilityData().GetVisibilityDistanceFor((WorldObject *)this), is3dDistance))
if (!IsWithinDistInMap(viewPoint, u->GetVisibilityData().GetVisibilityDistanceFor((WorldObject*)this), is3dDistance))
return false;
}
else if (GetVisibilityData().IsInfiniteVisibility() && !InSamePhase(viewPoint))
return false;

// when restriction not set, visible to all
if (!IsOnlyVisibleTo(u->GetObjectGuid()))
Expand Down
6 changes: 6 additions & 0 deletions src/game/Grids/GridNotifiers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,12 @@ void VisibleNotifier::Notify()
++itr;
}

if (player.IsPendingPhaseChange())
{
player.GetMap()->UpdateInfinite(player, i_data, i_clientGUIDs, i_visibleNow);
player.RemovePendingPhaseChange();
}

// generate outOfRange for not iterate objects
i_data.AddOutOfRangeGUID(i_clientGUIDs);
for (GuidSet::iterator itr = i_clientGUIDs.begin(); itr != i_clientGUIDs.end(); ++itr)
Expand Down
26 changes: 25 additions & 1 deletion src/game/Maps/Map.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1760,7 +1760,7 @@ void Map::SendInitInfiniteObjects(Player* player, UpdateData& updateData) const
for (auto i : m_infiniteObjects)
{
// send data for current transport in other place - if player is on transport, already sent in init self
if (i->GetMapId() == i_id && !player->HasAtClient(i))
if (i->GetMapId() == i_id && !player->HasAtClient(i) && i->InSamePhase(player))
{
player->AddAtClient(i);
i->BuildCreateUpdateBlockForPlayer(updateData, player);
Expand Down Expand Up @@ -1788,6 +1788,30 @@ void Map::SendRemoveInfinite(Player* player) const
updateData.SendData(*player->GetSession());
}

void Map::UpdateInfinite(Player& player, UpdateData& updateData, GuidSet& clientGUIDs, WorldObjectSet& visibleNow) const
{
for (auto i : m_infiniteObjects)
{
if (i->GetMapId() == i_id)
{
if (player.HasAtClient(i))
{
if (!player.InSamePhase(i))
{
i->BuildOutOfRangeUpdateBlock(updateData);
player.RemoveAtClient(i);
}
}
else if (player.InSamePhase(i))
{
player.AddAtClient(i);
i->BuildCreateUpdateBlockForPlayer(updateData, &player);
visibleNow.insert(i);
}
}
}
}

void Map::LoadTransports()
{
uint32 mapId = GetId();
Expand Down
2 changes: 2 additions & 0 deletions src/game/Maps/Map.h
Original file line number Diff line number Diff line change
Expand Up @@ -469,6 +469,8 @@ class Map : public GridRefManager<NGridType>
void AddWaypointingNpc(Unit* npc);
void RemoveWaypointingNpc(Unit* npc);

void UpdateInfinite(Player& player, UpdateData& updateData, GuidSet& clientGUIDs, WorldObjectSet& visibleNow) const;

private:
void LoadMapAndVMap(int gx, int gy);

Expand Down

0 comments on commit f3cf0ce

Please sign in to comment.