From 83d3ce8a1a299ce9ef794135726bf081d8831d9a Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Wed, 30 Apr 2025 17:35:39 +0100 Subject: [PATCH] work around some osgrid (mb others) null group titles --- .../Linden/Caps/BunchOfCaps/BunchOfCaps.cs | 43 +++++++++++++++---- .../ClientStack/Linden/UDP/LLClientView.cs | 25 ++++++++++- 2 files changed, 58 insertions(+), 10 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs index 39e826b3c3..272d15358b 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs @@ -2111,7 +2111,6 @@ namespace OpenSim.Region.ClientStack.Linden int memberCount = members.Count; Dictionary titles = new Dictionary(); - int i = 0; ulong defaultPowers = 0; @@ -2119,26 +2118,49 @@ namespace OpenSim.Region.ClientStack.Linden // build titles array and index roles.Sort(CompareRolesByMembersDesc); + int i = 0; OSDArray osdtitles = new OSDArray(); foreach(GroupRolesData grd in roles) { if(grd.Title == null) continue; - string title = grd.Title; + if(i==0) defaultPowers = grd.Powers; - if(!titles.ContainsKey(title)) + if(!titles.ContainsKey(grd.Title)) { - titles[title] = i++; - osdtitles.Add(new OSDString(title)); + titles[grd.Title] = i++; + osdtitles.Add(new OSDString(grd.Title)); } } + if(titles.Count == 0 && roles.Count > 0) + { + i = 0; + foreach(GroupRolesData grd in roles) + { + string fallbackTitle = grd.Name switch + { + "Owners" => "Owner", + "Everyone" => "Member", + _ => "Member" + }; + + if(i==0) + defaultPowers = grd.Powers; + + if(!titles.ContainsKey(fallbackTitle)) + { + titles[fallbackTitle] = i++; + osdtitles.Add(new OSDString(fallbackTitle)); + } + } + } if(titles.Count == 0) break; - OSDMap osdmembers = new OSDMap(); + OSDMap osdmembers = new(); foreach(GroupMembersData gmd in members) { OSDMap m = new OSDMap(); @@ -2146,8 +2168,13 @@ namespace OpenSim.Region.ClientStack.Linden m["last_login"] = new OSDString(gmd.OnlineStatus); if(gmd.AgentPowers != defaultPowers) m["powers"] = new OSDString((gmd.AgentPowers).ToString("X")); - if(gmd.Title != null && titles.ContainsKey(gmd.Title) && titles[gmd.Title] != 0) - m["title"] = new OSDInteger(titles[gmd.Title]); + if(gmd.Title != null) + { + if(titles.TryGetValue(gmd.Title, out int value) && value != 0) + m["title"] = new OSDInteger(value); + } + else if(gmd.IsOwner && titles.TryGetValue("Owner", out int ovalue) && ovalue != 0) + m["title"] = new OSDInteger(ovalue); if(gmd.IsOwner) m["owner"] = new OSDString("true"); if(gmd.Contribution != 0) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index d1c6071633..32de94fe27 100755 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -11692,13 +11692,23 @@ namespace OpenSim.Region.ClientStack.LindenUDP for (int i = 0; i < blockCount; i++) { GroupMembersData m = members[indx++]; + string title; + if(m.Title == null) + { + if(m.IsOwner) + title = "Owner"; + else + title = "Member"; + } + else + title = m.Title; groupMembersReply.MemberData[i] = new GroupMembersReplyPacket.MemberDataBlock { AgentID = m.AgentID, Contribution = m.Contribution, OnlineStatus = Util.StringToBytes256(m.OnlineStatus), AgentPowers = m.AgentPowers, - Title = Util.StringToBytes256(m.Title), + Title = Util.StringToBytes256(title), IsOwner = m.IsOwner }; } @@ -11728,11 +11738,22 @@ namespace OpenSim.Region.ClientStack.LindenUDP int i = 0; foreach (GroupRolesData d in titles) { + string title; + if(d.Title == null) + { + if("Owners".Equals(d.Name)) + title = "Owner"; + else + title = "Member"; + } + else + title = d.Title; + groupRolesReply.RoleData[i] = new GroupRoleDataReplyPacket.RoleDataBlock { RoleID = d.RoleID, Name = Util.StringToBytes256(d.Name), - Title = Util.StringToBytes256(d.Title), + Title = Util.StringToBytes256(title), Description = Util.StringToBytes1024(d.Description), Powers = d.Powers, Members = (uint)d.Members