예제 #1
0
        public int llGetInventoryPermMask(IScriptInstance script, string name, int mask)
        {
            LLPrimitive prim = script.Host as LLPrimitive;

            if (prim == null)
            {
                return(0);
            }

            LLInventoryTaskItem found = prim.Inventory.FindItem(item => item.Name == name);

            if (found != null)
            {
                switch (mask)
                {
                case LSLConstants.MASK_BASE:
                    return((int)found.Permissions.BaseMask);

                case LSLConstants.MASK_OWNER:
                    return((int)found.Permissions.OwnerMask);

                case LSLConstants.MASK_GROUP:
                    return((int)found.Permissions.GroupMask);

                case LSLConstants.MASK_EVERYONE:
                    return((int)found.Permissions.EveryoneMask);

                case LSLConstants.MASK_NEXT:
                    return((int)found.Permissions.NextOwnerMask);
                }
            }

            return(0);
        }
예제 #2
0
파일: Prims.cs 프로젝트: jhurliman/simian
        /// <summary>
        /// Lookup a task inventory item AssetID by item name
        /// </summary>
        /// <param name="script">Calling script</param>
        /// <param name="name">Name of an inventory item</param>
        /// <returns>AssetID, or UUID.Zero if the item was not found in prim
        /// inventory</returns>
        private UUID InventoryKey(IScriptInstance script, string name)
        {
            if (script.Host is LLPrimitive)
            {
                PrimInventory inventory = ((LLPrimitive)script.Host).Inventory;

                LLInventoryTaskItem item = inventory.FindItem(delegate(LLInventoryTaskItem match) { return(match.Name == name); });
                if (item != null)
                {
                    return(item.AssetID);
                }
            }

            return(UUID.Zero);
        }
예제 #3
0
파일: Prims.cs 프로젝트: jhurliman/simian
        /// <summary>
        /// Lookup the given script's AssetID
        /// </summary>
        /// <param name="script">Calling script</param>
        /// <returns>AssetID, or UUID.Zero if something went wrong</returns>
        protected UUID InventorySelf(IScriptInstance script)
        {
            if (script.Host is LLPrimitive)
            {
                PrimInventory inventory = ((LLPrimitive)script.Host).Inventory;

                LLInventoryTaskItem item = inventory.FindItem(delegate(LLInventoryTaskItem match) { return(match.ID == script.ID); });
                if (item != null)
                {
                    return(item.AssetID);
                }
            }

            return(UUID.Zero);
        }
예제 #4
0
        private void UpdatePrimFlags(LLPrimitive obj)
        {
            IList <LLInventoryTaskItem> scripts = obj.Inventory.GetScripts();
            LSLEventFlags eventFlags            = 0;
            bool          hasCollisionEvents;
            bool          scripted = false;

            if (scripts.Count > 0)
            {
                scripted = true;

                // Aggregate LSLEventFlags for all of the running scripts in this prim
                lock (m_syncRoot)
                {
                    for (int i = 0; i < scripts.Count; i++)
                    {
                        LLInventoryTaskItem scriptItem = scripts[i];
                        LSLScriptInstance   script;

                        if (m_scripts.TryGetValue(scriptItem.ID, out script))
                        {
                            eventFlags |= script.GetEventsForState(script.State);
                        }
                    }
                }
            }

            PrimFlags oldFlags = obj.Prim.Flags;

            PrimFlags newFlags = oldFlags;

            newFlags &= ~(PrimFlags.Scripted | PrimFlags.Touch | PrimFlags.Money);
            if (scripted)
            {
                newFlags |= PrimFlags.Scripted;
            }
            newFlags |= LSLEventFlagsToPrimFlags(eventFlags, out hasCollisionEvents);

            // FIXME: Do something with hasCollisionEvents

            if (newFlags != oldFlags)
            {
                obj.Prim.Flags = newFlags;
                m_scene.EntityAddOrUpdate(this, obj, 0, (uint)LLUpdateFlags.PrimFlags);
            }
        }
