/// <summary>
        /// Creates a new snapshot from the given group
        /// </summary>
        /// <param name="sog"></param>
        /// <returns></returns>
        public static SceneObjectGroupSnapshot FromSceneObjectGroup(SceneObjectGroup sog, SerializationFlags flags)
        {
            SceneObjectGroupSnapshot snapshot = new SceneObjectGroupSnapshot
            {
                RootPart = SceneObjectPartSnapshot.FromSceneObjectPart(sog.RootPart, flags)
            };

            SceneObjectPart[]         parts = sog.GetParts();
            SceneObjectPartSnapshot[] partsSnap;

            //do we have more than just the root?
            if (parts.Length > 1)
            {
                List <SceneObjectPartSnapshot> partsCollect = new List <SceneObjectPartSnapshot>();

                for (int i = 0; i < parts.Length; i++)
                {
                    SceneObjectPart part = parts[i];

                    if (!part.IsRootPart())
                    {
                        partsCollect.Add(SceneObjectPartSnapshot.FromSceneObjectPart(parts[i], flags));
                    }
                }

                partsSnap = partsCollect.ToArray();
            }
            else
            {
                //nope, just the root
                partsSnap = new SceneObjectPartSnapshot[0];
            }

            snapshot.ChildParts = partsSnap;

            if (sog.IsAttachment && sog.HasGroupChanged)
            {
                snapshot.TaintedAttachment = true;
            }
            else
            {
                snapshot.TaintedAttachment = false;
            }

            if (sog.IsAttachment && sog.IsTempAttachment)
            {
                snapshot.TempAttachment = true;
            }
            else
            {
                snapshot.TempAttachment = false;
            }


            return(snapshot);
        }
