From 2b842958cc172fbf9ee79b495a268f012fb47cdc Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Thu, 16 Feb 2012 02:58:00 +0000 Subject: If shape properties fail SOP parsing (e.g. due to commas instead of decimal points) print out one short message listing the failing node names rather than lots of exceptions. Adds skeleton bad float values deserialization test --- .../Scenes/Serialization/SceneObjectSerializer.cs | 34 ++++++++++++++-------- 1 file changed, 22 insertions(+), 12 deletions(-) (limited to 'OpenSim/Region/Framework') diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs index 0a32214..e6b88a3 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs @@ -29,6 +29,7 @@ using System; using System.Collections.Generic; using System.Drawing; using System.IO; +using System.Linq; using System.Reflection; using System.Xml; using log4net; @@ -570,13 +571,15 @@ namespace OpenSim.Region.Framework.Scenes.Serialization private static void ProcessShape(SceneObjectPart obj, XmlTextReader reader) { - bool errors = false; - obj.Shape = ReadShape(reader, "Shape", out errors); + List errorNodeNames; + obj.Shape = ReadShape(reader, "Shape", out errorNodeNames); - if (errors) + if (errorNodeNames != null) + { m_log.DebugFormat( - "[SceneObjectSerializer]: Parsing PrimitiveBaseShape for object part {0} {1} encountered errors. Please see earlier log entries.", - obj.Name, obj.UUID); + "[SceneObjectSerializer]: Parsing PrimitiveBaseShape for object part {0} {1} encountered errors in properties {2}.", + obj.Name, obj.UUID, string.Join(", ", errorNodeNames.ToArray())); + } } private static void ProcessScale(SceneObjectPart obj, XmlTextReader reader) @@ -1519,37 +1522,44 @@ namespace OpenSim.Region.Framework.Scenes.Serialization /// /// /// The name of the xml element containing the shape - /// true if any errors were encountered during parsing, false otherwise + /// a list containing the failing node names. If no failures then null. /// The shape parsed - public static PrimitiveBaseShape ReadShape(XmlTextReader reader, string name, out bool errors) + public static PrimitiveBaseShape ReadShape(XmlTextReader reader, string name, out List errorNodeNames) { - errors = false; + List internalErrorNodeNames = null; PrimitiveBaseShape shape = new PrimitiveBaseShape(); if (reader.IsEmptyElement) { reader.Read(); + errorNodeNames = null; return shape; } reader.ReadStartElement(name, String.Empty); // Shape - errors = ExternalRepresentationUtils.ExecuteReadProcessors( + ExternalRepresentationUtils.ExecuteReadProcessors( shape, m_ShapeXmlProcessors, reader, (o, nodeName, e) => { - m_log.DebugFormat( - "[SceneObjectSerializer]: Exception while parsing Shape property {0}: {1}{2}", - nodeName, e.Message, e.StackTrace); +// m_log.DebugFormat( +// "[SceneObjectSerializer]: Exception while parsing Shape property {0}: {1}{2}", +// nodeName, e.Message, e.StackTrace); + if (internalErrorNodeNames == null) + internalErrorNodeNames = new List(); + + internalErrorNodeNames.Add(nodeName); } ); reader.ReadEndElement(); // Shape + errorNodeNames = internalErrorNodeNames; + return shape; } -- cgit v1.1 From 4486b7d8e8aaa7f98e0003ce06fc0e145903f6b9 Mon Sep 17 00:00:00 2001 From: PixelTomsen Date: Thu, 16 Feb 2012 00:07:12 +0100 Subject: Fix: Object owned by the group does not return to the last owner http://opensimulator.org/mantis/view.php?id=5404 --- OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 2 +- OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'OpenSim/Region/Framework') diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 5a5307c..9d9729e 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -1926,7 +1926,7 @@ namespace OpenSim.Region.Framework.Scenes foreach (SceneObjectGroup g in deleteGroups) { - AddReturn(g.OwnerID, g.Name, g.AbsolutePosition, "parcel owner return"); + AddReturn(g.OwnerID == g.GroupID ? g.LastOwnerID : g.OwnerID, g.Name, g.AbsolutePosition, "parcel owner return"); } } } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 5b838f8..878476e 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -1330,7 +1330,7 @@ namespace OpenSim.Region.Framework.Scenes m_log.DebugFormat( "[SCENE OBJECT GROUP]: Returning object {0} due to parcel autoreturn", RootPart.UUID); - m_scene.AddReturn(OwnerID, Name, AbsolutePosition, "parcel autoreturn"); + m_scene.AddReturn(OwnerID == GroupID ? LastOwnerID : OwnerID, Name, AbsolutePosition, "parcel autoreturn"); m_scene.DeRezObjects(null, new List() { RootPart.LocalId }, UUID.Zero, DeRezAction.Return, UUID.Zero); -- cgit v1.1 From ba98d6fffe03389d6538a11d5eec45c863964403 Mon Sep 17 00:00:00 2001 From: BlueWall Date: Fri, 17 Feb 2012 08:03:53 -0500 Subject: Fix missing telehub handling on login --- OpenSim/Region/Framework/Scenes/Scene.cs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'OpenSim/Region/Framework') diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 4c8e2d2..ecc553d 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -3427,6 +3427,27 @@ namespace OpenSim.Region.Framework.Scenes agent.startpos.Z = 720; } } + + // Honor Estate teleport routing via Telehubs + if (RegionInfo.RegionSettings.TelehubObject != UUID.Zero && RegionInfo.EstateSettings.AllowDirectTeleport == false) + { + SceneObjectGroup telehub = GetSceneObjectGroup(RegionInfo.RegionSettings.TelehubObject); + // Can have multiple SpawnPoints + List spawnpoints = RegionInfo.RegionSettings.SpawnPoints(); + if ( spawnpoints.Count > 1) + { + // We have multiple SpawnPoints, Route the agent to a random one + agent.startpos = spawnpoints[Util.RandomClass.Next(spawnpoints.Count)].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation); + } + else + { + // We have a single SpawnPoint and will route the agent to it + agent.startpos = spawnpoints[0].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation); + } + + return true; + } + // Honor parcel landing type and position. if (land != null) { -- cgit v1.1 From 6baa13ab7aeb7d0ee08f2460f52961dbd79bada1 Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Fri, 17 Feb 2012 09:12:41 -0800 Subject: Add new and updated script events --- OpenSim/Region/Framework/Scenes/EventManager.cs | 58 ++++++++++++++++++++-- OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 12 +++++ 2 files changed, 67 insertions(+), 3 deletions(-) (limited to 'OpenSim/Region/Framework') diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index d31d380..34d3da7 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs @@ -184,10 +184,62 @@ namespace OpenSim.Region.Framework.Scenes public event ClientClosed OnClientClosed; + // Fired when a script is created + // The indication that a new script exists in this region. + public delegate void NewScript(UUID clientID, SceneObjectPart part, UUID itemID); + public event NewScript OnNewScript; + public virtual void TriggerNewScript(UUID clientID, SceneObjectPart part, UUID itemID) + { + NewScript handlerNewScript = OnNewScript; + if (handlerNewScript != null) + { + foreach (NewScript d in handlerNewScript.GetInvocationList()) + { + try + { + d(clientID, part, itemID); + } + catch (Exception e) + { + m_log.ErrorFormat( + "[EVENT MANAGER]: Delegate for TriggerNewScript failed - continuing. {0} {1}", + e.Message, e.StackTrace); + } + } + } + } + + //TriggerUpdateScript: triggered after Scene receives client's upload of updated script and stores it as asset + // An indication that the script has changed. + public delegate void UpdateScript(UUID clientID, UUID itemId, UUID primId, bool isScriptRunning, UUID newAssetID); + public event UpdateScript OnUpdateScript; + public virtual void TriggerUpdateScript(UUID clientId, UUID itemId, UUID primId, bool isScriptRunning, UUID newAssetID) + { + UpdateScript handlerUpdateScript = OnUpdateScript; + if (handlerUpdateScript != null) + { + foreach (UpdateScript d in handlerUpdateScript.GetInvocationList()) + { + try + { + d(clientId, itemId, primId, isScriptRunning, newAssetID); + } + catch (Exception e) + { + m_log.ErrorFormat( + "[EVENT MANAGER]: Delegate for TriggerUpdateScript failed - continuing. {0} {1}", + e.Message, e.StackTrace); + } + } + } + } + /// - /// This is fired when a scene object property that a script might be interested in (such as color, scale or - /// inventory) changes. Only enough information is sent for the LSL changed event - /// (see http://lslwiki.net/lslwiki/wakka.php?wakka=changed) + /// ScriptChangedEvent is fired when a scene object property that a script might be interested + /// in (such as color, scale or inventory) changes. Only enough information sent is for the LSL changed event. + /// This is not an indication that the script has changed (see OnUpdateScript for that). + /// This event is sent to a script to tell it that some property changed on + /// the object the script is in. See http://lslwiki.net/lslwiki/wakka.php?wakka=changed . /// public event ScriptChangedEvent OnScriptChangedEvent; public delegate void ScriptChangedEvent(uint localID, uint change); diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 9d9729e..6cc78b8 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -283,6 +283,10 @@ namespace OpenSim.Region.Framework.Scenes { remoteClient.SendAgentAlertMessage("Script saved", false); } + + // Tell anyone managing scripts that a script has been reloaded/changed + EventManager.TriggerUpdateScript(remoteClient.AgentId, itemId, primId, isScriptRunning, item.AssetID); + part.ParentGroup.ResumeScripts(); return errors; } @@ -1624,9 +1628,13 @@ namespace OpenSim.Region.Framework.Scenes // have state in inventory part.Inventory.CreateScriptInstance(copyID, 0, false, DefaultScriptEngine, 0); + // tell anyone watching that there is a new script in town + EventManager.TriggerNewScript(agentID, part, copyID); + // m_log.InfoFormat("[PRIMINVENTORY]: " + // "Rezzed script {0} into prim local ID {1} for user {2}", // item.inventoryName, localID, remoteClient.Name); + part.ParentGroup.ResumeScripts(); return part; @@ -1707,6 +1715,10 @@ namespace OpenSim.Region.Framework.Scenes part.Inventory.AddInventoryItem(taskItem, false); part.Inventory.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0); + + // tell anyone managing scripts that a new script exists + EventManager.TriggerNewScript(agentID, part, taskItem.ItemID); + part.ParentGroup.ResumeScripts(); return part; -- cgit v1.1 From 784263f5e334aeda15effee599efc8bf546aa010 Mon Sep 17 00:00:00 2001 From: Dan Lake Date: Fri, 17 Feb 2012 13:43:14 -0800 Subject: Added the TriggerAvatarAppearanceChanged to EventManager. It's triggered by AvatarFactoryModule after an avatar's appearance has been succesfully changed and persisted (if the persist option is set). --- OpenSim/Region/Framework/Scenes/EventManager.cs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'OpenSim/Region/Framework') diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index d31d380..6586437 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs @@ -173,6 +173,9 @@ namespace OpenSim.Region.Framework.Scenes public delegate void AvatarEnteringNewParcel(ScenePresence avatar, int localLandID, UUID regionID); public event AvatarEnteringNewParcel OnAvatarEnteringNewParcel; + public delegate void AvatarAppearanceChange(ScenePresence avatar); + public event AvatarAppearanceChange OnAvatarAppearanceChange; + public event Action OnSignificantClientMovement; public delegate void IncomingInstantMessage(GridInstantMessage message); @@ -1238,6 +1241,27 @@ namespace OpenSim.Region.Framework.Scenes } } + public void TriggerAvatarAppearanceChanged(ScenePresence avatar) + { + AvatarAppearanceChange handler = OnAvatarAppearanceChange; + if (handler != null) + { + foreach (AvatarAppearanceChange d in handler.GetInvocationList()) + { + try + { + d(avatar); + } + catch (Exception e) + { + m_log.ErrorFormat( + "[EVENT MANAGER]: Delegate for TriggerAvatarAppearanceChanged failed - continuing. {0} {1}", + e.Message, e.StackTrace); + } + } + } + } + public void TriggerIncomingInstantMessage(GridInstantMessage message) { IncomingInstantMessage handlerIncomingInstantMessage = OnIncomingInstantMessage; -- cgit v1.1 From 84184708de7f5663cabb3cf652c4f9922a14bf40 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Sat, 18 Feb 2012 01:15:43 +0000 Subject: Fix a bug where changing shape parameters of a child prim in a linkset would not persist. Resolves http://opensimulator.org/mantis/view.php?id=5819 --- OpenSim/Region/Framework/Scenes/SceneGraph.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'OpenSim/Region/Framework') diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index e66678a..66fb493 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -1592,7 +1592,7 @@ namespace OpenSim.Region.Framework.Scenes if (group != null) { - if (m_parentScene.Permissions.CanEditObject(group.UUID,agentID)) + if (m_parentScene.Permissions.CanEditObject(group.UUID, agentID)) { group.UpdateExtraParam(primLocalID, type, inUse, data); } @@ -1609,7 +1609,7 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectGroup group = GetGroupByPrim(primLocalID); if (group != null) { - if (m_parentScene.Permissions.CanEditObject(group.GetPartsFullID(primLocalID), agentID)) + if (m_parentScene.Permissions.CanEditObject(group.UUID, agentID)) { ObjectShapePacket.ObjectDataBlock shapeData = new ObjectShapePacket.ObjectDataBlock(); shapeData.ObjectLocalID = shapeBlock.ObjectLocalID; -- cgit v1.1 From 7bdcf9eb26842af57e31f3cecd4f403a39a27bc0 Mon Sep 17 00:00:00 2001 From: BlueWall Date: Sat, 18 Feb 2012 00:32:09 -0500 Subject: Propagate our teleport flags on logins --- OpenSim/Region/Framework/Scenes/Scene.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'OpenSim/Region/Framework') diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index ecc553d..841be96 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -3261,6 +3261,9 @@ namespace OpenSim.Region.Framework.Scenes { bool vialogin = ((teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0 || (teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0); + bool viahome = ((teleportFlags & (uint)Constants.TeleportFlags.ViaHome) != 0); + bool godlike = ((teleportFlags & (uint)Constants.TeleportFlags.Godlike) != 0); + reason = String.Empty; //Teleport flags: @@ -3429,7 +3432,7 @@ namespace OpenSim.Region.Framework.Scenes } // Honor Estate teleport routing via Telehubs - if (RegionInfo.RegionSettings.TelehubObject != UUID.Zero && RegionInfo.EstateSettings.AllowDirectTeleport == false) + if (RegionInfo.RegionSettings.TelehubObject != UUID.Zero && RegionInfo.EstateSettings.AllowDirectTeleport == false && !viahome && !godlike) { SceneObjectGroup telehub = GetSceneObjectGroup(RegionInfo.RegionSettings.TelehubObject); // Can have multiple SpawnPoints -- cgit v1.1 From f4cd35322f59b7aae548595541abaa80deefc74d Mon Sep 17 00:00:00 2001 From: BlueWall Date: Sat, 18 Feb 2012 00:45:43 -0500 Subject: Route logins according to Estate, Telehub and TeleportFlags --- OpenSim/Region/Framework/Scenes/Scene.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'OpenSim/Region/Framework') diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 841be96..13c866d 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -3431,8 +3431,10 @@ namespace OpenSim.Region.Framework.Scenes } } - // Honor Estate teleport routing via Telehubs - if (RegionInfo.RegionSettings.TelehubObject != UUID.Zero && RegionInfo.EstateSettings.AllowDirectTeleport == false && !viahome && !godlike) + // Honor Estate teleport routing via Telehubs excluding ViaHome and GodLike TeleportFlags + if (RegionInfo.RegionSettings.TelehubObject != UUID.Zero && + RegionInfo.EstateSettings.AllowDirectTeleport == false && + !viahome && !godlike) { SceneObjectGroup telehub = GetSceneObjectGroup(RegionInfo.RegionSettings.TelehubObject); // Can have multiple SpawnPoints -- cgit v1.1