예제 #5
0
        public int llGetInventoryType(IScriptInstance script, string name)
        {
            LLPrimitive prim = script.Host as LLPrimitive;

            if (prim == null)
            {
                return(LSLConstants.INVENTORY_NONE);
            }

            LLInventoryTaskItem found = prim.Inventory.FindItem(item => item.Name == name);

            if (found != null)
            {
                return((int)found.AssetType);
            }

            return(LSLConstants.INVENTORY_NONE);
        }
예제 #6
0
파일: Prims.cs 프로젝트: jhurliman/simian
        public string llGetScriptName(IScriptInstance script)
        {
            LLPrimitive prim = script.Host as LLPrimitive;

            if (prim == null)
            {
                return(String.Empty);
            }

            LLInventoryTaskItem scriptItem = prim.Inventory.FindItem(item => item.ID == script.ID);

            if (scriptItem != null)
            {
                return(scriptItem.Name);
            }

            return(String.Empty);
        }
예제 #7
0
        private void UpdateTaskInventoryHandler(Packet packet, LLAgent agent)
        {
            UpdateTaskInventoryPacket update = (UpdateTaskInventoryPacket)packet;

            LLInventoryTaskItem item;
            ISceneEntity targetObj;

            if (update.UpdateData.Key != 0)
            {
                m_log.Warn("Got an UpdateTaskInventory packet with a Key of " + update.UpdateData.Key);
                return;
            }

            if (m_scene.TryGetEntity(update.UpdateData.LocalID, out targetObj) && targetObj is LLPrimitive)
            {
                LLPrimitive targetPrim = (LLPrimitive)targetObj;

                // Updating an existing item in the task inventory
                if (targetPrim.Inventory.TryGetItem(update.InventoryData.ItemID, out item))
                {
                    if (update.InventoryData.TransactionID != UUID.Zero)
                        item.AssetID = UUID.Combine(update.InventoryData.TransactionID, agent.SecureSessionID);

                    item.Description = Utils.BytesToString(update.InventoryData.Description);
                    item.Flags = update.InventoryData.Flags;
                    item.GroupID = update.InventoryData.GroupID;
                    item.GroupOwned = update.InventoryData.GroupOwned;
                    item.Name = Utils.BytesToString(update.InventoryData.Name);
                    item.Permissions = new Permissions(update.InventoryData.BaseMask, update.InventoryData.EveryoneMask,
                        update.InventoryData.GroupMask, update.InventoryData.NextOwnerMask, update.InventoryData.OwnerMask);
                    item.SalePrice = update.InventoryData.SalePrice;
                    item.SaleType = (SaleType)update.InventoryData.SaleType;

                    targetPrim.Inventory.AddOrUpdateItem(item, true);
                    m_log.Debug(agent.Name + " updated task inventory item: " + item.Name);

                    SignalTaskInventoryChange(agent, targetPrim);
                }
                else if (m_inventory != null)
                {
                    // Copying from agent inventory to task inventory
                    InventoryBase obj;
                    if (m_inventory.TryGetInventory(agent.ID, update.InventoryData.ItemID, out obj))
                    {
                        if (obj is InventoryItem)
                        {
                            // Create a new item in the task inventory
                            LLInventoryItem fromItem = new LLInventoryItem((InventoryItem)obj);

                            item = new LLInventoryTaskItem();
                            //item.ID will be assigned in AddOrUpdateItem
                            item.AssetID = fromItem.AssetID;
                            item.ContentType = fromItem.ContentType;
                            item.CreationDate = fromItem.CreationDate;
                            item.CreatorID = fromItem.CreatorID;
                            item.Description = fromItem.Description;
                            item.Flags = fromItem.ExtraData["Flags"].AsUInteger();
                            item.GrantedPermissions = 0;
                            item.GroupID = fromItem.ExtraData["group_id"].AsUUID();
                            item.GroupOwned = fromItem.ExtraData["group_owned"].AsBoolean();
                            item.Name = fromItem.Name;
                            item.OwnerID = agent.ID;
                            item.ParentID = update.InventoryData.FolderID;
                            item.ParentObjectID = targetPrim.ID;
                            item.PermissionGranter = UUID.Zero;
                            item.Permissions = fromItem.Permissions;
                            item.SalePrice = fromItem.ExtraData["sale_price"].AsInteger();
                            item.SaleType = (SaleType)fromItem.ExtraData["sale_type"].AsInteger();

                            targetPrim.Inventory.AddOrUpdateItem(item, false);
                            m_log.Debug(agent.Name + " created new task inventory item: " + item.Name);

                            SignalTaskInventoryChange(agent, targetPrim);
                        }
                        else
                        {
                            m_log.Error("[TODO] Handle dropping folders in task inventory");
                        }
                    }
                    else
                    {
                        m_log.Warn(agent.Name + " sent an UpdateTaskInventory packet requesting unknown " +
                            "(or failed to fetch) inventory item " + update.InventoryData.ItemID);
                    }
                }
                else
                {
                    m_log.Warn(agent.Name + "attempted to copy inventory item " + update.InventoryData.ItemID +
                        " to task inventory, but we have no IInventoryClient");
                }
            }
            else
            {
                m_log.Warn(agent.Name + " attempted to update task inventory for prim " + update.UpdateData.LocalID +
                    " that does not exist in this scene");
            }
        }