Exemplo n.º 2
0
        static public SceneObjectPartSnapshot FromSceneObjectPart(SceneObjectPart part, SerializationFlags flags)
        {
            bool serializePhysicsShapes  = (flags & SerializationFlags.SerializePhysicsShapes) != 0;
            bool serializeScriptBytecode = (flags & SerializationFlags.SerializeScriptBytecode) != 0;

            StopScriptReason stopScriptReason;

            if ((flags & SerializationFlags.StopScripts) == 0)
            {
                stopScriptReason = StopScriptReason.None;
            }
            else
            {
                if ((flags & SerializationFlags.FromCrossing) != 0)
                {
                    stopScriptReason = StopScriptReason.Crossing;
                }
                else
                {
                    stopScriptReason = StopScriptReason.Derez;
                }
            }

            SceneObjectPartSnapshot partSnap = new SceneObjectPartSnapshot
            {
                AngularVelocity       = part.PhysicalAngularVelocity,
                AngularVelocityTarget = part.AngularVelocity,
                BaseMask             = part.BaseMask,
                Category             = part.Category,
                ClickAction          = part.ClickAction,
                CollisionSound       = part.CollisionSound.Guid,
                CollisionSoundVolume = part.CollisionSoundVolume,
                CreationDate         = part.CreationDate,
                CreatorId            = part.CreatorID.Guid,
                Description          = part.Description,
                EveryoneMask         = part.EveryoneMask,
                Flags     = part.Flags,
                GroupId   = part.GroupID.Guid,
                GroupMask = part.GroupMask,

                //if this is an attachment, dont fill out the group position. This prevents an issue where
                //a user is crossing to a new region and the vehicle has already been sent. Since the attachment's
                //group position is actually the wearer's position and the wearer's position is the vehicle position,
                //trying to get the attachment grp pos triggers an error and a ton of log spam.
                GroupPosition = part.ParentGroup.IsAttachment ? OpenMetaverse.Vector3.Zero : part.GroupPosition,

                HoverText             = part.Text,
                Id                    = part.UUID.Guid,
                Inventory             = TaskInventorySnapshot.FromTaskInventory(part),
                KeyframeAnimation     = KeyframeAnimationSnapshot.FromKeyframeAnimation(part.KeyframeAnimation),
                LastOwnerId           = part.LastOwnerID.Guid,
                LinkNumber            = part.LinkNum,
                LocalId               = part.LocalId,
                Material              = (OpenMetaverse.Material)part.Material,
                MediaUrl              = part.MediaUrl,
                Name                  = part.Name,
                NextOwnerMask         = part.NextOwnerMask,
                ObjectFlags           = (OpenMetaverse.PrimFlags)part.ObjectFlags,
                ObjectSaleType        = part.ObjectSaleType,
                OffsetPosition        = part.OffsetPosition,
                OwnerId               = part.OwnerID.Guid,
                OwnerMask             = part.OwnerMask,
                OwnershipCost         = part.OwnershipCost,
                ParentId              = part.ParentID,
                ParticleSystem        = part.ParticleSystem,
                PassTouches           = part.PassTouches,
                PayPrice              = part.PayPrice,
                RegionHandle          = part.RegionHandle,
                RotationOffset        = part.RotationOffset,
                SalePrice             = part.SalePrice,
                SavedAttachmentPoint  = part.SavedAttachmentPoint,
                SavedAttachmentPos    = part.SavedAttachmentPos,
                SavedAttachmentRot    = part.SavedAttachmentRot,
                Scale                 = part.Scale,
                ScriptAccessPin       = part.ScriptAccessPin,
                SerializedPhysicsData = part.SerializedPhysicsData,
                ServerWeight          = part.ServerWeight,
                Shape                 = PrimShapeSnapshot.FromShape(part.Shape),
                SitName               = part.SitName,
                SitTargetOrientation  = part.SitTargetOrientation,
                SitTargetPosition     = part.SitTargetPosition,
                Sound                 = part.Sound.Guid,
                SoundFlags            = part.SoundOptions,
                SoundGain             = part.SoundGain,
                SoundRadius           = part.SoundRadius,
                StreamingCost         = part.StreamingCost,
                TextColor             = part.TextColor,
                TextureAnimation      = part.TextureAnimation,
                TouchName             = part.TouchName,
                Velocity              = part.Velocity,
                FromItemId            = part.FromItemID.Guid
            };

            Dictionary <OpenMetaverse.UUID, byte[]> states;
            Dictionary <OpenMetaverse.UUID, byte[]> byteCode;

            if (serializeScriptBytecode)
            {
                Tuple <Dictionary <OpenMetaverse.UUID, byte[]>, Dictionary <OpenMetaverse.UUID, byte[]> >
                statesAndBytecode = part.Inventory.GetBinaryScriptStatesAndCompiledScripts(stopScriptReason);

                states   = statesAndBytecode.Item1;
                byteCode = statesAndBytecode.Item2;
            }
            else
            {
                states   = part.Inventory.GetBinaryScriptStates(stopScriptReason);
                byteCode = null;
            }


            partSnap.SerializedScriptStates = new Dictionary <Guid, byte[]>(states.Count);
            foreach (var kvp in states)
            {
                //map from UUID to Guid
                partSnap.SerializedScriptStates[kvp.Key.Guid] = kvp.Value;
            }

            if (byteCode != null)
            {
                partSnap.SeralizedScriptBytecode = new Dictionary <Guid, byte[]>();

                foreach (var kvp in byteCode)
                {
                    //map from UUID to Guid
                    partSnap.SeralizedScriptBytecode[kvp.Key.Guid] = kvp.Value;
                }
            }

            if (serializePhysicsShapes)
            {
                partSnap.SerializedPhysicsShapes = part.SerializedPhysicsShapes;
            }

            return(partSnap);
        }
