コード例 #1
0
        private void UpdateTaskInventoryItem(UpdateTaskInventory req, IAgent agent, ObjectPart part)
        {
            ObjectPartInventoryItem item;

            if (!CanEdit(agent, part.ObjectGroup, part.ObjectGroup.GlobalPosition))
            {
                return;
            }

            if (!part.Inventory.TryGetValue(req.ItemID, out item))
            {
                return;
            }

            if (req.TransactionID != UUID.Zero)
            {
                if (item.AssetType == AssetType.LSLText || item.AssetType == AssetType.LSLBytecode ||
                    item.InventoryType == InventoryType.LSL)
                {
                    /* do not allow editing scripts through this */
                    return;
                }

                /* asset upload follows */
                agent.SetAssetUploadAsCompletionAction(req.TransactionID, req.CircuitSceneID,
                                                       new UpdateTaskInventoryItemHandler {
                    Agent = agent, ItemID = req.ItemID, Part = part, Scene = this
                }.OnCompletion);
            }
            else
            {
                /* no asset upload */
                part.Inventory.Rename(req.Name, item.ID);
                item.Description = req.Description;
                if (agent.IsActiveGod)
                {
                    item.Permissions.Base      = req.BaseMask | InventoryPermissionsMask.Move;
                    item.Permissions.Current   = req.OwnerMask;
                    item.Permissions.EveryOne  = req.EveryoneMask;
                    item.Permissions.Group     = req.GroupMask;
                    item.Permissions.NextOwner = req.NextOwnerMask;
                }
                else if (part.Owner.EqualsGrid(agent.Owner))
                {
                    item.Permissions.EveryOne  = req.EveryoneMask & item.Permissions.Base;
                    item.Permissions.Group     = req.GroupMask & item.Permissions.Base;
                    item.Permissions.Current   = req.OwnerMask & item.Permissions.Base;
                    item.Permissions.NextOwner = req.OwnerMask & item.Permissions.Base;
                }
                Interlocked.Increment(ref part.Inventory.InventorySerial);
                part.SendObjectUpdate();
                SendObjectPropertiesToAgent(agent, part);
            }
        }
コード例 #2
0
        private void AddTaskInventoryItem(UpdateTaskInventory req, IAgent agent, ObjectPart part)
        {
            switch (req.InvType)
            {
            case InventoryType.Animation:
            case InventoryType.Attachable:
            case InventoryType.CallingCard:
            case InventoryType.Gesture:
            case InventoryType.Landmark:
            case InventoryType.Notecard:
            case InventoryType.Object:
            case InventoryType.Snapshot:
            case InventoryType.Sound:
            case InventoryType.Texture:
            case InventoryType.Wearable:
                break;

            default:
                /* do not allow anything else than the ones above */
                return;
            }

            switch (req.AssetType)
            {
            case AssetType.LSLText:
            case AssetType.LSLBytecode:
            case AssetType.Link:
            case AssetType.LinkFolder:
                /* no addition here of scripts, item links or folder links */
                return;

            default:
                break;
            }

            if (part.IsAllowedDrop)
            {
                /* llAllowInventoryDrop active, so we can drop anything except scripts */
            }
            else if (!CanEdit(agent, part.ObjectGroup, part.ObjectGroup.GlobalPosition))
            {
                /* not allowed */
                return;
            }

            InventoryItem agentItem;

            if (agent.InventoryService.Item.TryGetValue(agent.Owner.ID, req.ItemID, out agentItem) &&
                agentItem.AssetType == req.AssetType &&
                agentItem.InventoryType == req.InvType)
            {
                var item = new ObjectPartInventoryItem(UUID.Random, agentItem);
                AdjustPermissionsAccordingly(agent, part.Owner, item);
                item.LastOwner = item.Owner;
                item.Owner     = part.Owner;

                if (AssetService.Exists(agentItem.AssetID))
                {
                    /* no need for an assettransferer here */

                    if ((item.Permissions.Base & InventoryPermissionsMask.Transfer) == 0)
                    {
                        part.OwnerMask &= ~InventoryPermissionsMask.Transfer;
                    }

                    if (item.AssetType.IsNoCopyAffectingContainingObject() && (item.Permissions.Base & InventoryPermissionsMask.Copy) == 0)
                    {
                        part.OwnerMask &= ~InventoryPermissionsMask.Copy;
                    }

                    part.Inventory.Add(item);

                    part.SendObjectUpdate();

                    SendObjectPropertiesToAgent(agent, part);

                    if (agentItem.CheckPermissions(agent.Owner, agent.Group, InventoryPermissionsMask.Copy))
                    {
                        agent.InventoryService.Item.Delete(agent.Owner.ID, agentItem.ID);
                    }
                }
                else
                {
                    new AddToObjectTransferItem(agent, this, item.AssetID, part, item).QueueWorkItem();
                }
            }
        }