From 1aa4dbdb3fd5c3c8382dad53d6b7c105fb7cec85 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 28 Nov 2016 04:29:57 +0000 Subject: increase HG mapsearch spargetti; add more flexibility on input uri formats. To find regions in memory for a grid the http format needs to be used, because aditional compares made by viewers --- .../CoreModules/World/WorldMap/MapSearchModule.cs | 156 ++++++++++----------- OpenSim/Services/GridService/GridService.cs | 87 ++++++++++-- OpenSim/Services/GridService/HypergridLinker.cs | 148 ++++++++++++------- 3 files changed, 255 insertions(+), 136 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs index 7370156..b1234fe 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs @@ -128,104 +128,104 @@ namespace OpenSim.Region.CoreModules.World.WorldMap m_Clients.Add(remoteClient.AgentId); } - try - { - OnMapNameRequest(remoteClient, mapName, flags); - } - finally - { - lock (m_Clients) - m_Clients.Remove(remoteClient.AgentId); - } + OnMapNameRequest(remoteClient, mapName, flags); } private void OnMapNameRequest(IClientAPI remoteClient, string mapName, uint flags) { Util.FireAndForget(x => { - List blocks = new List(); - if (mapName.Length < 3 || (mapName.EndsWith("#") && mapName.Length < 4)) + try { - // final block, closing the search result - AddFinalBlock(blocks,mapName); + List blocks = new List(); + if (mapName.Length < 3 || (mapName.EndsWith("#") && mapName.Length < 4)) + { + // final block, closing the search result + AddFinalBlock(blocks,mapName); - // flags are agent flags sent from the viewer. - // they have different values depending on different viewers, apparently - remoteClient.SendMapBlock(blocks, flags); - remoteClient.SendAlertMessage("Use a search string with at least 3 characters"); - return; - } + // flags are agent flags sent from the viewer. + // they have different values depending on different viewers, apparently + remoteClient.SendMapBlock(blocks, flags); + remoteClient.SendAlertMessage("Use a search string with at least 3 characters"); + return; + } - //m_log.DebugFormat("MAP NAME=({0})", mapName); + //m_log.DebugFormat("MAP NAME=({0})", mapName); - // Hack to get around the fact that ll V3 now drops the port from the - // map name. See https://jira.secondlife.com/browse/VWR-28570 - // - // Caller, use this magic form instead: - // secondlife://http|!!mygrid.com|8002|Region+Name/128/128 - // or url encode if possible. - // the hacks we do with this viewer... - // - bool needOriginalName = false; - string mapNameOrig = mapName; - if (mapName.Contains("|")) - { - mapName = mapName.Replace('|', ':'); - needOriginalName = true; - } - if (mapName.Contains("+")) - { - mapName = mapName.Replace('+', ' '); - needOriginalName = true; - } - if (mapName.Contains("!")) - { - mapName = mapName.Replace('!', '/'); - needOriginalName = true; - } - if (mapName.Contains(".")) - needOriginalName = true; + // Hack to get around the fact that ll V3 now drops the port from the + // map name. See https://jira.secondlife.com/browse/VWR-28570 + // + // Caller, use this magic form instead: + // secondlife://http|!!mygrid.com|8002|Region+Name/128/128 + // or url encode if possible. + // the hacks we do with this viewer... + // + bool needOriginalName = false; + string mapNameOrig = mapName; + if (mapName.Contains("|")) + { + mapName = mapName.Replace('|', ':'); + needOriginalName = true; + } + if (mapName.Contains("+")) + { + mapName = mapName.Replace('+', ' '); + needOriginalName = true; + } + if (mapName.Contains("!")) + { + mapName = mapName.Replace('!', '/'); + needOriginalName = true; + } + if (mapName.Contains(".")) + needOriginalName = true; - // try to fetch from GridServer - List regionInfos = m_scene.GridService.GetRegionsByName(m_scene.RegionInfo.ScopeID, mapName, 20); - // if (regionInfos.Count == 0) - // remoteClient.SendAlertMessage("Hyperlink could not be established."); + // try to fetch from GridServer + List regionInfos = m_scene.GridService.GetRegionsByName(m_scene.RegionInfo.ScopeID, mapName, 20); + // if (regionInfos.Count == 0) + // remoteClient.SendAlertMessage("Hyperlink could not be established."); - //m_log.DebugFormat("[MAPSEARCHMODULE]: search {0} returned {1} regions", mapName, regionInfos.Count); + //m_log.DebugFormat("[MAPSEARCHMODULE]: search {0} returned {1} regions", mapName, regionInfos.Count); - MapBlockData data; - if (regionInfos.Count > 0) - { - foreach (GridRegion info in regionInfos) + MapBlockData data; + if (regionInfos.Count > 0) { - data = new MapBlockData(); - data.Agents = 0; - data.Access = info.Access; - MapBlockData block = new MapBlockData(); - WorldMap.MapBlockFromGridRegion(block, info, flags); + foreach (GridRegion info in regionInfos) + { + data = new MapBlockData(); + data.Agents = 0; + data.Access = info.Access; + MapBlockData block = new MapBlockData(); + WorldMap.MapBlockFromGridRegion(block, info, flags); - if (flags == 2 && regionInfos.Count == 1 && needOriginalName) - block.Name = mapNameOrig; - blocks.Add(block); + if (flags == 2 && regionInfos.Count == 1 && needOriginalName) + block.Name = mapNameOrig; + blocks.Add(block); + } } - } - // final block, closing the search result - AddFinalBlock(blocks,mapNameOrig); + // final block, closing the search result + AddFinalBlock(blocks,mapNameOrig); - // flags are agent flags sent from the viewer. - // they have different values depending on different viewers, apparently - remoteClient.SendMapBlock(blocks, flags); + // flags are agent flags sent from the viewer. + // they have different values depending on different viewers, apparently + remoteClient.SendMapBlock(blocks, flags); - // send extra user messages for V3 - // because the UI is very confusing - // while we don't fix the hard-coded urls - if (flags == 2) + // send extra user messages for V3 + // because the UI is very confusing + // while we don't fix the hard-coded urls + if (flags == 2) + { + if (regionInfos.Count == 0) + remoteClient.SendAgentAlertMessage("No regions found with that name.", true); + // else if (regionInfos.Count == 1) + // remoteClient.SendAgentAlertMessage("Region found!", false); + } + } + finally { - if (regionInfos.Count == 0) - remoteClient.SendAgentAlertMessage("No regions found with that name.", true); -// else if (regionInfos.Count == 1) -// remoteClient.SendAgentAlertMessage("Region found!", false); + lock (m_Clients) + m_Clients.Remove(remoteClient.AgentId); } }); } diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs index a11cae1..66c918f 100644 --- a/OpenSim/Services/GridService/GridService.cs +++ b/OpenSim/Services/GridService/GridService.cs @@ -579,7 +579,70 @@ namespace OpenSim.Services.GridService int count = 0; List rinfos = new List(); - if (rdatas != null) + if (count < maxNumber && m_AllowHypergridMapSearch && name.Contains(".")) + { + string regionURI = ""; + string regionName = ""; + if(!m_HypergridLinker.buildHGRegionURI(name, out regionURI, out regionName)) + return null; + + string mapname = regionURI + regionName; + bool haveMatch = false; + + if (rdatas != null && (rdatas.Count > 0)) + { +// m_log.DebugFormat("[GRID SERVICE]: Found {0} regions", rdatas.Count); + foreach (RegionData rdata in rdatas) + { + if (count++ < maxNumber) + rinfos.Add(RegionData2RegionInfo(rdata)); + if(rdata.RegionName == mapname) + { + haveMatch = true; + if(count == maxNumber) + { + rinfos.RemoveAt(count - 1); + rinfos.Add(RegionData2RegionInfo(rdata)); + } + } + } + if(haveMatch) + return rinfos; + } + + rdatas = m_Database.Get(Util.EscapeForLike(mapname)+ "%", scopeID); + if (rdatas != null && (rdatas.Count > 0)) + { +// m_log.DebugFormat("[GRID SERVICE]: Found {0} regions", rdatas.Count); + foreach (RegionData rdata in rdatas) + { + if (count++ < maxNumber) + rinfos.Add(RegionData2RegionInfo(rdata)); + if(rdata.RegionName == mapname) + { + haveMatch = true; + if(count == maxNumber) + { + rinfos.RemoveAt(count - 1); + rinfos.Add(RegionData2RegionInfo(rdata)); + break; + } + } + } + if(haveMatch) + return rinfos; + } + + string HGname = regionURI +" "+ regionName; + GridRegion r = m_HypergridLinker.LinkRegion(scopeID, HGname); + if (r != null) + { + if( count == maxNumber) + rinfos.RemoveAt(count - 1); + rinfos.Add(r); + } + } + else if (rdatas != null && (rdatas.Count > 0)) { // m_log.DebugFormat("[GRID SERVICE]: Found {0} regions", rdatas.Count); foreach (RegionData rdata in rdatas) @@ -589,13 +652,6 @@ namespace OpenSim.Services.GridService } } - if (m_AllowHypergridMapSearch && (rdatas == null || (rdatas != null && rdatas.Count == 0))) - { - GridRegion r = GetHypergridRegionByName(scopeID, name); - if (r != null) - rinfos.Add(r); - } - return rinfos; } @@ -608,7 +664,20 @@ namespace OpenSim.Services.GridService protected GridRegion GetHypergridRegionByName(UUID scopeID, string name) { if (name.Contains(".")) - return m_HypergridLinker.LinkRegion(scopeID, name); + { + string regionURI = ""; + string regionName = ""; + if(!m_HypergridLinker.buildHGRegionURI(name, out regionURI, out regionName)) + return null; + + string mapname = regionURI + regionName; + List rdatas = m_Database.Get(Util.EscapeForLike(mapname), scopeID); + if ((rdatas != null) && (rdatas.Count > 0)) + return RegionData2RegionInfo(rdatas[0]); // get the first + + string HGname = regionURI +" "+ regionName; + return m_HypergridLinker.LinkRegion(scopeID, HGname); + } else return null; } diff --git a/OpenSim/Services/GridService/HypergridLinker.cs b/OpenSim/Services/GridService/HypergridLinker.cs index 2869349..e00025b 100644 --- a/OpenSim/Services/GridService/HypergridLinker.cs +++ b/OpenSim/Services/GridService/HypergridLinker.cs @@ -191,14 +191,14 @@ namespace OpenSim.Services.GridService return TryLinkRegionToCoords(scopeID, mapName, xloc, yloc, UUID.Zero, out reason); } - public GridRegion TryLinkRegionToCoords(UUID scopeID, string mapName, int xloc, int yloc, UUID ownerID, out string reason) + public bool buildHGRegionURI(string inputName, out string serverURI, out string regionName) { - reason = string.Empty; - GridRegion regInfo = null; + serverURI = string.Empty; + regionName = string.Empty; - mapName = mapName.Trim(); + inputName = inputName.Trim(); - if (!mapName.StartsWith("http") && !mapName.StartsWith("https")) + if (!inputName.StartsWith("http") && !inputName.StartsWith("https")) { // Formats: grid.example.com:8002:region name // grid.example.com:region name @@ -207,38 +207,59 @@ namespace OpenSim.Services.GridService string host; uint port = 80; - string regionName = ""; - - string[] parts = mapName.Split(new char[] { ':' }); - - if (parts.Length == 0) - { - reason = "Wrong format for link-region"; - return null; - } - host = parts[0]; - - if (parts.Length >= 2) + string[] parts = inputName.Split(new char[] { ':' }); + int indx; + if(parts.Length == 0) + return false; + if (parts.Length == 1) { - // If it's a number then assume it's a port. Otherwise, it's a region name. - if (!UInt32.TryParse(parts[1], out port)) - regionName = parts[1]; + indx = inputName.IndexOf('/'); + if (indx < 0) + serverURI = "http://"+ inputName + "/"; + else + { + serverURI = "http://"+ inputName.Substring(0,indx + 1); + if(indx + 2 < inputName.Length) + regionName = inputName.Substring(indx + 1); + } } - - // always take the last one - if (parts.Length >= 3) + else { - regionName = parts[2]; - } + host = parts[0]; + + if (parts.Length >= 2) + { + indx = parts[1].IndexOf('/'); + if(indx < 0) + { + // If it's a number then assume it's a port. Otherwise, it's a region name. + if (!UInt32.TryParse(parts[1], out port)) + { + port = 80; + regionName = parts[1]; + } + } + else + { + string portstr = parts[1].Substring(0, indx); + if(indx + 2 < parts[1].Length) + regionName = parts[1].Substring(indx + 1); + if (!UInt32.TryParse(portstr, out port)) + port = 80; + } + } + // always take the last one + if (parts.Length >= 3) + { + regionName = parts[2]; + } - string serverURI = "http://"+ host +":"+ port.ToString() + "/"; -// bool success = TryCreateLink(scopeID, xloc, yloc, regionName, port, host, ownerID, out regInfo, out reason); - if(TryCreateLink(scopeID, xloc, yloc, regionName, 0, null, serverURI, ownerID, out regInfo, out reason)) - { - regInfo.RegionName = mapName; - return regInfo; - } + if(port == 80) + serverURI = "http://"+ host + "/"; + else + serverURI = "http://"+ host +":"+ port.ToString() + "/"; + } } else { @@ -246,34 +267,63 @@ namespace OpenSim.Services.GridService // http://grid.example.com "region name" // http://grid.example.com - string serverURI; - string regionName = ""; - - string[] parts = mapName.Split(new char[] { ' ' }); + string[] parts = inputName.Split(new char[] { ' ' }); if (parts.Length == 0) - { - reason = "Wrong format for link-region"; - return null; - } + return false; serverURI = parts[0]; - if (!serverURI.EndsWith("/")) - serverURI = serverURI + "/"; - if (parts.Length >= 2) + int indx = serverURI.LastIndexOf('/'); + if(indx > 10) { - regionName = mapName.Substring(serverURI.Length); - regionName = regionName.Trim(new char[] { '"', ' ' }); + if(indx + 2 < inputName.Length) + regionName = inputName.Substring(indx + 1); + serverURI = inputName.Substring(0, indx + 1); } - - if (TryCreateLink(scopeID, xloc, yloc, regionName, 0, null, serverURI, ownerID, out regInfo, out reason)) + else if (parts.Length >= 2) { - regInfo.RegionName = mapName; - return regInfo; + regionName = inputName.Substring(serverURI.Length); } } + // use better code for sanity check + Uri uri; + try + { + uri = new Uri(serverURI); + } + catch + { + return false; + } + + if(!string.IsNullOrEmpty(regionName)) + regionName = regionName.Trim(new char[] { '"', ' ' }); + serverURI = uri.AbsoluteUri; + return true; + } + + public GridRegion TryLinkRegionToCoords(UUID scopeID, string mapName, int xloc, int yloc, UUID ownerID, out string reason) + { + reason = string.Empty; + GridRegion regInfo = null; + + string serverURI = string.Empty; + string regionName = string.Empty; + + if(!buildHGRegionURI(mapName, out serverURI, out regionName)) + { + reason = "Wrong URI format for link-region"; + return null; + } + + if (TryCreateLink(scopeID, xloc, yloc, regionName, 0, null, serverURI, ownerID, out regInfo, out reason)) + { + regInfo.RegionName = serverURI + regionName; + return regInfo; + } + return null; } -- cgit v1.1 From af3f2717fd1b92a0f5f6003a8ce03939b8c57b47 Mon Sep 17 00:00:00 2001 From: Mandarinka Tasty Date: Sun, 27 Nov 2016 22:50:11 +0100 Subject: The implementation of new flags = paramters for llGetObjectDetails - Part I Constant: integer OBJECT_CLICK_ACTION = 28; Constant: integer OBJECT_OMEGA = 29; Constant: integer OBJECT_PRIM_COUNT = 30; Signed-off-by: Mandarinka Tasty Signed-off-by: UbitUmarov --- .../Shared/Api/Implementation/LSL_Api.cs | 23 ++++++++++++++++++++++ .../Shared/Api/Runtime/LSL_Constants.cs | 3 +++ 2 files changed, 26 insertions(+) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 849d02d..cc36ad1 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -13758,6 +13758,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api case ScriptBaseClass.OBJECT_LAST_OWNER_ID: ret.Add(new LSL_Key(ScriptBaseClass.NULL_KEY)); break; + case ScriptBaseClass.OBJECT_CLICK_ACTION: + ret.Add(new LSL_Integer(0)); + break; + case ScriptBaseClass.OBJECT_OMEGA: + ret.Add(new LSL_Vector(Vector3.Zero)); + break; + case ScriptBaseClass.OBJECT_PRIM_COUNT: + LSL_List AttachmentsPrimList = new LSL_List(); + List Attachments; + Attachments = av.GetAttachments(); + foreach (SceneObjectGroup Attachment in Attachments) + AttachmentsPrimList.Add(new LSL_Integer(Attachment.PrimCount)); + ret.Add(new LSL_Integer(AttachmentsPrimList.Sum())); + break; default: // Invalid or unhandled constant. ret.Add(new LSL_Integer(ScriptBaseClass.OBJECT_UNKNOWN_DETAIL)); @@ -13930,6 +13944,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api case ScriptBaseClass.OBJECT_LAST_OWNER_ID: ret.Add(new LSL_Key(obj.ParentGroup.LastOwnerID.ToString())); break; + case ScriptBaseClass.OBJECT_CLICK_ACTION: + ret.Add(new LSL_Integer(obj.ClickAction)); + break; + case ScriptBaseClass.OBJECT_OMEGA: + ret.Add(new LSL_Vector(obj.AngularVelocity)); + break; + case ScriptBaseClass.OBJECT_PRIM_COUNT: + ret.Add(new LSL_Integer(obj.ParentGroup.PrimCount)); + break; default: // Invalid or unhandled constant. ret.Add(new LSL_Integer(ScriptBaseClass.OBJECT_UNKNOWN_DETAIL)); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs index cee66b2..a177310 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs @@ -636,6 +636,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase public const int OBJECT_HOVER_HEIGHT = 25; public const int OBJECT_BODY_SHAPE_TYPE = 26; public const int OBJECT_LAST_OWNER_ID = 27; + public const int OBJECT_CLICK_ACTION = 28; + public const int OBJECT_OMEGA = 29; + public const int OBJECT_PRIM_COUNT = 30; // Pathfinding types public const int OPT_OTHER = -1; -- cgit v1.1 From 0bb959d8fda598b0f166ba5131a493c64147a317 Mon Sep 17 00:00:00 2001 From: Mandarinka Tasty Date: Mon, 28 Nov 2016 05:05:36 +0100 Subject: The implementation of new flags = parameters for llGetObjectDetails - Part II Constant: integer OBJECT_TOTAL_INVENTORY_COUNT = 31 Constant: integer OBJECT_GROUP_TAG = 33 Signed-off-by: Mandarinka Tasty Signed-off-by: UbitUmarov --- .../Shared/Api/Implementation/LSL_Api.cs | 25 ++++++++++++++++++++++ .../Shared/Api/Runtime/LSL_Constants.cs | 2 ++ 2 files changed, 27 insertions(+) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index cc36ad1..d90d5dd 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -13772,6 +13772,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api AttachmentsPrimList.Add(new LSL_Integer(Attachment.PrimCount)); ret.Add(new LSL_Integer(AttachmentsPrimList.Sum())); break; + case ScriptBaseClass.OBJECT_TOTAL_INVENTORY_COUNT: + LSL_List AttachmentsPrimsInventoryList = new LSL_List(); + foreach (SceneObjectGroup Attachment in av.GetAttachments()) + { + Attachment.ForEachPart(delegate(SceneObjectPart part) + { + AttachmentsPrimsInventoryList.Add(new LSL_Integer(part.Inventory.Count)); + }); + } + ret.Add(new LSL_Integer(AttachmentsPrimsInventoryList.Sum())); + break; + case ScriptBaseClass.OBJECT_GROUP_TAG: + ret.Add(new LSL_String(av.Grouptitle)); + break; default: // Invalid or unhandled constant. ret.Add(new LSL_Integer(ScriptBaseClass.OBJECT_UNKNOWN_DETAIL)); @@ -13953,6 +13967,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api case ScriptBaseClass.OBJECT_PRIM_COUNT: ret.Add(new LSL_Integer(obj.ParentGroup.PrimCount)); break; + case ScriptBaseClass.OBJECT_TOTAL_INVENTORY_COUNT: + LSL_List ObjectPrimsInventoryList = new LSL_List(); + obj.ParentGroup.ForEachPart(delegate(SceneObjectPart part) + { + ObjectPrimsInventoryList.Add(new LSL_Integer(part.Inventory.Count)); + }); + ret.Add(ObjectPrimsInventoryList.Sum()); + break; + case ScriptBaseClass.OBJECT_GROUP_TAG: + ret.Add(new LSL_String(String.Empty)); + break; default: // Invalid or unhandled constant. ret.Add(new LSL_Integer(ScriptBaseClass.OBJECT_UNKNOWN_DETAIL)); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs index a177310..17173a2 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs @@ -639,6 +639,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase public const int OBJECT_CLICK_ACTION = 28; public const int OBJECT_OMEGA = 29; public const int OBJECT_PRIM_COUNT = 30; + public const int OBJECT_TOTAL_INVENTORY_COUNT = 31; + public const int OBJECT_GROUP_TAG = 33; // Pathfinding types public const int OPT_OTHER = -1; -- cgit v1.1 From 9dd820765eaa51d7583abcf493e203f575036d5f Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 28 Nov 2016 05:58:05 +0000 Subject: change last patch a bit --- .../Shared/Api/Implementation/LSL_Api.cs | 44 ++++++++++++---------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index d90d5dd..80bb461 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -13765,23 +13765,29 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api ret.Add(new LSL_Vector(Vector3.Zero)); break; case ScriptBaseClass.OBJECT_PRIM_COUNT: - LSL_List AttachmentsPrimList = new LSL_List(); - List Attachments; - Attachments = av.GetAttachments(); - foreach (SceneObjectGroup Attachment in Attachments) - AttachmentsPrimList.Add(new LSL_Integer(Attachment.PrimCount)); - ret.Add(new LSL_Integer(AttachmentsPrimList.Sum())); + List Attachments = av.GetAttachments(); + int count = 0; + try + { + foreach (SceneObjectGroup Attachment in Attachments) + count += Attachment.PrimCount; + } catch { }; + ret.Add(new LSL_Integer(count)); break; case ScriptBaseClass.OBJECT_TOTAL_INVENTORY_COUNT: - LSL_List AttachmentsPrimsInventoryList = new LSL_List(); - foreach (SceneObjectGroup Attachment in av.GetAttachments()) + List invAttachments = av.GetAttachments(); + int invcount = 0; + try { - Attachment.ForEachPart(delegate(SceneObjectPart part) + foreach (SceneObjectGroup Attachment in invAttachments) { - AttachmentsPrimsInventoryList.Add(new LSL_Integer(part.Inventory.Count)); - }); - } - ret.Add(new LSL_Integer(AttachmentsPrimsInventoryList.Sum())); + SceneObjectPart[] parts = Attachment.Parts; + int nparts = parts.Count(); + for(int i = 0; i < nparts; i++) + invcount += parts[i].Inventory.Count; + } + } catch { }; + ret.Add(new LSL_Integer(invcount)); break; case ScriptBaseClass.OBJECT_GROUP_TAG: ret.Add(new LSL_String(av.Grouptitle)); @@ -13968,12 +13974,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api ret.Add(new LSL_Integer(obj.ParentGroup.PrimCount)); break; case ScriptBaseClass.OBJECT_TOTAL_INVENTORY_COUNT: - LSL_List ObjectPrimsInventoryList = new LSL_List(); - obj.ParentGroup.ForEachPart(delegate(SceneObjectPart part) - { - ObjectPrimsInventoryList.Add(new LSL_Integer(part.Inventory.Count)); - }); - ret.Add(ObjectPrimsInventoryList.Sum()); + SceneObjectPart[] parts = obj.ParentGroup.Parts; + int nparts = parts.Count(); + int count = 0; + for(int i = 0; i < nparts; i++) + count += parts[i].Inventory.Count; + ret.Add(new LSL_Integer(count)); break; case ScriptBaseClass.OBJECT_GROUP_TAG: ret.Add(new LSL_String(String.Empty)); -- cgit v1.1