diff --git a/OpenSim/Capabilities/Handlers/GetAssets/GetAssetsHandler.cs b/OpenSim/Capabilities/Handlers/GetAssets/GetAssetsHandler.cs index 099c7b4b4e..a5f0056d7b 100644 --- a/OpenSim/Capabilities/Handlers/GetAssets/GetAssetsHandler.cs +++ b/OpenSim/Capabilities/Handlers/GetAssets/GetAssetsHandler.cs @@ -138,8 +138,6 @@ namespace OpenSim.Capabilities.Handlers if(type == AssetType.Mesh || type == AssetType.Texture) responsedata["throttle"] = true; -// else -// m_log.Warn("[GETASSETS]: type: " + query); responsedata["content_type"] = asset.Metadata.ContentType; responsedata["bin_response_data"] = asset.Data; diff --git a/OpenSim/Framework/AgentCircuitData.cs b/OpenSim/Framework/AgentCircuitData.cs index 330a41e93d..ebb00d2b1d 100644 --- a/OpenSim/Framework/AgentCircuitData.cs +++ b/OpenSim/Framework/AgentCircuitData.cs @@ -267,16 +267,17 @@ namespace OpenSim.Framework /// public void UnpackAgentCircuitData(OSDMap args) { - if (args["agent_id"] != null) - AgentID = args["agent_id"].AsUUID(); - if (args["base_folder"] != null) - BaseFolder = args["base_folder"].AsUUID(); - if (args["caps_path"] != null) - CapsPath = args["caps_path"].AsString(); + OSD tmpOSD; + if (args.TryGetValue("agent_id", out tmpOSD)) + AgentID = tmpOSD.AsUUID(); + if (args.TryGetValue("base_folder", out tmpOSD)) + BaseFolder =tmpOSD.AsUUID(); + if (args.TryGetValue("caps_path", out tmpOSD)) + CapsPath = tmpOSD.AsString(); - if ((args["children_seeds"] != null) && (args["children_seeds"].Type == OSDType.Array)) + if ((args.TryGetValue("children_seeds", out tmpOSD) && tmpOSD is OSDArray)) { - OSDArray childrenSeeds = (OSDArray)(args["children_seeds"]); + OSDArray childrenSeeds = (OSDArray)tmpOSD; ChildrenCapSeeds = new Dictionary(); foreach (OSD o in childrenSeeds) { @@ -285,53 +286,59 @@ namespace OpenSim.Framework ulong handle = 0; string seed = ""; OSDMap pair = (OSDMap)o; - if (pair["handle"] != null) - if (!UInt64.TryParse(pair["handle"].AsString(), out handle)) + if (pair.TryGetValue("handle", out tmpOSD)) + { + if (!UInt64.TryParse(tmpOSD.AsString(), out handle)) continue; - if (pair["seed"] != null) - seed = pair["seed"].AsString(); + } if (!ChildrenCapSeeds.ContainsKey(handle)) - ChildrenCapSeeds.Add(handle, seed); + { + if (pair.TryGetValue("seed", out tmpOSD)) + { + seed = tmpOSD.AsString(); + ChildrenCapSeeds.Add(handle, seed); + } + } } } } else ChildrenCapSeeds = new Dictionary(); - if (args["child"] != null) - child = args["child"].AsBoolean(); - if (args["circuit_code"] != null) - UInt32.TryParse(args["circuit_code"].AsString(), out circuitcode); - if (args["first_name"] != null) - firstname = args["first_name"].AsString(); - if (args["last_name"] != null) - lastname = args["last_name"].AsString(); - if (args["inventory_folder"] != null) - InventoryFolder = args["inventory_folder"].AsUUID(); - if (args["secure_session_id"] != null) - SecureSessionID = args["secure_session_id"].AsUUID(); - if (args["session_id"] != null) - SessionID = args["session_id"].AsUUID(); - if (args["service_session_id"] != null) - ServiceSessionID = args["service_session_id"].AsString(); - if (args["client_ip"] != null) - IPAddress = args["client_ip"].AsString(); - if (args["viewer"] != null) - Viewer = args["viewer"].AsString(); - if (args["channel"] != null) - Channel = args["channel"].AsString(); - if (args["mac"] != null) - Mac = args["mac"].AsString(); - if (args["id0"] != null) - Id0 = args["id0"].AsString(); - if (args["teleport_flags"] != null) - teleportFlags = args["teleport_flags"].AsUInteger(); + if (args.TryGetValue("child", out tmpOSD)) + child = tmpOSD.AsBoolean(); + if (args.TryGetValue("circuit_code", out tmpOSD)) + UInt32.TryParse(tmpOSD.AsString(), out circuitcode); + if (args.TryGetValue("first_name", out tmpOSD)) + firstname = tmpOSD.AsString(); + if (args.TryGetValue("last_name", out tmpOSD)) + lastname = tmpOSD.AsString(); + if (args.TryGetValue("inventory_folder", out tmpOSD)) + InventoryFolder = tmpOSD.AsUUID(); + if (args.TryGetValue("secure_session_id", out tmpOSD)) + SecureSessionID = tmpOSD.AsUUID(); + if (args.TryGetValue("session_id", out tmpOSD)) + SessionID = tmpOSD.AsUUID(); + if (args.TryGetValue("service_session_id", out tmpOSD)) + ServiceSessionID = tmpOSD.AsString(); + if (args.TryGetValue("client_ip", out tmpOSD)) + IPAddress = tmpOSD.AsString(); + if (args.TryGetValue("viewer", out tmpOSD)) + Viewer = tmpOSD.AsString(); + if (args.TryGetValue("channel", out tmpOSD)) + Channel = tmpOSD.AsString(); + if (args.TryGetValue("mac", out tmpOSD)) + Mac = tmpOSD.AsString(); + if (args.TryGetValue("id0", out tmpOSD)) + Id0 = tmpOSD.AsString(); + if (args.TryGetValue("teleport_flags", out tmpOSD)) + teleportFlags = tmpOSD.AsUInteger(); - if (args["start_pos"] != null) - Vector3.TryParse(args["start_pos"].AsString(), out startpos); + if (args.TryGetValue("start_pos", out tmpOSD)) + Vector3.TryParse(tmpOSD.AsString(), out startpos); - if(args["far"] != null) - startfar = (float)args["far"].AsReal(); + if(args.TryGetValue("far", out tmpOSD)) + startfar = (float)tmpOSD.AsReal(); //m_log.InfoFormat("[AGENTCIRCUITDATA]: agentid={0}, child={1}, startpos={2}", AgentID, child, startpos); @@ -342,12 +349,12 @@ namespace OpenSim.Framework // Eventually this code should be deprecated, use full appearance // packing in packed_appearance - if (args["appearance_serial"] != null) - Appearance.Serial = args["appearance_serial"].AsInteger(); + if (args.TryGetValue("appearance_serial", out tmpOSD)) + Appearance.Serial = tmpOSD.AsInteger(); - if (args.ContainsKey("packed_appearance") && (args["packed_appearance"].Type == OSDType.Map)) + if (args.TryGetValue("packed_appearance", out tmpOSD) && (tmpOSD is OSDMap)) { - Appearance.Unpack((OSDMap)args["packed_appearance"]); + Appearance.Unpack((OSDMap)tmpOSD); // m_log.InfoFormat("[AGENTCIRCUITDATA] unpacked appearance"); } else @@ -362,31 +369,29 @@ namespace OpenSim.Framework ServiceURLs = new Dictionary(); // Try parse the new way, OSDMap - if (args.ContainsKey("serviceurls") && args["serviceurls"] != null && (args["serviceurls"]).Type == OSDType.Map) + if (args.TryGetValue("serviceurls", out tmpOSD) && (tmpOSD is OSDMap)) { - OSDMap urls = (OSDMap)(args["serviceurls"]); + OSDMap urls = (OSDMap)tmpOSD; foreach (KeyValuePair kvp in urls) { - ServiceURLs[kvp.Key] = kvp.Value.AsString(); + ServiceURLs[kvp.Key] = kvp.Value; //System.Console.WriteLine("XXX " + kvp.Key + "=" + ServiceURLs[kvp.Key]); - } } // else try the old way, OSDArray // OBSOLETE -- soon to be deleted - else if (args.ContainsKey("service_urls") && args["service_urls"] != null && (args["service_urls"]).Type == OSDType.Array) + else if (args.TryGetValue("service_urls", out tmpOSD) && (tmpOSD is OSDArray)) { - OSDArray urls = (OSDArray)(args["service_urls"]); - for (int i = 0; i < urls.Count / 2; i++) + OSDArray urls = (OSDArray)tmpOSD; + OSD tmpOSDb; + for (int i = 0; i < urls.Count - 1; i += 2) { - ServiceURLs[urls[i * 2].AsString()] = urls[(i * 2) + 1].AsString(); + tmpOSD = urls[i]; + tmpOSDb = urls[i + 1]; + ServiceURLs[tmpOSD.AsString()] = tmpOSDb.AsString(); //System.Console.WriteLine("XXX " + urls[i * 2].AsString() + "=" + urls[(i * 2) + 1].AsString()); - } } } - } - - } diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs index 77a7621a29..f1713a6a39 100644 --- a/OpenSim/Framework/AvatarAppearance.cs +++ b/OpenSim/Framework/AvatarAppearance.cs @@ -796,25 +796,33 @@ namespace OpenSim.Framework /// public void Unpack(OSDMap data) { - if ((data != null) && (data["serial"] != null)) - m_serial = data["serial"].AsInteger(); - if ((data != null) && (data["height"] != null)) + SetDefaultWearables(); + SetDefaultTexture(); + SetDefaultParams(); + m_attachments = new Dictionary>(); + + if(data == null) + { + m_log.Warn("[AVATAR APPEARANCE]: data to unpack is null"); + return; + } + + OSD tmpOSD; + if (data.TryGetValue("serial", out tmpOSD)) + m_serial = tmpOSD.AsInteger(); + if (data.TryGetValue("height", out tmpOSD)) // m_avatarHeight = (float)data["height"].AsReal(); - SetSize(new Vector3(0.45f,0.6f, (float)data["height"].AsReal())); + SetSize(new Vector3(0.45f,0.6f, (float)tmpOSD.AsReal())); try { // Wearables - SetDefaultWearables(); - if ((data != null) && (data["wearables"] != null) && (data["wearables"]).Type == OSDType.Array) + if (data.TryGetValue("wearables", out tmpOSD) && (tmpOSD is OSDArray)) { - OSDArray wears = (OSDArray)(data["wearables"]); + OSDArray wears = (OSDArray)tmpOSD; + m_wearables = new AvatarWearable[wears.Count]; - int count = wears.Count; - - m_wearables = new AvatarWearable[count]; - - for (int i = 0; i < count; i++) + for (int i = 0; i < wears.Count; i++) m_wearables[i] = new AvatarWearable((OSDArray)wears[i]); } else @@ -823,15 +831,15 @@ namespace OpenSim.Framework } // Avatar Textures - SetDefaultTexture(); - if ((data != null) && (data["textures"] != null) && (data["textures"]).Type == OSDType.Array) + if (data.TryGetValue("textures", out tmpOSD) && (tmpOSD is OSDArray)) { - OSDArray textures = (OSDArray)(data["textures"]); + OSDArray textures = (OSDArray)tmpOSD; for (int i = 0; i < AvatarAppearance.TEXTURE_COUNT && i < textures.Count; i++) { UUID textureID = AppearanceManager.DEFAULT_AVATAR_TEXTURE; - if (textures[i] != null) - textureID = textures[i].AsUUID(); + tmpOSD = textures[i]; + if (tmpOSD != null) + textureID = tmpOSD.AsUUID(); m_texture.CreateFace((uint)i).TextureID = new UUID(textureID); } } @@ -840,18 +848,17 @@ namespace OpenSim.Framework m_log.Warn("[AVATAR APPEARANCE]: failed to unpack textures"); } - if ((data != null) && (data["bakedcache"] != null) && (data["bakedcache"]).Type == OSDType.Array) + if (data.TryGetValue("bakedcache", out tmpOSD) && (tmpOSD is OSDArray)) { - OSDArray bakedOSDArray = (OSDArray)(data["bakedcache"]); + OSDArray bakedOSDArray = (OSDArray)tmpOSD; m_cacheitems = WearableCacheItem.BakedFromOSD(bakedOSDArray); } // Visual Parameters - SetDefaultParams(); - if ((data != null) && (data["visualparams"] != null)) + if (data.TryGetValue("visualparams", out tmpOSD)) { - if ((data["visualparams"].Type == OSDType.Binary) || (data["visualparams"].Type == OSDType.Array)) - m_visualparams = data["visualparams"].AsBinary(); + if (tmpOSD is OSDBinary || tmpOSD is OSDArray) + m_visualparams = tmpOSD.AsBinary(); } else { @@ -859,10 +866,9 @@ namespace OpenSim.Framework } // Attachments - m_attachments = new Dictionary>(); - if ((data != null) && (data["attachments"] != null) && (data["attachments"]).Type == OSDType.Array) + if (data.TryGetValue("attachments", out tmpOSD) && tmpOSD is OSDArray) { - OSDArray attachs = (OSDArray)(data["attachments"]); + OSDArray attachs = (OSDArray)tmpOSD; for (int i = 0; i < attachs.Count; i++) { AvatarAttachment att = new AvatarAttachment((OSDMap)attachs[i]); diff --git a/OpenSim/Framework/AvatarAttachment.cs b/OpenSim/Framework/AvatarAttachment.cs index 07dd385f28..d8a0ffc874 100644 --- a/OpenSim/Framework/AvatarAttachment.cs +++ b/OpenSim/Framework/AvatarAttachment.cs @@ -68,11 +68,18 @@ namespace OpenSim.Framework public void Unpack(OSDMap args) { - if (args["point"] != null) - AttachPoint = args["point"].AsInteger(); + OSD tmpOSD; + if (args.TryGetValue("point", out tmpOSD)) + AttachPoint = tmpOSD.AsInteger(); + if (args.TryGetValue("item", out tmpOSD)) + ItemID = tmpOSD.AsUUID(); + else + ItemID = UUID.Zero; - ItemID = (args["item"] != null) ? args["item"].AsUUID() : UUID.Zero; - AssetID = (args["asset"] != null) ? args["asset"].AsUUID() : UUID.Zero; + if (args.TryGetValue("asset", out tmpOSD)) + AssetID = tmpOSD.AsUUID(); + else + AssetID = UUID.Zero; } } } diff --git a/OpenSim/Framework/AvatarWearable.cs b/OpenSim/Framework/AvatarWearable.cs index fddd0f06ea..abf575948b 100644 --- a/OpenSim/Framework/AvatarWearable.cs +++ b/OpenSim/Framework/AvatarWearable.cs @@ -132,10 +132,12 @@ namespace OpenSim.Framework public void Unpack(OSDArray args) { Clear(); - + OSD tmpOSDA, tmpOSDB; foreach (OSDMap weardata in args) { - Add(weardata["item"].AsUUID(), weardata["asset"].AsUUID()); + tmpOSDA = weardata["item"]; + tmpOSDB = weardata["asset"]; + Add(tmpOSDA.AsUUID(), tmpOSDB.AsUUID()); } } diff --git a/OpenSim/Framework/EntityTransferContext.cs b/OpenSim/Framework/EntityTransferContext.cs index 860414edca..257c6d177b 100644 --- a/OpenSim/Framework/EntityTransferContext.cs +++ b/OpenSim/Framework/EntityTransferContext.cs @@ -58,13 +58,13 @@ namespace OpenSim.Framework public void Unpack(OSD data) { OSDMap map = (OSDMap)data; - - if (map.ContainsKey("InboundVersion")) - InboundVersion = (float)map["InboundVersion"].AsReal(); - if (map.ContainsKey("OutboundVersion")) - OutboundVersion = (float)map["OutboundVersion"].AsReal(); - if (map.ContainsKey("WearablesCount")) - WearablesCount = map["WearablesCount"].AsInteger(); + OSD tmpOSD; + if (map.TryGetValue("InboundVersion", out tmpOSD)) + InboundVersion = (float)tmpOSD.AsReal(); + if (map.TryGetValue("OutboundVersion", out tmpOSD)) + OutboundVersion = (float)tmpOSD.AsReal(); + if (map.TryGetValue("WearablesCount", out tmpOSD)) + WearablesCount = tmpOSD.AsInteger(); } } } diff --git a/OpenSim/Framework/WearableCacheItem.cs b/OpenSim/Framework/WearableCacheItem.cs index 427e149f69..e060f22bf6 100644 --- a/OpenSim/Framework/WearableCacheItem.cs +++ b/OpenSim/Framework/WearableCacheItem.cs @@ -161,13 +161,12 @@ namespace OpenSim.Framework public static WearableCacheItem[] BakedFromOSD(OSD pInput) { WearableCacheItem[] pcache = WearableCacheItem.GetDefaultCacheItem(); - if (pInput.Type == OSDType.Array) { OSDArray itemarray = (OSDArray)pInput; foreach (OSDMap item in itemarray) { - int idx = (int)item["textureindex"].AsUInteger(); + int idx = item["textureindex"].AsInteger(); if (idx < 0 || idx > pcache.Length) continue; pcache[idx].CacheId = item["cacheid"].AsUUID(); @@ -217,6 +216,4 @@ namespace OpenSim.Framework return null; } } - - } diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EstateAccess.cs b/OpenSim/Region/ClientStack/Linden/Caps/EstateAccess.cs new file mode 100644 index 0000000000..cd6cdef35f --- /dev/null +++ b/OpenSim/Region/ClientStack/Linden/Caps/EstateAccess.cs @@ -0,0 +1,224 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; + +using log4net; +using Nini.Config; +using OpenMetaverse; +using Mono.Addins; +using OpenSim.Framework; +using OpenSim.Framework.Servers.HttpServer; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; +using Caps=OpenSim.Framework.Capabilities.Caps; + +namespace OpenSim.Region.ClientStack.Linden +{ + [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "EstateAcessCapModule")] + public class EstateAccessCapModule : INonSharedRegionModule + { +// private static readonly ILog m_log = +// LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private Scene m_scene; + private bool m_Enabled = false; + private string m_capUrl; + //IEstateModule m_EstateModule; + + #region INonSharedRegionModule Members + + public void Initialise(IConfigSource pSource) + { + IConfig config = pSource.Configs["ClientStack.LindenCaps"]; + if (config == null) + return; + + m_capUrl = config.GetString("Cap_EstateAccess", string.Empty); + if (!String.IsNullOrEmpty(m_capUrl) && m_capUrl.Equals("localhost")) + m_Enabled = true; + } + + public void AddRegion(Scene scene) + { + if (!m_Enabled) + return; + + m_scene = scene; + } + + public void RemoveRegion(Scene scene) + { + if (!m_Enabled) + return; + + if (m_scene == scene) + { + m_scene.EventManager.OnRegisterCaps -= RegisterCaps; + m_scene = null; + } + } + + public void RegionLoaded(Scene scene) + { + if (!m_Enabled) + return; + + if (scene.RegionInfo == null || scene.RegionInfo.EstateSettings == null) + { + m_Enabled = false; + return; + } + + IEstateModule m_EstateModule = scene.RequestModuleInterface(); + if(m_EstateModule == null) + { + m_Enabled = false; + return; + } + + scene.EventManager.OnRegisterCaps += RegisterCaps; + } + + public void Close() + { + } + + public string Name + { + get { return "EstateAccessCapModule"; } + } + + public Type ReplaceableInterface + { + get { return null; } + } + + #endregion + + public void RegisterCaps(UUID agentID, Caps caps) + { + string capUrl = "/CAPS/" + UUID.Random() + "/"; + + caps.RegisterHandler( + "EstateAccess", + new RestHTTPHandler( + "GET", + capUrl, + httpMethod => ProcessRequest(httpMethod, agentID, caps), + "EstateAccess", + agentID.ToString())); ; + } + + public Hashtable ProcessRequest(Hashtable request, UUID AgentId, Caps cap) + { + Hashtable responsedata = new Hashtable(); + responsedata["int_response_code"] = 200; //501; //410; //404; + responsedata["content_type"] = "text/plain"; + + ScenePresence avatar; + if (!m_scene.TryGetScenePresence(AgentId, out avatar)) + { + responsedata["str_response_string"] = ""; ; + responsedata["keepalive"] = false; + return responsedata; + } + + if (m_scene.RegionInfo == null + || m_scene.RegionInfo.EstateSettings == null + ||!m_scene.Permissions.CanIssueEstateCommand(AgentId, false)) + { + responsedata["str_response_string"] = ""; ; + return responsedata; + } + + EstateSettings regionSettings = m_scene.RegionInfo.EstateSettings; + UUID[] managers = regionSettings.EstateManagers; + UUID[] allowed = regionSettings.EstateAccess; + UUID[] groups = regionSettings.EstateGroups; + EstateBan[] EstateBans = regionSettings.EstateBans; + + StringBuilder sb = LLSDxmlEncode.Start(); + LLSDxmlEncode.AddArray(sb); + + if (allowed != null && allowed.Length > 0) + { + LLSDxmlEncode.AddMap("AllowedAgents", sb); + for (int i = 0; i < allowed.Length; ++i) + { + UUID id = allowed[i]; + if (id == UUID.Zero) + continue; + LLSDxmlEncode.AddElem("id", id, sb); + } + LLSDxmlEncode.AddEndMap(sb); + } + + if (groups != null && groups.Length > 0) + { + LLSDxmlEncode.AddMap("AllowedGroups", sb); + for (int i = 0; i < groups.Length; ++i) + { + UUID id = groups[i]; + if (id == UUID.Zero) + continue; + LLSDxmlEncode.AddElem("id", id, sb); + } + LLSDxmlEncode.AddEndMap(sb); + } + + if (EstateBans != null && EstateBans.Length > 0) + { + LLSDxmlEncode.AddMap("BannedAgents", sb); + for (int i = 0; i < EstateBans.Length; ++i) + { + UUID id = EstateBans[i].BannedUserID; + if (id == UUID.Zero) + continue; + LLSDxmlEncode.AddElem("id", id, sb); + } + LLSDxmlEncode.AddEndMap(sb); + } + + if (managers != null && managers.Length > 0) + { + LLSDxmlEncode.AddMap("Managers", sb); + for (int i = 0; i < managers.Length; ++i) + LLSDxmlEncode.AddElem("id", managers[i], sb); + LLSDxmlEncode.AddEndMap(sb); + } + + LLSDxmlEncode.AddEndArray(sb); + responsedata["str_response_string"] = LLSDxmlEncode.End(sb); + + return responsedata; + } + } +} diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs index 094b0f523b..9111d28bc0 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs @@ -994,7 +994,7 @@ namespace OpenSim.Region.CoreModules.World.Land } else { - // keeping previus odd average + // keeping previous odd average avgx = (avgx * tempArea + x) / (tempArea + 1); avgy = (avgy * tempArea + y) / (tempArea + 1); } diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs index 4b9f207d71..f60beafa65 100644 --- a/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs +++ b/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs @@ -441,6 +441,9 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap startHeights[0], startHeights[2], startHeights[1], startHeights[3], pctX, pctY); + if (float.IsNaN(startHeight)) + return 0; + startHeight = Utils.Clamp(startHeight, 0f, 255f); float heightRange = ImageUtils.Bilinear( @@ -448,7 +451,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap heightRanges[1], heightRanges[3], pctX, pctY); heightRange = Utils.Clamp(heightRange, 0f, 255f); - if(heightRange == 0f) + if(heightRange == 0f || float.IsNaN(heightRange)) return 0; // Generate two frequencies of perlin noise based on our global position diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index 299509100f..b0ecb80578 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs @@ -341,7 +341,7 @@ namespace OpenSim.Region.Framework.Scenes if(group == null || group.IsDeleted) return; - if (Permissions.CanMoveObject(group, remoteClient))// && PermissionsMngr.) + if (Permissions.CanMoveObject(group, remoteClient)) { group.GrabMovement(objectID, offset, pos, remoteClient); } @@ -359,16 +359,13 @@ namespace OpenSim.Region.Framework.Scenes Vector3 grabOffset = pos - part.AbsolutePosition; // If the touched prim handles touches, deliver it if ((part.ScriptEvents & scriptEvents.touch) != 0) -// EventManager.TriggerObjectGrabbing(part.LocalId, 0, part.OffsetPosition, remoteClient, surfaceArg); EventManager.TriggerObjectGrabbing(part.LocalId, 0, grabOffset, remoteClient, surfaceArg); + // Deliver to the root prim if the touched prim doesn't handle touches // or if we're meant to pass on touches anyway. if (((part.ScriptEvents & scriptEvents.touch) == 0) || (part.PassTouches && (part.LocalId != group.RootPart.LocalId))) - { -// EventManager.TriggerObjectGrabbing(group.RootPart.LocalId, part.LocalId, part.OffsetPosition, remoteClient, surfaceArg); EventManager.TriggerObjectGrabbing(group.RootPart.LocalId, part.LocalId, grabOffset, remoteClient, surfaceArg); - } } public virtual void ProcessObjectDeGrab(uint localID, IClientAPI remoteClient, List surfaceArgs) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index c0bafc55ff..dcfe79b66e 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -2086,13 +2086,20 @@ namespace OpenSim.Region.Framework.Scenes public void ObjectGrabHandler(uint localId, Vector3 offsetPos, IClientAPI remoteClient) { + if (m_rootPart.LocalId == localId) { + if((RootPart.ScriptEvents & scriptEvents.anytouch) != 0) + lastTouchTime = Util.GetTimeStampMS(); OnGrabGroup(offsetPos, remoteClient); } else { SceneObjectPart part = GetPart(localId); + + if (((part.ScriptEvents & scriptEvents.anytouch) != 0) || + (part.PassTouches && (RootPart.ScriptEvents & scriptEvents.anytouch) != 0)) + lastTouchTime = Util.GetTimeStampMS(); OnGrabPart(part, offsetPos, remoteClient); } } @@ -3615,6 +3622,10 @@ namespace OpenSim.Region.Framework.Scenes // part.UpdatePrimFlags(UsesPhysics, IsTemporary, IsPhantom, IsVolumeDetect, false); } + double lastTouchTime = 0; + + + /// /// If object is physical, apply force to move it around /// If object is not physical, just put it at the resulting location @@ -3623,7 +3634,7 @@ namespace OpenSim.Region.Framework.Scenes /// Always seems to be 0,0,0, so ignoring /// New position. We do the math here to turn it into a force /// - public void GrabMovement(UUID partID, Vector3 offset, Vector3 pos, IClientAPI remoteClient) + public void GrabMovement(UUID partID, Vector3 offset, Vector3 pos, IClientAPI remoteClienth) { if (m_scene.EventManager.TriggerGroupMove(UUID, pos)) { @@ -3650,24 +3661,31 @@ namespace OpenSim.Region.Framework.Scenes } else { - NonPhysicalGrabMovement(pos); + if(IsAttachment) + return; + + // block movement if there was a touch at start + double now = Util.GetTimeStampMS(); + if (now - lastTouchTime < 250) + { + lastTouchTime = now; + return; + } + + // a touch or pass may had become active ?? + if (((part.ScriptEvents & scriptEvents.anytouch) != 0) || + (part.PassTouches && (RootPart.ScriptEvents & scriptEvents.anytouch) != 0)) + { + lastTouchTime = now; + return; + } + + lastTouchTime = 0; + UpdateGroupPosition(pos); } } } - /// - /// Apply possition for grabbing non-physical linksets (Ctrl+Drag) - /// This MUST be blocked for linksets that contain touch scripts because the viewer triggers grab on the touch - /// event (Viewer Bug?) This would allow anyone to drag a linkset with a touch script. SL behaviour is also to - /// block grab on prims with touch events. - /// - /// New Position - public void NonPhysicalGrabMovement(Vector3 pos) - { - if(!IsAttachment && ScriptCount() == 0) - UpdateGroupPosition(pos); - } - /// /// If object is physical, prepare for spinning torques (set flag to save old orientation) /// diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 5e2204e5fc..ec58b9709b 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -3023,11 +3023,6 @@ namespace OpenSim.Region.Framework.Scenes { if (m_scriptEvents.ContainsKey(scriptid)) { - scriptEvents oldparts = scriptEvents.None; - oldparts = (scriptEvents) m_scriptEvents[scriptid]; - - // remove values from aggregated script events - AggregateScriptEvents &= ~oldparts; m_scriptEvents.Remove(scriptid); aggregateScriptEvents(); } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index a0f895933f..8c880fc179 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -1091,7 +1091,6 @@ namespace OpenSim.Region.Framework.Scenes m_part.ParentGroup.InvalidateDeepEffectivePerms(); m_inventorySerial++; - m_part.TriggerScriptChangedEvent(Changed.INVENTORY); HasInventoryChanged = true; m_part.ParentGroup.HasGroupChanged = true; @@ -1115,6 +1114,7 @@ namespace OpenSim.Region.Framework.Scenes m_part.ScheduleFullUpdate(); + m_part.TriggerScriptChangedEvent(Changed.INVENTORY); return type; } else diff --git a/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs b/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs index 2aea7f9cb2..331f1bdc9a 100644 --- a/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs +++ b/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs @@ -272,17 +272,19 @@ namespace OpenSim.Region.OptionalModules.Materials if (elemOsd != null && elemOsd is OSDMap) { OSDMap matMap = elemOsd as OSDMap; - if (matMap.ContainsKey("ID") && matMap.ContainsKey("Material")) + OSD OSDID; + OSD OSDMaterial; + if (matMap.TryGetValue("ID", out OSDID) && matMap.TryGetValue("Material", out OSDMaterial) && OSDMaterial is OSDMap) { try { lock (materialslock) { - UUID id = matMap["ID"].AsUUID(); + UUID id = OSDID.AsUUID(); if(m_Materials.ContainsKey(id)) continue; - OSDMap theMatMap = (OSDMap)matMap["Material"]; + OSDMap theMatMap = (OSDMap)OSDMaterial; FaceMaterial fmat = new FaceMaterial(theMatMap); if(fmat == null || @@ -290,7 +292,7 @@ namespace OpenSim.Region.OptionalModules.Materials && fmat.NormalMapID == UUID.Zero && fmat.SpecularMapID == UUID.Zero)) continue; - + fmat.ID = id; m_Materials[id] = fmat; m_MaterialsRefCount[id] = 0; @@ -459,12 +461,13 @@ namespace OpenSim.Region.OptionalModules.Materials OSDMap resp = new OSDMap(); OSDArray respArr = new OSDArray(); + OSD tmpOSD; - if (req.ContainsKey("Zipped")) + if (req.TryGetValue("Zipped", out tmpOSD)) { OSD osd = null; - byte[] inBytes = req["Zipped"].AsBinary(); + byte[] inBytes = tmpOSD.AsBinary(); try { @@ -531,12 +534,13 @@ namespace OpenSim.Region.OptionalModules.Materials OSDArray respArr = new OSDArray(); + OSD tmpOSD; HashSet parts = new HashSet(); - if (req.ContainsKey("Zipped")) + if (req.TryGetValue("Zipped", out tmpOSD)) { OSD osd = null; - byte[] inBytes = req["Zipped"].AsBinary(); + byte[] inBytes = tmpOSD.AsBinary(); try { @@ -546,145 +550,140 @@ namespace OpenSim.Region.OptionalModules.Materials { materialsFromViewer = osd as OSDMap; - if (materialsFromViewer.ContainsKey("FullMaterialsPerFace")) + if (materialsFromViewer.TryGetValue("FullMaterialsPerFace", out tmpOSD) && (tmpOSD is OSDArray)) { - OSD matsOsd = materialsFromViewer["FullMaterialsPerFace"]; - if (matsOsd is OSDArray) + OSDArray matsArr = tmpOSD as OSDArray; + try { - OSDArray matsArr = matsOsd as OSDArray; - - try + foreach (OSDMap matsMap in matsArr) { - foreach (OSDMap matsMap in matsArr) + uint primLocalID = 0; + try { - uint primLocalID = 0; - try - { - primLocalID = matsMap["ID"].AsUInteger(); - } - catch (Exception e) - { - m_log.Warn("[Materials]: cannot decode \"ID\" from matsMap: " + e.Message); - continue; - } + primLocalID = matsMap["ID"].AsUInteger(); + } + catch (Exception e) + { + m_log.Warn("[Materials]: cannot decode \"ID\" from matsMap: " + e.Message); + continue; + } - SceneObjectPart sop = m_scene.GetSceneObjectPart(primLocalID); - if (sop == null) - { - m_log.WarnFormat("[Materials]: SOP not found for localId: {0}", primLocalID.ToString()); - continue; - } + SceneObjectPart sop = m_scene.GetSceneObjectPart(primLocalID); + if (sop == null) + { + m_log.WarnFormat("[Materials]: SOP not found for localId: {0}", primLocalID.ToString()); + continue; + } - if (!m_scene.Permissions.CanEditObject(sop.UUID, agentID)) - { - m_log.WarnFormat("User {0} can't edit object {1} {2}", agentID, sop.Name, sop.UUID); - continue; - } + if (!m_scene.Permissions.CanEditObject(sop.UUID, agentID)) + { + m_log.WarnFormat("User {0} can't edit object {1} {2}", agentID, sop.Name, sop.UUID); + continue; + } - OSDMap mat = null; - try - { - mat = matsMap["Material"] as OSDMap; - } - catch (Exception e) - { - m_log.Warn("[Materials]: cannot decode \"Material\" from matsMap: " + e.Message); - continue; - } + OSDMap mat = null; + try + { + mat = matsMap["Material"] as OSDMap; + } + catch (Exception e) + { + m_log.Warn("[Materials]: cannot decode \"Material\" from matsMap: " + e.Message); + continue; + } - Primitive.TextureEntry te = new Primitive.TextureEntry(sop.Shape.TextureEntry, 0, sop.Shape.TextureEntry.Length); - if (te == null) - { - m_log.WarnFormat("[Materials]: Error in TextureEntry for SOP {0} {1}", sop.Name, sop.UUID); - continue; - } + Primitive.TextureEntry te = new Primitive.TextureEntry(sop.Shape.TextureEntry, 0, sop.Shape.TextureEntry.Length); + if (te == null) + { + m_log.WarnFormat("[Materials]: Error in TextureEntry for SOP {0} {1}", sop.Name, sop.UUID); + continue; + } - int face = -1; - UUID oldid = UUID.Zero; - Primitive.TextureEntryFace faceEntry = null; - if (matsMap.ContainsKey("Face")) - { - face = matsMap["Face"].AsInteger(); - faceEntry = te.CreateFace((uint)face); - } - else - faceEntry = te.DefaultTexture; + int face = -1; + UUID oldid = UUID.Zero; + Primitive.TextureEntryFace faceEntry = null; + if (matsMap.TryGetValue("Face", out tmpOSD)) + { + face = tmpOSD.AsInteger(); + faceEntry = te.CreateFace((uint)face); + } + else + faceEntry = te.DefaultTexture; - if (faceEntry == null) - continue; + if (faceEntry == null) + continue; - UUID id; - FaceMaterial newFaceMat = null; - if (mat == null) - { - // This happens then the user removes a material from a prim + UUID id; + FaceMaterial newFaceMat = null; + if (mat == null) + { + // This happens then the user removes a material from a prim + id = UUID.Zero; + } + else + { + newFaceMat = new FaceMaterial(mat); + if(newFaceMat.DiffuseAlphaMode == 1 + && newFaceMat.NormalMapID == UUID.Zero + && newFaceMat.SpecularMapID == UUID.Zero + ) id = UUID.Zero; - } else { - newFaceMat = new FaceMaterial(mat); - if(newFaceMat.DiffuseAlphaMode == 1 - && newFaceMat.NormalMapID == UUID.Zero - && newFaceMat.SpecularMapID == UUID.Zero - ) - id = UUID.Zero; + newFaceMat.genID(); + id = newFaceMat.ID; + } + } + + oldid = faceEntry.MaterialID; + + if(oldid == id) + continue; + + if (faceEntry != null) + { + faceEntry.MaterialID = id; + //m_log.DebugFormat("[Materials]: in \"{0}\" {1}, setting material ID for face {2} to {3}", sop.Name, sop.UUID, face, id); + // We can't use sop.UpdateTextureEntry(te) because it filters, so do it manually + sop.Shape.TextureEntry = te.GetBytes(9); + } + + if(oldid != UUID.Zero) + RemoveMaterial(oldid); + + lock(materialslock) + { + if(id != UUID.Zero) + { + if (m_Materials.ContainsKey(id)) + m_MaterialsRefCount[id]++; else { - newFaceMat.genID(); - id = newFaceMat.ID; + m_Materials[id] = newFaceMat; + m_MaterialsRefCount[id] = 1; + m_changed[newFaceMat] = Util.GetTimeStamp(); } } - - oldid = faceEntry.MaterialID; - - if(oldid == id) - continue; - - if (faceEntry != null) - { - faceEntry.MaterialID = id; - //m_log.DebugFormat("[Materials]: in \"{0}\" {1}, setting material ID for face {2} to {3}", sop.Name, sop.UUID, face, id); - // We can't use sop.UpdateTextureEntry(te) because it filters, so do it manually - sop.Shape.TextureEntry = te.GetBytes(9); - } - - if(oldid != UUID.Zero) - RemoveMaterial(oldid); - - lock(materialslock) - { - if(id != UUID.Zero) - { - if (m_Materials.ContainsKey(id)) - m_MaterialsRefCount[id]++; - else - { - m_Materials[id] = newFaceMat; - m_MaterialsRefCount[id] = 1; - m_changed[newFaceMat] = Util.GetTimeStamp(); - } - } - } - - if(!parts.Contains(sop)) - parts.Add(sop); } - foreach(SceneObjectPart sop in parts) - { - if (sop.ParentGroup != null && !sop.ParentGroup.IsDeleted) - { - sop.TriggerScriptChangedEvent(Changed.TEXTURE); - sop.ScheduleFullUpdate(); - sop.ParentGroup.HasGroupChanged = true; - } - } + if(!parts.Contains(sop)) + parts.Add(sop); } - catch (Exception e) + + foreach(SceneObjectPart sop in parts) { - m_log.Warn("[Materials]: exception processing received material ", e); + if (sop.ParentGroup != null && !sop.ParentGroup.IsDeleted) + { + sop.TriggerScriptChangedEvent(Changed.TEXTURE); + sop.ScheduleFullUpdate(); + sop.ParentGroup.HasGroupChanged = true; + } } } + catch (Exception e) + { + m_log.Warn("[Materials]: exception processing received material ", e); + } } } } diff --git a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs index 84495963ab..ac32f759ed 100644 --- a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs +++ b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs @@ -294,7 +294,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing if(numCoords < 3 || (!needsConvexProcessing && numFaces < 1)) { - m_log.ErrorFormat("[MESH]: invalid degenerated mesh for prim {0} ignored", primName); + m_log.ErrorFormat("[ubODEMesh]: invalid degenerated mesh for prim {0} ignored", primName); return null; } @@ -331,7 +331,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing if(mesh.numberVertices() < 3 || mesh.numberTriangles() < 1) { - m_log.ErrorFormat("[MESH]: invalid degenerated mesh for prim {0} ignored", primName); + m_log.ErrorFormat("[ubODEMesh]: invalid degenerated mesh for prim {0} ignored", primName); return null; } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 5d72858fe2..9a0c8364ef 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -784,25 +784,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Float llCos(double f) { m_host.AddScriptLPS(1); - return (double)Math.Cos(f); + return Math.Cos(f); } public LSL_Float llTan(double f) { m_host.AddScriptLPS(1); - return (double)Math.Tan(f); + return Math.Tan(f); } - public LSL_Float llAtan2(double x, double y) + public LSL_Float llAtan2(LSL_Float x, LSL_Float y) { m_host.AddScriptLPS(1); - return (double)Math.Atan2(x, y); + return Math.Atan2(x, y); } public LSL_Float llSqrt(double f) { m_host.AddScriptLPS(1); - return (double)Math.Sqrt(f); + return Math.Sqrt(f); } public LSL_Float llPow(double fbase, double fexponent) @@ -811,7 +811,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return (double)Math.Pow(fbase, fexponent); } - public LSL_Integer llAbs(int i) + public LSL_Integer llAbs(LSL_Integer i) { // changed to replicate LSL behaviour whereby minimum int value is returned untouched. m_host.AddScriptLPS(1); @@ -3069,7 +3069,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.ParentGroup.StopMoveToTarget(); } - public void llApplyImpulse(LSL_Vector force, int local) + public void llApplyImpulse(LSL_Vector force, LSL_Integer local) { m_host.AddScriptLPS(1); //No energy force yet @@ -3526,7 +3526,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return src.ToLower(); } - public LSL_Integer llGiveMoney(string destination, int amount) + public LSL_Integer llGiveMoney(LSL_Key destination, LSL_Integer amount) { Util.FireAndForget(x => { @@ -3785,7 +3785,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return 100f * llGetMass(); } - public void llCollisionFilter(string name, string id, int accept) + public void llCollisionFilter(LSL_String name, LSL_Key id, LSL_Integer accept) { m_host.AddScriptLPS(1); m_host.CollisionFilter.Clear(); @@ -4513,7 +4513,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } - public void llCreateLink(LSL_String target, LSL_Integer parent) + public void llCreateLink(LSL_Key target, LSL_Integer parent) { m_host.AddScriptLPS(1); @@ -4847,7 +4847,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return 1.0f; } - public void llGiveInventory(string destination, string inventory) + public void llGiveInventory(LSL_Key destination, LSL_String inventory) { m_host.AddScriptLPS(1); @@ -5317,7 +5317,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } - public void llCollisionSound(string impact_sound, double impact_volume) + public void llCollisionSound(LSL_String impact_sound, LSL_Float impact_volume) { m_host.AddScriptLPS(1); @@ -5344,11 +5344,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.aggregateScriptEvents(); } - public LSL_String llGetAnimation(string id) + public LSL_String llGetAnimation(LSL_Key id) { // This should only return a value if the avatar is in the same region m_host.AddScriptLPS(1); - UUID avatar = (UUID)id; + UUID avatar; + if(!UUID.TryParse(id, out avatar)) + return ""; ScenePresence presence = World.GetScenePresence(avatar); if (presence == null) return ""; @@ -5698,13 +5700,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return angle; } - public LSL_Float llAcos(double val) + public LSL_Float llAcos(LSL_Float val) { m_host.AddScriptLPS(1); return (double)Math.Acos(val); } - public LSL_Float llAsin(double val) + public LSL_Float llAsin(LSL_Float val) { m_host.AddScriptLPS(1); return (double)Math.Asin(val); @@ -5744,7 +5746,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return UUID.Zero.ToString(); } - public void llAllowInventoryDrop(int add) + public void llAllowInventoryDrop(LSL_Integer add) { m_host.AddScriptLPS(1); @@ -6387,75 +6389,64 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_String llGetEnv(LSL_String name) { m_host.AddScriptLPS(1); - if (name == "agent_limit") + switch(name) { - return World.RegionInfo.RegionSettings.AgentLimit.ToString(); - } - else if (name == "dynamic_pathfinding") - { - return "0"; - } - else if (name == "estate_id") - { - return World.RegionInfo.EstateSettings.EstateID.ToString(); - } - else if (name == "estate_name") - { - return World.RegionInfo.EstateSettings.EstateName; - } - else if (name == "frame_number") - { - return World.Frame.ToString(); - } - else if (name == "region_cpu_ratio") - { - return "1"; - } - else if (name == "region_idle") - { - return "0"; - } - else if (name == "region_product_name") - { - if (World.RegionInfo.RegionType != String.Empty) - return World.RegionInfo.RegionType; - else + case "agent_limit": + return World.RegionInfo.RegionSettings.AgentLimit.ToString(); + + case "dynamic_pathfinding": + return "0"; + + case "estate_id": + return World.RegionInfo.EstateSettings.EstateID.ToString(); + + case "estate_name": + return World.RegionInfo.EstateSettings.EstateName; + + case "frame_number": + return World.Frame.ToString(); + + case "region_cpu_ratio": + return "1"; + + case "region_idle": + return "0"; + + case "region_product_name": + if (World.RegionInfo.RegionType != String.Empty) + return World.RegionInfo.RegionType; + else + return ""; + + case "region_product_sku": + return "OpenSim"; + + case "region_start_time": + return World.UnixStartTime.ToString(); + + case "region_up_time": + int time = Util.UnixTimeSinceEpoch() - World.UnixStartTime; + return time.ToString(); + + case "sim_channel": + return "OpenSim"; + + case "sim_version": + return World.GetSimulatorVersion(); + + case "simulator_hostname": + IUrlModule UrlModule = World.RequestModuleInterface(); + return UrlModule.ExternalHostNameForLSL; + + case "region_max_prims": + return World.RegionInfo.ObjectCapacity.ToString(); + + case "region_object_bonus": + return World.RegionInfo.RegionSettings.ObjectBonus.ToString(); + + default: return ""; } - else if (name == "region_product_sku") - { - return "OpenSim"; - } - else if (name == "region_start_time") - { - return World.UnixStartTime.ToString(); - } - else if (name == "sim_channel") - { - return "OpenSim"; - } - else if (name == "sim_version") - { - return World.GetSimulatorVersion(); - } - else if (name == "simulator_hostname") - { - IUrlModule UrlModule = World.RequestModuleInterface(); - return UrlModule.ExternalHostNameForLSL; - } - else if (name == "region_max_prims") - { - return World.RegionInfo.ObjectCapacity.ToString(); - } - else if (name == "region_object_bonus") - { - return World.RegionInfo.RegionSettings.ObjectBonus.ToString(); - } - else - { - return ""; - } - } /// @@ -6650,7 +6641,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// AGENT_BUSY /// Remove as they are done /// - public LSL_Integer llGetAgentInfo(string id) + public LSL_Integer llGetAgentInfo(LSL_Key id) { m_host.AddScriptLPS(1); @@ -6757,7 +6748,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return flags; } - public LSL_String llGetAgentLanguage(string id) + public LSL_String llGetAgentLanguage(LSL_Key id) { // This should only return a value if the avatar is in the same region, but eh. idc. m_host.AddScriptLPS(1); @@ -6868,7 +6859,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return result; } - public void llAdjustSoundVolume(double volume) + public void llAdjustSoundVolume(LSL_Float volume) { m_host.AddScriptLPS(1); m_host.AdjustSoundGain(volume); @@ -6881,7 +6872,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.SoundRadius = radius; } - public LSL_String llKey2Name(string id) + public LSL_String llKey2Name(LSL_Key id) { m_host.AddScriptLPS(1); UUID key = new UUID(); @@ -7055,22 +7046,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// only the height of avatars vary and that says: /// Width (x) and depth (y) are constant. (0.45m and 0.6m respectively). /// - public LSL_Vector llGetAgentSize(string id) + public LSL_Vector llGetAgentSize(LSL_Key id) { m_host.AddScriptLPS(1); - ScenePresence avatar = World.GetScenePresence((UUID)id); - LSL_Vector agentSize; + UUID avID; + if(!UUID.TryParse(id, out avID)) + return ScriptBaseClass.ZERO_VECTOR; + + ScenePresence avatar = World.GetScenePresence(avID); if (avatar == null || avatar.IsChildAgent) // Fail if not in the same region - { - agentSize = ScriptBaseClass.ZERO_VECTOR; - } - else - { + return ScriptBaseClass.ZERO_VECTOR; + // agentSize = new LSL_Vector(0.45f, 0.6f, avatar.Appearance.AvatarHeight); - Vector3 s = avatar.Appearance.AvatarSize; - agentSize = new LSL_Vector(s.X, s.Y, s.Z); - } - return agentSize; + Vector3 s = avatar.Appearance.AvatarSize; + return new LSL_Vector(s.X, s.Y, s.Z); } public LSL_Integer llSameGroup(string id) @@ -7246,12 +7235,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return m_host.ParentGroup.AttachmentPoint; } - public LSL_List llGetAttachedList(string id) + public LSL_List llGetAttachedList(LSL_Key id) { m_host.AddScriptLPS(1); - ScenePresence av = World.GetScenePresence((UUID)id); + UUID avID; + if(!UUID.TryParse(id, out avID)) + return new LSL_List("NOT_FOUND"); + ScenePresence av = World.GetScenePresence(avID); if (av == null || av.IsDeleted) return new LSL_List("NOT_FOUND"); @@ -7836,7 +7828,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } - public void llGiveInventoryList(string destination, string category, LSL_List inventory) + public void llGiveInventoryList(LSL_Key destination, LSL_String category, LSL_List inventory) { m_host.AddScriptLPS(1); @@ -8014,7 +8006,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } - public void llAddToLandPassList(LSL_Key avatar, double hours) + public void llAddToLandPassList(LSL_Key avatar, LSL_Float hours) { m_host.AddScriptLPS(1); UUID key; @@ -11086,16 +11078,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return (double)Math.Log(val); } - public LSL_List llGetAnimationList(string id) + public LSL_List llGetAnimationList(LSL_Key id) { m_host.AddScriptLPS(1); - LSL_List l = new LSL_List(); - ScenePresence av = World.GetScenePresence((UUID)id); + UUID avID; + if(!UUID.TryParse(id, out avID)) + return new LSL_List(); + + ScenePresence av = World.GetScenePresence(avID); if (av == null || av.IsChildAgent) // only if in the region - return l; + return new LSL_List(); + UUID[] anims; anims = av.Animator.GetAnimationArray(); + LSL_List l = new LSL_List(); foreach (UUID foo in anims) l.Add(new LSL_Key(foo.ToString())); return l; @@ -13619,7 +13616,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api ScriptSleep(m_sleepMsOnMapDestination); } - public void llAddToLandBanList(LSL_Key avatar, double hours) + public void llAddToLandBanList(LSL_Key avatar, LSL_Float hours) { m_host.AddScriptLPS(1); UUID key; @@ -14343,6 +14340,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api case "5": ret.Add(new LSL_Key(land.GlobalID.ToString())); break; + case "64": + ret.Add(new LSL_Integer(land.Dwell)); + break; default: ret.Add(new LSL_Integer(0)); break; @@ -15056,7 +15056,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return name.Replace(" ", ".").ToLower(); } - public LSL_String llGetUsername(string id) + public LSL_String llGetUsername(LSL_Key id) { return Name2Username(llKey2Name(id)); } @@ -16599,7 +16599,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_SoundModule.SetSoundQueueing(m_host.UUID, queue == ScriptBaseClass.TRUE.value); } - public void llCollisionSprite(string impact_sprite) + public void llCollisionSprite(LSL_String impact_sprite) { m_host.AddScriptLPS(1); // Viewer 2.0 broke this and it's likely LL has no intention @@ -16660,7 +16660,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api new DetectParams[0])); } - public LSL_Key llTransferLindenDollars(string destination, int amount) + public LSL_Key llTransferLindenDollars(LSL_Key destination, LSL_Integer amount) { UUID txn = UUID.Random(); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 7d3c832d1e..62da221cb3 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -1600,6 +1600,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return 0.0f; } + public LSL_Integer osGetParcelDwell(LSL_Vector pos) + { + LandData land = World.GetLandData(pos); + if (land != null) + { + return (int)land.Dwell; + } + return 0; + } + // Routines for creating and managing parcels programmatically public void osParcelJoin(LSL_Vector pos1, LSL_Vector pos2) { diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs index 8e1192cd92..6599c22d30 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs @@ -41,20 +41,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces { void state(string newState); - LSL_Integer llAbs(int val); - LSL_Float llAcos(double val); + LSL_Integer llAbs(LSL_Integer val); + LSL_Float llAcos(LSL_Float val); //ApiDesc Sleep 0.1 - void llAddToLandBanList(LSL_Key avatarId, double hours); + void llAddToLandBanList(LSL_Key avatarId, LSL_Float hours); //ApiDesc Sleep 0.1 - void llAddToLandPassList(LSL_Key avatarId, double hours); + void llAddToLandPassList(LSL_Key avatarId, LSL_Float hours); //ApiDesc Sleep 0.1 - void llAdjustSoundVolume(double volume); - void llAllowInventoryDrop(int add); + void llAdjustSoundVolume(LSL_Float volume); + void llAllowInventoryDrop(LSL_Integer add); LSL_Float llAngleBetween(LSL_Rotation a, LSL_Rotation b); - void llApplyImpulse(LSL_Vector force, int local); + void llApplyImpulse(LSL_Vector force, LSL_Integer local); void llApplyRotationalImpulse(LSL_Vector force, int local); - LSL_Float llAsin(double val); - LSL_Float llAtan2(double x, double y); + LSL_Float llAsin(LSL_Float val); + LSL_Float llAtan2(LSL_Float x, LSL_Float y); void llAttachToAvatar(LSL_Integer attachment); void llAttachToAvatarTemp(LSL_Integer attachmentPoint); LSL_Key llAvatarOnSitTarget(); @@ -74,13 +74,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces //ApiDesc Sleep 1.0 void llCloseRemoteDataChannel(string channel); LSL_Float llCloud(LSL_Vector offset); - void llCollisionFilter(string name, string id, int accept); - void llCollisionSound(string impact_sound, double impact_volume); + void llCollisionFilter(LSL_String name, LSL_Key id, LSL_Integer accept); + void llCollisionSound(LSL_String impact_sound, LSL_Float impact_volume); //ApiDesc Not Supported - does nothing - void llCollisionSprite(string impact_sprite); + void llCollisionSprite(LSL_String impact_sprite); LSL_Float llCos(double f); //ApiDesc Sleep 1.0 - void llCreateLink(LSL_String targetId, LSL_Integer parent); + void llCreateLink(LSL_Key targetId, LSL_Integer parent); LSL_List llCSV2List(string src); LSL_List llDeleteSubList(LSL_List src, int start, int end); LSL_String llDeleteSubString(string src, int start, int end); @@ -116,16 +116,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces LSL_Float llFrand(double mag); LSL_Key llGenerateKey(); LSL_Vector llGetAccel(); - LSL_Integer llGetAgentInfo(string id); - LSL_String llGetAgentLanguage(string id); + LSL_Integer llGetAgentInfo(LSL_Key id); + LSL_String llGetAgentLanguage(LSL_Key id); LSL_List llGetAgentList(LSL_Integer scope, LSL_List options); - LSL_Vector llGetAgentSize(string id); + LSL_Vector llGetAgentSize(LSL_Key id); LSL_Float llGetAlpha(int face); LSL_Float llGetAndResetTime(); - LSL_String llGetAnimation(string id); - LSL_List llGetAnimationList(string id); + LSL_String llGetAnimation(LSL_Key id); + LSL_List llGetAnimationList(LSL_Key id); LSL_Integer llGetAttached(); - LSL_List llGetAttachedList(string id); + LSL_List llGetAttachedList(LSL_Key id); LSL_List llGetBoundingBox(string obj); LSL_Vector llGetCameraPos(); LSL_Rotation llGetCameraRot(); @@ -217,10 +217,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces LSL_Integer llGetUnixTime(); LSL_Vector llGetVel(); LSL_Float llGetWallclock(); - void llGiveInventory(string destination, string inventory); - void llGiveInventoryList(string destination, string category, LSL_List inventory); - LSL_Integer llGiveMoney(string destination, int amount); - LSL_Key llTransferLindenDollars(string destination, int amount); + void llGiveInventory(LSL_Key destination, LSL_String inventory); + void llGiveInventoryList(LSL_Key destination, LSL_String category, LSL_List inventory); + LSL_Integer llGiveMoney(LSL_Key destination, LSL_Integer amount); + LSL_Key llTransferLindenDollars(LSL_Key destination, LSL_Integer amount); void llGodLikeRezObject(string inventory, LSL_Vector pos); LSL_Float llGround(LSL_Vector offset); LSL_Vector llGroundContour(LSL_Vector offset); @@ -232,8 +232,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces LSL_String llInsertString(string dst, int position, string src); void llInstantMessage(string user, string message); LSL_String llIntegerToBase64(int number); - LSL_String llKey2Name(string id); - LSL_String llGetUsername(string id); + LSL_String llKey2Name(LSL_Key id); + LSL_String llGetUsername(LSL_Key id); LSL_Key llRequestUsername(string id); LSL_String llGetDisplayName(string id); LSL_Key llRequestDisplayName(string id); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index 194df36fec..7c5ced8013 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs @@ -260,6 +260,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces LSL_Float osGetWindParam(string plugin, string param); // Parcel commands + LSL_Integer osGetParcelDwell(vector pos); void osParcelJoin(vector pos1, vector pos2); void osParcelSubdivide(vector pos1, vector pos2); void osSetParcelDetails(vector pos, LSL_List rules); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs index fa0e25c5f6..f93cea8274 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs @@ -35,7 +35,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase public partial class ScriptBaseClass { // SCRIPTS CONSTANTS - public static readonly LSLInteger OS_APIVERSION = 4; + public static readonly LSLInteger OS_APIVERSION = 5; public static readonly LSLInteger TRUE = 1; public static readonly LSLInteger FALSE = 0; @@ -728,6 +728,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase public const int PARCEL_DETAILS_SEE_AVATARS = 6; public const int PARCEL_DETAILS_ANY_AVATAR_SOUNDS = 7; public const int PARCEL_DETAILS_GROUP_SOUNDS = 8; + // constants for llGetParcelDetails os specific + public const int PARCEL_DETAILS_DWELL = 64; //osSetParcelDetails public const int PARCEL_DETAILS_CLAIMDATE = 10; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs index 0f10d8d228..ff5b4c3473 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs @@ -65,32 +65,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase // // Script functions // - public LSL_Integer llAbs(int i) + public LSL_Integer llAbs(LSL_Integer i) { return m_LSL_Functions.llAbs(i); } - public LSL_Float llAcos(double val) + public LSL_Float llAcos(LSL_Float val) { return m_LSL_Functions.llAcos(val); } - public void llAddToLandBanList(string avatar, double hours) + public void llAddToLandBanList(LSL_Key avatar, LSL_Float hours) { m_LSL_Functions.llAddToLandBanList(avatar, hours); } - public void llAddToLandPassList(string avatar, double hours) + public void llAddToLandPassList(LSL_Key avatar, LSL_Float hours) { m_LSL_Functions.llAddToLandPassList(avatar, hours); } - public void llAdjustSoundVolume(double volume) + public void llAdjustSoundVolume(LSL_Float volume) { m_LSL_Functions.llAdjustSoundVolume(volume); } - public void llAllowInventoryDrop(int add) + public void llAllowInventoryDrop(LSL_Integer add) { m_LSL_Functions.llAllowInventoryDrop(add); } @@ -100,7 +100,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_LSL_Functions.llAngleBetween(a, b); } - public void llApplyImpulse(LSL_Vector force, int local) + public void llApplyImpulse(LSL_Vector force, LSL_Integer local) { m_LSL_Functions.llApplyImpulse(force, local); } @@ -110,12 +110,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase m_LSL_Functions.llApplyRotationalImpulse(force, local); } - public LSL_Float llAsin(double val) + public LSL_Float llAsin(LSL_Float val) { return m_LSL_Functions.llAsin(val); } - public LSL_Float llAtan2(double x, double y) + public LSL_Float llAtan2(LSL_Float x, LSL_Float y) { return m_LSL_Functions.llAtan2(x, y); } @@ -190,17 +190,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_LSL_Functions.llCloud(offset); } - public void llCollisionFilter(string name, string id, int accept) + public void llCollisionFilter(LSL_String name, LSL_Key id, LSL_Integer accept) { m_LSL_Functions.llCollisionFilter(name, id, accept); } - public void llCollisionSound(string impact_sound, double impact_volume) + public void llCollisionSound(LSL_String impact_sound, LSL_Float impact_volume) { m_LSL_Functions.llCollisionSound(impact_sound, impact_volume); } - public void llCollisionSprite(string impact_sprite) + public void llCollisionSprite(LSL_String impact_sprite) { m_LSL_Functions.llCollisionSprite(impact_sprite); } @@ -210,7 +210,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_LSL_Functions.llCos(f); } - public void llCreateLink(LSL_String target, LSL_Integer parent) + public void llCreateLink(LSL_Key target, LSL_Integer parent) { m_LSL_Functions.llCreateLink(target, parent); } @@ -386,12 +386,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_LSL_Functions.llGetAccel(); } - public LSL_Integer llGetAgentInfo(string id) + public LSL_Integer llGetAgentInfo(LSL_Key id) { return m_LSL_Functions.llGetAgentInfo(id); } - public LSL_String llGetAgentLanguage(string id) + public LSL_String llGetAgentLanguage(LSL_Key id) { return m_LSL_Functions.llGetAgentLanguage(id); } @@ -401,7 +401,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_LSL_Functions.llGetAgentList(scope, options); } - public LSL_Vector llGetAgentSize(string id) + public LSL_Vector llGetAgentSize(LSL_Key id) { return m_LSL_Functions.llGetAgentSize(id); } @@ -416,12 +416,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_LSL_Functions.llGetAndResetTime(); } - public LSL_String llGetAnimation(string id) + public LSL_String llGetAnimation(LSL_Key id) { return m_LSL_Functions.llGetAnimation(id); } - public LSL_List llGetAnimationList(string id) + public LSL_List llGetAnimationList(LSL_Key id) { return m_LSL_Functions.llGetAnimationList(id); } @@ -431,7 +431,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_LSL_Functions.llGetAttached(); } - public LSL_List llGetAttachedList(string id) + public LSL_List llGetAttachedList(LSL_Key id) { return m_LSL_Functions.llGetAttachedList(id); } @@ -881,27 +881,27 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_LSL_Functions.llGetWallclock(); } - public void llGiveInventory(string destination, string inventory) + public void llGiveInventory(LSL_Key destination, LSL_String inventory) { m_LSL_Functions.llGiveInventory(destination, inventory); } - public void llGiveInventoryList(string destination, string category, LSL_List inventory) + public void llGiveInventoryList(LSL_Key destination, LSL_String category, LSL_List inventory) { m_LSL_Functions.llGiveInventoryList(destination, category, inventory); } - public LSL_Integer llGiveMoney(string destination, int amount) + public LSL_Integer llGiveMoney(LSL_Key destination, LSL_Integer amount) { return m_LSL_Functions.llGiveMoney(destination, amount); } - public LSL_Key llTransferLindenDollars(string destination, int amount) + public LSL_Key llTransferLindenDollars(LSL_Key destination, LSL_Integer amount) { return m_LSL_Functions.llTransferLindenDollars(destination, amount); } - public void llGodLikeRezObject(string inventory, LSL_Vector pos) + public void llGodLikeRezObject(LSL_String inventory, LSL_Vector pos) { m_LSL_Functions.llGodLikeRezObject(inventory, pos); } @@ -931,22 +931,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_LSL_Functions.llGroundSlope(offset); } - public LSL_Key llHTTPRequest(string url, LSL_List parameters, string body) + public LSL_Key llHTTPRequest(LSL_String url, LSL_List parameters, LSL_String body) { return m_LSL_Functions.llHTTPRequest(url, parameters, body); } - public void llHTTPResponse(LSL_Key id, int status, string body) + public void llHTTPResponse(LSL_Key id, int status, LSL_String body) { m_LSL_Functions.llHTTPResponse(id, status, body); } - public LSL_String llInsertString(string dst, int position, string src) + public LSL_String llInsertString(LSL_String dst, int position, LSL_String src) { return m_LSL_Functions.llInsertString(dst, position, src); } - public void llInstantMessage(string user, string message) + public void llInstantMessage(LSL_String user, LSL_String message) { m_LSL_Functions.llInstantMessage(user, message); } @@ -956,12 +956,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_LSL_Functions.llIntegerToBase64(number); } - public LSL_String llKey2Name(string id) + public LSL_String llKey2Name(LSL_Key id) { return m_LSL_Functions.llKey2Name(id); } - public LSL_String llGetUsername(string id) + public LSL_String llGetUsername(LSL_Key id) { return m_LSL_Functions.llGetUsername(id); } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index 88ea9d5660..6a70305702 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -116,6 +116,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_OSSL_Functions.osGetWindParam(plugin, param); } + public LSL_Integer osGetParcelDwell(vector pos) + { + return m_OSSL_Functions.osGetParcelDwell(pos); + } + public void osParcelJoin(vector pos1, vector pos2) { m_OSSL_Functions.osParcelJoin(pos1,pos2); diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 351fca9bed..ec2a24e5ac 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs @@ -490,6 +490,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance { ReleaseControls(); AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID); + SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID); + if (part != null) + part.RemoveScriptEvents(ItemID); } public void RemoveState() diff --git a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs index 5a385013e9..b52f767f40 100644 --- a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs +++ b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs @@ -533,8 +533,12 @@ namespace OpenSim.Region.ScriptEngine.Shared public static Quaternion operator /(Quaternion a, Quaternion b) { - // assuming normalized - b.s = -b.s; + // assume normalized + // if not, sl seems to not normalize either + b.x = -b.x; + b.y = -b.y; + b.z = -b.z; + return a * b; } diff --git a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs index 1c1930aaf7..788bd3d057 100644 --- a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs +++ b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs @@ -115,15 +115,10 @@ namespace OpenSim.Server.Handlers.Simulation return responsedata; } - } protected virtual void DoQueryAccess(Hashtable request, Hashtable responsedata, UUID agentID, UUID regionID) { - Culture.SetCurrentCulture(); - - EntityTransferContext ctx = new EntityTransferContext(); - if (m_SimulationService == null) { m_log.Debug("[AGENT HANDLER]: Agent QUERY called. Harmless but useless."); @@ -134,33 +129,37 @@ namespace OpenSim.Server.Handlers.Simulation return; } + Culture.SetCurrentCulture(); + // m_log.DebugFormat("[AGENT HANDLER]: Received QUERYACCESS with {0}", (string)request["body"]); OSDMap args = Utils.GetOSDMap((string)request["body"]); bool viaTeleport = true; - if (args.ContainsKey("viaTeleport")) - viaTeleport = args["viaTeleport"].AsBoolean(); + OSD tmpOSD; + if (args.TryGetValue("viaTeleport",out tmpOSD)) + viaTeleport = tmpOSD.AsBoolean(); Vector3 position = Vector3.Zero; - if (args.ContainsKey("position")) - position = Vector3.Parse(args["position"].AsString()); + if (args.TryGetValue("position", out tmpOSD)) + position = Vector3.Parse(tmpOSD.AsString()); string agentHomeURI = null; - if (args.ContainsKey("agent_home_uri")) - agentHomeURI = args["agent_home_uri"].AsString(); + if (args.TryGetValue("agent_home_uri", out tmpOSD)) + agentHomeURI = tmpOSD.AsString(); // Decode the legacy (string) version and extract the number float theirVersion = 0f; - if (args.ContainsKey("my_version")) + if (args.TryGetValue("my_version", out tmpOSD)) { - string theirVersionStr = args["my_version"].AsString(); + string theirVersionStr = tmpOSD.AsString(); string[] parts = theirVersionStr.Split(new char[] {'/'}); if (parts.Length > 1) theirVersion = float.Parse(parts[1], Culture.FormatProvider); } - if (args.ContainsKey("context")) - ctx.Unpack((OSDMap)args["context"]); + EntityTransferContext ctx = new EntityTransferContext(); + if (args.TryGetValue("context", out tmpOSD) && tmpOSD is OSDMap) + ctx.Unpack((OSDMap)tmpOSD); // Decode the new versioning data float minVersionRequired = 0f; @@ -168,15 +167,15 @@ namespace OpenSim.Server.Handlers.Simulation float minVersionProvided = 0f; float maxVersionProvided = 0f; - if (args.ContainsKey("simulation_service_supported_min")) - minVersionProvided = (float)args["simulation_service_supported_min"].AsReal(); - if (args.ContainsKey("simulation_service_supported_max")) - maxVersionProvided = (float)args["simulation_service_supported_max"].AsReal(); + if (args.TryGetValue("simulation_service_supported_min", out tmpOSD)) + minVersionProvided = (float)tmpOSD.AsReal(); + if (args.TryGetValue("simulation_service_supported_max", out tmpOSD)) + maxVersionProvided = (float)tmpOSD.AsReal(); - if (args.ContainsKey("simulation_service_accepted_min")) - minVersionRequired = (float)args["simulation_service_accepted_min"].AsReal(); - if (args.ContainsKey("simulation_service_accepted_max")) - maxVersionRequired = (float)args["simulation_service_accepted_max"].AsReal(); + if (args.TryGetValue("simulation_service_accepted_min", out tmpOSD)) + minVersionRequired = (float)tmpOSD.AsReal(); + if (args.TryGetValue("simulation_service_accepted_max", out tmpOSD)) + maxVersionRequired = (float)tmpOSD.AsReal(); responsedata["int_response_code"] = HttpStatusCode.OK; OSDMap resp = new OSDMap(3); @@ -239,9 +238,9 @@ namespace OpenSim.Server.Handlers.Simulation List features = new List(); - if (args.ContainsKey("features")) + if (args.TryGetValue("features", out tmpOSD) && tmpOSD is OSDArray) { - OSDArray array = (OSDArray)args["features"]; + OSDArray array = (OSDArray)tmpOSD; foreach (OSD o in array) features.Add(new UUID(o.AsString())); @@ -414,8 +413,6 @@ namespace OpenSim.Server.Handlers.Simulation protected void DoAgentPost(Hashtable request, Hashtable responsedata, UUID id) { - EntityTransferContext ctx = new EntityTransferContext(); - OSDMap args = Utils.GetOSDMap((string)request["body"]); if (args == null) { @@ -424,8 +421,10 @@ namespace OpenSim.Server.Handlers.Simulation return; } - if (args.ContainsKey("context")) - ctx.Unpack((OSDMap)args["context"]); + OSD tmpOSD; + EntityTransferContext ctx = new EntityTransferContext(); + if (args.TryGetValue("context", out tmpOSD) && tmpOSD is OSDMap) + ctx.Unpack((OSDMap)tmpOSD); AgentDestinationData data = CreateAgentDestinationData(); UnpackData(args, data, request); @@ -453,16 +452,19 @@ namespace OpenSim.Server.Handlers.Simulation GridRegion source = null; - if (args.ContainsKey("source_uuid")) + if (args.TryGetValue("source_uuid", out tmpOSD)) { source = new GridRegion(); - source.RegionLocX = Int32.Parse(args["source_x"].AsString()); - source.RegionLocY = Int32.Parse(args["source_y"].AsString()); - source.RegionName = args["source_name"].AsString(); - source.RegionID = UUID.Parse(args["source_uuid"].AsString()); + source.RegionID = UUID.Parse(tmpOSD.AsString()); + tmpOSD = args["source_x"]; + source.RegionLocX = Int32.Parse(tmpOSD.AsString()); + tmpOSD = args["source_y"]; + source.RegionLocY = Int32.Parse(tmpOSD.AsString()); + tmpOSD = args["source_name"]; + source.RegionName = tmpOSD.AsString(); - if (args.ContainsKey("source_server_uri")) - source.RawServerURI = args["source_server_uri"].AsString(); + if (args.TryGetValue("source_server_uri", out tmpOSD)) + source.RawServerURI = tmpOSD.AsString(); else source.RawServerURI = null; } @@ -493,21 +495,26 @@ namespace OpenSim.Server.Handlers.Simulation protected virtual void UnpackData(OSDMap args, AgentDestinationData data, Hashtable request) { + OSD tmpOSD; // retrieve the input arguments - if (args.ContainsKey("destination_x") && args["destination_x"] != null) - Int32.TryParse(args["destination_x"].AsString(), out data.x); + if (args.TryGetValue("destination_x", out tmpOSD) && tmpOSD != null) + Int32.TryParse(tmpOSD.AsString(), out data.x); else m_log.WarnFormat(" -- request didn't have destination_x"); - if (args.ContainsKey("destination_y") && args["destination_y"] != null) - Int32.TryParse(args["destination_y"].AsString(), out data.y); + + if (args.TryGetValue("destination_y", out tmpOSD) && tmpOSD != null) + Int32.TryParse(tmpOSD.AsString(), out data.y); else m_log.WarnFormat(" -- request didn't have destination_y"); - if (args.ContainsKey("destination_uuid") && args["destination_uuid"] != null) - UUID.TryParse(args["destination_uuid"].AsString(), out data.uuid); - if (args.ContainsKey("destination_name") && args["destination_name"] != null) - data.name = args["destination_name"].ToString(); - if (args.ContainsKey("teleport_flags") && args["teleport_flags"] != null) - data.flags = args["teleport_flags"].AsUInteger(); + + if (args.TryGetValue("destination_uuid", out tmpOSD) && tmpOSD != null) + UUID.TryParse(tmpOSD.AsString(), out data.uuid); + + if (args.TryGetValue("destination_name", out tmpOSD) && tmpOSD != null) + data.name = tmpOSD.ToString(); + + if (args.TryGetValue("teleport_flags", out tmpOSD) && tmpOSD != null) + data.flags = tmpOSD.AsUInteger(); } protected virtual GridRegion ExtractGatekeeper(AgentDestinationData data) @@ -674,7 +681,6 @@ namespace OpenSim.Server.Handlers.Simulation protected void DoAgentPut(Hashtable request, Hashtable responsedata) { // TODO: Encode the ENtityTransferContext - EntityTransferContext ctx = new EntityTransferContext(); OSDMap args = Utils.GetOSDMap((string)request["body"]); if (args == null) @@ -685,19 +691,21 @@ namespace OpenSim.Server.Handlers.Simulation } // retrieve the input arguments + OSD tmpOSD; + EntityTransferContext ctx = new EntityTransferContext(); int x = 0, y = 0; UUID uuid = UUID.Zero; string regionname = string.Empty; - if (args.ContainsKey("destination_x") && args["destination_x"] != null) - Int32.TryParse(args["destination_x"].AsString(), out x); - if (args.ContainsKey("destination_y") && args["destination_y"] != null) - Int32.TryParse(args["destination_y"].AsString(), out y); - if (args.ContainsKey("destination_uuid") && args["destination_uuid"] != null) - UUID.TryParse(args["destination_uuid"].AsString(), out uuid); - if (args.ContainsKey("destination_name") && args["destination_name"] != null) - regionname = args["destination_name"].ToString(); - if (args.ContainsKey("context")) - ctx.Unpack((OSDMap)args["context"]); + if (args.TryGetValue("destination_x", out tmpOSD) && tmpOSD != null) + Int32.TryParse(tmpOSD.AsString(), out x); + if (args.TryGetValue("destination_y", out tmpOSD) && tmpOSD != null) + Int32.TryParse(tmpOSD.AsString(), out y); + if (args.TryGetValue("destination_uuid", out tmpOSD) && tmpOSD != null) + UUID.TryParse(tmpOSD.AsString(), out uuid); + if (args.TryGetValue("destination_name", out tmpOSD) && tmpOSD != null) + regionname = tmpOSD.ToString(); + if (args.TryGetValue("context", out tmpOSD) && tmpOSD is OSDMap) + ctx.Unpack((OSDMap)tmpOSD); GridRegion destination = new GridRegion(); destination.RegionID = uuid; diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs index e15ac8c47b..f5e7771248 100644 --- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs +++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs @@ -112,7 +112,7 @@ namespace OpenSim.Services.Connectors.Simulation m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: Creating agent at {0}", destination.ServerURI); string uri = destination.ServerURI + AgentPath() + aCircuit.AgentID + "/"; - + OSD tmpOSD; try { OSDMap args = aCircuit.PackAgentCircuitData(ctx); @@ -121,10 +121,9 @@ namespace OpenSim.Services.Connectors.Simulation OSDMap result = WebUtil.PostToServiceCompressed(uri, args, 30000); bool success = result["success"].AsBoolean(); - if (success && result.ContainsKey("_Result")) + if (success && result.TryGetValue("_Result", out tmpOSD) && tmpOSD is OSDMap) { - OSDMap data = (OSDMap)result["_Result"]; - + OSDMap data = (OSDMap)tmpOSD; reason = data["reason"].AsString(); success = data["success"].AsBoolean(); return success; @@ -133,14 +132,15 @@ namespace OpenSim.Services.Connectors.Simulation // Try the old version, uncompressed result = WebUtil.PostToService(uri, args, 30000, false); - if (result["Success"].AsBoolean()) + success = result["success"].AsBoolean(); + if (success) { - if (result.ContainsKey("_Result")) + if (result.TryGetValue("_Result", out tmpOSD) && tmpOSD is OSDMap) { - OSDMap data = (OSDMap)result["_Result"]; - + OSDMap data = (OSDMap)tmpOSD; reason = data["reason"].AsString(); success = data["success"].AsBoolean(); + m_log.WarnFormat( "[REMOTE SIMULATION CONNECTOR]: Remote simulator {0} did not accept compressed transfer, suggest updating it.", destination.RegionName); return success; @@ -312,34 +312,42 @@ namespace OpenSim.Services.Connectors.Simulation if (agentHomeURI != null) request.Add("agent_home_uri", OSD.FromString(agentHomeURI)); + OSD tmpOSD; try { OSDMap result = WebUtil.ServiceOSDRequest(uri, request, "QUERYACCESS", 30000, false, false, true); + bool success = result["success"].AsBoolean(); - if (result.ContainsKey("_Result")) + + bool has_Result = false; + if (result.TryGetValue("_Result", out tmpOSD)) { - OSDMap data = (OSDMap)result["_Result"]; + has_Result = true; + OSDMap data = (OSDMap)tmpOSD; // FIXME: If there is a _Result map then it's the success key here that indicates the true success // or failure, not the sibling result node. + //nte4.8 crap success = data["success"].AsBoolean(); - reason = data["reason"].AsString(); // We will need to plumb this and start sing the outbound version as well // TODO: lay the pipe for version plumbing - if (data.ContainsKey("negotiated_inbound_version") && data["negotiated_inbound_version"] != null) + if (data.TryGetValue("negotiated_inbound_version", out tmpOSD) && tmpOSD != null) { - ctx.InboundVersion = (float)data["negotiated_inbound_version"].AsReal(); + ctx.InboundVersion = (float)tmpOSD.AsReal(); ctx.OutboundVersion = (float)data["negotiated_outbound_version"].AsReal(); } - else if (data["version"] != null && data["version"].AsString() != string.Empty) + else if (data.TryGetValue("version", out tmpOSD) && tmpOSD != null) { - string versionString = data["version"].AsString(); - String[] parts = versionString.Split(new char[] {'/'}); - if (parts.Length > 1) + string versionString = tmpOSD.AsString(); + if(versionString != string.Empty) { - ctx.InboundVersion = float.Parse(parts[1], Culture.FormatProvider); - ctx.OutboundVersion = float.Parse(parts[1], Culture.FormatProvider); + String[] parts = versionString.Split(new char[] {'/'}); + if (parts.Length > 1) + { + ctx.InboundVersion = float.Parse(parts[1], Culture.FormatProvider); + ctx.OutboundVersion = float.Parse(parts[1], Culture.FormatProvider); + } } } @@ -352,11 +360,11 @@ namespace OpenSim.Services.Connectors.Simulation { // If we don't check this then OpenSimulator 0.7.3.1 and some period before will never see the // actual failure message - if (!result.ContainsKey("_Result")) + if (!has_Result) { - if (result.ContainsKey("Message")) + if (result.TryGetValue("Message", out tmpOSD)) { - string message = result["Message"].AsString(); + string message = tmpOSD.AsString(); if (message == "Service request failed: [MethodNotAllowed] MethodNotAllowed") // Old style region { m_log.Info("[REMOTE SIMULATION CONNECTOR]: The above web util error was caused by a TP to a sim that doesn't support QUERYACCESS and can be ignored"); @@ -376,9 +384,9 @@ namespace OpenSim.Services.Connectors.Simulation featuresAvailable.Clear(); - if (result.ContainsKey("features")) + if (result.TryGetValue("features", out tmpOSD) && tmpOSD is OSDArray) { - OSDArray array = (OSDArray)result["features"]; + OSDArray array = (OSDArray)tmpOSD; foreach (OSD o in array) featuresAvailable.Add(new UUID(o.AsString())); diff --git a/OpenSim/Services/LLLoginService/LLLoginService.cs b/OpenSim/Services/LLLoginService/LLLoginService.cs index 22748cc1f7..b923761368 100644 --- a/OpenSim/Services/LLLoginService/LLLoginService.cs +++ b/OpenSim/Services/LLLoginService/LLLoginService.cs @@ -1051,7 +1051,7 @@ namespace OpenSim.Services.LLLoginService } aCircuit.ServiceURLs[keyName] = keyValue; - m_log.DebugFormat("[LLLOGIN SERVICE]: found new key {0} {1}", keyName, aCircuit.ServiceURLs[keyName]); +// m_log.DebugFormat("[LLLOGIN SERVICE]: found new key {0} {1}", keyName, aCircuit.ServiceURLs[keyName]); } if (!account.ServiceURLs.ContainsKey("GatekeeperURI") && !string.IsNullOrEmpty(m_GatekeeperURL)) diff --git a/OpenSim/Tests/ConfigurationLoaderTest.cs b/OpenSim/Tests/ConfigurationLoaderTest.cs index a409a1349b..2a67b84438 100644 --- a/OpenSim/Tests/ConfigurationLoaderTest.cs +++ b/OpenSim/Tests/ConfigurationLoaderTest.cs @@ -114,6 +114,7 @@ namespace OpenSim.Tests IConfigSource argvSource = new IniConfigSource(); EnvConfigSource envConfigSource = new EnvConfigSource(); argvSource.AddConfig("Startup").Set("inifile", mainIniFile); + argvSource.AddConfig("Network"); ConfigSettings configSettings; NetworkServersInfo networkInfo; diff --git a/bin/OpenMetaverse.Rendering.Meshmerizer.dll b/bin/OpenMetaverse.Rendering.Meshmerizer.dll index 53e9600331..2d0aa08757 100755 Binary files a/bin/OpenMetaverse.Rendering.Meshmerizer.dll and b/bin/OpenMetaverse.Rendering.Meshmerizer.dll differ diff --git a/bin/OpenMetaverse.StructuredData.dll b/bin/OpenMetaverse.StructuredData.dll index f9c8c4f176..eb96d19ded 100755 Binary files a/bin/OpenMetaverse.StructuredData.dll and b/bin/OpenMetaverse.StructuredData.dll differ diff --git a/bin/OpenMetaverse.dll b/bin/OpenMetaverse.dll index 02edd6c1d3..4728719846 100755 Binary files a/bin/OpenMetaverse.dll and b/bin/OpenMetaverse.dll differ diff --git a/bin/OpenMetaverseTypes.dll b/bin/OpenMetaverseTypes.dll index befbcf246d..a3f65d2b01 100755 Binary files a/bin/OpenMetaverseTypes.dll and b/bin/OpenMetaverseTypes.dll differ diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index 1332ce81b2..9c53b93d20 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -771,6 +771,7 @@ Cap_ChatSessionRequest = "" Cap_CopyInventoryFromNotecard = "localhost" Cap_DispatchRegionInfo = "" + Cap_EstateAccess = "localhost" Cap_EstateChangeInfo = "" Cap_EnvironmentSettings = "localhost" Cap_EventQueueGet = "localhost" diff --git a/bin/ScriptSyntax.xml b/bin/ScriptSyntax.xml index 2282adaea1..34cd1cc8b8 100644 --- a/bin/ScriptSyntax.xml +++ b/bin/ScriptSyntax.xml @@ -1,4 +1,4 @@ -24121ec8-c0a3-099d-8d83-64feaa32418c +d2556181-baf5-e5b9-c8ec-99eda597b9f6 llsd-lsl-syntax-version2 controls @@ -1513,7 +1513,7 @@ OS_APIVERSION typeinteger - value4 + value5 OS_ATTACH_MSG_ALL typeinteger @@ -1665,6 +1665,10 @@ typeinteger value1 + PARCEL_DETAILS_DWELL + typeinteger + value64 + PARCEL_DETAILS_GROUP typeinteger value3 @@ -3017,6 +3021,10 @@ typeinteger value1 + VEHICLE_FLAG_NO_FLY_UP + typeinteger + value1 + VEHICLE_FLAG_NO_X typeinteger value1024 @@ -6665,6 +6673,13 @@ nametypestring + osGetParcelDwell + + returninteger + arguments + postypevector + + osGetPhysicsEngineName returnstring @@ -7581,7 +7596,6 @@ arguments srctypestring starttypeinteger - lengthtypeinteger osStringSubString @@ -7590,6 +7604,7 @@ arguments srctypestring starttypeinteger + lengthtypeinteger osSunGetParam @@ -7619,6 +7634,8 @@ arguments agenttypestring + regionXtypeinteger + regionYtypeinteger positiontypevector lookattypevector @@ -7627,8 +7644,6 @@ arguments agenttypestring - regionXtypeinteger - regionYtypeinteger positiontypevector lookattypevector