private void ProcessTopScripts(AgentCircuit circuit, SceneInterface scene, LandStatFilterFlags flags, string filter) { RwLockedDictionary <uint, ScriptReportData> execTimes = scene.ScriptThreadPool.GetExecutionTimes(); var reply = new LandStatReply { ReportType = LandStatReportEnum.TopScripts, RequestFlags = 0, TotalObjectCount = (uint)execTimes.Count }; int allocedlength = 0; /* make top objects go first */ foreach (KeyValuePair <uint, ScriptReportData> kvp in execTimes.OrderByDescending(x => x.Value.Score)) { if (reply.ReportData.Count == 100) { break; } ObjectPart p; try { if (!scene.Primitives.TryGetValue(kvp.Key, out p)) { continue; } UGUIWithName owner = scene.AvatarNameService.ResolveName(p.Owner); if ((flags & LandStatFilterFlags.FilterByObject) != 0 && !p.Name.Contains(filter)) { continue; } if ((flags & LandStatFilterFlags.FilterByOwner) != 0 && !owner.FullName.Contains(filter)) { continue; } ParcelInfo pinfo; if ((flags & LandStatFilterFlags.FilterByParcelName) != 0 && !scene.Parcels.TryGetValue(p.GlobalPosition, out pinfo) && !pinfo.Name.Equals(filter, System.StringComparison.InvariantCultureIgnoreCase)) { continue; } var entry = new LandStatReply.ReportDataEntry { Location = p.GlobalPosition, Score = kvp.Value.Score, TaskID = p.ID, TaskLocalID = kvp.Key, TaskName = p.Name, OwnerName = owner.FullName }; if (allocedlength + entry.MessageLength > 1400) { circuit.SendMessage(reply); reply = new LandStatReply { ReportType = 0, RequestFlags = 0, TotalObjectCount = (uint)execTimes.Count }; } reply.ReportData.Add(entry); allocedlength += entry.MessageLength; } catch { /* ignore the report */ } } circuit.SendMessage(reply); }