예제 #8
0
        private void RezScriptHandler(Packet packet, LLAgent agent)
        {
            RezScriptPacket rez = (RezScriptPacket)packet;

            LLInventoryTaskItem scriptItem;
            ISceneEntity targetObj;

            if (m_scene.TryGetEntity(rez.UpdateBlock.ObjectLocalID, out targetObj) && targetObj is LLPrimitive)
            {
                LLPrimitive targetPrim = (LLPrimitive)targetObj;

                if (rez.InventoryBlock.ItemID != UUID.Zero)
                {
                    if (targetPrim.Inventory.TryGetItem(rez.InventoryBlock.ItemID, out scriptItem))
                    {
                        // Rezzing a script from task inventory
                        UUID assetID = UUID.Combine(rez.InventoryBlock.TransactionID, agent.SecureSessionID);

                        // Update task inventory with the new script source assetID
                        scriptItem.AssetID = assetID;
                        targetPrim.Inventory.AddOrUpdateItem(scriptItem, true);

                        // Run the script
                        if (m_scriptEngine != null)
                            m_scriptEngine.RezScript(scriptItem.ID, assetID, targetObj, 0);
                        else
                            m_log.Warn("Can't rez script in prim " + targetObj.ID + " without an ILSLScriptEngine");

                        SignalTaskInventoryChange(agent, targetPrim);
                    }
                    else if (m_inventory != null)
                    {
                        InventoryBase obj;
                        if (m_inventory.TryGetInventory(agent.ID, rez.InventoryBlock.ItemID, out obj) &&
                            obj is InventoryItem && ((InventoryItem)obj).ContentType == "application/vnd.ll.lsltext")
                        {
                            LLInventoryItem sourceItem = new LLInventoryItem((InventoryItem)obj);

                            // Rezzing a script from agent inventory
                            scriptItem = new LLInventoryTaskItem();
                            scriptItem.AssetID = sourceItem.AssetID;
                            scriptItem.ContentType = "application/vnd.ll.lsltext";
                            scriptItem.CreationDate = DateTime.UtcNow;
                            scriptItem.CreatorID = agent.ID;
                            scriptItem.Description = sourceItem.Description;
                            scriptItem.ID = UUID.Random();
                            scriptItem.Name = sourceItem.Name;
                            scriptItem.OwnerID = sourceItem.OwnerID;
                            scriptItem.ParentID = sourceItem.ParentID;
                            scriptItem.ParentObjectID = targetPrim.ID;

                            scriptItem.Flags = sourceItem.Flags;
                            scriptItem.GroupID = sourceItem.GroupID;
                            scriptItem.GroupOwned = sourceItem.GroupOwned;
                            scriptItem.Permissions = sourceItem.Permissions;
                            scriptItem.SalePrice = sourceItem.SalePrice;
                            scriptItem.SaleType = sourceItem.SaleType;

                            targetPrim.Inventory.AddOrUpdateItem(scriptItem, false);
                            m_log.Info(agent.Name + " copied agent inventory script to task inventory: " + scriptItem.Name);

                            // Run the script
                            if (m_scriptEngine != null)
                                m_scriptEngine.RezScript(scriptItem.ID, scriptItem.AssetID, targetObj, 0);
                            else
                                m_log.Warn("Can't rez script in prim " + targetObj.ID + " without an ILSLScriptEngine");

                            SignalTaskInventoryChange(agent, targetPrim);
                        }
                        else
                        {
                            m_log.Warn(agent.Name + " called RezScript for unknown inventory script " + rez.InventoryBlock.ItemID);
                        }
                    }
                    else
                    {
                        m_log.Warn(agent.Name + "attempted to copy (and rez) script " + rez.InventoryBlock.ItemID +
                            " to task inventory, but we have no IInventoryClient");
                    }
                }
                else
                {
                    // Rezzing a new script
                    scriptItem = new LLInventoryTaskItem();
                    scriptItem.AssetID = DEFAULT_SCRIPT;
                    scriptItem.ContentType = "application/vnd.ll.lsltext";
                    scriptItem.CreationDate = DateTime.UtcNow;
                    scriptItem.CreatorID = agent.ID;
                    scriptItem.Description = String.Empty;
                    scriptItem.ID = UUID.Random();
                    scriptItem.Name = "New script";
                    scriptItem.OwnerID = agent.ID;
                    scriptItem.ParentID = rez.InventoryBlock.FolderID;
                    scriptItem.ParentObjectID = targetPrim.ID;
                    scriptItem.Permissions = GetDefaultPermissions();
                    scriptItem.SalePrice = 10;
                    scriptItem.SaleType = SaleType.Not;

                    targetPrim.Inventory.AddOrUpdateItem(scriptItem, false);
                    m_log.Info(agent.Name + " created new task inventory script: " + scriptItem.Name);

                    // Run the script
                    if (m_scriptEngine != null)
                        m_scriptEngine.RezScript(scriptItem.ID, scriptItem.AssetID, targetObj, 0);
                    else
                        m_log.Warn("Can't rez script in prim " + targetObj.ID + " without an ILSLScriptEngine");

                    SignalTaskInventoryChange(agent, targetPrim);
                }
            }
            else
            {
                m_log.Warn(agent.Name + "sent a RezScript packet referencing unknown object " + rez.UpdateBlock.ObjectLocalID);
            }
        }
