diff --git a/OpenSim/Data/MySQL/MySQLPresenceData.cs b/OpenSim/Data/MySQL/MySQLPresenceData.cs index 71caa1aa2a..2390febd7f 100644 --- a/OpenSim/Data/MySQL/MySQLPresenceData.cs +++ b/OpenSim/Data/MySQL/MySQLPresenceData.cs @@ -78,9 +78,12 @@ namespace OpenSim.Data.MySQL if (pd.Length == 0) return false; + if (regionID == UUID.Zero) + return false; + MySqlCommand cmd = new MySqlCommand(); - cmd.CommandText = String.Format("update {0} set RegionID=?RegionID where `SessionID`=?SessionID", m_Realm); + cmd.CommandText = String.Format("update {0} set RegionID=?RegionID, LastSeen=NOW() where `SessionID`=?SessionID", m_Realm); cmd.Parameters.AddWithValue("?SessionID", sessionID.ToString()); cmd.Parameters.AddWithValue("?RegionID", regionID.ToString()); @@ -90,6 +93,5 @@ namespace OpenSim.Data.MySQL return true; } - } } diff --git a/OpenSim/Data/MySQL/Resources/Presence.migrations b/OpenSim/Data/MySQL/Resources/Presence.migrations index 91f7de55f7..1075a15721 100644 --- a/OpenSim/Data/MySQL/Resources/Presence.migrations +++ b/OpenSim/Data/MySQL/Resources/Presence.migrations @@ -13,3 +13,11 @@ CREATE UNIQUE INDEX SessionID ON Presence(SessionID); CREATE INDEX UserID ON Presence(UserID); COMMIT; + +:VERSION 1 # -------------------------- + +BEGIN; + +ALTER TABLE `Presence` ADD COLUMN LastSeen timestamp; + +COMMIT; diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs index 2c6d99902d..efd5a8e041 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs @@ -361,6 +361,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization m_SOPXmlProcessors.Add("Flags", ProcessFlags); m_SOPXmlProcessors.Add("CollisionSound", ProcessCollisionSound); m_SOPXmlProcessors.Add("CollisionSoundVolume", ProcessCollisionSoundVolume); + m_SOPXmlProcessors.Add("MediaUrl", ProcessMediaUrl); #endregion #region TaskInventoryXmlProcessors initialization @@ -436,6 +437,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization m_ShapeXmlProcessors.Add("FlexiEntry", ProcessShpFlexiEntry); m_ShapeXmlProcessors.Add("LightEntry", ProcessShpLightEntry); m_ShapeXmlProcessors.Add("SculptEntry", ProcessShpSculptEntry); + m_ShapeXmlProcessors.Add("Media", ProcessShpMedia); #endregion } @@ -703,6 +705,11 @@ namespace OpenSim.Region.Framework.Scenes.Serialization { obj.CollisionSoundVolume = reader.ReadElementContentAsFloat("CollisionSoundVolume", String.Empty); } + + private static void ProcessMediaUrl(SceneObjectPart obj, XmlTextReader reader) + { + obj.MediaUrl = reader.ReadElementContentAsString("MediaUrl", String.Empty); + } #endregion #region TaskInventoryXmlProcessors @@ -1063,6 +1070,13 @@ namespace OpenSim.Region.Framework.Scenes.Serialization shp.SculptEntry = reader.ReadElementContentAsBoolean("SculptEntry", String.Empty); } + private static void ProcessShpMedia(PrimitiveBaseShape shp, XmlTextReader reader) + { + string value = reader.ReadElementContentAsString("Media", String.Empty); + shp.Media = PrimitiveBaseShape.MediaList.FromXml(value); + } + + #endregion ////////// Write ///////// @@ -1305,210 +1319,6 @@ namespace OpenSim.Region.Framework.Scenes.Serialization return true; } - public static SceneObjectPart Xml2ToSOPPull(XmlTextReader reader) - { - SceneObjectPart obj = new SceneObjectPart(); - - reader.ReadStartElement("SceneObjectPart"); - - if (reader.Name == "AllowedDrop") - obj.AllowedDrop = reader.ReadElementContentAsBoolean("AllowedDrop", String.Empty); - else - obj.AllowedDrop = true; - - obj.CreatorID = ReadUUID(reader, "CreatorID"); - obj.FolderID = ReadUUID(reader, "FolderID"); - obj.InventorySerial = (uint)reader.ReadElementContentAsInt("InventorySerial", String.Empty); - - #region Task Inventory - - obj.TaskInventory = new TaskInventoryDictionary(); - //List invItems = new List(); - - reader.ReadStartElement("TaskInventory", String.Empty); - while (reader.Name == "TaskInventoryItem") - { - TaskInventoryItem item = new TaskInventoryItem(); - reader.ReadStartElement("TaskInventoryItem", String.Empty); - - item.AssetID = ReadUUID(reader, "AssetID"); - item.BasePermissions = (uint)reader.ReadElementContentAsInt("BasePermissions", String.Empty); - item.CreationDate = (uint)reader.ReadElementContentAsInt("CreationDate", String.Empty); - item.CreatorID = ReadUUID(reader, "CreatorID"); - item.Description = reader.ReadElementContentAsString("Description", String.Empty); - item.EveryonePermissions = (uint)reader.ReadElementContentAsInt("EveryonePermissions", String.Empty); - item.Flags = (uint)reader.ReadElementContentAsInt("Flags", String.Empty); - item.GroupID = ReadUUID(reader, "GroupID"); - item.GroupPermissions = (uint)reader.ReadElementContentAsInt("GroupPermissions", String.Empty); - item.InvType = reader.ReadElementContentAsInt("InvType", String.Empty); - item.ItemID = ReadUUID(reader, "ItemID"); - UUID oldItemID = ReadUUID(reader, "OldItemID"); // TODO: Is this useful? - item.LastOwnerID = ReadUUID(reader, "LastOwnerID"); - item.Name = reader.ReadElementContentAsString("Name", String.Empty); - item.NextPermissions = (uint)reader.ReadElementContentAsInt("NextPermissions", String.Empty); - item.OwnerID = ReadUUID(reader, "OwnerID"); - item.CurrentPermissions = (uint)reader.ReadElementContentAsInt("CurrentPermissions", String.Empty); - UUID parentID = ReadUUID(reader, "ParentID"); - UUID parentPartID = ReadUUID(reader, "ParentPartID"); - item.PermsGranter = ReadUUID(reader, "PermsGranter"); - item.PermsMask = reader.ReadElementContentAsInt("PermsMask", String.Empty); - item.Type = reader.ReadElementContentAsInt("Type", String.Empty); - - reader.ReadEndElement(); - obj.TaskInventory.Add(item.ItemID, item); - } - if (reader.NodeType == XmlNodeType.EndElement) - reader.ReadEndElement(); - - #endregion Task Inventory - - obj.Flags = (PrimFlags)reader.ReadElementContentAsInt("ObjectFlags", String.Empty); - - obj.UUID = ReadUUID(reader, "UUID"); - obj.LocalId = (uint)reader.ReadElementContentAsLong("LocalId", String.Empty); - obj.Name = reader.ReadElementString("Name"); - obj.Material = (byte)reader.ReadElementContentAsInt("Material", String.Empty); - - if (reader.Name == "PassTouches") - obj.PassTouches = reader.ReadElementContentAsBoolean("PassTouches", String.Empty); - else - obj.PassTouches = false; - - obj.RegionHandle = (ulong)reader.ReadElementContentAsLong("RegionHandle", String.Empty); - obj.ScriptAccessPin = reader.ReadElementContentAsInt("ScriptAccessPin", String.Empty); - - if (reader.Name == "PlaySoundSlavePrims") - reader.ReadInnerXml(); - if (reader.Name == "LoopSoundSlavePrims") - reader.ReadInnerXml(); - - Vector3 groupPosition = ReadVector(reader, "GroupPosition"); - Vector3 offsetPosition = ReadVector(reader, "OffsetPosition"); - obj.RotationOffset = ReadQuaternion(reader, "RotationOffset"); - obj.Velocity = ReadVector(reader, "Velocity"); - if (reader.Name == "RotationalVelocity") - ReadVector(reader, "RotationalVelocity"); - obj.AngularVelocity = ReadVector(reader, "AngularVelocity"); - obj.Acceleration = ReadVector(reader, "Acceleration"); - obj.Description = reader.ReadElementString("Description"); - reader.ReadStartElement("Color"); - if (reader.Name == "R") - { - obj.Color = Color.FromArgb((int)reader.ReadElementContentAsFloat("A", String.Empty), - (int)reader.ReadElementContentAsFloat("R", String.Empty), - (int)reader.ReadElementContentAsFloat("G", String.Empty), - (int)reader.ReadElementContentAsFloat("B", String.Empty)); - reader.ReadEndElement(); - } - obj.Text = reader.ReadElementString("Text", String.Empty); - obj.SitName = reader.ReadElementString("SitName", String.Empty); - obj.TouchName = reader.ReadElementString("TouchName", String.Empty); - - obj.LinkNum = reader.ReadElementContentAsInt("LinkNum", String.Empty); - obj.ClickAction = (byte)reader.ReadElementContentAsInt("ClickAction", String.Empty); - - reader.ReadStartElement("Shape"); - obj.Shape.ProfileCurve = (byte)reader.ReadElementContentAsInt("ProfileCurve", String.Empty); - - byte[] teData = Convert.FromBase64String(reader.ReadElementString("TextureEntry")); - obj.Shape.Textures = new Primitive.TextureEntry(teData, 0, teData.Length); - - reader.ReadInnerXml(); // ExtraParams - - obj.Shape.PathBegin = (ushort)reader.ReadElementContentAsInt("PathBegin", String.Empty); - obj.Shape.PathCurve = (byte)reader.ReadElementContentAsInt("PathCurve", String.Empty); - obj.Shape.PathEnd = (ushort)reader.ReadElementContentAsInt("PathEnd", String.Empty); - obj.Shape.PathRadiusOffset = (sbyte)reader.ReadElementContentAsInt("PathRadiusOffset", String.Empty); - obj.Shape.PathRevolutions = (byte)reader.ReadElementContentAsInt("PathRevolutions", String.Empty); - obj.Shape.PathScaleX = (byte)reader.ReadElementContentAsInt("PathScaleX", String.Empty); - obj.Shape.PathScaleY = (byte)reader.ReadElementContentAsInt("PathScaleY", String.Empty); - obj.Shape.PathShearX = (byte)reader.ReadElementContentAsInt("PathShearX", String.Empty); - obj.Shape.PathShearY = (byte)reader.ReadElementContentAsInt("PathShearY", String.Empty); - obj.Shape.PathSkew = (sbyte)reader.ReadElementContentAsInt("PathSkew", String.Empty); - obj.Shape.PathTaperX = (sbyte)reader.ReadElementContentAsInt("PathTaperX", String.Empty); - obj.Shape.PathTaperY = (sbyte)reader.ReadElementContentAsInt("PathTaperY", String.Empty); - obj.Shape.PathTwist = (sbyte)reader.ReadElementContentAsInt("PathTwist", String.Empty); - obj.Shape.PathTwistBegin = (sbyte)reader.ReadElementContentAsInt("PathTwistBegin", String.Empty); - obj.Shape.PCode = (byte)reader.ReadElementContentAsInt("PCode", String.Empty); - obj.Shape.ProfileBegin = (ushort)reader.ReadElementContentAsInt("ProfileBegin", String.Empty); - obj.Shape.ProfileEnd = (ushort)reader.ReadElementContentAsInt("ProfileEnd", String.Empty); - obj.Shape.ProfileHollow = (ushort)reader.ReadElementContentAsInt("ProfileHollow", String.Empty); - obj.Scale = ReadVector(reader, "Scale"); - obj.Shape.State = (byte)reader.ReadElementContentAsInt("State", String.Empty); - - obj.Shape.ProfileCurve = (byte)reader.ReadElementContentAsInt("ProfileCurve", String.Empty); - obj.Shape.ProfileShape = (ProfileShape)reader.ReadElementContentAsInt("ProfileShape", String.Empty); - obj.Shape.HollowShape = (HollowShape)reader.ReadElementContentAsInt("HollowShape", String.Empty); - - UUID sculptTexture = ReadUUID(reader, "SculptTexture"); - SculptType sculptType = (SculptType)reader.ReadElementContentAsInt("SculptType", String.Empty); - if (sculptTexture != UUID.Zero) - { - obj.Shape.SculptTexture = sculptTexture; - obj.Shape.SculptType = (byte)sculptType; - } - - reader.ReadInnerXml(); // SculptData - - obj.Shape.FlexiSoftness = reader.ReadElementContentAsInt("FlexiSoftness", String.Empty); - obj.Shape.FlexiTension = reader.ReadElementContentAsFloat("FlexiTension", String.Empty); - obj.Shape.FlexiDrag = reader.ReadElementContentAsFloat("FlexiDrag", String.Empty); - obj.Shape.FlexiGravity = reader.ReadElementContentAsFloat("FlexiGravity", String.Empty); - obj.Shape.FlexiWind = reader.ReadElementContentAsFloat("FlexiWind", String.Empty); - obj.Shape.FlexiForceX = reader.ReadElementContentAsFloat("FlexiForceX", String.Empty); - obj.Shape.FlexiForceY = reader.ReadElementContentAsFloat("FlexiForceY", String.Empty); - obj.Shape.FlexiForceZ = reader.ReadElementContentAsFloat("FlexiForceZ", String.Empty); - - obj.Shape.LightColorR = reader.ReadElementContentAsFloat("LightColorR", String.Empty); - obj.Shape.LightColorG = reader.ReadElementContentAsFloat("LightColorG", String.Empty); - obj.Shape.LightColorB = reader.ReadElementContentAsFloat("LightColorB", String.Empty); - obj.Shape.LightColorA = reader.ReadElementContentAsFloat("LightColorA", String.Empty); - obj.Shape.LightRadius = reader.ReadElementContentAsFloat("LightRadius", String.Empty); - obj.Shape.LightCutoff = reader.ReadElementContentAsFloat("LightCutoff", String.Empty); - obj.Shape.LightFalloff = reader.ReadElementContentAsFloat("LightFalloff", String.Empty); - obj.Shape.LightIntensity = reader.ReadElementContentAsFloat("LightIntensity", String.Empty); - - bool hasFlexi = reader.ReadElementContentAsBoolean("FlexiEntry", String.Empty); - bool hasLight = reader.ReadElementContentAsBoolean("LightEntry", String.Empty); - reader.ReadInnerXml(); // SculptEntry - - reader.ReadEndElement(); - - obj.Scale = ReadVector(reader, "Scale"); // Yes, again - obj.UpdateFlag = (byte)reader.ReadElementContentAsInt("UpdateFlag", String.Empty); // UpdateFlag - - obj.SitTargetOrientation = ReadQuaternion(reader, "SitTargetOrientation"); - obj.SitTargetPosition = ReadVector(reader, "SitTargetPosition"); - obj.SitTargetPositionLL = ReadVector(reader, "SitTargetPositionLL"); - obj.SitTargetOrientationLL = ReadQuaternion(reader, "SitTargetOrientationLL"); - obj.ParentID = (uint)reader.ReadElementContentAsLong("ParentID", String.Empty); - obj.CreationDate = reader.ReadElementContentAsInt("CreationDate", String.Empty); - int category = reader.ReadElementContentAsInt("Category", String.Empty); - obj.SalePrice = reader.ReadElementContentAsInt("SalePrice", String.Empty); - obj.ObjectSaleType = (byte)reader.ReadElementContentAsInt("ObjectSaleType", String.Empty); - int ownershipCost = reader.ReadElementContentAsInt("OwnershipCost", String.Empty); - obj.GroupID = ReadUUID(reader, "GroupID"); - obj.OwnerID = ReadUUID(reader, "OwnerID"); - obj.LastOwnerID = ReadUUID(reader, "LastOwnerID"); - obj.BaseMask = (uint)reader.ReadElementContentAsInt("BaseMask", String.Empty); - obj.OwnerMask = (uint)reader.ReadElementContentAsInt("OwnerMask", String.Empty); - obj.GroupMask = (uint)reader.ReadElementContentAsInt("GroupMask", String.Empty); - obj.EveryoneMask = (uint)reader.ReadElementContentAsInt("EveryoneMask", String.Empty); - obj.NextOwnerMask = (uint)reader.ReadElementContentAsInt("NextOwnerMask", String.Empty); - - obj.Flags = (PrimFlags)reader.ReadElementContentAsInt("Flags", String.Empty); - - obj.CollisionSound = ReadUUID(reader, "CollisionSound"); - obj.CollisionSoundVolume = reader.ReadElementContentAsFloat("CollisionSoundVolume", String.Empty); - - reader.ReadEndElement(); - - obj.GroupPosition = groupPosition; - obj.OffsetPosition = offsetPosition; - - return obj; - } - public static SceneObjectPart Xml2ToSOP(XmlTextReader reader) { SceneObjectPart obj = new SceneObjectPart(); @@ -1533,7 +1343,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization } else { - m_log.DebugFormat("[SceneObjectSerializer]: caught unknown element {0}", nodeName); + //m_log.DebugFormat("[SceneObjectSerializer]: caught unknown element {0}", nodeName); reader.ReadOuterXml(); // ignore } diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index 9c63118c47..05358c4373 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -136,17 +136,16 @@ meshing = Meshmerizer ;meshing = ZeroMesher - ;; Path to decoded sculpty maps - ;; Defaults to "j2kDecodeCache + ; Path to decoded sculpty maps + ; Defaults to "j2kDecodeCache ;DecodedSculptMapPath = "j2kDecodeCache" - ;# {CacheSculptMaps} {Cache decoded sculpt maps?} {true false} true - ;; if you use Meshmerizer and want sculpt map collisions, setting this to - ;; to true will store decoded sculpt maps in a special folder in your bin - ;; folder, which can reduce startup times by reducing asset requests. Some - ;; versions of mono dont work well when reading the cache files, so set this - ;; to false if you have compatability problems. - ; CacheSculptMaps = true + ; if you use Meshmerizer and want sculpt map collisions, setting this to + ; to true will store decoded sculpt maps in a special folder in your bin + ; folder, which can reduce startup times by reducing asset requests. Some + ; versions of mono dont work well when reading the cache files, so set this + ; to false if you have compatibility problems. + ;CacheSculptMaps = true ; Choose one of the physics engines below ; OpenDynamicsEngine is by some distance the most developed physics engine