예제 #1
0
        public void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient)
        {
            remoteClient.RunAttachmentOperation(() =>
            {
                ScenePresence sp = this.GetScenePresence(remoteClient.AgentId);
                if (sp == null)
                    return;
                SceneObjectGroup group =  sp.GetAttachmentByItemID(itemID);
                if (group == null)
                    return;
                if (group.OwnerID != remoteClient.AgentId) 
                    return;

                this.EventManager.TriggerOnDetachObject(group.LocalId);
                DetachSingleAttachmentToInvSync(itemID, remoteClient);
            });
        }
예제 #2
0
        public void DetachSingleAttachmentToGround(UUID itemID, IClientAPI remoteClient)
        {
            remoteClient.RunAttachmentOperation(() =>
                {
                    SceneObjectPart part = GetSceneObjectPart(itemID);
                    if (part == null || part.ParentGroup == null)
                        return;

                    UUID inventoryID = part.ParentGroup.GetFromItemID();

                    ScenePresence presence;
                    if (TryGetAvatar(remoteClient.AgentId, out presence))
                    {
                        int landImpact = part.ParentGroup.LandImpact;
                        bool isTemp = (part.GetEffectiveObjectFlags() & PrimFlags.TemporaryOnRez) != 0;
                        if (!Permissions.CanRezObject(landImpact, remoteClient.AgentId, UUID.Zero, presence.AbsolutePosition, isTemp))
                            return;

                        this.EventManager.TriggerOnDetachObject(part.ParentGroup.LocalId);
                        presence.Appearance.DetachAttachment(itemID);
                        IAvatarFactory ava = RequestModuleInterface<IAvatarFactory>();
                        if (ava != null)
                        {
                            ava.UpdateDatabase(remoteClient.AgentId, presence.Appearance, null, null);
                        }
                        part.ParentGroup.DetachToGround();
                        CachedUserInfo userInfo =
                            CommsManager.UserService.GetUserDetails(remoteClient.AgentId);
                        if (userInfo != null)
                        {
                            userInfo.CheckedDeleteItem(remoteClient.AgentId, inventoryID);
                            remoteClient.SendRemoveInventoryItem(inventoryID);
                        }
                    }
                });
        }
예제 #3
0
 public void AttachObject(IClientAPI controllingClient, uint localID, uint attachPoint, bool append, bool silent,
     AttachFlags flags)
 {
     controllingClient.RunAttachmentOperation(() =>
         {
             m_sceneGraph.AttachObject(controllingClient, localID, attachPoint, append, silent, flags);
         });
 }
예제 #4
0
        public void RezMultipleAttachments(IClientAPI remoteClient, RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header,
                                       RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[] objects)
        {
            remoteClient.RunAttachmentOperation(() =>
            {
                ScenePresence presence;
                if (!TryGetAvatar(remoteClient.AgentId, out presence))
                    return;

                if (header.FirstDetachAll)
                {
                    foreach (UUID itemId in presence.CollectAttachmentItemIds())
                        this.DetachSingleAttachmentToInvSync(itemId, remoteClient);

                    this.ClearAllAttachments(presence);
                }

                bool updated = false;

                foreach (RezMultipleAttachmentsFromInvPacket.ObjectDataBlock obj in objects)
                {
                    bool append = (((uint)obj.AttachmentPt & 0x80) != 0);         // Are we appending?
                    uint attachPoint = ((uint)obj.AttachmentPt & 0x7f);           // And strip the append bit

                    // Are we already attached?
                    if (presence.Appearance.GetAttachmentForItem(obj.ItemID) == null)
                    {
                        SceneObjectGroup sog = RezSingleAttachmentSync(remoteClient, obj.ItemID, attachPoint, append);
                        if (sog != null)
                            updated = true;
                    }
                }

                if (updated)
                {
                    IAvatarFactory ava = RequestModuleInterface<IAvatarFactory>();
                    if (ava != null)
                        ava.UpdateDatabase(remoteClient.AgentId, presence.Appearance, null, null);
                }
            });
        }
예제 #5
0
        /// <summary>
        /// Rezzes a single attachment and returns UUID.Zero. Can not be called if you need the ID
        /// </summary>
        /// <param name="remoteClient"></param>
        /// <param name="itemID"></param>
        /// <param name="AttachmentPt"></param>
        /// <param name="append"></param>
        /// <returns></returns>
        public UUID RezSingleAttachment(IClientAPI client, UUID itemID, uint AttachmentPt, bool append)
        {
            ScenePresence presence;
            if (!TryGetAvatar(client.AgentId, out presence))
                return UUID.Zero;

            client.RunAttachmentOperation(() =>
                {
                    SceneObjectGroup sog = RezSingleAttachmentSync(client, itemID, AttachmentPt, append);
                    if (sog != null)
                    {
                        IAvatarFactory ava = RequestModuleInterface<IAvatarFactory>();
                        if (ava != null)
                            ava.UpdateDatabase(client.AgentId, presence.Appearance, null, null);
                    }

                });

            return UUID.Zero;
        }
예제 #6
0
        /// <summary>
        /// Event Handling routine for Attach Object
        /// </summary>
        /// <param name="remoteClient"></param>
        /// <param name="objectLocalID"></param>
        /// <param name="AttachmentPt"></param>
        /// <param name="rot"></param>
        protected internal void AttachObject(
            IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, bool appendMode, Quaternion rot, bool silent)
        {
            remoteClient.RunAttachmentOperation(() =>
                {
                    // If we can't take it, we can't attach it!
                    //
                    SceneObjectPart part = m_parentScene.GetSceneObjectPart(objectLocalID);
                    if (part == null)
                        return;

                    if (!m_parentScene.Permissions.CanTakeObject(part.ParentGroup.UUID, remoteClient.AgentId))
                        return;

                    SceneObjectGroup group = part.ParentGroup;
                    group.Rotation = rot;

                    AttachObject(remoteClient, objectLocalID, AttachmentPt, appendMode, false, AttachFlags.FromInWorld);

                    ScenePresence sp = m_parentScene.GetScenePresence(remoteClient.AgentId);
                    UUID itemID = group.GetFromItemID();
                    if (sp != null) sp.Appearance.SetAttachment((int)AttachmentPt, appendMode, itemID, UUID.Zero);
                });
        }