예제 #9
0
        private void RezScriptHandler(Packet packet, LLAgent agent)
        {
            RezScriptPacket rez = (RezScriptPacket)packet;

            LLInventoryTaskItem scriptItem;
            ISceneEntity        targetObj;

            if (m_scene.TryGetEntity(rez.UpdateBlock.ObjectLocalID, out targetObj) && targetObj is LLPrimitive)
            {
                LLPrimitive targetPrim = (LLPrimitive)targetObj;

                if (rez.InventoryBlock.ItemID != UUID.Zero)
                {
                    if (targetPrim.Inventory.TryGetItem(rez.InventoryBlock.ItemID, out scriptItem))
                    {
                        // Rezzing a script from task inventory
                        UUID assetID = UUID.Combine(rez.InventoryBlock.TransactionID, agent.SecureSessionID);

                        // Update task inventory with the new script source assetID
                        scriptItem.AssetID = assetID;
                        targetPrim.Inventory.AddOrUpdateItem(scriptItem, true);

                        // Run the script
                        if (m_scriptEngine != null)
                        {
                            m_scriptEngine.RezScript(scriptItem.ID, assetID, targetObj, 0);
                        }
                        else
                        {
                            m_log.Warn("Can't rez script in prim " + targetObj.ID + " without an ILSLScriptEngine");
                        }

                        SignalTaskInventoryChange(agent, targetPrim);
                    }
                    else if (m_inventory != null)
                    {
                        InventoryBase obj;
                        if (m_inventory.TryGetInventory(agent.ID, rez.InventoryBlock.ItemID, out obj) &&
                            obj is InventoryItem && ((InventoryItem)obj).ContentType == "application/vnd.ll.lsltext")
                        {
                            LLInventoryItem sourceItem = new LLInventoryItem((InventoryItem)obj);

                            // Rezzing a script from agent inventory
                            scriptItem                = new LLInventoryTaskItem();
                            scriptItem.AssetID        = sourceItem.AssetID;
                            scriptItem.ContentType    = "application/vnd.ll.lsltext";
                            scriptItem.CreationDate   = DateTime.UtcNow;
                            scriptItem.CreatorID      = agent.ID;
                            scriptItem.Description    = sourceItem.Description;
                            scriptItem.ID             = UUID.Random();
                            scriptItem.Name           = sourceItem.Name;
                            scriptItem.OwnerID        = sourceItem.OwnerID;
                            scriptItem.ParentID       = sourceItem.ParentID;
                            scriptItem.ParentObjectID = targetPrim.ID;

                            scriptItem.Flags       = sourceItem.Flags;
                            scriptItem.GroupID     = sourceItem.GroupID;
                            scriptItem.GroupOwned  = sourceItem.GroupOwned;
                            scriptItem.Permissions = sourceItem.Permissions;
                            scriptItem.SalePrice   = sourceItem.SalePrice;
                            scriptItem.SaleType    = sourceItem.SaleType;

                            targetPrim.Inventory.AddOrUpdateItem(scriptItem, false);
                            m_log.Info(agent.Name + " copied agent inventory script to task inventory: " + scriptItem.Name);

                            // Run the script
                            if (m_scriptEngine != null)
                            {
                                m_scriptEngine.RezScript(scriptItem.ID, scriptItem.AssetID, targetObj, 0);
                            }
                            else
                            {
                                m_log.Warn("Can't rez script in prim " + targetObj.ID + " without an ILSLScriptEngine");
                            }

                            SignalTaskInventoryChange(agent, targetPrim);
                        }
                        else
                        {
                            m_log.Warn(agent.Name + " called RezScript for unknown inventory script " + rez.InventoryBlock.ItemID);
                        }
                    }
                    else
                    {
                        m_log.Warn(agent.Name + "attempted to copy (and rez) script " + rez.InventoryBlock.ItemID +
                                   " to task inventory, but we have no IInventoryClient");
                    }
                }
                else
                {
                    // Rezzing a new script
                    scriptItem                = new LLInventoryTaskItem();
                    scriptItem.AssetID        = DEFAULT_SCRIPT;
                    scriptItem.ContentType    = "application/vnd.ll.lsltext";
                    scriptItem.CreationDate   = DateTime.UtcNow;
                    scriptItem.CreatorID      = agent.ID;
                    scriptItem.Description    = String.Empty;
                    scriptItem.ID             = UUID.Random();
                    scriptItem.Name           = "New script";
                    scriptItem.OwnerID        = agent.ID;
                    scriptItem.ParentID       = rez.InventoryBlock.FolderID;
                    scriptItem.ParentObjectID = targetPrim.ID;
                    scriptItem.Permissions    = GetDefaultPermissions();
                    scriptItem.SalePrice      = 10;
                    scriptItem.SaleType       = SaleType.Not;

                    targetPrim.Inventory.AddOrUpdateItem(scriptItem, false);
                    m_log.Info(agent.Name + " created new task inventory script: " + scriptItem.Name);

                    // Run the script
                    if (m_scriptEngine != null)
                    {
                        m_scriptEngine.RezScript(scriptItem.ID, scriptItem.AssetID, targetObj, 0);
                    }
                    else
                    {
                        m_log.Warn("Can't rez script in prim " + targetObj.ID + " without an ILSLScriptEngine");
                    }

                    SignalTaskInventoryChange(agent, targetPrim);
                }
            }
            else
            {
                m_log.Warn(agent.Name + "sent a RezScript packet referencing unknown object " + rez.UpdateBlock.ObjectLocalID);
            }
        }
