Ejemplo n.º 1
0
        /// <summary>
        ///     Remove an item from this prim's inventory
        /// </summary>
        /// <param name="itemID"></param>
        /// <returns>
        ///     Numeric asset type of the item removed.  Returns -1 if the item did not exist
        ///     in this prim's inventory.
        /// </returns>
        public int RemoveInventoryItem(UUID itemID)
        {
            TaskInventoryItem item = GetInventoryItem(itemID);

            if (item != null)
            {
                int type = m_items[itemID].InvType;
                if (type == 10) // Script
                {
                    m_part.RemoveScriptEvents(itemID);
                    m_part.ParentGroup.Scene.EventManager.TriggerRemoveScript(m_part.LocalId, itemID);
                }
                m_items.Remove(itemID);
                m_inventorySerial++;
                m_part.TriggerScriptChangedEvent(Changed.INVENTORY);

                HasInventoryChanged = true;

                if (!ContainsScripts())
                {
                    if (m_part.RemFlag(PrimFlags.Scripted))
                    {
                        m_part.ScheduleUpdate(PrimUpdateFlags.PrimFlags);
                    }
                }
                return(type);
            }

            return(-1);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Remove an item from this prim's inventory
        /// </summary>
        /// <param name="itemID"></param>
        /// <returns>Numeric asset type of the item removed.  Returns -1 if the item did not exist
        /// in this prim's inventory.</returns>
        public int RemoveInventoryItem(UUID itemID)
        {
            lock (m_items)
            {
                if (m_items.ContainsKey(itemID))
                {
                    int type = m_items[itemID].InvType;
                    if (type == 10) // Script
                    {
                        m_part.ParentGroup.Scene.EventManager.TriggerRemoveScript(m_part.LocalId, itemID);
                    }
                    m_items.Remove(itemID);
                    m_inventorySerial++;
                    m_part.TriggerScriptChangedEvent(Changed.INVENTORY);

                    HasInventoryChanged = true;
                    m_part.ParentGroup.HasGroupChanged = true;

                    int scriptcount = 0;
                    lock (m_items)
                    {
                        foreach (TaskInventoryItem item in m_items.Values)
                        {
                            if (item.Type == 10)
                            {
                                scriptcount++;
                            }
                        }
                    }

                    if (scriptcount <= 0)
                    {
                        m_part.RemFlag(PrimFlags.Scripted);
                    }

                    m_part.ScheduleFullUpdate();

                    return(type);
                }
                else
                {
                    m_log.ErrorFormat(
                        "[PRIM INVENTORY]: " +
                        "Tried to remove item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
                        itemID, m_part.Name, m_part.UUID);
                }
            }

            return(-1);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Remove an item from this prim's inventory
        /// </summary>
        /// <param name="itemID"></param>
        /// <returns>Numeric asset type of the item removed.  Returns -1 if the item did not exist
        /// in this prim's inventory.</returns>
        public int RemoveInventoryItem(UUID itemID)
        {
            TaskInventoryItem item = GetInventoryItem(itemID);

            if (item != null)
            {
                int type = m_items[itemID].InvType;
                if (type == 10) // Script
                {
                    m_part.RemoveScriptEvents(itemID);
                    m_part.ParentGroup.Scene.EventManager.TriggerRemoveScript(m_part.LocalId, itemID);
                }
                m_items.Remove(itemID);
                m_inventorySerial++;
                m_part.TriggerScriptChangedEvent(Changed.INVENTORY);

                HasInventoryChanged = true;
                m_part.ParentGroup.HasGroupChanged = true;

                if (!ContainsScripts())
                {
                    m_part.RemFlag(PrimFlags.Scripted);
                }

                m_part.ScheduleFullUpdate();

                return(type);
            }
            else
            {
                m_log.ErrorFormat(
                    "[PRIM INVENTORY]: " +
                    "Tried to remove item ID {0} from prim {1}, {2} at {3} in {4} but the item does not exist in this inventory",
                    itemID, m_part.Name, m_part.UUID,
                    m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName);
            }

            return(-1);
        }
        public void DetachSingleAttachmentToGround(IScenePresence sp, uint soLocalId)
        {
            if (!Enabled)
            {
                return;
            }

//            m_log.DebugFormat(
//                "[ATTACHMENTS MODULE]: DetachSingleAttachmentToGround() for {0}, object {1}",
//                sp.UUID, soLocalId);

            SceneObjectGroup so = m_scene.GetGroupByPrim(soLocalId);

            if (so == null)
            {
                return;
            }

            if (so.AttachedAvatar != sp.UUID)
            {
                return;
            }

            UUID inventoryID = so.GetFromItemID();

//            m_log.DebugFormat(
//                "[ATTACHMENTS MODULE]: In DetachSingleAttachmentToGround(), object is {0} {1}, associated item is {2}",
//                so.Name, so.LocalId, inventoryID);

            lock (sp.AttachmentsSyncLock)
            {
                if (!m_scene.Permissions.CanRezObject(
                        so.PrimCount, sp.UUID, sp.AbsolutePosition))
                {
                    return;
                }

                bool changed = sp.Appearance.DetachAttachment(inventoryID);
                if (changed && m_scene.AvatarFactory != null)
                {
                    m_scene.AvatarFactory.QueueAppearanceSave(sp.UUID);
                }

                sp.RemoveAttachment(so);

                SceneObjectPart rootPart = so.RootPart;
                rootPart.FromItemID = UUID.Zero;
                so.AbsolutePosition = sp.AbsolutePosition;
                so.AttachedAvatar   = UUID.Zero;
                rootPart.SetParentLocalId(0);
                so.ClearPartAttachmentData();
                rootPart.ApplyPhysics(rootPart.GetEffectiveObjectFlags(), rootPart.VolumeDetectActive);
                so.HasGroupChanged = true;
                rootPart.Rezzed    = DateTime.Now;
                rootPart.RemFlag(PrimFlags.TemporaryOnRez);
                so.AttachToBackup();
                m_scene.EventManager.TriggerParcelPrimCountTainted();
                rootPart.ScheduleFullUpdate();
                rootPart.ClearUndoState();

                List <UUID> uuids = new List <UUID>();
                uuids.Add(inventoryID);
                m_scene.InventoryService.DeleteItems(sp.UUID, uuids);
                sp.ControllingClient.SendRemoveInventoryItem(inventoryID);
            }

            m_scene.EventManager.TriggerOnAttach(so.LocalId, so.UUID, UUID.Zero);
        }