예제 #1
0
        private void StartScripts(LLPrimitive prim)
        {
            if (m_scriptEngine == null)
            {
                return;
            }

            IList <LLInventoryTaskItem> scriptItems = prim.Inventory.FindAllItems(item => item.AssetType == AssetType.LSLText);

            for (int i = 0; i < scriptItems.Count; i++)
            {
                LLInventoryItem item = scriptItems[i];
                m_scriptEngine.RezScript(item.ID, item.AssetID, prim, 0);
            }
        }
예제 #2
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);
            }
        }