예제 #10
0
        private void UpdateTaskInventoryHandler(Packet packet, LLAgent agent)
        {
            UpdateTaskInventoryPacket update = (UpdateTaskInventoryPacket)packet;

            LLInventoryTaskItem item;
            ISceneEntity        targetObj;

            if (update.UpdateData.Key != 0)
            {
                m_log.Warn("Got an UpdateTaskInventory packet with a Key of " + update.UpdateData.Key);
                return;
            }

            if (m_scene.TryGetEntity(update.UpdateData.LocalID, out targetObj) && targetObj is LLPrimitive)
            {
                LLPrimitive targetPrim = (LLPrimitive)targetObj;

                // Updating an existing item in the task inventory
                if (targetPrim.Inventory.TryGetItem(update.InventoryData.ItemID, out item))
                {
                    if (update.InventoryData.TransactionID != UUID.Zero)
                    {
                        item.AssetID = UUID.Combine(update.InventoryData.TransactionID, agent.SecureSessionID);
                    }

                    item.Description = Utils.BytesToString(update.InventoryData.Description);
                    item.Flags       = update.InventoryData.Flags;
                    item.GroupID     = update.InventoryData.GroupID;
                    item.GroupOwned  = update.InventoryData.GroupOwned;
                    item.Name        = Utils.BytesToString(update.InventoryData.Name);
                    item.Permissions = new Permissions(update.InventoryData.BaseMask, update.InventoryData.EveryoneMask,
                                                       update.InventoryData.GroupMask, update.InventoryData.NextOwnerMask, update.InventoryData.OwnerMask);
                    item.SalePrice = update.InventoryData.SalePrice;
                    item.SaleType  = (SaleType)update.InventoryData.SaleType;

                    targetPrim.Inventory.AddOrUpdateItem(item, true);
                    m_log.Debug(agent.Name + " updated task inventory item: " + item.Name);

                    SignalTaskInventoryChange(agent, targetPrim);
                }
                else if (m_inventory != null)
                {
                    // Copying from agent inventory to task inventory
                    InventoryBase obj;
                    if (m_inventory.TryGetInventory(agent.ID, update.InventoryData.ItemID, out obj))
                    {
                        if (obj is InventoryItem)
                        {
                            // Create a new item in the task inventory
                            LLInventoryItem fromItem = new LLInventoryItem((InventoryItem)obj);

                            item = new LLInventoryTaskItem();
                            //item.ID will be assigned in AddOrUpdateItem
                            item.AssetID            = fromItem.AssetID;
                            item.ContentType        = fromItem.ContentType;
                            item.CreationDate       = fromItem.CreationDate;
                            item.CreatorID          = fromItem.CreatorID;
                            item.Description        = fromItem.Description;
                            item.Flags              = fromItem.ExtraData["Flags"].AsUInteger();
                            item.GrantedPermissions = 0;
                            item.GroupID            = fromItem.ExtraData["group_id"].AsUUID();
                            item.GroupOwned         = fromItem.ExtraData["group_owned"].AsBoolean();
                            item.Name              = fromItem.Name;
                            item.OwnerID           = agent.ID;
                            item.ParentID          = update.InventoryData.FolderID;
                            item.ParentObjectID    = targetPrim.ID;
                            item.PermissionGranter = UUID.Zero;
                            item.Permissions       = fromItem.Permissions;
                            item.SalePrice         = fromItem.ExtraData["sale_price"].AsInteger();
                            item.SaleType          = (SaleType)fromItem.ExtraData["sale_type"].AsInteger();

                            targetPrim.Inventory.AddOrUpdateItem(item, false);
                            m_log.Debug(agent.Name + " created new task inventory item: " + item.Name);

                            SignalTaskInventoryChange(agent, targetPrim);
                        }
                        else
                        {
                            m_log.Error("[TODO] Handle dropping folders in task inventory");
                        }
                    }
                    else
                    {
                        m_log.Warn(agent.Name + " sent an UpdateTaskInventory packet requesting unknown " +
                                   "(or failed to fetch) inventory item " + update.InventoryData.ItemID);
                    }
                }
                else
                {
                    m_log.Warn(agent.Name + "attempted to copy inventory item " + update.InventoryData.ItemID +
                               " to task inventory, but we have no IInventoryClient");
                }
            }
            else
            {
                m_log.Warn(agent.Name + " attempted to update task inventory for prim " + update.UpdateData.LocalID +
                           " that does not exist in this scene");
            }
        }
