Merge branch 'master' into Fix-the-crash-2

This commit is contained in:
天鹭 2025-10-14 10:42:59 +08:00 committed by GitHub
commit 7952f5105c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 49 additions and 22 deletions

View File

@ -1095,23 +1095,45 @@ void WorldObject::SetVisibilityDistanceOverride(VisibilityDistanceType type)
if (type == GetVisibilityOverrideType())
return;
if (IsPlayer())
if (!IsCreature() && !IsGameObject() && !IsDynamicObject())
return;
if (IsVisibilityOverridden())
{
if (IsFarVisible())
GetMap()->RemoveWorldObjectFromFarVisibleMap(this);
else if (IsZoneWideVisible())
GetMap()->RemoveWorldObjectFromZoneWideVisibleMap(GetZoneId(), this);
}
if (type == VisibilityDistanceType::Large || type == VisibilityDistanceType::Gigantic)
GetMap()->AddWorldObjectToFarVisibleMap(this);
else if (type == VisibilityDistanceType::Infinite)
GetMap()->AddWorldObjectToZoneWideVisibleMap(GetZoneId(), this);
// Important to remove from old visibility override containers first
RemoveFromMapVisibilityOverrideContainers();
// Always update _visibilityDistanceOverrideType, even when not in world
_visibilityDistanceOverrideType = type;
// Finally, add to new visibility override containers
AddToMapVisibilityOverrideContainers();
}
void WorldObject::RemoveFromMapVisibilityOverrideContainers()
{
if (!IsVisibilityOverridden())
return;
if (!IsInWorld())
return;
if (IsFarVisible())
GetMap()->RemoveWorldObjectFromFarVisibleMap(this);
else if (IsZoneWideVisible())
GetMap()->RemoveWorldObjectFromZoneWideVisibleMap(_zoneId, this);
}
void WorldObject::AddToMapVisibilityOverrideContainers()
{
if (!IsVisibilityOverridden())
return;
if (!IsInWorld())
return;
if (IsFarVisible())
GetMap()->AddWorldObjectToFarVisibleMap(this);
else if (IsZoneWideVisible())
GetMap()->AddWorldObjectToZoneWideVisibleMap(_zoneId, this);
}
void WorldObject::CleanupsBeforeDelete(bool /*finalCleanup*/)
@ -1177,6 +1199,9 @@ void WorldObject::AddToWorld()
Object::AddToWorld();
GetMap()->GetZoneAndAreaId(GetPhaseMask(), _zoneId, _areaId, GetPositionX(), GetPositionY(), GetPositionZ());
GetMap()->AddObjectToPendingUpdateList(this);
if (IsZoneWideVisible())
GetMap()->AddWorldObjectToZoneWideVisibleMap(_zoneId, this);
}
void WorldObject::RemoveFromWorld()
@ -1184,8 +1209,7 @@ void WorldObject::RemoveFromWorld()
if (!IsInWorld())
return;
if (IsZoneWideVisible())
GetMap()->RemoveWorldObjectFromZoneWideVisibleMap(GetZoneId(), this);
RemoveFromMapVisibilityOverrideContainers();
DestroyForVisiblePlayers();

View File

@ -780,6 +780,9 @@ private:
//bool CanDetectStealthOf(WorldObject const* obj) const;
bool CanDetectStealthOf(WorldObject const* obj, bool checkAlert = false) const;
void RemoveFromMapVisibilityOverrideContainers();
void AddToMapVisibilityOverrideContainers();
GuidUnorderedSet _allowedLooters;
ObjectVisibilityContainer _objectVisibilityContainer;

View File

@ -422,7 +422,9 @@ void Map::UpdatePlayerZoneStats(uint32 oldZone, uint32 newZone)
else
--oldZoneCount;
}
++_zonePlayerCountMap[newZone];
if (newZone != MAP_INVALID_ZONE)
++_zonePlayerCountMap[newZone];
}
void Map::Update(const uint32 t_diff, const uint32 s_diff, bool /*thread*/)
@ -696,8 +698,8 @@ struct ResetNotifier
void Map::RemovePlayerFromMap(Player* player, bool remove)
{
// Before leaving map, update zone/area for stats
player->UpdateZone(MAP_INVALID_ZONE, 0);
UpdatePlayerZoneStats(player->GetZoneId(), MAP_INVALID_ZONE);
player->getHostileRefMgr().deleteReferences(true); // pussywizard: multithreading crashfix
player->RemoveFromWorld();
@ -725,8 +727,6 @@ void Map::RemoveFromMap(T* obj, bool remove)
obj->RemoveFromWorld();
obj->RemoveFromGrid();
if (obj->IsFarVisible())
RemoveWorldObjectFromFarVisibleMap(obj);
obj->ResetMap();

View File

@ -100,8 +100,8 @@ public:
}
else
{
canFly = handler->GetSession()->GetPlayer()->CanFly();
target->SetCanFly(!canFly);
canFly = !handler->GetSession()->GetPlayer()->CanFly();
target->SetCanFly(canFly);
}
handler->PSendSysMessage(LANG_COMMAND_FLYMODE_STATUS, handler->GetNameLink(target), canFly ? "on" : "off");