Exemplo n.º 3
0
        static public SceneObjectPartSnapshot FromSceneObjectPart(SceneObjectPart part, SerializationFlags flags)
        {
            bool serializePhysicsShapes = (flags & SerializationFlags.SerializePhysicsShapes) != 0;
            bool serializeScriptBytecode = (flags & SerializationFlags.SerializeScriptBytecode) != 0;

            StopScriptReason stopScriptReason;
            if ((flags & SerializationFlags.StopScripts) == 0)
            {
                stopScriptReason = StopScriptReason.None;
            }
            else
            {
                if ((flags & SerializationFlags.FromCrossing) != 0)
                    stopScriptReason = StopScriptReason.Crossing;
                else
                    stopScriptReason = StopScriptReason.Derez;
            }

            SceneObjectPartSnapshot partSnap = new SceneObjectPartSnapshot
            {
                AngularVelocity = part.PhysicalAngularVelocity,
                AngularVelocityTarget = part.AngularVelocity,
                BaseMask = part.BaseMask,
                Category = part.Category,
                ClickAction = part.ClickAction,
                CollisionSound = part.CollisionSound.Guid,
                CollisionSoundVolume = part.CollisionSoundVolume,
                CreationDate = part.CreationDate,
                CreatorId = part.CreatorID.Guid,
                Description = part.Description,
                EveryoneMask = part.EveryoneMask,
                Flags = part.Flags,
                GroupId = part.GroupID.Guid,
                GroupMask = part.GroupMask,

                //if this is an attachment, dont fill out the group position. This prevents an issue where
                //a user is crossing to a new region and the vehicle has already been sent. Since the attachment's
                //group position is actually the wearer's position and the wearer's position is the vehicle position,
                //trying to get the attachment grp pos triggers an error and a ton of log spam.
                GroupPosition = part.ParentGroup.IsAttachment ? OpenMetaverse.Vector3.Zero : part.GroupPosition, 

                HoverText = part.Text,
                Id = part.UUID.Guid,
                Inventory = TaskInventorySnapshot.FromTaskInventory(part),
                KeyframeAnimation = KeyframeAnimationSnapshot.FromKeyframeAnimation(part.KeyframeAnimation),
                LastOwnerId = part.LastOwnerID.Guid,
                LinkNumber = part.LinkNum,
                LocalId = part.LocalId,
                Material = (OpenMetaverse.Material)part.Material,
                MediaUrl = part.MediaUrl,
                Name = part.Name,
                NextOwnerMask = part.NextOwnerMask,
                ObjectFlags = (OpenMetaverse.PrimFlags)part.ObjectFlags,
                ObjectSaleType = part.ObjectSaleType,
                OffsetPosition = part.OffsetPosition,
                OwnerId = part.OwnerID.Guid,
                OwnerMask = part.OwnerMask,
                OwnershipCost = part.OwnershipCost,
                ParentId = part.ParentID,
                ParticleSystem = part.ParticleSystem,
                PassTouches = part.PassTouches,
                PayPrice = part.PayPrice,
                RegionHandle = part.RegionHandle,
                RotationOffset = part.RotationOffset,
                SalePrice = part.SalePrice,
                SavedAttachmentPoint = part.SavedAttachmentPoint,
                SavedAttachmentPos = part.SavedAttachmentPos,
                SavedAttachmentRot = part.SavedAttachmentRot,
                Scale = part.Scale,
                ScriptAccessPin = part.ScriptAccessPin,
                SerializedPhysicsData = part.SerializedPhysicsData,
                ServerWeight = part.ServerWeight,
                Shape = PrimShapeSnapshot.FromShape(part.Shape),
                SitName = part.SitName,
                SitTargetOrientation = part.SitTargetOrientation,
                SitTargetPosition = part.SitTargetPosition,
                Sound = part.Sound.Guid,
                SoundFlags = part.SoundOptions,
                SoundGain = part.SoundGain,
                SoundRadius = part.SoundRadius,
                StreamingCost = part.StreamingCost,
                TextColor = part.TextColor,
                TextureAnimation = part.TextureAnimation,
                TouchName = part.TouchName,
                Velocity = part.Velocity,
                FromItemId = part.FromItemID.Guid
            };

            Dictionary<OpenMetaverse.UUID, byte[]> states;
            Dictionary<OpenMetaverse.UUID, byte[]> byteCode;
            if (serializeScriptBytecode)
            {
                Tuple<Dictionary<OpenMetaverse.UUID, byte[]>, Dictionary<OpenMetaverse.UUID, byte[]>>
                    statesAndBytecode = part.Inventory.GetBinaryScriptStatesAndCompiledScripts(stopScriptReason);

                states = statesAndBytecode.Item1;
                byteCode = statesAndBytecode.Item2;
            }
            else
            {
                states = part.Inventory.GetBinaryScriptStates(stopScriptReason);
                byteCode = null;
            }

            
            partSnap.SerializedScriptStates = new Dictionary<Guid, byte[]>(states.Count);
            foreach (var kvp in states)
            {
                //map from UUID to Guid
                partSnap.SerializedScriptStates[kvp.Key.Guid] = kvp.Value;
            }

            if (byteCode != null)
            {
                partSnap.SeralizedScriptBytecode = new Dictionary<Guid, byte[]>();

                foreach (var kvp in byteCode)
                {
                    //map from UUID to Guid
                    partSnap.SeralizedScriptBytecode[kvp.Key.Guid] = kvp.Value;
                }
            }

            if (serializePhysicsShapes)
            {
                partSnap.SerializedPhysicsShapes = part.SerializedPhysicsShapes;
            }

            return partSnap;
        }
