Ejemplo n.º 1
0
        public override void AssetTransferComplete()
        {
            AssetData          data;
            List <ObjectGroup> objgroups;

            try
            {
                data = m_Scene.AssetService[AssetID];
            }
            catch (Exception e)
            {
                m_Log.Error(string.Format("Failed to rez object from asset {0}", AssetID), e);
                SendAlertMessage("ALERT: CantFindObject");
                return;
            }

            try
            {
                objgroups = ObjectXML.FromAsset(data, m_RezzingAgent);
            }
            catch (Exception e)
            {
                m_Log.Error(string.Format("Unable to decode asset {0} to rez", data.ID), e);
                SendAlertMessage("ALERT: RezAttemptFailed");
                return;
            }

            if (objgroups.Count == 1 && m_SourceItem != null)
            {
                objgroups[0].Name = m_SourceItem.Name;
            }

            try
            {
                foreach (ObjectGroup grp in objgroups)
                {
                    if (m_Scene.CanRez(m_RezzingAgent.ID, m_RezzingAgent, grp.GlobalPosition))
                    {
                        if (m_Scene.GroupsService?.Members.ContainsKey(m_RezzingAgent, m_RezzingGroup, m_RezzingAgent) ?? false)
                        {
                            grp.Group = m_RezzingGroup;
                        }
                        m_Scene.RezObject(grp, m_RezzingAgent, m_SourceItem);
                    }
                }
            }
            catch (Exception e)
            {
                m_Log.Error(string.Format("Failed to rez object in scene {0} ({1})", m_Scene.Name, m_Scene.ID), e);
                SendAlertMessage("ALERT: RezAttemptFailed");
                return;
            }
        }
Ejemplo n.º 2
0
        public override void AssetTransferComplete()
        {
            AssetData data;
            var       objgroups = new List <ObjectGroup>();

            foreach (UUID assetid in m_ItemAssetIDs)
            {
                try
                {
                    data = m_Scene.AssetService[assetid];
                }
                catch (Exception e)
                {
                    m_Log.Error(string.Format("Failed to rez object from asset {0}", assetid), e);
                    SendAlertMessage("ALERT: CantFindObject");
                    return;
                }

                try
                {
                    objgroups.AddRange(ObjectXML.FromAsset(data, m_RezzingAgent));
                }
                catch (Exception e)
                {
                    m_Log.Error(string.Format("Unable to decode asset {0} to rez", data.ID), e);
                    SendAlertMessage("ALERT: RezAttemptFailed");
                    return;
                }
            }

            if (objgroups.Count == 1 && m_RezParams.SourceItem != null)
            {
                objgroups[0].Name = m_RezParams.SourceItem.Name;
            }

            try
            {
                m_Scene.RezObjects(objgroups, m_RezParams);
            }
            catch (Exception e)
            {
                m_Log.Error(string.Format("Failed to rez object in scene {0} ({1})", m_Scene.Name, m_Scene.ID), e);
                SendAlertMessage("ALERT: RezAttemptFailed");
            }
        }
