From 75e9a4907224006b4ee547a95f323ff7fe1f33c7 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 14 Mar 2025 02:08:11 +0000 Subject: [PATCH] only send up top 20 pre sorted profile picks to viewers --- OpenSim/Framework/Constants.cs | 3 ++ .../ClientStack/Linden/UDP/LLClientView.cs | 29 ++++++++++++++----- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/OpenSim/Framework/Constants.cs b/OpenSim/Framework/Constants.cs index 63f7edf231..1551ac45f4 100644 --- a/OpenSim/Framework/Constants.cs +++ b/OpenSim/Framework/Constants.cs @@ -37,6 +37,9 @@ namespace OpenSim.Framework public const int MaxEstateAccessIds = 500; public const int MaxEstateManagers = 20; + + public const int MaxProfilePicks = 20; + // 'RegionSize' is the legacy region size. // DO NOT USE THIS FOR ANY NEW CODE. Use Scene.RegionInfo.RegionSize[XYZ] as a region might not // be the legacy region size. diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index c2157a74cd..6b90e6095c 100755 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -51,6 +51,7 @@ using AssetLandmark = OpenSim.Framework.AssetLandmark; using Caps = OpenSim.Framework.Capabilities.Caps; using PermissionMask = OpenSim.Framework.PermissionMask; using RegionFlags = OpenMetaverse.RegionFlags; +using System.Linq; namespace OpenSim.Region.ClientStack.LindenUDP { @@ -4199,17 +4200,29 @@ namespace OpenSim.Region.ClientStack.LindenUDP TargetID = targetID }; - ap.Data = new AvatarPicksReplyPacket.DataBlock[picks.Count]; + if(picks.Count > 0) + { + List> spicks = picks.ToList(); + spicks.Sort((a,b) => string.Compare(a.Value, b.Value)); - int i = 0; - foreach (KeyValuePair pick in picks) - { - ap.Data[i++] = new AvatarPicksReplyPacket.DataBlock + int npicks = spicks.Count > Constants.MaxProfilePicks ? Constants.MaxProfilePicks : spicks.Count; + int maxtrlen = (LLUDPServer.MTU - 128) / npicks - 1; + if( maxtrlen > 128) + maxtrlen = 128; + + ap.Data = new AvatarPicksReplyPacket.DataBlock[npicks]; + for(int i = 0; i < npicks; ++i) { - PickID = pick.Key, - PickName = Utils.StringToBytes(pick.Value) - }; + KeyValuePair pick = spicks[i]; + ap.Data[i++] = new AvatarPicksReplyPacket.DataBlock + { + PickID = pick.Key, + PickName = Utils.StringToBytes(pick.Value, maxtrlen) + }; + } } + else + ap.Data = []; OutPacket(ap, ThrottleOutPacketType.Task); }