Exemplo n.º 4
0
        /// <summary>
        /// Creates a new snapshot from the given group
        /// </summary>
        /// <param name="sog"></param>
        /// <returns></returns>
        public static SceneObjectGroupSnapshot FromSceneObjectGroup(SceneObjectGroup sog, SerializationFlags flags)
        {
            SceneObjectGroupSnapshot snapshot = new SceneObjectGroupSnapshot
            {
                RootPart = SceneObjectPartSnapshot.FromSceneObjectPart(sog.RootPart, flags)
            };

            var parts = sog.GetParts();
            SceneObjectPartSnapshot[] partsSnap;

            //do we have more than just the root?
            if (parts.Count > 1)
            {
                List<SceneObjectPartSnapshot> partsCollect = new List<SceneObjectPartSnapshot>();

                foreach (SceneObjectPart part in parts)
                {
                    if (!part.IsRootPart())
                    {
                        partsCollect.Add(SceneObjectPartSnapshot.FromSceneObjectPart(part, flags));
                    }
                }

                partsSnap = partsCollect.ToArray();
            }
            else
            {
                //nope, just the root
                partsSnap = new SceneObjectPartSnapshot[0];
            }

            snapshot.ChildParts = partsSnap;

            if (sog.IsAttachment && sog.HasGroupChanged)
            {
                snapshot.TaintedAttachment = true;
            }
            else
            {
                snapshot.TaintedAttachment = false;
            }

            if (sog.IsAttachment && sog.IsTempAttachment)
            {
                snapshot.TempAttachment = true;
            }
            else
            {
                snapshot.TempAttachment = false;
            }


            return snapshot;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="osPart"></param>
        /// <returns></returns>
        private SceneObjectPartSnapshot ConvertOpenSimPartToPartSnapshot(dynamic osPart)
        {
            //we need server weight and streaming cost

            SceneObjectPartSnapshot snap = new SceneObjectPartSnapshot
            {
                AngularVelocity = new Vector3(osPart.AngularVelocity.X, osPart.AngularVelocity.Y, osPart.AngularVelocity.Z),
                AngularVelocityTarget = new Vector3(osPart.AngularVelocity.X, osPart.AngularVelocity.Y, osPart.AngularVelocity.Z),
                BaseMask = osPart.BaseMask,
                Category = osPart.Category,
                ClickAction = osPart.ClickAction,
                CollisionSound = osPart.CollisionSound.Guid,
                CollisionSoundVolume = osPart.CollisionSoundVolume,
                CreationDate = osPart.CreationDate,
                CreatorId = m_creatorOverride == Guid.Empty ? osPart.CreatorID.Guid : m_creatorOverride,
                Description = osPart.Description,
                EveryoneMask = osPart.EveryoneMask,
                Flags = osPart.Flags,
                FromItemId = Guid.Empty,
                GroupId = osPart.GroupID.Guid,
                GroupMask = osPart.GroupMask,
                GroupPosition = osPart.GroupPosition,
                HoverText = osPart.Text,
                Id = osPart.UUID.Guid,
                Inventory = ExtractSOPInventorySnapshot(osPart),
                KeyframeAnimation = ExtractSOPKFASnapshot(osPart),
                LastOwnerId = osPart.LastOwnerID.Guid,
                LinkNumber = osPart.LinkNum,
                LocalId = osPart.LocalId,
                Material = (Material)osPart.Material,
                MediaUrl = osPart.MediaUrl,
                Name = osPart.Name,
                NextOwnerMask = osPart.NextOwnerMask,
                ObjectFlags = (PrimFlags)osPart.ObjectFlags,
                ObjectSaleType = osPart.ObjectSaleType,
                OffsetPosition = osPart.OffsetPosition,
                OwnerMask = osPart.OwnerMask,
                OwnershipCost = osPart.OwnershipCost,
                ParentId = osPart.ParentID,
                ParticleSystem = osPart.ParticleSystem,
                PassTouches = osPart.PassTouches,
                PayPrice = osPart.PayPrice,
                RegionHandle = osPart.RegionHandle,
                RotationOffset = new Quaternion(osPart.RotationOffset.X, osPart.RotationOffset.Y, osPart.RotationOffset.Z, osPart.RotationOffset.W),
                SalePrice = osPart.SalePrice,
                Scale = osPart.Scale,
                ScriptAccessPin = osPart.ScriptAccessPin,
                ServerWeight = 1,
                StreamingCost = 1,
                Shape = ExtractSOPBaseShape(osPart),

                OwnerId = m_ownerOverride == Guid.Empty ? osPart.OwnerID.Guid : m_ownerOverride,
                
            };

            return snap;
        }