Ejemplo n.º 3
0
        public static UUID GenerateNextOwnerAsset(this AssetServiceInterface assetService, UUID firstLevelAssetID)
        {
            var assetIDs       = new List <UUID>();
            var replaceAssets  = new Dictionary <UUID, UUID>();
            var objectAssetIDs = new List <UUID>();

            assetIDs.Add(firstLevelAssetID);
            int pos = 0;

            while (pos < assetIDs.Count)
            {
                UUID          assetid = assetIDs[pos++];
                AssetMetadata objmeta;
                if (assetService.Metadata.TryGetValue(assetid, out objmeta))
                {
                    if (objmeta.Type == AssetType.Object)
                    {
                        if (!objectAssetIDs.Contains(assetid))
                        {
                            objectAssetIDs.Add(assetid);
                        }
                        assetIDs.AddRange(ObjectReferenceDecoder.GetReferences(assetService[assetid]));
                        if (!replaceAssets.ContainsKey(assetid))
                        {
                            replaceAssets.Add(assetid, UUID.Random);
                        }
                    }
                    else if (objmeta.Type == AssetType.Notecard)
                    {
                        if (!objectAssetIDs.Contains(assetid))
                        {
                            objectAssetIDs.Add(assetid);
                        }
                        var nc = new Notecard(assetService[assetid]);
                        foreach (NotecardInventoryItem item in nc.Inventory.Values)
                        {
                            if ((item.AssetType == AssetType.Object || item.AssetType == AssetType.Notecard) &&
                                !objectAssetIDs.Contains(item.AssetID))
                            {
                                objectAssetIDs.Add(item.AssetID);
                            }
                        }
                        assetIDs.InsertRange(0, nc.References);
                        if (!replaceAssets.ContainsKey(assetid))
                        {
                            replaceAssets.Add(assetid, UUID.Random);
                        }
                    }
                }
            }

            objectAssetIDs.Reverse();
            foreach (UUID objectid in objectAssetIDs)
            {
                AssetData data;
                AssetData newAsset;
                if (assetService.TryGetValue(objectid, out data))
                {
                    switch (data.Type)
                    {
                    case AssetType.Object:
                        List <ObjectGroup> grps = ObjectXML.FromAsset(data, UGUI.Unknown);
                        foreach (ObjectGroup grp in grps)
                        {
                            foreach (ObjectPart part in grp.Values)
                            {
                                foreach (ObjectPartInventoryItem item in part.Inventory.Values)
                                {
                                    if (item.NextOwnerAssetID == UUID.Zero)
                                    {
                                        UUID replaceAssetID;
                                        part.Inventory.SetNextOwnerAssetID(
                                            item.ID,
                                            replaceAssets.TryGetValue(item.AssetID, out replaceAssetID) ? replaceAssetID : item.AssetID);
                                    }
                                }
                            }
                        }

                        newAsset = (grps.Count == 1) ?
                                   grps[0].Asset(UGUI.Unknown, XmlSerializationOptions.AdjustForNextOwner | XmlSerializationOptions.WriteXml2) :
                                   grps.Asset(UGUI.Unknown, XmlSerializationOptions.AdjustForNextOwner | XmlSerializationOptions.WriteXml2);

                        newAsset.ID         = replaceAssets[objectid];
                        newAsset.CreateTime = data.CreateTime;
                        assetService.Store(newAsset);
                        break;

                    case AssetType.Notecard:
                        var nc = new Notecard(data);
                        foreach (NotecardInventoryItem item in nc.Inventory.Values)
                        {
                            UUID replace;
                            if (replaceAssets.TryGetValue(item.AssetID, out replace))
                            {
                                item.AssetID = replace;
                            }
                            break;
                        }
                        break;

                    default:
                        break;
                    }
                }
            }

            UUID finalAssetID;

            return(replaceAssets.TryGetValue(firstLevelAssetID, out finalAssetID) ? finalAssetID : firstLevelAssetID);
        }
Ejemplo n.º 4
0
        private void AttachFromInventory(AssetData data, UUID itemID)
        {
            List <ObjectGroup> objgroups;

#if DEBUG
            m_Log.DebugFormat("Deserializing object asset {0} for agent {1} {2} ({3})", data.ID, NamedOwner.FirstName, NamedOwner.LastName, NamedOwner.ID);
#endif
            try
            {
                objgroups = ObjectXML.FromAsset(data, Owner);
            }
            catch (Exception e)
            {
                m_Log.WarnFormat("Deserialization error for object asset {0} for agent {1} {2} ({3}): {4}: {5}",
                                 data.ID, NamedOwner.FirstName, NamedOwner.LastName, NamedOwner.ID, e.GetType().FullName, e.ToString());
                return;
            }

            if (objgroups.Count != 1)
            {
                return;
            }

            ObjectGroup grp = objgroups[0];

            foreach (ObjectPart part in grp.Values)
            {
                if (part.Shape.PCode == PrimitiveCode.Grass ||
                    part.Shape.PCode == PrimitiveCode.Tree ||
                    part.Shape.PCode == PrimitiveCode.NewTree)
                {
                    return;
                }
            }

            AttachmentPoint attachAt = grp.AttachPoint;

            if (attachAt == AttachmentPoint.NotAttached)
            {
                grp.AttachPoint = AttachmentPoint.LeftHand;
                grp.AttachedPos = Vector3.Zero;
                grp.AttachedRot = Quaternion.Identity;
            }

            grp.FromItemID       = itemID;
            grp.IsAttached       = true;
            grp.Position         = grp.AttachedPos;
            grp.Rotation         = grp.AttachedRot;
            grp.IsChangedEnabled = true;

#if DEBUG
            m_Log.DebugFormat("Adding attachment asset {0} at {4} for agent {1} {2} ({3})", data.ID, NamedOwner.FirstName, NamedOwner.LastName, NamedOwner.ID, grp.AttachPoint.ToString());
#endif
            SceneInterface scene = CurrentScene;
            try
            {
                scene.Add(grp);
                Attachments.Add(grp.AttachPoint, grp);
            }
            catch
            {
                return;
            }
        }
