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); } }
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); } }