/// <summary> /// Add a notecard item to the given part. /// </summary> /// <param name="assetService"></param> /// <param name="part"></param> /// <param name="itemName"></param> /// <param name="itemID"></param> /// <param name="assetID"></param> /// <param name="text">The tex to put in the notecard.</param> /// <returns>The item that was added</returns> public static TaskInventoryItem AddNotecard( IAssetService assetService, SceneObjectPart part, string itemName, UUID itemID, UUID assetID, string text) { AssetNotecard nc = new AssetNotecard(); nc.BodyText = text; nc.Encode(); AssetBase ncAsset = AssetHelpers.CreateAsset(assetID, AssetType.Notecard, nc.AssetData, UUID.Zero); assetService.Store(ncAsset); TaskInventoryItem ncItem = new TaskInventoryItem { Name = itemName, AssetID = assetID, ItemID = itemID, Type = (int)AssetType.Notecard, InvType = (int)InventoryType.Notecard }; part.Inventory.AddInventoryItem(ncItem, true); return(ncItem); }
public void TestMoveTaskInventoryItemNoParent() { TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); Scene scene = new SceneHelpers().SetupScene(); UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene); SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID); SceneObjectPart sop1 = sog1.RootPart; TaskInventoryItem sopItem1 = TaskInventoryHelpers.AddNotecard( scene, sop1, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900), "Hello World!"); // Perform test string message; scene.MoveTaskInventoryItem(user1.PrincipalID, UUID.Zero, sop1, sopItem1.ItemID, out message); InventoryItemBase ncUserItem = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, user1.PrincipalID, "Notecards/ncItem"); Assert.That(ncUserItem, Is.Not.Null, "Notecards/ncItem was not found"); }
/// <summary> /// Add an item to this prim's inventory. /// </summary> /// <param name="name">The name that the new item should have.</param> /// <param name="item"> /// The item itself. The name within this structure is ignored in favour of the name /// given in this method's arguments /// </param> /// <param name="allowedDrop"> /// Item was only added to inventory because AllowedDrop is set /// </param> protected void AddInventoryItem(string name, TaskInventoryItem item, bool allowedDrop) { name = FindAvailableInventoryName(name); if (name == String.Empty) { return; } item.ParentID = m_part.UUID; item.ParentPartID = m_part.UUID; item.Name = name; item.GroupID = m_part.GroupID; lock (m_itemsLock) { m_items.Add(item.ItemID, item); } m_part.TriggerScriptChangedEvent(allowedDrop ? Changed.ALLOWED_DROP : Changed.INVENTORY); m_inventorySerial++; //m_inventorySerial += 2; HasInventoryChanged = true; }
private void TestLoadedRegion(SceneObjectPart part1, string soundItemName, byte[] soundData) { SceneObjectPart object1PartLoaded = m_scene.GetSceneObjectPart(part1.Name); Assert.That(object1PartLoaded, Is.Not.Null, "object1 was not loaded"); Assert.That(object1PartLoaded.Name, Is.EqualTo(part1.Name), "object1 names not identical"); Assert.That(object1PartLoaded.GroupPosition, Is.EqualTo(part1.GroupPosition), "object1 group position not equal"); Assert.That( object1PartLoaded.RotationOffset, Is.EqualTo(part1.RotationOffset), "object1 rotation offset not equal"); Assert.That( object1PartLoaded.OffsetPosition, Is.EqualTo(part1.OffsetPosition), "object1 offset position not equal"); Assert.That(object1PartLoaded.SitTargetOrientation, Is.EqualTo(part1.SitTargetOrientation)); Assert.That(object1PartLoaded.SitTargetPosition, Is.EqualTo(part1.SitTargetPosition)); TaskInventoryItem loadedSoundItem = object1PartLoaded.Inventory.GetInventoryItems(soundItemName)[0]; Assert.That(loadedSoundItem, Is.Not.Null, "loaded sound item was null"); AssetBase loadedSoundAsset = m_scene.AssetService.Get(loadedSoundItem.AssetID.ToString()); Assert.That(loadedSoundAsset, Is.Not.Null, "loaded sound asset was null"); Assert.That(loadedSoundAsset.Data, Is.EqualTo(soundData), "saved and loaded sound data do not match"); Assert.Greater(m_scene.LandChannel.AllParcels().Count, 0, "incorrect number of parcels"); }
public void TestllCreateLink() { TestHelpers.InMethod(); UUID ownerId = TestHelpers.ParseTail(0x1); SceneObjectGroup grp1 = SceneHelpers.CreateSceneObject(2, ownerId, "grp1-", 0x10); grp1.AbsolutePosition = new Vector3(10, 10, 10); m_scene.AddSceneObject(grp1); // FIXME: This should really be a script item (with accompanying script) TaskInventoryItem grp1Item = TaskInventoryHelpers.AddNotecard( m_scene.AssetService, grp1.RootPart, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900), "Hello World!"); grp1Item.PermsMask |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; SceneObjectGroup grp2 = SceneHelpers.CreateSceneObject(2, ownerId, "grp2-", 0x20); grp2.AbsolutePosition = new Vector3(20, 20, 20); // <180,0,0> grp2.UpdateGroupRotationR(Quaternion.CreateFromEulers(180 * Utils.DEG_TO_RAD, 0, 0)); m_scene.AddSceneObject(grp2); LSL_Api apiGrp1 = new LSL_Api(); apiGrp1.Initialize(m_engine, grp1.RootPart, grp1Item, null); apiGrp1.llCreateLink(grp2.UUID.ToString(), ScriptBaseClass.TRUE); Assert.That(grp1.Parts.Length, Is.EqualTo(4)); Assert.That(grp2.IsDeleted, Is.True); }
public void Initialize(IScriptEngine scriptEngine, SceneObjectPart host, TaskInventoryItem item) { m_ScriptEngine = scriptEngine; m_host = host; m_osslconfig = m_ScriptEngine.ConfigSource.Configs["OSSL"]; if (m_osslconfig == null) { m_osslconfig = m_ScriptEngine.Config; } if (m_osslconfig.GetBoolean("AllowLightShareFunctions", false)) { m_LSFunctionsEnabled = true; } m_comms = m_ScriptEngine.World.RequestModuleInterface <IScriptModuleComms>(); if (m_comms == null) { m_LSFunctionsEnabled = false; } m_environment = m_ScriptEngine.World.RequestModuleInterface <IEnvironmentModule>(); }
/// <summary> /// Rez a script into a prim's inventory from another prim /// This is used for the LSL function llRemoteLoadScriptPin and requires a valid pin to be used /// </summary> /// <param name="srcId">The UUID of the script that is going to be copied</param> /// <param name="srcPart">The prim that the script that is going to be copied from</param> /// <param name="destId">The UUID of the prim that the </param> /// <param name="pin">The ScriptAccessPin of the prim</param> /// <param name="running">Whether the script should be running when it is started</param> /// <param name="start_param">The start param to pass to the script</param> public void RezScript (UUID srcId, ISceneChildEntity srcPart, UUID destId, int pin, int running, int start_param) { TaskInventoryItem srcTaskItem = srcPart.Inventory.GetInventoryItem(srcId); if (srcTaskItem == null) { MainConsole.Instance.ErrorFormat( "[PRIM INVENTORY]: Tried to retrieve item ID {0} from prim {1}, {2} for rezzing a script but the " + " item does not exist in this inventory", srcId, srcPart.Name, srcPart.UUID); return; } ISceneChildEntity destPart = m_scene.GetSceneObjectPart (destId); if (destPart == null) { MainConsole.Instance.ErrorFormat( "[PRIM INVENTORY]: " + "Could not find script for ID {0}", destId); return; } // Must own the object, and have modify rights if (srcPart.OwnerID != destPart.OwnerID) { // Group permissions if ((destPart.GroupID == UUID.Zero) || (destPart.GroupID != srcPart.GroupID) || ((destPart.GroupMask & (uint)PermissionMask.Modify) == 0)) return; } else { if ((destPart.OwnerMask & (uint)PermissionMask.Modify) == 0) return; } if (destPart.ScriptAccessPin != pin) { MainConsole.Instance.WarnFormat( "[PRIM INVENTORY]: " + "Script in object {0} : {1}, attempted to load script {2} : {3} into object {4} : {5} with invalid pin {6}", srcPart.Name, srcId, srcTaskItem.Name, srcTaskItem.ItemID, destPart.Name, destId, pin); // the LSL Wiki says we are supposed to shout on the DEBUG_CHANNEL - // "Object: Task Object trying to illegally load script onto task Other_Object!" // How do we shout from in here? return; } TaskInventoryItem destTaskItem = new TaskInventoryItem { ItemID = UUID.Random(), CreatorID = srcTaskItem.CreatorID, CreatorData = srcTaskItem.CreatorData, AssetID = srcTaskItem.AssetID, GroupID = destPart.GroupID, OwnerID = destPart.OwnerID, ParentID = destPart.UUID, ParentPartID = destPart.UUID, BasePermissions = srcTaskItem.BasePermissions, EveryonePermissions = srcTaskItem.EveryonePermissions, GroupPermissions = srcTaskItem.GroupPermissions, CurrentPermissions = srcTaskItem.CurrentPermissions, NextPermissions = srcTaskItem.NextPermissions, Flags = srcTaskItem.Flags, SalePrice = srcTaskItem.SalePrice, SaleType = srcTaskItem.SaleType }; if (destPart.OwnerID != srcPart.OwnerID) { if (m_scene.Permissions.PropagatePermissions()) { destTaskItem.CurrentPermissions = srcTaskItem.CurrentPermissions & srcTaskItem.NextPermissions; destTaskItem.GroupPermissions = srcTaskItem.GroupPermissions & srcTaskItem.NextPermissions; destTaskItem.EveryonePermissions = srcTaskItem.EveryonePermissions & srcTaskItem.NextPermissions; destTaskItem.BasePermissions = srcTaskItem.BasePermissions & srcTaskItem.NextPermissions; destTaskItem.CurrentPermissions |= 16; // Slam! } } destTaskItem.Description = srcTaskItem.Description; destTaskItem.Name = srcTaskItem.Name; destTaskItem.InvType = srcTaskItem.InvType; destTaskItem.Type = srcTaskItem.Type; destPart.Inventory.AddInventoryItemExclusive(destTaskItem, false); if (running > 0) destPart.Inventory.CreateScriptInstance(destTaskItem, start_param, false, StateSource.NewRez); IScenePresence avatar; if (m_scene.TryGetScenePresence(srcTaskItem.OwnerID, out avatar)) destPart.GetProperties(avatar.ControllingClient); }
/// <summary> /// Update an existing inventory item. /// </summary> /// <param name="item"> /// The updated item. An item with the same id must already exist /// in this prim's inventory. /// </param> /// <returns>false if the item did not exist, true if the update occurred successfully</returns> public bool UpdateInventoryItem(TaskInventoryItem item) { return(UpdateInventoryItem(item, true)); }
/// <summary> /// Rez an object into the scene from the user's inventory /// </summary> /// FIXME: It would be really nice if inventory access modules didn't also actually do the work of rezzing /// things to the scene. The caller should be doing that, I think. /// <param name="remoteClient"></param> /// <param name="itemID"></param> /// <param name="RayEnd"></param> /// <param name="RayStart"></param> /// <param name="RayTargetID"></param> /// <param name="BypassRayCast"></param> /// <param name="RayEndIsIntersection"></param> /// <param name="RezSelected"></param> /// <param name="RemoveItem"></param> /// <param name="fromTaskID"></param> /// <param name="attachment"></param> /// <returns>The SceneObjectGroup rezzed or null if rez was unsuccessful.</returns> public virtual SceneObjectGroup RezObject(IClientAPI remoteClient, UUID itemID, Vector3 RayEnd, Vector3 RayStart, UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, bool RezSelected, bool RemoveItem, UUID fromTaskID) { // Work out position details byte bRayEndIsIntersection = (byte)0; if (RayEndIsIntersection) { bRayEndIsIntersection = (byte)1; } else { bRayEndIsIntersection = (byte)0; } Vector3 scale = new Vector3(0.5f, 0.5f, 0.5f); Vector3 pos = m_scene.SceneGraph.GetNewRezLocation( RayStart, RayEnd, RayTargetID, Quaternion.Identity, BypassRayCast, bRayEndIsIntersection, true, scale, false); System.Xml.XmlDocument doc; InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); item = m_scene.InventoryService.GetItem(item); SceneObjectGroup group = CreateObjectFromInventory(item, remoteClient, itemID, out doc); if (doc == null) { //No asset, check task inventory IEntity e; m_scene.SceneGraph.TryGetEntity(fromTaskID, out e); if (e != null && e is SceneObjectGroup) { SceneObjectGroup grp = (SceneObjectGroup)e; TaskInventoryItem taskItem = grp.RootPart.Inventory.GetInventoryItem(itemID); item = new InventoryItemBase(); item.ID = UUID.Random(); item.CreatorId = taskItem.CreatorID.ToString(); item.Owner = remoteClient.AgentId; item.AssetID = taskItem.AssetID; item.Description = taskItem.Description; item.Name = taskItem.Name; item.AssetType = taskItem.Type; item.InvType = taskItem.InvType; item.Flags = taskItem.Flags; item.SalePrice = taskItem.SalePrice; item.SaleType = taskItem.SaleType; if (m_scene.Permissions.PropagatePermissions()) { item.BasePermissions = taskItem.BasePermissions & (taskItem.NextPermissions | (uint)PermissionMask.Move); if (taskItem.InvType == (int)InventoryType.Object) { item.CurrentPermissions = item.BasePermissions & (((taskItem.CurrentPermissions & 7) << 13) | (taskItem.CurrentPermissions & (uint)PermissionMask.Move)); } else { item.CurrentPermissions = item.BasePermissions & taskItem.CurrentPermissions; } item.CurrentPermissions |= 16; // Slam item.NextPermissions = taskItem.NextPermissions; item.EveryOnePermissions = taskItem.EveryonePermissions & (taskItem.NextPermissions | (uint)PermissionMask.Move); item.GroupPermissions = taskItem.GroupPermissions & taskItem.NextPermissions; } else { item.BasePermissions = taskItem.BasePermissions; item.CurrentPermissions = taskItem.CurrentPermissions; item.NextPermissions = taskItem.NextPermissions; item.EveryOnePermissions = taskItem.EveryonePermissions; item.GroupPermissions = taskItem.GroupPermissions; } group = CreateObjectFromInventory(item, remoteClient, itemID, out doc); } else { return(null); } } if (group == null && doc.FirstChild.OuterXml.StartsWith("<groups>")) { List <SceneObjectGroup> Groups = RezMultipleObjectsFromInventory(doc.FirstChild.ChildNodes, itemID, remoteClient, pos, RezSelected, item, RayTargetID, BypassRayCast, RayEndIsIntersection, RayEnd, RayStart, bRayEndIsIntersection); if (Groups.Count != 0) { return(Groups[0]); } else { return(null); } } string reason; if (!m_scene.Permissions.CanRezObject( group.ChildrenList.Count, remoteClient.AgentId, pos, out reason)) { // The client operates in no fail mode. It will // have already removed the item from the folder // if it's no copy. // Put it back if it's not an attachment // if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) { remoteClient.SendBulkUpdateInventory(item); } remoteClient.SendAlertMessage("You do not have permission to rez objects here."); return(null); } if (RezSelected) { group.RootPart.AddFlag(PrimFlags.CreateSelected); } // If we're rezzing an attachment then don't ask AddNewSceneObject() to update the client since // we'll be doing that later on. Scheduling more than one full update during the attachment // process causes some clients to fail to display the attachment properly. m_scene.SceneGraph.AddPrimToScene(group); // m_log.InfoFormat("ray end point for inventory rezz is {0} {1} {2} ", RayEnd.X, RayEnd.Y, RayEnd.Z); // Set it's position in world. float offsetHeight = 0; pos = m_scene.SceneGraph.GetNewRezLocation( RayStart, RayEnd, RayTargetID, Quaternion.Identity, BypassRayCast, bRayEndIsIntersection, true, group.GetAxisAlignedBoundingBox(out offsetHeight), false); pos.Z += offsetHeight; group.AbsolutePosition = pos; // m_log.InfoFormat("rezx point for inventory rezz is {0} {1} {2} and offsetheight was {3}", pos.X, pos.Y, pos.Z, offsetHeight); SceneObjectPart rootPart = (SceneObjectPart)group.GetChildPart(group.UUID); if (rootPart == null) { m_log.Error("[AGENT INVENTORY]: Error rezzing ItemID: " + itemID + " object has no rootpart."); return(null); } // Since renaming the item in the inventory does not affect the name stored // in the serialization, transfer the correct name from the inventory to the // object itself before we rez. rootPart.Name = item.Name; rootPart.Description = item.Description; List <SceneObjectPart> partList = new List <SceneObjectPart> (group.ChildrenList); group.SetGroup(remoteClient.ActiveGroupId, remoteClient); item.Owner = remoteClient.AgentId; if (rootPart.OwnerID != item.Owner) { //Need to kill the for sale here rootPart.ObjectSaleType = 0; rootPart.SalePrice = 10; if (m_scene.Permissions.PropagatePermissions()) { if ((item.CurrentPermissions & 8) != 0) { foreach (SceneObjectPart part in partList) { part.EveryoneMask = item.EveryOnePermissions; part.NextOwnerMask = item.NextPermissions; part.GroupMask = 0; // DO NOT propagate here } } group.ApplyNextOwnerPermissions(); } } foreach (SceneObjectPart part in partList) { if (part.OwnerID != item.Owner) { part.LastOwnerID = part.OwnerID; part.OwnerID = item.Owner; part.Inventory.ChangeInventoryOwner(item.Owner); } else if ((item.CurrentPermissions & 8) != 0) // Slam! { part.EveryoneMask = item.EveryOnePermissions; part.NextOwnerMask = item.NextPermissions; part.GroupMask = 0; // DO NOT propagate here } } rootPart.TrimPermissions(); if (group.RootPart.Shape.PCode == (byte)PCode.Prim) { group.ClearPartAttachmentData(); } // Fire on_rez group.CreateScriptInstances(0, true, 0, UUID.Zero); rootPart.ParentGroup.ResumeScripts(); group.ScheduleGroupUpdate(PrimUpdateFlags.FullUpdate); if (!m_scene.Permissions.BypassPermissions()) { if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) { List <UUID> uuids = new List <UUID> (); uuids.Add(item.ID); m_scene.InventoryService.DeleteItems(item.Owner, uuids); } } return(group); }
public void TriggerRezScripts(ISceneChildEntity part, TaskInventoryItem[] taskInventoryItem, int startParam, bool postOnRez, StateSource stateSource, UUID RezzedFrom, bool clearStateSaves) { NewRezScripts handlerRezScripts = OnRezScripts; if (handlerRezScripts != null) { foreach (NewRezScripts d in handlerRezScripts.GetInvocationList()) { try { d(part, taskInventoryItem, startParam, postOnRez, stateSource, RezzedFrom, clearStateSaves); } catch (Exception e) { MainConsole.Instance.ErrorFormat( "[EVENT MANAGER]: Delegate for TriggerRezScript failed - continuing. {0} {1}", e, e.StackTrace); } } } }
public void TestSaveOarV0_2() { TestHelper.InMethod(); //log4net.Config.XmlConfigurator.Configure(); SceneObjectPart part1 = CreateSceneObjectPart1(); SceneObjectGroup sog1 = new SceneObjectGroup(part1); m_scene.AddNewSceneObject(sog1, false); SceneObjectPart part2 = CreateSceneObjectPart2(); AssetNotecard nc = new AssetNotecard(); nc.BodyText = "Hello World!"; nc.Encode(); UUID ncAssetUuid = new UUID("00000000-0000-0000-1000-000000000000"); UUID ncItemUuid = new UUID("00000000-0000-0000-1100-000000000000"); AssetBase ncAsset = AssetHelpers.CreateAsset(ncAssetUuid, AssetType.Notecard, nc.AssetData, UUID.Zero); m_scene.AssetService.Store(ncAsset); SceneObjectGroup sog2 = new SceneObjectGroup(part2); TaskInventoryItem ncItem = new TaskInventoryItem { Name = "ncItem", AssetID = ncAssetUuid, ItemID = ncItemUuid }; part2.Inventory.AddInventoryItem(ncItem, true); m_scene.AddNewSceneObject(sog2, false); MemoryStream archiveWriteStream = new MemoryStream(); m_scene.EventManager.OnOarFileSaved += SaveCompleted; Guid requestId = new Guid("00000000-0000-0000-0000-808080808080"); lock (this) { m_archiverModule.ArchiveRegion(archiveWriteStream, requestId); //AssetServerBase assetServer = (AssetServerBase)scene.CommsManager.AssetCache.AssetServer; //while (assetServer.HasWaitingRequests()) // assetServer.ProcessNextRequest(); Monitor.Wait(this, 60000); } Assert.That(m_lastRequestId, Is.EqualTo(requestId)); byte[] archive = archiveWriteStream.ToArray(); MemoryStream archiveReadStream = new MemoryStream(archive); TarArchiveReader tar = new TarArchiveReader(archiveReadStream); bool gotControlFile = false; bool gotNcAssetFile = false; string expectedNcAssetFileName = string.Format("{0}_{1}", ncAssetUuid, "notecard.txt"); List <string> foundPaths = new List <string>(); List <string> expectedPaths = new List <string>(); expectedPaths.Add(ArchiveHelpers.CreateObjectPath(sog1)); expectedPaths.Add(ArchiveHelpers.CreateObjectPath(sog2)); string filePath; TarArchiveReader.TarEntryType tarEntryType; while (tar.ReadEntry(out filePath, out tarEntryType) != null) { if (ArchiveConstants.CONTROL_FILE_PATH == filePath) { gotControlFile = true; } else if (filePath.StartsWith(ArchiveConstants.ASSETS_PATH)) { string fileName = filePath.Remove(0, ArchiveConstants.ASSETS_PATH.Length); Assert.That(fileName, Is.EqualTo(expectedNcAssetFileName)); gotNcAssetFile = true; } else if (filePath.StartsWith(ArchiveConstants.OBJECTS_PATH)) { foundPaths.Add(filePath); } } Assert.That(gotControlFile, Is.True, "No control file in archive"); Assert.That(gotNcAssetFile, Is.True, "No notecard asset file in archive"); Assert.That(foundPaths, Is.EquivalentTo(expectedPaths)); // TODO: Test presence of more files and contents of files. }
/// <summary> /// Add an inventory item to a prim in this group. /// </summary> /// <param name="remoteClient"></param> /// <param name="localID"></param> /// <param name="item"></param> /// <param name="copyItemID">The item UUID that should be used by the new item.</param> /// <returns></returns> public bool AddInventoryItem(IClientAPI remoteClient, uint localID, InventoryItemBase item, UUID copyItemID) { UUID newItemId = (copyItemID != UUID.Zero) ? copyItemID : item.ID; SceneObjectPart part = GetChildPart(localID); if (part != null) { TaskInventoryItem taskItem = new TaskInventoryItem(); taskItem.ItemID = newItemId; taskItem.AssetID = item.AssetID; taskItem.Name = item.Name; taskItem.Description = item.Description; taskItem.OwnerID = part.OwnerID; // Transfer ownership taskItem.CreatorID = item.CreatorIdAsUuid; taskItem.Type = item.AssetType; taskItem.InvType = item.InvType; if (remoteClient != null && remoteClient.AgentId != part.OwnerID && m_scene.Permissions.PropagatePermissions()) { taskItem.BasePermissions = item.BasePermissions & item.NextPermissions; taskItem.CurrentPermissions = item.CurrentPermissions & item.NextPermissions; taskItem.EveryonePermissions = item.EveryOnePermissions & item.NextPermissions; taskItem.GroupPermissions = item.GroupPermissions & item.NextPermissions; taskItem.NextPermissions = item.NextPermissions; taskItem.CurrentPermissions |= 8; } else { taskItem.BasePermissions = item.BasePermissions; taskItem.CurrentPermissions = item.CurrentPermissions; taskItem.CurrentPermissions |= 8; taskItem.EveryonePermissions = item.EveryOnePermissions; taskItem.GroupPermissions = item.GroupPermissions; taskItem.NextPermissions = item.NextPermissions; } taskItem.Flags = item.Flags; // TODO: These are pending addition of those fields to TaskInventoryItem // taskItem.SalePrice = item.SalePrice; // taskItem.SaleType = item.SaleType; taskItem.CreationDate = (uint)item.CreationDate; bool addFromAllowedDrop = false; if (remoteClient != null) { addFromAllowedDrop = remoteClient.AgentId != part.OwnerID; } part.Inventory.AddInventoryItem(taskItem, addFromAllowedDrop); return(true); } else { m_log.ErrorFormat( "[PRIM INVENTORY]: " + "Couldn't find prim local ID {0} in group {1}, {2} to add inventory item ID {3}", localID, Name, UUID, newItemId); } return(false); }
private static void ProcessTIName(TaskInventoryItem item, XmlTextReader reader) { item.Name = reader.ReadElementContentAsString("Name", String.Empty); }
private static void ProcessTIOldItemID(TaskInventoryItem item, XmlTextReader reader) { //Disable this, if we are rezzing from inventory, we want to get a new ItemID for next time //item.OldItemID = ReadUUID (reader, "OldItemID"); ReadUUID(reader, "OldItemID"); }
private static void ProcessTIGroupID(TaskInventoryItem item, XmlTextReader reader) { item.GroupID = ReadUUID(reader, "GroupID"); }
private InventoryItemBase CreateAgentInventoryItemFromTask(Scene scene, UUID destAgent, SceneObjectPart part, UUID itemId) { TaskInventoryItem taskItem = part.Inventory.GetInventoryItem(itemId); if (null == taskItem) { m_log.ErrorFormat( "[PRIM INVENTORY]: Tried to retrieve item ID {0} from prim {1}, {2} for creating an avatar" + " inventory item from a prim's inventory item " + " but the required item does not exist in the prim's inventory", itemId, part.Name, part.UUID); return(null); } if ((destAgent != taskItem.OwnerID) && ((taskItem.CurrentPermissions & (uint)OpenSim.Framework.PermissionMask.Transfer) == 0)) { return(null); } InventoryItemBase agentItem = new InventoryItemBase(); agentItem.ID = UUID.Random(); agentItem.CreatorId = taskItem.CreatorID.ToString(); agentItem.CreatorData = taskItem.CreatorData; agentItem.Owner = destAgent; agentItem.AssetID = taskItem.AssetID; agentItem.Description = taskItem.Description; agentItem.Name = taskItem.Name; agentItem.AssetType = taskItem.Type; agentItem.InvType = taskItem.InvType; agentItem.Flags = taskItem.Flags; if ((part.OwnerID != destAgent) && scene.Permissions.PropagatePermissions()) { agentItem.BasePermissions = taskItem.BasePermissions & (taskItem.NextPermissions | (uint)OpenSim.Framework.PermissionMask.Move); if (taskItem.InvType == (int)InventoryType.Object) { agentItem.CurrentPermissions = agentItem.BasePermissions & (((taskItem.CurrentPermissions & 7) << 13) | (taskItem.CurrentPermissions & (uint)OpenSim.Framework.PermissionMask.Move)); } else { agentItem.CurrentPermissions = agentItem.BasePermissions & taskItem.CurrentPermissions; } agentItem.Flags |= (uint)InventoryItemFlags.ObjectSlamPerm; agentItem.NextPermissions = taskItem.NextPermissions; agentItem.EveryOnePermissions = taskItem.EveryonePermissions & (taskItem.NextPermissions | (uint)OpenSim.Framework.PermissionMask.Move); agentItem.GroupPermissions = taskItem.GroupPermissions & taskItem.NextPermissions; } else { agentItem.BasePermissions = taskItem.BasePermissions; agentItem.CurrentPermissions = taskItem.CurrentPermissions; agentItem.NextPermissions = taskItem.NextPermissions; agentItem.EveryOnePermissions = taskItem.EveryonePermissions; agentItem.GroupPermissions = taskItem.GroupPermissions; } return(agentItem); }
public InventoryItem(IScene rootScene, TaskInventoryItem internalItem) { m_rootScene = rootScene; m_privateItem = internalItem; }
private static void ProcessTIOwnerID(TaskInventoryItem item, XmlTextReader reader) { item.OwnerID = ReadUUID(reader, "OwnerID"); }
/// <summary> /// Add an inventory item to a prim in this group. /// </summary> /// <param name="remoteClient"></param> /// <param name="localID"></param> /// <param name="item"></param> /// <param name="copyItemID">The item UUID that should be used by the new item.</param> /// <returns></returns> public bool AddInventoryItem(IClientAPI remoteClient, uint localID, InventoryItemBase item, UUID copyItemID) { UUID newItemId = (copyItemID != UUID.Zero) ? copyItemID : item.ID; SceneObjectPart part = (SceneObjectPart)GetChildPart(localID); if (part != null) { TaskInventoryItem taskItem = new TaskInventoryItem { ItemID = newItemId, AssetID = item.AssetID, Name = item.Name, Description = item.Description, OwnerID = part.OwnerID, CreatorID = item.CreatorIdAsUuid, Type = item.AssetType, InvType = item.InvType }; // Transfer ownership if (remoteClient != null && remoteClient.AgentId != part.OwnerID && m_scene.Permissions.PropagatePermissions()) { taskItem.BasePermissions = item.BasePermissions & item.NextPermissions; taskItem.CurrentPermissions = item.CurrentPermissions & item.NextPermissions; taskItem.EveryonePermissions = item.EveryOnePermissions & item.NextPermissions; taskItem.GroupPermissions = item.GroupPermissions & item.NextPermissions; taskItem.NextPermissions = item.NextPermissions; // We're adding this to a prim we don't own. Force owner change taskItem.CurrentPermissions |= 16; } else { taskItem.BasePermissions = item.BasePermissions; taskItem.CurrentPermissions = item.CurrentPermissions; taskItem.EveryonePermissions = item.EveryOnePermissions; taskItem.GroupPermissions = item.GroupPermissions; taskItem.NextPermissions = item.NextPermissions; } taskItem.Flags = item.Flags; taskItem.SalePrice = item.SalePrice; taskItem.SaleType = item.SaleType; taskItem.CreationDate = (uint)item.CreationDate; bool addFromAllowedDrop = false; if (remoteClient != null) { addFromAllowedDrop = remoteClient.AgentId != part.OwnerID; } part.Inventory.AddInventoryItem(taskItem, addFromAllowedDrop); return(true); } MainConsole.Instance.ErrorFormat( "[PRIM INVENTORY]: " + "Couldn't find prim local ID {0} in group {1}, {2} to add inventory item ID {3}", localID, Name, UUID, newItemId); return(false); }
private static void ProcessTICurrentPermissions(TaskInventoryItem item, XmlTextReader reader) { item.CurrentPermissions = uint.Parse(reader.ReadElementContentAsString("CurrentPermissions", String.Empty)); }
private int llAttachToAvatarTemp(UUID host, UUID script, int attachmentPoint) { SceneObjectPart hostPart = m_scene.GetSceneObjectPart(host); if (hostPart == null) { return(0); } if (hostPart.ParentGroup.IsAttachment) { return(0); } IAttachmentsModule attachmentsModule = m_scene.RequestModuleInterface <IAttachmentsModule>(); if (attachmentsModule == null) { return(0); } TaskInventoryItem item = hostPart.Inventory.GetInventoryItem(script); if (item == null) { return(0); } if ((item.PermsMask & 32) == 0) // PERMISSION_ATTACH { return(0); } ScenePresence target; if (!m_scene.TryGetScenePresence(item.PermsGranter, out target)) { return(0); } if (target.UUID != hostPart.ParentGroup.OwnerID) { uint effectivePerms = hostPart.ParentGroup.GetEffectivePermissions(); if ((effectivePerms & (uint)PermissionMask.Transfer) == 0) { return(0); } hostPart.ParentGroup.SetOwnerId(target.UUID); hostPart.ParentGroup.SetRootPartOwner(hostPart.ParentGroup.RootPart, target.UUID, target.ControllingClient.ActiveGroupId); if (m_scene.Permissions.PropagatePermissions()) { foreach (SceneObjectPart child in hostPart.ParentGroup.Parts) { child.Inventory.ChangeInventoryOwner(target.UUID); child.TriggerScriptChangedEvent(Changed.OWNER); child.ApplyNextOwnerPermissions(); } } hostPart.ParentGroup.RootPart.ObjectSaleType = 0; hostPart.ParentGroup.RootPart.SalePrice = 10; hostPart.ParentGroup.HasGroupChanged = true; hostPart.ParentGroup.RootPart.SendPropertiesToClient(target.ControllingClient); hostPart.ParentGroup.RootPart.ScheduleFullUpdate(); } return(attachmentsModule.AttachObject(target, hostPart.ParentGroup, (uint)attachmentPoint, false, false, true) ? 1 : 0); }
private static void ProcessTIParentPartID(TaskInventoryItem item, XmlTextReader reader) { item.ParentPartID = ReadUUID(reader, "ParentPartID"); }
public SceneObjectGroup GetRezReadySceneObject(TaskInventoryItem item) { AssetBase rezAsset = m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString()); if (null == rezAsset) { m_log.WarnFormat( "[PRIM INVENTORY]: Could not find asset {0} for inventory item {1} in {2}", item.AssetID, item.Name, m_part.Name); return(null); } string xmlData = Utils.BytesToString(rezAsset.Data); SceneObjectGroup group = SceneObjectSerializer.FromOriginalXmlFormat(xmlData); group.ResetIDs(); SceneObjectPart rootPart = group.GetChildPart(group.UUID); // Since renaming the item in the inventory does not affect the name stored // in the serialization, transfer the correct name from the inventory to the // object itself before we rez. rootPart.Name = item.Name; rootPart.Description = item.Description; SceneObjectPart[] partList = group.Parts; group.SetGroup(m_part.GroupID, null); // TODO: Remove magic number badness if ((rootPart.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0 || (item.Flags & (uint)InventoryItemFlags.ObjectSlamPerm) != 0) // Magic number { if (m_part.ParentGroup.Scene.Permissions.PropagatePermissions()) { foreach (SceneObjectPart part in partList) { if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0) { part.EveryoneMask = item.EveryonePermissions; } if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0) { part.NextOwnerMask = item.NextPermissions; } if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteGroup) != 0) { part.GroupMask = item.GroupPermissions; } } group.ApplyNextOwnerPermissions(); } } foreach (SceneObjectPart part in partList) { // TODO: Remove magic number badness if ((part.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0 || (item.Flags & (uint)InventoryItemFlags.ObjectSlamPerm) != 0) // Magic number { part.LastOwnerID = part.OwnerID; part.OwnerID = item.OwnerID; part.Inventory.ChangeInventoryOwner(item.OwnerID); } if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0) { part.EveryoneMask = item.EveryonePermissions; } if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0) { part.NextOwnerMask = item.NextPermissions; } if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteGroup) != 0) { part.GroupMask = item.GroupPermissions; } } rootPart.TrimPermissions(); return(group); }
private static void ProcessTIPermsGranter(TaskInventoryItem item, XmlTextReader reader) { item.PermsGranter = ReadUUID(reader, "PermsGranter"); }
public bool BuyObject(IClientAPI remoteClient, UUID categoryID, uint localID, byte saleType, int salePrice) { ISceneChildEntity part = m_scene.GetSceneObjectPart(localID); if (part == null) { return(false); } if (part.ParentEntity == null) { return(false); } ISceneEntity group = part.ParentEntity; ILLClientInventory inventoryModule = m_scene.RequestModuleInterface <ILLClientInventory>(); switch (saleType) { case 1: // Sell as original (in-place sale) uint effectivePerms = group.GetEffectivePermissions(); if ((effectivePerms & (uint)PermissionMask.Transfer) == 0) { if (m_dialogModule != null) { m_dialogModule.SendAlertToUser(remoteClient, "This item doesn't appear to be for sale"); } return(false); } group.SetOwnerId(remoteClient.AgentId); group.SetRootPartOwner(part, remoteClient.AgentId, remoteClient.ActiveGroupId); if (m_scene.Permissions.PropagatePermissions()) { foreach (ISceneChildEntity child in group.ChildrenEntities()) { child.Inventory.ChangeInventoryOwner(remoteClient.AgentId); child.TriggerScriptChangedEvent(Changed.OWNER); child.ApplyNextOwnerPermissions(); } } part.ObjectSaleType = 0; part.SalePrice = 10; group.HasGroupChanged = true; part.GetProperties(remoteClient); part.TriggerScriptChangedEvent(Changed.OWNER); group.ResumeScripts(); part.ScheduleUpdate(PrimUpdateFlags.ForcedFullUpdate); break; case 2: // Sell a copy Vector3 inventoryStoredPosition = new Vector3 (((group.AbsolutePosition.X > m_scene.RegionInfo.RegionSizeX) ? m_scene.RegionInfo.RegionSizeX - 1 : group.AbsolutePosition.X) , (group.AbsolutePosition.X > m_scene.RegionInfo.RegionSizeY) ? m_scene.RegionInfo.RegionSizeY - 1 : group.AbsolutePosition.X, group.AbsolutePosition.Z); Vector3 originalPosition = group.AbsolutePosition; group.AbsolutePosition = inventoryStoredPosition; string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat((SceneObjectGroup)group); group.AbsolutePosition = originalPosition; uint perms = group.GetEffectivePermissions(); if ((perms & (uint)PermissionMask.Transfer) == 0) { if (m_dialogModule != null) { m_dialogModule.SendAlertToUser(remoteClient, "This item doesn't appear to be for sale"); } return(false); } AssetBase asset = new AssetBase(UUID.Random(), part.Name, AssetType.Object, group.OwnerID) { Description = part.Description, Data = Utils.StringToBytes(sceneObjectXml) }; asset.ID = m_scene.AssetService.Store(asset); InventoryItemBase item = new InventoryItemBase { CreatorId = part.CreatorID.ToString(), CreatorData = part.CreatorData, ID = UUID.Random(), Owner = remoteClient.AgentId, AssetID = asset.ID, Description = asset.Description, Name = asset.Name, AssetType = asset.Type, InvType = (int)InventoryType.Object, Folder = categoryID }; uint nextPerms = (perms & 7) << 13; if ((nextPerms & (uint)PermissionMask.Copy) == 0) { perms &= ~(uint)PermissionMask.Copy; } if ((nextPerms & (uint)PermissionMask.Transfer) == 0) { perms &= ~(uint)PermissionMask.Transfer; } if ((nextPerms & (uint)PermissionMask.Modify) == 0) { perms &= ~(uint)PermissionMask.Modify; } item.BasePermissions = perms & part.NextOwnerMask; item.CurrentPermissions = perms & part.NextOwnerMask; item.NextPermissions = part.NextOwnerMask; item.EveryOnePermissions = part.EveryoneMask & part.NextOwnerMask; item.GroupPermissions = part.GroupMask & part.NextOwnerMask; item.CurrentPermissions |= 16; // Slam! item.CreationDate = Util.UnixTimeSinceEpoch(); if (inventoryModule != null) { if (inventoryModule.AddInventoryItem(item)) { remoteClient.SendInventoryItemCreateUpdate(item, 0); } else { if (m_dialogModule != null) { m_dialogModule.SendAlertToUser(remoteClient, "Cannot buy now. Your inventory is unavailable"); } return(false); } } break; case 3: // Sell contents List <UUID> invList = part.Inventory.GetInventoryList(); #if (!ISWIN) bool okToSell = true; foreach (UUID invId in invList) { TaskInventoryItem item1 = part.Inventory.GetInventoryItem(invId); if ((item1.CurrentPermissions & (uint)PermissionMask.Transfer) == 0) { okToSell = false; break; } } #else bool okToSell = invList.Select(invID => part.Inventory.GetInventoryItem(invID)).All(item1 => (item1.CurrentPermissions & (uint)PermissionMask.Transfer) != 0); #endif if (!okToSell) { if (m_dialogModule != null) { m_dialogModule.SendAlertToUser( remoteClient, "This item's inventory doesn't appear to be for sale"); } return(false); } if (invList.Count > 0) { if (inventoryModule != null) { inventoryModule.MoveTaskInventoryItemsToUserInventory(remoteClient.AgentId, part.Name, part, invList); } } break; } return(true); }
private static void ProcessTIPermsMask(TaskInventoryItem item, XmlTextReader reader) { item.PermsMask = reader.ReadElementContentAsInt("PermsMask", String.Empty); }
/// <summary> /// Update an item in a prim (task) inventory. /// This method does not handle scripts, <see>RezScript(IClientAPI, UUID, unit)</see> /// </summary> /// <param name="remoteClient"></param> /// <param name="transactionID"></param> /// <param name="itemInfo"></param> /// <param name="primLocalID"></param> protected void UpdateTaskInventory(IClientAPI remoteClient, UUID transactionID, TaskInventoryItem itemInfo, uint primLocalID) { UUID itemID = itemInfo.ItemID; // Find the prim we're dealing with ISceneChildEntity part = m_scene.GetSceneObjectPart (primLocalID); if (part != null) { TaskInventoryItem currentItem = part.Inventory.GetInventoryItem(itemID); bool allowInventoryDrop = (part.GetEffectiveObjectFlags() & (uint)PrimFlags.AllowInventoryDrop) != 0; // Explicity allow anyone to add to the inventory if the // AllowInventoryDrop flag has been set. Don't however let // them update an item unless they pass the external checks // if (!m_scene.Permissions.CanEditObjectInventory(part.UUID, remoteClient.AgentId) && (currentItem != null || !allowInventoryDrop)) return; if (currentItem == null) { UUID copyID = UUID.Random(); if (itemID != UUID.Zero) { InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); item = m_scene.InventoryService.GetItem(item); // If we've found the item in the user's inventory or in the library if (item != null) { part.ParentEntity.AddInventoryItem (remoteClient, primLocalID, item, copyID); MainConsole.Instance.InfoFormat( "[PRIM INVENTORY]: Update with item {0} requested of prim {1} for {2}", item.Name, primLocalID, remoteClient.Name); part.GetProperties(remoteClient); if (!m_scene.Permissions.BypassPermissions()) { if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) { List<UUID> uuids = new List<UUID> {itemID}; RemoveInventoryItem(remoteClient, uuids); } } } else { MainConsole.Instance.ErrorFormat( "[PRIM INVENTORY]: Could not find inventory item {0} to update for {1}!", itemID, remoteClient.Name); } } } else // Updating existing item with new perms etc { // Base ALWAYS has move currentItem.BasePermissions |= (uint)PermissionMask.Move; // Check if we're allowed to mess with permissions if (!m_scene.Permissions.IsGod(remoteClient.AgentId)) // Not a god { if (remoteClient.AgentId != part.OwnerID) // Not owner { // Friends and group members can't change any perms itemInfo.BasePermissions = currentItem.BasePermissions; itemInfo.EveryonePermissions = currentItem.EveryonePermissions; itemInfo.GroupPermissions = currentItem.GroupPermissions; itemInfo.NextPermissions = currentItem.NextPermissions; itemInfo.CurrentPermissions = currentItem.CurrentPermissions; } else { // Owner can't change base, and can change other // only up to base itemInfo.BasePermissions = currentItem.BasePermissions; itemInfo.EveryonePermissions &= currentItem.BasePermissions; itemInfo.GroupPermissions &= currentItem.BasePermissions; itemInfo.CurrentPermissions &= currentItem.BasePermissions; itemInfo.NextPermissions &= currentItem.BasePermissions; } } // Next ALWAYS has move itemInfo.NextPermissions |= (uint)PermissionMask.Move; if (part.Inventory.UpdateInventoryItem(itemInfo)) { part.GetProperties(remoteClient); } } } else { MainConsole.Instance.WarnFormat( "[PRIM INVENTORY]: " + "Update with item {0} requested of prim {1} for {2} but this prim does not exist", itemID, primLocalID, remoteClient.Name); } }
private static void ProcessTIType(TaskInventoryItem item, XmlTextReader reader) { item.Type = reader.ReadElementContentAsInt("Type", String.Empty); }
/// <summary> /// Add an item to this prim's inventory. If an item with the same name already exists, then an alternative /// name is chosen. /// </summary> /// <param name="item"></param> public void AddInventoryItem(TaskInventoryItem item, bool allowedDrop) { AddInventoryItem(item.Name, item, allowedDrop); }
private static void ProcessTIOwnerChanged(TaskInventoryItem item, XmlTextReader reader) { item.OwnerChanged = reader.ReadElementContentAsBoolean("OwnerChanged", String.Empty); }
/// <summary> /// Start multiple scripts in the object /// </summary> /// <param name = "part"></param> /// <param name = "items"></param> /// <param name = "startParam"></param> /// <param name = "postOnRez"></param> /// <param name = "engine"></param> /// <param name = "stateSource"></param> /// <param name = "RezzedFrom"></param> public void rez_scripts(ISceneChildEntity part, TaskInventoryItem[] items, int startParam, bool postOnRez, StateSource stateSource, UUID RezzedFrom) { #if (!ISWIN) List<LUStruct> ItemsToStart = new List<LUStruct>(); foreach (TaskInventoryItem item in items) { LUStruct itemToQueue = m_scriptEngine.StartScript(part, item.ItemID, startParam, postOnRez, stateSource, RezzedFrom); if (itemToQueue.Action != LUType.Unknown) ItemsToStart.Add(itemToQueue); } #else List<LUStruct> ItemsToStart = items.Select(item => m_scriptEngine.StartScript(part, item.ItemID, startParam, postOnRez, stateSource, RezzedFrom)).Where(itemToQueue => itemToQueue.Action != LUType.Unknown).ToList(); #endif if (ItemsToStart.Count != 0) m_scriptEngine.MaintenanceThread.AddScriptChange(ItemsToStart.ToArray(), LoadPriority.FirstStart); }
private static TaskInventoryDictionary ReadTaskInventory(XmlTextReader reader, string name) { TaskInventoryDictionary tinv = new TaskInventoryDictionary(); reader.ReadStartElement(name, String.Empty); if (reader.IsEmptyElement) { reader.Read(); return tinv; } while (reader.Name == "TaskInventoryItem") { reader.ReadStartElement("TaskInventoryItem", String.Empty); // TaskInventory TaskInventoryItem item = new TaskInventoryItem(); while (reader.NodeType != XmlNodeType.EndElement) { TaskInventoryXmlProcessor p = null; try { if (m_TaskInventoryXmlProcessors.TryGetValue(reader.Name, out p)) p(item, reader); else { //MainConsole.Instance.DebugFormat("[SceneObjectSerializer]: caught unknown element in TaskInventory {0}, {1}", reader.Name, reader.Value); reader.ReadOuterXml(); } } catch (Exception e) { MainConsole.Instance.DebugFormat("[SceneObjectSerializer]: exception while parsing Inventory Items {0}: {1}", reader.Name, e); } } reader.ReadEndElement(); // TaskInventoryItem tinv.Add(item.ItemID, item); } if (reader.NodeType == XmlNodeType.EndElement) reader.ReadEndElement(); // TaskInventory return tinv; }
public bool BuyObject(IClientAPI remoteClient, UUID categoryID, uint localID, byte saleType, int salePrice) { SceneObjectPart part = m_scene.GetSceneObjectPart(localID); if (part == null) { return(false); } SceneObjectGroup group = part.ParentGroup; if (group == null || group.IsDeleted || group.inTransit) { return(false); } // make sure we are not buying a child part part = group.RootPart; switch (saleType) { case 1: // Sell as original (in-place sale) uint effectivePerms = group.EffectiveOwnerPerms; if ((effectivePerms & (uint)PermissionMask.Transfer) == 0) { if (m_dialogModule != null) { m_dialogModule.SendAlertToUser(remoteClient, "This item doesn't appear to be for sale"); } return(false); } group.SetOwner(remoteClient.AgentId, remoteClient.ActiveGroupId); if (m_scene.Permissions.PropagatePermissions()) { foreach (SceneObjectPart child in group.Parts) { child.Inventory.ChangeInventoryOwner(remoteClient.AgentId); child.TriggerScriptChangedEvent(Changed.OWNER); child.ApplyNextOwnerPermissions(); } group.InvalidateDeepEffectivePerms(); } part.ObjectSaleType = 0; part.SalePrice = 10; part.ClickAction = Convert.ToByte(0); group.HasGroupChanged = true; part.SendPropertiesToClient(remoteClient); part.TriggerScriptChangedEvent(Changed.OWNER); group.ResumeScripts(); part.ScheduleFullUpdate(); break; case 2: // Sell a copy uint perms = group.EffectiveOwnerPerms; if ((perms & (uint)PermissionMask.Transfer) == 0) { if (m_dialogModule != null) { m_dialogModule.SendAlertToUser(remoteClient, "This item doesn't appear to be for sale"); } return(false); } if ((perms & (uint)PermissionMask.Copy) == 0) { if (m_dialogModule != null) { m_dialogModule.SendAlertToUser(remoteClient, "This sale has been blocked by the permissions system"); } return(false); } string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(group); AssetBase asset = m_scene.CreateAsset( group.GetPartName(localID), group.GetPartDescription(localID), (sbyte)AssetType.Object, Utils.StringToBytes(sceneObjectXml), group.OwnerID); m_scene.AssetService.Store(asset); InventoryItemBase item = new InventoryItemBase(); item.CreatorId = part.CreatorID.ToString(); item.CreatorData = part.CreatorData; item.ID = UUID.Random(); item.Owner = remoteClient.AgentId; item.AssetID = asset.FullID; item.Description = asset.Description; item.Name = asset.Name; item.AssetType = asset.Type; item.InvType = (int)InventoryType.Object; item.Folder = categoryID; perms = group.CurrentAndFoldedNextPermissions(); // apply parts inventory next perms PermissionsUtil.ApplyNoModFoldedPermissions(perms, ref perms); // change to next owner perms perms &= part.NextOwnerMask; // update folded perms = PermissionsUtil.FixAndFoldPermissions(perms); item.BasePermissions = perms; item.CurrentPermissions = perms; item.NextPermissions = part.NextOwnerMask & perms; item.EveryOnePermissions = part.EveryoneMask & perms; item.GroupPermissions = part.GroupMask & perms; item.Flags |= (uint)InventoryItemFlags.ObjectSlamPerm; item.CreationDate = Util.UnixTimeSinceEpoch(); if (m_scene.AddInventoryItem(item)) { remoteClient.SendInventoryItemCreateUpdate(item, 0); } else { if (m_dialogModule != null) { m_dialogModule.SendAlertToUser(remoteClient, "Cannot buy now. Your inventory is unavailable"); } return(false); } break; case 3: // Sell contents List <UUID> invList = part.Inventory.GetInventoryList(); bool okToSell = true; foreach (UUID invID in invList) { TaskInventoryItem item1 = part.Inventory.GetInventoryItem(invID); if ((item1.CurrentPermissions & (uint)PermissionMask.Transfer) == 0) { okToSell = false; break; } } if (!okToSell) { if (m_dialogModule != null) { m_dialogModule.SendAlertToUser( remoteClient, "This item's inventory doesn't appear to be for sale"); } return(false); } if (invList.Count > 0) { m_scene.MoveTaskInventoryItems(remoteClient.AgentId, part.Name, part, invList); } break; } return(true); }
/// <summary> /// Add an item to this prim's inventory. /// </summary> /// <param name="name">The name that the new item should have.</param> /// <param name="item"> /// The item itself. The name within this structure is ignored in favour of the name /// given in this method's arguments /// </param> /// <param name="allowedDrop"> /// Item was only added to inventory because AllowedDrop is set /// </param> protected void AddInventoryItem(string name, TaskInventoryItem item, bool allowedDrop) { name = FindAvailableInventoryName(name); if (name == String.Empty) return; item.ParentID = m_part.UUID; item.ParentPartID = m_part.UUID; item.Name = name; item.GroupID = m_part.GroupID; lock (m_itemsLock) { m_items.Add (item.ItemID, item); } m_part.TriggerScriptChangedEvent(allowedDrop ? Changed.ALLOWED_DROP : Changed.INVENTORY); m_inventorySerial++; //m_inventorySerial += 2; HasInventoryChanged = true; }
public void TestScriptCrossOnSameSimulator() { TestHelpers.InMethod(); // TestHelpers.EnableLogging(); UUID userId = TestHelpers.ParseTail(0x1); int sceneObjectIdTail = 0x2; EntityTransferModule etmA = new EntityTransferModule(); EntityTransferModule etmB = new EntityTransferModule(); LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); XEngine xEngineA = new XEngine(); XEngine xEngineB = new XEngine(); xEngineA.DebugLevel = 1; xEngineB.DebugLevel = 1; IConfigSource configSource = new IniConfigSource(); IConfig startupConfig = configSource.AddConfig("Startup"); startupConfig.Set("DefaultScriptEngine", "XEngine"); startupConfig.Set("TrustBinaries", "true"); IConfig xEngineConfig = configSource.AddConfig("XEngine"); xEngineConfig.Set("Enabled", "true"); xEngineConfig.Set("StartDelay", "0"); // These tests will not run with AppDomainLoading = true, at least on mono. For unknown reasons, the call // to AssemblyResolver.OnAssemblyResolve fails. xEngineConfig.Set("AppDomainLoading", "false"); IConfig modulesConfig = configSource.AddConfig("Modules"); modulesConfig.Set("EntityTransferModule", etmA.Name); modulesConfig.Set("SimulationServices", lscm.Name); SceneHelpers sh = new SceneHelpers(); TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000, configSource); TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1000, 999, configSource); SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, configSource, lscm); SceneHelpers.SetupSceneModules(sceneA, configSource, etmA, xEngineA); SceneHelpers.SetupSceneModules(sceneB, configSource, etmB, xEngineB); sceneA.StartScripts(); sceneB.StartScripts(); SceneObjectGroup soSceneA = SceneHelpers.AddSceneObject(sceneA, 1, userId, "so1-", sceneObjectIdTail); soSceneA.AbsolutePosition = new Vector3(128, 10, 20); string soSceneAName = soSceneA.Name; string scriptItemSceneAName = "script1"; // CREATE SCRIPT TODO InventoryItemBase scriptItemSceneA = new InventoryItemBase(); // itemTemplate.ID = itemId; scriptItemSceneA.Name = scriptItemSceneAName; scriptItemSceneA.Folder = soSceneA.UUID; scriptItemSceneA.InvType = (int)InventoryType.LSL; AutoResetEvent chatEvent = new AutoResetEvent(false); OSChatMessage messageReceived = null; sceneA.EventManager.OnChatFromWorld += (s, m) => { messageReceived = m; chatEvent.Set(); }; sceneA.RezNewScript(userId, scriptItemSceneA, @"integer c = 0; default { state_entry() { llSay(0, ""Script running""); } changed(integer change) { llSay(0, ""Changed""); } touch_start(integer n) { c = c + 1; llSay(0, (string)c); } }"); chatEvent.WaitOne(60000); Assert.That(messageReceived, Is.Not.Null, "No chat message received."); Assert.That(messageReceived.Message, Is.EqualTo("Script running")); { // XXX: Should not be doing this so directly. Should call some variant of EventManager.touch() instead. DetectParams[] det = new DetectParams[1]; det[0] = new DetectParams(); det[0].Key = userId; det[0].Populate(sceneA); EventParams ep = new EventParams("touch_start", new Object[] { new LSL_Types.LSLInteger(1) }, det); messageReceived = null; chatEvent.Reset(); xEngineA.PostObjectEvent(soSceneA.LocalId, ep); chatEvent.WaitOne(60000); Assert.That(messageReceived.Message, Is.EqualTo("1")); } AutoResetEvent chatEventB = new AutoResetEvent(false); sceneB.EventManager.OnChatFromWorld += (s, m) => { messageReceived = m; chatEventB.Set(); }; messageReceived = null; chatEventB.Reset(); // Cross with a negative value soSceneA.AbsolutePosition = new Vector3(128, -10, 20); chatEventB.WaitOne(60000); Assert.That(messageReceived, Is.Not.Null, "No Changed message received."); Assert.That(messageReceived.Message, Is.Not.Null, "Changed message without content"); Assert.That(messageReceived.Message, Is.EqualTo("Changed")); // TEST sending event to moved prim and output { SceneObjectGroup soSceneB = sceneB.GetSceneObjectGroup(soSceneAName); TaskInventoryItem scriptItemSceneB = soSceneB.RootPart.Inventory.GetInventoryItem(scriptItemSceneAName); // XXX: Should not be doing this so directly. Should call some variant of EventManager.touch() instead. DetectParams[] det = new DetectParams[1]; det[0] = new DetectParams(); det[0].Key = userId; det[0].Populate(sceneB); EventParams ep = new EventParams("touch_start", new Object[] { new LSL_Types.LSLInteger(1) }, det); messageReceived = null; chatEventB.Reset(); xEngineB.PostObjectEvent(soSceneB.LocalId, ep); chatEventB.WaitOne(60000); Assert.That(messageReceived.Message, Is.EqualTo("2")); } }
private void ResumeScript(TaskInventoryItem item) { IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces<IScriptModule>(); if (engines == null) return; foreach (IScriptModule engine in engines) { if (engine != null) { engine.ResumeScript(item.ItemID); if (item.OwnerChanged) engine.PostScriptEvent(item.ItemID, m_part.UUID, "changed", new Object[] { (int)Changed.OWNER }); item.OwnerChanged = false; } } }
public void TestLlRequestAgentDataOnline() { TestHelpers.InMethod(); // TestHelpers.EnableLogging(); UUID userId = TestHelpers.ParseTail(0x1); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(m_scene, userId); SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene).RootPart; TaskInventoryItem scriptItem = TaskInventoryHelpers.AddScript(m_scene.AssetService, part); LSL_Api apiGrp1 = new LSL_Api(); apiGrp1.Initialize(m_engine, part, scriptItem); // Initially long timeout to test cache apiGrp1.LlRequestAgentDataCacheTimeoutMs = 20000; // Offline test { apiGrp1.llRequestAgentData(userId.ToString(), ScriptBaseClass.DATA_ONLINE); Assert.That(m_engine.PostedEvents.ContainsKey(scriptItem.ItemID)); List <EventParams> events = m_engine.PostedEvents[scriptItem.ItemID]; Assert.That(events.Count, Is.EqualTo(1)); EventParams eventParams = events[0]; Assert.That(eventParams.EventName, Is.EqualTo("dataserver")); string data = eventParams.Params[1].ToString(); Assert.AreEqual(0, int.Parse(data)); m_engine.PostedEvents.Clear(); } // Online test. Should get the 'wrong' result because of caching. ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, ua1); { apiGrp1.llRequestAgentData(userId.ToString(), ScriptBaseClass.DATA_ONLINE); Assert.That(m_engine.PostedEvents.ContainsKey(scriptItem.ItemID)); List <EventParams> events = m_engine.PostedEvents[scriptItem.ItemID]; Assert.That(events.Count, Is.EqualTo(1)); EventParams eventParams = events[0]; Assert.That(eventParams.EventName, Is.EqualTo("dataserver")); string data = eventParams.Params[1].ToString(); Assert.AreEqual(0, int.Parse(data)); m_engine.PostedEvents.Clear(); } apiGrp1.LlRequestAgentDataCacheTimeoutMs = 20; // Make absolutely sure that we should trigger cache timeout. Thread.Sleep(apiGrp1.LlRequestAgentDataCacheTimeoutMs + 50); { apiGrp1.llRequestAgentData(userId.ToString(), ScriptBaseClass.DATA_ONLINE); Assert.That(m_engine.PostedEvents.ContainsKey(scriptItem.ItemID)); List <EventParams> events = m_engine.PostedEvents[scriptItem.ItemID]; Assert.That(events.Count, Is.EqualTo(1)); EventParams eventParams = events[0]; Assert.That(eventParams.EventName, Is.EqualTo("dataserver")); string data = eventParams.Params[1].ToString(); Assert.AreEqual(1, int.Parse(data)); m_engine.PostedEvents.Clear(); } m_scene.CloseAgent(userId, false); Thread.Sleep(apiGrp1.LlRequestAgentDataCacheTimeoutMs + 50); { apiGrp1.llRequestAgentData(userId.ToString(), ScriptBaseClass.DATA_ONLINE); Assert.That(m_engine.PostedEvents.ContainsKey(scriptItem.ItemID)); List <EventParams> events = m_engine.PostedEvents[scriptItem.ItemID]; Assert.That(events.Count, Is.EqualTo(1)); EventParams eventParams = events[0]; Assert.That(eventParams.EventName, Is.EqualTo("dataserver")); string data = eventParams.Params[1].ToString(); Assert.AreEqual(0, int.Parse(data)); m_engine.PostedEvents.Clear(); } }
/// <summary> /// Add an item to this prim's inventory. If an item with the same name already exists, then an alternative /// name is chosen. /// </summary> /// <param name="item"></param> /// <param name="allowedDrop"></param> public void AddInventoryItem(TaskInventoryItem item, bool allowedDrop) { AddInventoryItem(item.Name, item, allowedDrop); }
// This needs ThreatLevel high. It is an excellent griefer tool, // In a loop, it can cause asset bloat and DOS levels of asset // writes. // public void osMakeNotecard(string notecardName, LSL_List contents) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.High, "osMakeNotecard", m_host, "OSSL", m_itemID)) return; // Create new asset AssetBase asset = new AssetBase(UUID.Random(), notecardName, AssetType.Notecard, m_host.OwnerID) { Description = "Script Generated Notecard" }; string notecardData = String.Empty; for (int i = 0; i < contents.Length; i++) { notecardData += contents.GetLSLStringItem(i) + "\n"; } int textLength = notecardData.Length; notecardData = "Linden text version 2\n{\nLLEmbeddedItems version 1\n{\ncount 0\n}\nText length " + textLength.ToString(CultureInfo.InvariantCulture) + "\n" + notecardData + "}\n"; asset.Data = Util.UTF8.GetBytes(notecardData); asset.FillHash(); asset.ID = World.AssetService.Store(asset); // Create Task Entry TaskInventoryItem taskItem = new TaskInventoryItem(); taskItem.ResetIDs(m_host.UUID); taskItem.ParentID = m_host.UUID; taskItem.CreationDate = (uint)Util.UnixTimeSinceEpoch(); taskItem.Name = asset.Name; taskItem.Description = asset.Description; taskItem.Type = (int)AssetType.Notecard; taskItem.InvType = (int)InventoryType.Notecard; taskItem.OwnerID = m_host.OwnerID; taskItem.CreatorID = m_host.OwnerID; taskItem.BasePermissions = (uint)PermissionMask.All; taskItem.CurrentPermissions = (uint)PermissionMask.All; taskItem.EveryonePermissions = 0; taskItem.NextPermissions = (uint)PermissionMask.All; taskItem.GroupID = m_host.GroupID; taskItem.GroupPermissions = 0; taskItem.Flags = 0; taskItem.SalePrice = 0; taskItem.SaleType = 0; taskItem.PermsGranter = UUID.Zero; taskItem.PermsMask = 0; taskItem.AssetID = asset.ID; m_host.Inventory.AddInventoryItem(taskItem, false); }
/// <summary> /// Add an item to this prim's inventory. If an item with the same name already exists, it is replaced. /// </summary> /// <param name="item"></param> /// <param name="allowedDrop"></param> public void AddInventoryItemExclusive(TaskInventoryItem item, bool allowedDrop) { List<TaskInventoryItem> il = GetInventoryItems(); foreach (TaskInventoryItem i in il) { if (i.Name == item.Name) { if (i.InvType == (int)InventoryType.LSL) RemoveScriptInstance(i.ItemID, false); RemoveInventoryItem(i.ItemID); break; } } AddInventoryItem(item.Name, item, allowedDrop); }
public void TestLoadOarV0_2() { TestHelper.InMethod(); // log4net.Config.XmlConfigurator.Configure(); MemoryStream archiveWriteStream = new MemoryStream(); TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream); // Put in a random blank directory to check that this doesn't upset the load process tar.WriteDir("ignoreme"); // Also check that direct entries which will also have a file entry containing that directory doesn't // upset load tar.WriteDir(ArchiveConstants.TERRAINS_PATH); tar.WriteFile(ArchiveConstants.CONTROL_FILE_PATH, ArchiveWriteRequestExecution.Create0p2ControlFile()); SceneObjectPart part1 = CreateSceneObjectPart1(); SceneObjectGroup object1 = new SceneObjectGroup(part1); // Let's put some inventory items into our object string soundItemName = "sound-item1"; UUID soundItemUuid = UUID.Parse("00000000-0000-0000-0000-000000000002"); Type type = GetType(); Assembly assembly = type.Assembly; string soundDataResourceName = null; string[] names = assembly.GetManifestResourceNames(); foreach (string name in names) { if (name.EndsWith(".Resources.test-sound.wav")) { soundDataResourceName = name; } } Assert.That(soundDataResourceName, Is.Not.Null); byte[] soundData; Console.WriteLine("Loading " + soundDataResourceName); using (Stream resource = assembly.GetManifestResourceStream(soundDataResourceName)) { using (BinaryReader br = new BinaryReader(resource)) { // FIXME: Use the inspector insteadthere are so many forums and lists already, though admittedly none of them are suitable for cross virtual-enivornemnt discussion soundData = br.ReadBytes(99999999); UUID soundUuid = UUID.Parse("00000000-0000-0000-0000-000000000001"); string soundAssetFileName = ArchiveConstants.ASSETS_PATH + soundUuid + ArchiveConstants.ASSET_TYPE_TO_EXTENSION[(sbyte)AssetType.SoundWAV]; tar.WriteFile(soundAssetFileName, soundData); /* * AssetBase soundAsset = AssetHelpers.CreateAsset(soundUuid, soundData); * scene.AssetService.Store(soundAsset); * asset1FileName = ArchiveConstants.ASSETS_PATH + soundUuid + ".wav"; */ TaskInventoryItem item1 = new TaskInventoryItem { AssetID = soundUuid, ItemID = soundItemUuid, Name = soundItemName }; part1.Inventory.AddInventoryItem(item1, true); } } m_scene.AddNewSceneObject(object1, false); string object1FileName = string.Format( "{0}_{1:000}-{2:000}-{3:000}__{4}.xml", part1.Name, Math.Round(part1.GroupPosition.X), Math.Round(part1.GroupPosition.Y), Math.Round(part1.GroupPosition.Z), part1.UUID); tar.WriteFile(ArchiveConstants.OBJECTS_PATH + object1FileName, SceneObjectSerializer.ToXml2Format(object1)); tar.Close(); MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray()); lock (this) { m_scene.EventManager.OnOarFileLoaded += LoadCompleted; m_archiverModule.DearchiveRegion(archiveReadStream); } Assert.That(m_lastErrorMessage, Is.Null); SceneObjectPart object1PartLoaded = m_scene.GetSceneObjectPart(part1.Name); Assert.That(object1PartLoaded, Is.Not.Null, "object1 was not loaded"); Assert.That(object1PartLoaded.Name, Is.EqualTo(part1.Name), "object1 names not identical"); Assert.That(object1PartLoaded.GroupPosition, Is.EqualTo(part1.GroupPosition), "object1 group position not equal"); Assert.That( object1PartLoaded.RotationOffset, Is.EqualTo(part1.RotationOffset), "object1 rotation offset not equal"); Assert.That( object1PartLoaded.OffsetPosition, Is.EqualTo(part1.OffsetPosition), "object1 offset position not equal"); TaskInventoryItem loadedSoundItem = object1PartLoaded.Inventory.GetInventoryItems(soundItemName)[0]; Assert.That(loadedSoundItem, Is.Not.Null, "loaded sound item was null"); AssetBase loadedSoundAsset = m_scene.AssetService.Get(loadedSoundItem.AssetID.ToString()); Assert.That(loadedSoundAsset, Is.Not.Null, "loaded sound asset was null"); Assert.That(loadedSoundAsset.Data, Is.EqualTo(soundData), "saved and loaded sound data do not match"); // Temporary Console.WriteLine("Successfully completed {0}", MethodBase.GetCurrentMethod()); }
/// <summary> /// Start a script which is in this prim's inventory. /// </summary> /// <param name="item"></param> /// <param name="startParam"></param> /// <param name="postOnRez"></param> /// <param name="stateSource"></param> /// <returns></returns> public void CreateScriptInstance(TaskInventoryItem item, int startParam, bool postOnRez, StateSource stateSource) { // MainConsole.Instance.InfoFormat( // "[PRIM INVENTORY]: " + // "Starting script {0}, {1} in prim {2}, {3}", // item.Name, item.ItemID, Name, UUID); if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item.ItemID, m_part.UUID, item.OwnerID)) return; if (!m_part.ParentGroup.Scene.RegionInfo.RegionSettings.DisableScripts) { lock (m_itemsLock) { m_items[item.ItemID].PermsMask = 0; m_items[item.ItemID].PermsGranter = UUID.Zero; } bool SendUpdate = m_part.AddFlag (PrimFlags.Scripted); m_part.ParentGroup.Scene.EventManager.TriggerRezScripts ( m_part, new[] { item }, startParam, postOnRez, stateSource, UUID.Zero); if (SendUpdate) m_part.ScheduleUpdate (PrimUpdateFlags.PrimFlags); //We only need to send a compressed } HasInventoryChanged = true; ResumeScript(item); }
public void RequestUpdateTaskInventoryItem(IClientAPI remoteClient, ISceneChildEntity part, UUID transactionID, TaskInventoryItem item) { AssetXferUploader uploader = RequestXferUploader(transactionID); uploader.RequestUpdateTaskInventoryItem(remoteClient, item); }
public ISceneEntity GetRezReadySceneObject(TaskInventoryItem item) { AssetBase rezAsset = m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString()); if (null == rezAsset) { MainConsole.Instance.WarnFormat( "[PRIM INVENTORY]: Could not find asset {0} for inventory item {1} in {2}", item.AssetID, item.Name, m_part.Name); return null; } string xmlData = Utils.BytesToString(rezAsset.Data); SceneObjectGroup group = SceneObjectSerializer.FromOriginalXmlFormat(xmlData, m_part.ParentGroup.Scene); if (group == null) return null; group.IsDeleted = false; group.m_isLoaded = true; foreach (SceneObjectPart part in group.ChildrenList) { part.IsLoading = false; } //Reset IDs, etc m_part.ParentGroup.Scene.SceneGraph.PrepPrimForAdditionToScene(group); SceneObjectPart rootPart = (SceneObjectPart)group.GetChildPart(group.UUID); // Since renaming the item in the inventory does not affect the name stored // in the serialization, transfer the correct name from the inventory to the // object itself before we rez. rootPart.Name = item.Name; rootPart.Description = item.Description; SceneObjectPart[] partList = group.Parts; group.SetGroup(m_part.GroupID, group.OwnerID, false); if ((rootPart.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0) { if (m_part.ParentGroup.Scene.Permissions.PropagatePermissions()) { foreach (SceneObjectPart part in partList) { part.EveryoneMask = item.EveryonePermissions; part.NextOwnerMask = item.NextPermissions; } group.ApplyNextOwnerPermissions(); } } foreach (SceneObjectPart part in partList) { if ((part.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0) { part.LastOwnerID = part.OwnerID; part.OwnerID = item.OwnerID; part.Inventory.ChangeInventoryOwner(item.OwnerID); } part.EveryoneMask = item.EveryonePermissions; part.NextOwnerMask = item.NextPermissions; } rootPart.TrimPermissions(); return group; }
/// <summary> /// Start a script which is in this prim's inventory. /// </summary> /// <param name="item"></param> /// <returns></returns> public void CreateScriptInstance(TaskInventoryItem item, int startParam, bool postOnRez, string engine, int stateSource) { // m_log.InfoFormat( // "[PRIM INVENTORY]: " + // "Starting script {0}, {1} in prim {2}, {3}", // item.Name, item.ItemID, Name, UUID); if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item.ItemID, m_part.UUID, item.OwnerID)) { return; } m_part.AddFlag(PrimFlags.Scripted); if (!m_part.ParentGroup.Scene.RegionInfo.RegionSettings.DisableScripts) { if (stateSource == 2 && // Prim crossing m_part.ParentGroup.Scene.m_trustBinaries) { lock (m_items) { m_items[item.ItemID].PermsMask = 0; m_items[item.ItemID].PermsGranter = UUID.Zero; } m_part.ParentGroup.Scene.EventManager.TriggerRezScript( m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource); m_part.ParentGroup.AddActiveScriptCount(1); m_part.ScheduleFullUpdate(); return; } AssetBase asset = m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString()); if (null == asset) { m_log.ErrorFormat( "[PRIM INVENTORY]: " + "Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found", item.Name, item.ItemID, m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID); } else { if (m_part.ParentGroup.m_savedScriptState != null) { RestoreSavedScriptState(item.OldItemID, item.ItemID); } lock (m_items) { m_items[item.ItemID].PermsMask = 0; m_items[item.ItemID].PermsGranter = UUID.Zero; } string script = Utils.BytesToString(asset.Data); m_part.ParentGroup.Scene.EventManager.TriggerRezScript( m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource); m_part.ParentGroup.AddActiveScriptCount(1); m_part.ScheduleFullUpdate(); } } }
/// <summary> /// Update an existing inventory item. /// </summary> /// <param name="item">The updated item. An item with the same id must already exist /// in this prim's inventory.</param> /// <returns>false if the item did not exist, true if the update occurred successfully</returns> public bool UpdateInventoryItem(TaskInventoryItem item) { return UpdateInventoryItem(item, true); }
public bool UpdateInventoryItem(TaskInventoryItem item, bool fireScriptEvents) { return(UpdateInventoryItem(item, fireScriptEvents, true)); }
public bool UpdateInventoryItem(TaskInventoryItem item, bool fireScriptEvents) { TaskInventoryItem it = GetInventoryItem(item.ItemID); if (it != null) { item.ParentID = m_part.UUID; item.ParentPartID = m_part.UUID; item.Flags = m_items[item.ItemID].Flags; // If group permissions have been set on, check that the groupID is up to date in case it has // changed since permissions were last set. if (item.GroupPermissions != (uint)PermissionMask.None) item.GroupID = m_part.GroupID; if (item.AssetID == UUID.Zero) item.AssetID = it.AssetID; lock (m_itemsLock) { m_items[item.ItemID] = item; m_inventorySerial++; } if (fireScriptEvents) m_part.TriggerScriptChangedEvent(Changed.INVENTORY); HasInventoryChanged = true; return true; } MainConsole.Instance.ErrorFormat( "[PRIM INVENTORY]: " + "Tried to retrieve item ID {0} from prim {1}, {2} at {3} in {4} but the item does not exist in this inventory", item.ItemID, m_part.Name, m_part.UUID, m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); return false; }
public bool BuyObject(IClientAPI remoteClient, UUID categoryID, uint localID, byte saleType, int salePrice) { SceneObjectPart part = m_scene.GetSceneObjectPart(localID); if (part == null) { return(false); } SceneObjectGroup group = part.ParentGroup; switch (saleType) { case 1: // Sell as original (in-place sale) uint effectivePerms = group.GetEffectivePermissions(); if ((effectivePerms & (uint)PermissionMask.Transfer) == 0) { if (m_dialogModule != null) { m_dialogModule.SendAlertToUser(remoteClient, "This item doesn't appear to be for sale"); } return(false); } group.SetOwnerId(remoteClient.AgentId); group.SetRootPartOwner(part, remoteClient.AgentId, remoteClient.ActiveGroupId); if (m_scene.Permissions.PropagatePermissions()) { foreach (SceneObjectPart child in group.Parts) { child.Inventory.ChangeInventoryOwner(remoteClient.AgentId); child.TriggerScriptChangedEvent(Changed.OWNER); child.ApplyNextOwnerPermissions(); } } part.ObjectSaleType = 0; part.SalePrice = 10; group.HasGroupChanged = true; part.SendPropertiesToClient(remoteClient); part.TriggerScriptChangedEvent(Changed.OWNER); group.ResumeScripts(); part.ScheduleFullUpdate(); break; case 2: // Sell a copy Vector3 inventoryStoredPosition = new Vector3( Math.Min(group.AbsolutePosition.X, m_scene.RegionInfo.RegionSizeX - 6), Math.Min(group.AbsolutePosition.Y, m_scene.RegionInfo.RegionSizeY - 6), group.AbsolutePosition.Z); Vector3 originalPosition = group.AbsolutePosition; group.AbsolutePosition = inventoryStoredPosition; string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(group); group.AbsolutePosition = originalPosition; uint perms = group.GetEffectivePermissions(); if ((perms & (uint)PermissionMask.Transfer) == 0) { if (m_dialogModule != null) { m_dialogModule.SendAlertToUser(remoteClient, "This item doesn't appear to be for sale"); } return(false); } AssetBase asset = m_scene.CreateAsset( group.GetPartName(localID), group.GetPartDescription(localID), (sbyte)AssetType.Object, Utils.StringToBytes(sceneObjectXml), group.OwnerID); m_scene.AssetService.Store(asset); InventoryItemBase item = new InventoryItemBase(); item.CreatorId = part.CreatorID.ToString(); item.CreatorData = part.CreatorData; item.ID = UUID.Random(); item.Owner = remoteClient.AgentId; item.AssetID = asset.FullID; item.Description = asset.Description; item.Name = asset.Name; item.AssetType = asset.Type; item.InvType = (int)InventoryType.Object; item.Folder = categoryID; PermissionsUtil.ApplyFoldedPermissions(perms, ref perms); item.BasePermissions = perms & part.NextOwnerMask; item.CurrentPermissions = perms & part.NextOwnerMask; item.NextPermissions = part.NextOwnerMask; item.EveryOnePermissions = part.EveryoneMask & part.NextOwnerMask; item.GroupPermissions = part.GroupMask & part.NextOwnerMask; item.Flags |= (uint)InventoryItemFlags.ObjectSlamPerm; item.CreationDate = Util.UnixTimeSinceEpoch(); if (m_scene.AddInventoryItem(item)) { remoteClient.SendInventoryItemCreateUpdate(item, 0); } else { if (m_dialogModule != null) { m_dialogModule.SendAlertToUser(remoteClient, "Cannot buy now. Your inventory is unavailable"); } return(false); } break; case 3: // Sell contents List <UUID> invList = part.Inventory.GetInventoryList(); bool okToSell = true; foreach (UUID invID in invList) { TaskInventoryItem item1 = part.Inventory.GetInventoryItem(invID); if ((item1.CurrentPermissions & (uint)PermissionMask.Transfer) == 0) { okToSell = false; break; } } if (!okToSell) { if (m_dialogModule != null) { m_dialogModule.SendAlertToUser( remoteClient, "This item's inventory doesn't appear to be for sale"); } return(false); } if (invList.Count > 0) { m_scene.MoveTaskInventoryItems(remoteClient.AgentId, part.Name, part, invList); } break; } return(true); }
/// <summary> /// Rez an object into the scene from a prim's inventory. /// </summary> /// <param name="sourcePart"></param> /// <param name="item"></param> /// <param name="pos"></param> /// <param name="rot"></param> /// <param name="vel"></param> /// <param name="param"></param> /// <param name="RezzedFrom"></param> /// <param name="RezObjectAtRoot"></param> /// <returns>The SceneObjectGroup rezzed or null if rez was unsuccessful</returns> public ISceneEntity RezObject( ISceneChildEntity sourcePart, TaskInventoryItem item, Vector3 pos, Quaternion rot, Vector3 vel, int param, UUID RezzedFrom, bool RezObjectAtRoot) { if (item != null) { UUID ownerID = item.OwnerID; AssetBase rezAsset = World.AssetService.Get(item.AssetID.ToString()); if (rezAsset != null) { string xmlData = Utils.BytesToString(rezAsset.Data); SceneObjectGroup group = SceneObjectSerializer.FromOriginalXmlFormat(xmlData, World); if (group == null) return null; string reason; if (!World.Permissions.CanRezObject(group.ChildrenList.Count, ownerID, pos, out reason)) { World.GetScenePresence(ownerID).ControllingClient.SendAlertMessage("You do not have permission to rez objects here: " + reason); return null; } List<ISceneChildEntity> partList = group.ChildrenEntities(); // we set it's position in world. // llRezObject sets the whole group at the position, while llRezAtRoot rezzes the group based on the root prim's position // See: http://lslwiki.net/lslwiki/wakka.php?wakka=llRezAtRoot // Shorthand: llRezAtRoot rezzes the root prim of the group at the position // llRezObject rezzes the center of group at the position if (RezObjectAtRoot) //This sets it right... group.AbsolutePosition = pos; else { // center is on average of all positions // less root prim position #if (!ISWIN) Vector3 offset = Vector3.Zero; foreach (ISceneChildEntity child in partList) { offset += child.AbsolutePosition; } #else Vector3 offset = partList.Aggregate(Vector3.Zero, (current, child) => current + child.AbsolutePosition); #endif offset /= partList.Count; offset -= group.AbsolutePosition; offset += pos; group.AbsolutePosition = offset; } ISceneChildEntity rootPart = group.GetChildPart(group.UUID); // Since renaming the item in the inventory does not affect the name stored // in the serialization, transfer the correct name from the inventory to the // object itself before we rez. rootPart.Name = item.Name; rootPart.Description = item.Description; group.SetGroup(sourcePart.GroupID, group.OwnerID); if (rootPart.OwnerID != item.OwnerID) { if (World.Permissions.PropagatePermissions()) { if ((item.CurrentPermissions & 8) != 0) { foreach(ISceneChildEntity part in partList) { part.EveryoneMask = item.EveryonePermissions; part.NextOwnerMask = item.NextPermissions; } } group.ApplyNextOwnerPermissions(); } } foreach (ISceneChildEntity part in partList) { if (part.OwnerID != item.OwnerID) { part.LastOwnerID = part.OwnerID; part.OwnerID = item.OwnerID; part.Inventory.ChangeInventoryOwner(item.OwnerID); } else if ((item.CurrentPermissions & 8) != 0) // Slam! { part.EveryoneMask = item.EveryonePermissions; part.NextOwnerMask = item.NextPermissions; } } rootPart.TrimPermissions(); if (group.RootPart.Shape.PCode == (byte)PCode.Prim) { group.ClearPartAttachmentData(); } group.UpdateGroupRotationR(rot); //group.ApplyPhysics(m_physicalPrim); if((group.RootPart.Flags & PrimFlags.Physics) == PrimFlags.Physics) { group.RootPart.PhysActor.OnPhysicalRepresentationChanged += delegate { float groupmass = group.GetMass(); //Apply the velocity to the object //llApplyImpulse(new LSL_Vector(llvel.X * groupmass, llvel.Y * groupmass, llvel.Z * groupmass), 0); // @Above: Err.... no. Read http://lslwiki.net/lslwiki/wakka.php?wakka=llRezObject // Notice the "Creates ("rezzes") object's inventory object centered at position pos (in region coordinates) with velocity vel" // This means SET the velocity to X, not just temperarily add it! // -- Revolution Smythe llSetForce(new LSL_Vector(vel * groupmass), 0); group.RootPart.PhysActor.ForceSetVelocity(vel * groupmass); group.RootPart.PhysActor.Velocity = vel * groupmass; }; } World.SceneGraph.AddPrimToScene(group); group.CreateScriptInstances(param, true, StateSource.ScriptedRez, RezzedFrom); if (!World.Permissions.BypassPermissions()) { if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) sourcePart.Inventory.RemoveInventoryItem(item.ItemID); } group.ScheduleGroupUpdate(PrimUpdateFlags.FullUpdate); return rootPart.ParentEntity; } } return null; }
public ISceneEntity GetRezReadySceneObject(TaskInventoryItem item) { byte[] rezAsset = m_part.ParentGroup.Scene.AssetService.GetData(item.AssetID.ToString()); if (null == rezAsset) { MainConsole.Instance.WarnFormat( "[PRIM INVENTORY]: Could not find asset {0} for inventory item {1} in {2}", item.AssetID, item.Name, m_part.Name); return(null); } string xmlData = Utils.BytesToString(rezAsset); ISceneEntity group = SceneEntitySerializer.SceneObjectSerializer.FromOriginalXmlFormat(xmlData, m_part.ParentGroup .Scene); if (group == null) { return(null); } group.IsDeleted = false; foreach (ISceneChildEntity part in group.ChildrenEntities()) { part.IsLoading = false; } //Reset IDs, etc m_part.ParentGroup.Scene.SceneGraph.PrepPrimForAdditionToScene(group); ISceneChildEntity rootPart = group.GetChildPart(group.UUID); // Since renaming the item in the inventory does not affect the name stored // in the serialization, transfer the correct name from the inventory to the // object itself before we rez. rootPart.Name = item.Name; rootPart.Description = item.Description; List <ISceneChildEntity> partList = group.ChildrenEntities(); group.SetGroup(m_part.GroupID, group.OwnerID, false); if ((rootPart.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0) { if (m_part.ParentGroup.Scene.Permissions.PropagatePermissions()) { foreach (ISceneChildEntity part in partList) { part.EveryoneMask = item.EveryonePermissions; part.NextOwnerMask = item.NextPermissions; } group.ApplyNextOwnerPermissions(); } } foreach (ISceneChildEntity part in partList) { if ((part.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0) { part.LastOwnerID = part.OwnerID; part.OwnerID = item.OwnerID; part.Inventory.ChangeInventoryOwner(item.OwnerID); } part.EveryoneMask = item.EveryonePermissions; part.NextOwnerMask = item.NextPermissions; } rootPart.TrimPermissions(); return(group); }
// ----------------------------------------------------------------- /// <summary> /// /// </summary> // ----------------------------------------------------------------- private void DoJsonRezObject(UUID hostID, UUID scriptID, UUID reqID, string name, Vector3 pos, Vector3 vel, Quaternion rot, string param) { if (Double.IsNaN(rot.X) || Double.IsNaN(rot.Y) || Double.IsNaN(rot.Z) || Double.IsNaN(rot.W)) { GenerateRuntimeError("Invalid rez rotation"); return; } SceneObjectGroup host = m_scene.GetSceneObjectGroup(hostID); if (host == null) { GenerateRuntimeError(String.Format("Unable to find rezzing host '{0}'", hostID)); return; } // hpos = host.RootPart.GetWorldPosition() // float dist = (float)llVecDist(hpos, pos); // if (dist > m_ScriptDistanceFactor * 10.0f) // return; TaskInventoryItem item = host.RootPart.Inventory.GetInventoryItem(name); if (item == null) { GenerateRuntimeError(String.Format("Unable to find object to rez '{0}'", name)); return; } if (item.InvType != (int)InventoryType.Object) { GenerateRuntimeError("Can't create requested object; object is missing from database"); return; } List <SceneObjectGroup> objlist; List <Vector3> veclist; Vector3 bbox = new Vector3(); float offsetHeight; bool success = host.RootPart.Inventory.GetRezReadySceneObjects(item, out objlist, out veclist, out bbox, out offsetHeight); if (!success) { GenerateRuntimeError("Failed to create object"); return; } int totalPrims = 0; foreach (SceneObjectGroup group in objlist) { totalPrims += group.PrimCount; } if (!m_scene.Permissions.CanRezObject(totalPrims, item.OwnerID, pos)) { GenerateRuntimeError("Not allowed to create the object"); return; } if (!m_scene.Permissions.BypassPermissions()) { if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) { host.RootPart.Inventory.RemoveInventoryItem(item.ItemID); } } for (int i = 0; i < objlist.Count; i++) { SceneObjectGroup group = objlist[i]; Vector3 curpos = pos + veclist[i]; if (group.IsAttachment == false && group.RootPart.Shape.State != 0) { group.RootPart.AttachedPos = group.AbsolutePosition; group.RootPart.Shape.LastAttachPoint = (byte)group.AttachmentPoint; } group.RezzerID = host.RootPart.UUID; m_scene.AddNewSceneObject(group, true, curpos, rot, vel); UUID storeID = group.UUID; if (!m_store.CreateStore(param, ref storeID)) { GenerateRuntimeError("Unable to create jsonstore for new object"); continue; } // We can only call this after adding the scene object, since the scene object references the scene // to find out if scripts should be activated at all. group.RootPart.SetDieAtEdge(true); group.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 3); group.ResumeScripts(); group.ScheduleGroupForFullUpdate(); // send the reply back to the host object, use the integer param to indicate the number // of remaining objects m_comms.DispatchReply(scriptID, objlist.Count - i - 1, group.RootPart.UUID.ToString(), reqID.ToString()); } }
/// <summary> /// Add an inventory item from a user's inventory to a prim in this scene object. /// </summary> /// <param name="agentID">The agent adding the item.</param> /// <param name="localID">The local ID of the part receiving the add.</param> /// <param name="item">The user inventory item being added.</param> /// <param name="copyItemID">The item UUID that should be used by the new item.</param> /// <returns></returns> public bool AddInventoryItem(UUID agentID, uint localID, InventoryItemBase item, UUID copyItemID, bool withModRights = true) { // m_log.DebugFormat( // "[PRIM INVENTORY]: Adding inventory item {0} from {1} to part with local ID {2}", // item.Name, remoteClient.Name, localID); UUID newItemId = (copyItemID != UUID.Zero) ? copyItemID : item.ID; SceneObjectPart part = GetPart(localID); if (part == null) { m_log.ErrorFormat( "[PRIM INVENTORY]: " + "Couldn't find prim local ID {0} in group {1}, {2} to add inventory item ID {3}", localID, Name, UUID, newItemId); return(false); } TaskInventoryItem taskItem = new TaskInventoryItem(); taskItem.ItemID = newItemId; taskItem.AssetID = item.AssetID; taskItem.Name = item.Name; taskItem.Description = item.Description; taskItem.OwnerID = part.OwnerID; // Transfer ownership taskItem.CreatorID = item.CreatorIdAsUuid; taskItem.Type = item.AssetType; taskItem.InvType = item.InvType; taskItem.Flags = item.Flags; if (agentID != part.OwnerID && m_scene.Permissions.PropagatePermissions()) { taskItem.BasePermissions = item.BasePermissions & item.NextPermissions; taskItem.CurrentPermissions = item.CurrentPermissions & item.NextPermissions; taskItem.EveryonePermissions = item.EveryOnePermissions & item.NextPermissions; taskItem.GroupPermissions = item.GroupPermissions & item.NextPermissions; taskItem.NextPermissions = item.NextPermissions; // We're adding this to a prim we don't own. Force // owner change taskItem.Flags |= (uint)InventoryItemFlags.ObjectSlamPerm; taskItem.LastOwnerID = item.Owner; } else { taskItem.BasePermissions = item.BasePermissions; taskItem.CurrentPermissions = item.CurrentPermissions; taskItem.EveryonePermissions = item.EveryOnePermissions; taskItem.GroupPermissions = item.GroupPermissions; taskItem.NextPermissions = item.NextPermissions; } // m_log.DebugFormat( // "[PRIM INVENTORY]: Flags are 0x{0:X} for item {1} added to part {2} by {3}", // taskItem.Flags, taskItem.Name, localID, remoteClient.Name); // TODO: These are pending addition of those fields to TaskInventoryItem // taskItem.SalePrice = item.SalePrice; // taskItem.SaleType = item.SaleType; taskItem.CreationDate = (uint)item.CreationDate; bool addFromAllowedDrop; if (withModRights) { addFromAllowedDrop = false; } else { addFromAllowedDrop = (part.ParentGroup.RootPart.GetEffectiveObjectFlags() & (uint)PrimFlags.AllowInventoryDrop) != 0; } part.Inventory.AddInventoryItem(taskItem, addFromAllowedDrop); part.ParentGroup.InvalidateDeepEffectivePerms(); return(true); }
private Hashtable CopyInventoryFromNotecard(Hashtable mDhttpMethod, UUID agentID) { OSDMap rm = (OSDMap)OSDParser.DeserializeLLSDXml((string)mDhttpMethod["requestbody"]); UUID FolderID = rm["folder-id"].AsUUID(); UUID ItemID = rm["item-id"].AsUUID(); UUID NotecardID = rm["notecard-id"].AsUUID(); UUID ObjectID = rm["object-id"].AsUUID(); InventoryItemBase notecardItem = null; if (ObjectID != UUID.Zero) { ISceneChildEntity part = m_scene.GetSceneObjectPart(ObjectID); if (part != null) { TaskInventoryItem item = part.Inventory.GetInventoryItem(NotecardID); if (m_scene.Permissions.CanCopyObjectInventory(NotecardID, ObjectID, agentID)) { notecardItem = new InventoryItemBase(NotecardID, agentID) { AssetID = item.AssetID }; } } } else { notecardItem = m_scene.InventoryService.GetItem(new InventoryItemBase(NotecardID)); } if (notecardItem != null && notecardItem.Owner == agentID) { AssetBase asset = m_scene.AssetService.Get(notecardItem.AssetID.ToString()); if (asset != null) { UTF8Encoding enc = new UTF8Encoding(); List <string> notecardData = SLUtil.ParseNotecardToList(enc.GetString(asset.Data)); AssetNotecard noteCardAsset = new AssetNotecard(UUID.Zero, asset.Data); noteCardAsset.Decode(); bool found = false; UUID lastOwnerID = UUID.Zero; #if (!ISWIN) foreach (InventoryItem notecardObjectItem in noteCardAsset.EmbeddedItems) { if (notecardObjectItem.UUID == ItemID) { //Make sure that it exists found = true; lastOwnerID = notecardObjectItem.OwnerID; break; } } #else foreach (InventoryItem notecardObjectItem in noteCardAsset.EmbeddedItems.Where(notecardObjectItem => notecardObjectItem.UUID == ItemID)) { //Make sure that it exists found = true; lastOwnerID = notecardObjectItem.OwnerID; break; } #endif if (found) { InventoryItemBase item = null; ILLClientInventory inventoryModule = m_scene.RequestModuleInterface <ILLClientInventory>(); if (inventoryModule != null) { item = inventoryModule.GiveInventoryItem(agentID, lastOwnerID, ItemID, FolderID); } IClientAPI client; m_scene.ClientManager.TryGetValue(agentID, out client); if (item != null) { client.SendBulkUpdateInventory(item); } else { client.SendAlertMessage("Failed to retrieve item"); } } } } //Send back data Hashtable responsedata = new Hashtable(); responsedata["int_response_code"] = 200; //501; //410; //404; responsedata["content_type"] = "text/plain"; responsedata["keepalive"] = false; responsedata["str_response_string"] = ""; return(responsedata); }
/// <summary> /// Rez a script into a prim's inventory, either ex nihilo or from an existing avatar inventory /// </summary> /// <param name="remoteClient"></param> /// <param name="transactionID"></param> /// <param name="localID"></param> /// <param name="itemBase"></param> protected void RezScript(IClientAPI remoteClient, InventoryItemBase itemBase, UUID transactionID, uint localID) { UUID itemID = itemBase.ID; UUID copyID = UUID.Random(); if (itemID != UUID.Zero) // transferred from an avatar inventory to the prim's inventory { InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); item = m_scene.InventoryService.GetItem(item); if (item != null) { ISceneChildEntity part = m_scene.GetSceneObjectPart (localID); if (part != null) { if (!m_scene.Permissions.CanEditObjectInventory(part.UUID, remoteClient.AgentId)) return; part.ParentEntity.AddInventoryItem (remoteClient, localID, item, copyID); part.Inventory.CreateScriptInstance(copyID, 0, false, 0); // MainConsole.Instance.InfoFormat("[PRIMINVENTORY]: " + // "Rezzed script {0} into prim local ID {1} for user {2}", // item.inventoryName, localID, remoteClient.Name); part.GetProperties(remoteClient); } else { MainConsole.Instance.ErrorFormat( "[PRIM INVENTORY]: " + "Could not rez script {0} into prim local ID {1} for user {2}" + " because the prim could not be found in the region!", item.Name, localID, remoteClient.Name); } } else { MainConsole.Instance.ErrorFormat( "[PRIM INVENTORY]: Could not find script inventory item {0} to rez for {1}!", itemID, remoteClient.Name); } } else // script has been rezzed directly into a prim's inventory { ISceneChildEntity part = m_scene.GetSceneObjectPart (itemBase.Folder); if (part == null) return; if (!m_scene.Permissions.CanCreateObjectInventory( itemBase.InvType, part.UUID, remoteClient.AgentId)) return; AssetBase asset = new AssetBase(UUID.Random(), itemBase.Name, (AssetType)itemBase.AssetType, remoteClient.AgentId) { Description = itemBase.Description, Data = Encoding.ASCII.GetBytes(DefaultLSLScript) }; asset.ID = m_scene.AssetService.Store(asset); TaskInventoryItem taskItem = new TaskInventoryItem(); taskItem.ResetIDs(itemBase.Folder); taskItem.ParentID = itemBase.Folder; taskItem.CreationDate = (uint)itemBase.CreationDate; taskItem.Name = itemBase.Name; taskItem.Description = itemBase.Description; taskItem.Type = itemBase.AssetType; taskItem.InvType = itemBase.InvType; taskItem.OwnerID = itemBase.Owner; taskItem.CreatorID = itemBase.CreatorIdAsUuid; taskItem.CreatorData = itemBase.CreatorData; taskItem.BasePermissions = itemBase.BasePermissions; taskItem.CurrentPermissions = itemBase.CurrentPermissions; taskItem.EveryonePermissions = itemBase.EveryOnePermissions; taskItem.GroupPermissions = itemBase.GroupPermissions; taskItem.NextPermissions = itemBase.NextPermissions; taskItem.GroupID = itemBase.GroupID; taskItem.GroupPermissions = 0; taskItem.Flags = itemBase.Flags; taskItem.PermsGranter = UUID.Zero; taskItem.PermsMask = 0; taskItem.AssetID = asset.ID; taskItem.SalePrice = itemBase.SalePrice; taskItem.SaleType = itemBase.SaleType; part.Inventory.AddInventoryItem(taskItem, false); part.GetProperties(remoteClient); part.Inventory.CreateScriptInstance(taskItem, 0, false, StateSource.NewRez); } }
/// <summary> /// Update an existing inventory item. /// </summary> /// <param name = "item">The updated item. An item with the same id must already exist /// in this prim's inventory</param> /// <returns>false if the item did not exist, true if the update occurred succesfully</returns> public bool UpdateInventoryItem(TaskInventoryItem item) { SceneObjectPart part = (SceneObjectPart) GetChildPart(item.ParentPartID); if (part != null) { part.Inventory.UpdateInventoryItem(item); return true; } MainConsole.Instance.ErrorFormat( "[PRIM INVENTORY]: " + "Couldn't find prim ID {0} to update item {1}, {2}", item.ParentPartID, item.Name, item.ItemID); return false; }
/// <summary> /// Copy a task (prim) inventory item to another task (prim) /// </summary> /// <param name="destId"></param> /// <param name="part"></param> /// <param name="itemId"></param> public void MoveTaskInventoryItemToObject (UUID destId, ISceneChildEntity part, UUID itemId) { TaskInventoryItem srcTaskItem = part.Inventory.GetInventoryItem(itemId); if (srcTaskItem == null) { MainConsole.Instance.ErrorFormat( "[PRIM INVENTORY]: Tried to retrieve item ID {0} from prim {1}, {2} for moving" + " but the item does not exist in this inventory", itemId, part.Name, part.UUID); return; } ISceneChildEntity destPart = m_scene.GetSceneObjectPart (destId); if (destPart == null) { MainConsole.Instance.ErrorFormat( "[PRIM INVENTORY]: " + "Could not find prim for ID {0}", destId); return; } // Can't transfer this // if ((part.OwnerID != destPart.OwnerID) && ((srcTaskItem.CurrentPermissions & (uint)PermissionMask.Transfer) == 0)) return; if (part.OwnerID != destPart.OwnerID && (destPart.GetEffectiveObjectFlags() & (uint)PrimFlags.AllowInventoryDrop) == 0) { // object cannot copy items to an object owned by a different owner // unless llAllowInventoryDrop has been called return; } // must have both move and modify permission to put an item in an object if ((part.OwnerMask & ((uint)PermissionMask.Move | (uint)PermissionMask.Modify)) == 0) { return; } TaskInventoryItem destTaskItem = new TaskInventoryItem { ItemID = UUID.Random(), CreatorID = srcTaskItem.CreatorID, CreatorData = srcTaskItem.CreatorData, AssetID = srcTaskItem.AssetID, GroupID = destPart.GroupID, OwnerID = destPart.OwnerID, ParentID = destPart.UUID, ParentPartID = destPart.UUID, BasePermissions = srcTaskItem.BasePermissions, EveryonePermissions = srcTaskItem.EveryonePermissions, GroupPermissions = srcTaskItem.GroupPermissions, CurrentPermissions = srcTaskItem.CurrentPermissions, NextPermissions = srcTaskItem.NextPermissions, Flags = srcTaskItem.Flags, SalePrice = srcTaskItem.SalePrice, SaleType = srcTaskItem.SaleType }; if (destPart.OwnerID != part.OwnerID) { if (m_scene.Permissions.PropagatePermissions()) { destTaskItem.CurrentPermissions = srcTaskItem.CurrentPermissions & (srcTaskItem.NextPermissions | (uint)PermissionMask.Move); destTaskItem.GroupPermissions = srcTaskItem.GroupPermissions & (srcTaskItem.NextPermissions | (uint)PermissionMask.Move); destTaskItem.EveryonePermissions = srcTaskItem.EveryonePermissions & (srcTaskItem.NextPermissions | (uint)PermissionMask.Move); destTaskItem.BasePermissions = srcTaskItem.BasePermissions & (srcTaskItem.NextPermissions | (uint)PermissionMask.Move); destTaskItem.CurrentPermissions |= 16; // Slam! } } destTaskItem.Description = srcTaskItem.Description; destTaskItem.Name = srcTaskItem.Name; destTaskItem.InvType = srcTaskItem.InvType; destTaskItem.Type = srcTaskItem.Type; destPart.Inventory.AddInventoryItem(destTaskItem, part.OwnerID != destPart.OwnerID); if ((srcTaskItem.CurrentPermissions & (uint)PermissionMask.Copy) == 0) part.Inventory.RemoveInventoryItem(itemId); IScenePresence avatar; if (m_scene.TryGetScenePresence(srcTaskItem.OwnerID, out avatar)) destPart.GetProperties(avatar.ControllingClient); }
/// <summary> /// Add an inventory item to a prim in this group. /// </summary> /// <param name = "remoteClient"></param> /// <param name = "localID"></param> /// <param name = "item"></param> /// <param name = "copyItemID">The item UUID that should be used by the new item.</param> /// <returns></returns> public bool AddInventoryItem(IClientAPI remoteClient, uint localID, InventoryItemBase item, UUID copyItemID) { UUID newItemId = (copyItemID != UUID.Zero) ? copyItemID : item.ID; SceneObjectPart part = (SceneObjectPart) GetChildPart(localID); if (part != null) { TaskInventoryItem taskItem = new TaskInventoryItem { ItemID = newItemId, AssetID = item.AssetID, Name = item.Name, Description = item.Description, OwnerID = part.OwnerID, CreatorID = item.CreatorIdAsUuid, Type = item.AssetType, InvType = item.InvType }; // Transfer ownership if (remoteClient != null && remoteClient.AgentId != part.OwnerID && m_scene.Permissions.PropagatePermissions()) { taskItem.BasePermissions = item.BasePermissions & item.NextPermissions; taskItem.CurrentPermissions = item.CurrentPermissions & item.NextPermissions; taskItem.EveryonePermissions = item.EveryOnePermissions & item.NextPermissions; taskItem.GroupPermissions = item.GroupPermissions & item.NextPermissions; taskItem.NextPermissions = item.NextPermissions; // We're adding this to a prim we don't own. Force // owner change taskItem.CurrentPermissions |= 16; // Slam } else { taskItem.BasePermissions = item.BasePermissions; taskItem.CurrentPermissions = item.CurrentPermissions; taskItem.EveryonePermissions = item.EveryOnePermissions; taskItem.GroupPermissions = item.GroupPermissions; taskItem.NextPermissions = item.NextPermissions; } taskItem.Flags = item.Flags; taskItem.SalePrice = item.SalePrice; taskItem.SaleType = item.SaleType; taskItem.CreationDate = (uint) item.CreationDate; bool addFromAllowedDrop = false; if (remoteClient != null) { addFromAllowedDrop = remoteClient.AgentId != part.OwnerID; } part.Inventory.AddInventoryItem(taskItem, addFromAllowedDrop); return true; } MainConsole.Instance.ErrorFormat( "[PRIM INVENTORY]: " + "Couldn't find prim local ID {0} in group {1}, {2} to add inventory item ID {3}", localID, Name, UUID, newItemId); return false; }
public void llTeleportAgent(LSL_Key avatar, LSL_String landmark, LSL_Vector position, LSL_Vector look_at) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) { return; } UUID invItemID = InventorySelf(); if (invItemID == UUID.Zero) { return; } lock (m_host.TaskInventory) { if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) { Error("llTeleportAgent", "No permissions to teleport the agent"); return; } if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TELEPORT) == 0) { Error("llTeleportAgent", "No permissions to teleport the agent"); return; } } TaskInventoryItem item = null; lock (m_host.TaskInventory) { foreach (KeyValuePair <UUID, TaskInventoryItem> inv in m_host.TaskInventory) { if (inv.Value.Name == landmark) { item = inv.Value; } } } if (item == null) { return; } IScenePresence presence = World.GetScenePresence(m_host.OwnerID); if (presence != null) { IEntityTransferModule module = World.RequestModuleInterface <IEntityTransferModule>(); if (module != null) { if (landmark != "") { var worldAsset = World.AssetService.Get(item.AssetID.ToString()); if (worldAsset != null) { var lm = new AssetLandmark(worldAsset); worldAsset.Dispose(); module.Teleport(presence, lm.RegionHandle, lm.Position, look_at.ToVector3(), (uint)TeleportFlags.ViaLocation); lm.Dispose(); return; } } // no landmark details module.Teleport(presence, World.RegionInfo.RegionHandle, position.ToVector3(), look_at.ToVector3(), (uint)TeleportFlags.ViaLocation); } } }
public ScriptInstance(IScriptEngine engine, SceneObjectPart part, UUID itemID, UUID assetID, string assembly, AppDomain dom, string primName, string scriptName, int startParam, bool postOnRez, StateSource stateSource, int maxScriptQueue) { m_Engine = engine; m_LocalID = part.LocalId; m_ObjectID = part.UUID; m_ItemID = itemID; m_AssetID = assetID; m_PrimName = primName; m_ScriptName = scriptName; m_Assembly = assembly; m_StartParam = startParam; m_MaxScriptQueue = maxScriptQueue; m_stateSource = stateSource; m_postOnRez = postOnRez; m_AttachedAvatar = part.AttachedAvatar; m_RegionID = part.ParentGroup.Scene.RegionInfo.RegionID; if (part != null) { lock (part.TaskInventory) { if (part.TaskInventory.ContainsKey(m_ItemID)) { m_thisScriptTask = part.TaskInventory[m_ItemID]; } } } ApiManager am = new ApiManager(); foreach (string api in am.GetApis()) { m_Apis[api] = am.CreateApi(api); m_Apis[api].Initialize(engine, part, m_LocalID, itemID); } try { if (dom != System.AppDomain.CurrentDomain) { m_Script = (IScript)dom.CreateInstanceAndUnwrap( Path.GetFileNameWithoutExtension(assembly), "SecondLife.Script"); } else { m_Script = (IScript)Assembly.Load( Path.GetFileNameWithoutExtension(assembly)).CreateInstance( "SecondLife.Script"); } //ILease lease = (ILease)RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass); //RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass); // lease.Register(this); } catch (Exception) { // m_log.ErrorFormat("[Script] Error loading assembly {0}\n"+e.ToString(), assembly); } try { foreach (KeyValuePair <string, IScriptApi> kv in m_Apis) { m_Script.InitApi(kv.Key, kv.Value); } // // m_log.Debug("[Script] Script instance created"); part.SetScriptEvents(m_ItemID, (int)m_Script.GetStateEventFlags(State)); } catch (Exception) { // m_log.Error("[Script] Error loading script instance\n"+e.ToString()); return; } m_SaveState = true; string savedState = Path.Combine(Path.GetDirectoryName(assembly), m_ItemID.ToString() + ".state"); if (File.Exists(savedState)) { string xml = String.Empty; try { FileInfo fi = new FileInfo(savedState); int size = (int)fi.Length; if (size < 512000) { using (FileStream fs = File.Open(savedState, FileMode.Open, FileAccess.Read, FileShare.None)) { System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); Byte[] data = new Byte[size]; fs.Read(data, 0, size); xml = enc.GetString(data); ScriptSerializer.Deserialize(xml, this); AsyncCommandManager.CreateFromData(m_Engine, m_LocalID, m_ItemID, m_ObjectID, PluginData); // m_log.DebugFormat("[Script] Successfully retrieved state for script {0}.{1}", m_PrimName, m_ScriptName); part.SetScriptEvents(m_ItemID, (int)m_Script.GetStateEventFlags(State)); if (m_RunEvents && (!m_ShuttingDown)) { m_RunEvents = false; } else { m_RunEvents = false; m_startOnInit = false; } // we get new rez events on sim restart, too // but if there is state, then we fire the change // event // We loaded state, don't force a re-save m_SaveState = false; m_startedFromSavedState = true; } } else { // m_log.Error("[Script] Unable to load script state: Memory limit exceeded"); } } catch (Exception) { // m_log.ErrorFormat("[Script] Unable to load script state from xml: {0}\n"+e.ToString(), xml); } } // else // { // ScenePresence presence = m_Engine.World.GetScenePresence(part.OwnerID); // if (presence != null && (!postOnRez)) // presence.ControllingClient.SendAgentAlertMessage("Compile successful", false); // } }