Ejemplo n.º 5
0
            public override void AssetTransferComplete()
            {
                AssetData          data;
                List <ObjectGroup> objgroups;

                try
                {
                    data = m_Scene.AssetService[AssetID];
                }
                catch (Exception e)
                {
                    m_Log.Error(string.Format("Failed to rez attachment from asset {0}", AssetID), e);
                    SendAlertMessage("ALERT: CantFindObject");
                    return;
                }

#if DEBUG
                m_Log.DebugFormat("Deserializing object asset {0} for agent {1}", data.ID, m_RezzingAgent.ToString());
#endif
                try
                {
                    objgroups = ObjectXML.FromAsset(data, m_RezzingAgent);
                }
                catch (Exception e)
                {
                    m_Log.WarnFormat("Deserialization error for object asset {0} for agent {1}: {2}: {3}",
                                     data.ID, m_RezzingAgent.ToString(), e.GetType().FullName, e.ToString());
                    SendAlertMessage("ALERT: InvalidObjectParams");
                    return;
                }

                if (objgroups.Count != 1)
                {
                    SendAlertMessage("ALERT: InvalidObjectParams");
                    return;
                }

                ObjectGroup grp = objgroups[0];

                bool attachPointChanged = false;

                foreach (var part in grp.Values)
                {
                    if (part.Shape.PCode == PrimitiveCode.Grass ||
                        part.Shape.PCode == PrimitiveCode.Tree ||
                        part.Shape.PCode == PrimitiveCode.NewTree)
                    {
                        SendAlertMessage("ALERT: WhyAreYouTryingToWearShrubbery");
                        return;
                    }
                }

                var attachAt = m_AttachPoint & AttachmentPoint.PositionMask;
                if (attachAt != AttachmentPoint.Default && attachAt != grp.AttachPoint)
                {
                    grp.AttachedPos    = Vector3.Zero;
                    grp.AttachedRot    = Quaternion.Identity;
                    attachPointChanged = true;
                }

                if (attachAt == AttachmentPoint.Default)
                {
                    attachAt = grp.AttachPoint;

                    if (attachAt == AttachmentPoint.NotAttached)
                    {
                        grp.AttachPoint = AttachmentPoint.LeftHand;
                        grp.AttachedPos = Vector3.Zero;
                        grp.AttachedRot = Quaternion.Identity;
                    }
                }

                grp.Owner            = m_RezzingAgent;
                grp.FromItemID       = m_SourceItem.ID;
                grp.IsAttached       = true;
                grp.Position         = grp.AttachedPos;
                grp.Rotation         = grp.AttachedRot;
                grp.IsChangedEnabled = true;

                if (attachPointChanged)
                {
                    grp.AttachPoint = attachAt;
                }

#if DEBUG
                m_Log.DebugFormat("Adding attachment asset {0} at {4} for agent {1}", data.ID, m_RezzingAgent.ToString());
#endif
                try
                {
                    m_Scene.RezObject(grp, m_RezzingAgent, m_SourceItem);
                    m_AttachmentsList.Add(grp.AttachPoint, grp);
                }
                catch
                {
                    SendAlertMessage("ALERT: RezAttemptFailed");
                    return;
                }
                grp.PostEvent(new AttachEvent {
                    ObjectID = grp.Owner.ID
                });
            }