예제 #11
0
파일: Prims.cs 프로젝트: jhurliman/simian
        private void RezObject(IScriptInstance script, string inventory, Vector3 position, Vector3 vel, Quaternion rot, int param, bool atRoot)
        {
            // TODO: Test to make sure this actually rezzes from the root, and get the atRoot param working

            // Can't do this without an IAssetClient
            if (m_assetClient == null)
            {
                return;
            }

            // Sanity check the input rotation
            if (Single.IsNaN(rot.X) || Single.IsNaN(rot.Y) || Single.IsNaN(rot.Z) || Single.IsNaN(rot.W))
            {
                return;
            }

            // Sanity check the distance, silently fail at > 10m
            float dist = Vector3.Distance(script.Host.ScenePosition, position);

            if (dist > 10.0f)
            {
                return;
            }

            if (script.Host is LLPrimitive)
            {
                LLPrimitive         obj  = (LLPrimitive)script.Host;
                LLInventoryTaskItem item = obj.Inventory.FindItem(delegate(LLInventoryTaskItem match) { return(match.Name == inventory); });

                if (item != null)
                {
                    // Make sure this is an object
                    if (item.InventoryType != InventoryType.Object)
                    {
                        llSay(script, 0, "Unable to create requested object. Object is missing from database.");
                        return;
                    }

                    // Fetch the serialized linkset asset
                    Asset linksetAsset;
                    if (!m_assetClient.TryGetAsset(item.AssetID, LLUtil.LLAssetTypeToContentType((int)AssetType.Object), out linksetAsset))
                    {
                        llSay(script, 0, "Unable to create requested object. Object is missing from database.");
                        return;
                    }

                    // Deserialize the asset to LLSD
                    OSDMap linksetMap = null;
                    try { linksetMap = OSDParser.Deserialize(linksetAsset.Data) as OSDMap; }
                    catch (Exception ex) { m_log.Error("Failed to deserialize linkset from asset " + linksetAsset.ID + ": " + ex.Message); }

                    if (linksetMap == null)
                    {
                        llSay(script, 0, "Unable to create requested object. Object is corrupted in database.");
                        return;
                    }

                    // Deserialize the linkset
                    IList <LLPrimitive> linkset = LLPrimitive.DeserializeLinkset(linksetMap, obj.Scene, m_primMesher, true);

                    Vector3    velocity = vel;
                    Quaternion rotation = rot;
                    float      velMag   = velocity.Length();
                    float      mass     = (float)llGetMass(script);

                    // Rez the parent(s) first
                    for (int i = 0; i < linkset.Count; i++)
                    {
                        LLPrimitive prim = linkset[i];
                        if (prim.Parent == null)
                        {
                            // Objects rezzed with this method are DieAtEdge by default
                            prim.Prim.Flags |= PrimFlags.DieAtEdge;

                            // Set the position, rotation and velocity of the root prim in the scene
                            prim.RelativePosition = position;
                            prim.RelativeRotation = rotation;
                            if (prim.Prim.Flags.HasFlag(PrimFlags.Physics))
                            {
                                prim.FallStart = Util.TickCount();
                                prim.Velocity  = velocity;
                            }

                            obj.Scene.EntityAddOrUpdate(this, prim, UpdateFlags.FullUpdate, 0);
                            m_log.Debug("Deserialized root prim " + prim.ID + " (" + prim.LocalID + ") from task inventory");
                        }
                    }

                    // Rez the children
                    for (int i = 0; i < linkset.Count; i++)
                    {
                        LLPrimitive prim = linkset[i];
                        if (prim.Parent != null)
                        {
                            obj.Scene.EntityAddOrUpdate(this, prim, UpdateFlags.FullUpdate, 0);
                        }
                    }

                    // FIXME: Post an object_rez event

                    if (obj.Prim.Flags.HasFlag(PrimFlags.Physics))
                    {
                        obj.FallStart = Util.TickCount();
                        // FIXME: Recoil
                        //llApplyImpulse(script, new lsl_vector(velocity.X * mass, velocity.Y * mass, velocity.Z * mass), 0);
                    }

                    // Variable script delay (http://wiki.secondlife.com/wiki/LSL_Delay)
                    script.AddSleepMS((int)((mass * velMag) * 0.1f));
                    script.AddSleepMS(200);
                }
                else
                {
                    llSay(script, 0, "Could not find object " + inventory);
                }
            }
        }