aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs128
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs20
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs36
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs143
5 files changed, 254 insertions, 75 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 0384224..012732b 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -122,7 +122,7 @@ namespace OpenSim.Region.Framework.Scenes
122 else 122 else
123 { 123 {
124 m_log.WarnFormat( 124 m_log.WarnFormat(
125 "[AGENT INVENTORY]: Agent {1} could not add item {2} {3}", 125 "[AGENT INVENTORY]: Agent {0} could not add item {1} {2}",
126 AgentID, item.Name, item.ID); 126 AgentID, item.Name, item.ID);
127 127
128 return; 128 return;
@@ -2004,7 +2004,7 @@ namespace OpenSim.Region.Framework.Scenes
2004 remoteClient, itemID, RayEnd, RayStart, RayTargetID, BypassRayCast, RayEndIsIntersection, 2004 remoteClient, itemID, RayEnd, RayStart, RayTargetID, BypassRayCast, RayEndIsIntersection,
2005 RezSelected, RemoveItem, fromTaskID, false); 2005 RezSelected, RemoveItem, fromTaskID, false);
2006 } 2006 }
2007 2007
2008 /// <summary> 2008 /// <summary>
2009 /// Rez an object into the scene from a prim's inventory. 2009 /// Rez an object into the scene from a prim's inventory.
2010 /// </summary> 2010 /// </summary>
@@ -2019,95 +2019,79 @@ namespace OpenSim.Region.Framework.Scenes
2019 SceneObjectPart sourcePart, TaskInventoryItem item, 2019 SceneObjectPart sourcePart, TaskInventoryItem item,
2020 Vector3 pos, Quaternion rot, Vector3 vel, int param) 2020 Vector3 pos, Quaternion rot, Vector3 vel, int param)
2021 { 2021 {
2022 // Rez object 2022 if (null == item)
2023 if (item != null) 2023 return null;
2024 { 2024
2025 UUID ownerID = item.OwnerID; 2025 UUID ownerID = item.OwnerID;
2026 2026 AssetBase rezAsset = AssetService.Get(item.AssetID.ToString());
2027 AssetBase rezAsset = AssetService.Get(item.AssetID.ToString());
2028
2029 if (rezAsset != null)
2030 {
2031 string xmlData = Utils.BytesToString(rezAsset.Data);
2032 SceneObjectGroup group = SceneObjectSerializer.FromOriginalXmlFormat(xmlData);
2033 2027
2034 if (!Permissions.CanRezObject(group.Children.Count, ownerID, pos)) 2028 if (null == rezAsset)
2035 { 2029 return null;
2036 return null;
2037 }
2038 group.ResetIDs();
2039 2030
2040 AddNewSceneObject(group, true); 2031 string xmlData = Utils.BytesToString(rezAsset.Data);
2032 SceneObjectGroup group = SceneObjectSerializer.FromOriginalXmlFormat(xmlData);
2041 2033
2042 // we set it's position in world. 2034 if (!Permissions.CanRezObject(group.Children.Count, ownerID, pos))
2043 group.AbsolutePosition = pos; 2035 return null;
2044 2036
2045 SceneObjectPart rootPart = group.GetChildPart(group.UUID); 2037 group.ResetIDs();
2046 2038
2047 // Since renaming the item in the inventory does not affect the name stored 2039 SceneObjectPart rootPart = group.GetChildPart(group.UUID);
2048 // in the serialization, transfer the correct name from the inventory to the
2049 // object itself before we rez.
2050 rootPart.Name = item.Name;
2051 rootPart.Description = item.Description;
2052 2040
2053 List<SceneObjectPart> partList = new List<SceneObjectPart>(group.Children.Values); 2041 // Since renaming the item in the inventory does not affect the name stored
2042 // in the serialization, transfer the correct name from the inventory to the
2043 // object itself before we rez.
2044 rootPart.Name = item.Name;
2045 rootPart.Description = item.Description;
2054 2046
2055 group.SetGroup(sourcePart.GroupID, null); 2047 List<SceneObjectPart> partList = new List<SceneObjectPart>(group.Children.Values);
2056 2048
2057 if ((rootPart.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0) 2049 group.SetGroup(sourcePart.GroupID, null);
2058 {
2059 if (Permissions.PropagatePermissions())
2060 {
2061 foreach (SceneObjectPart part in partList)
2062 {
2063 part.EveryoneMask = item.EveryonePermissions;
2064 part.NextOwnerMask = item.NextPermissions;
2065 }
2066 group.ApplyNextOwnerPermissions();
2067 }
2068 }
2069 2050
2051 if ((rootPart.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0)
2052 {
2053 if (Permissions.PropagatePermissions())
2054 {
2070 foreach (SceneObjectPart part in partList) 2055 foreach (SceneObjectPart part in partList)
2071 { 2056 {
2072 if ((part.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0)
2073 {
2074 part.LastOwnerID = part.OwnerID;
2075 part.OwnerID = item.OwnerID;
2076 part.Inventory.ChangeInventoryOwner(item.OwnerID);
2077 }
2078 part.EveryoneMask = item.EveryonePermissions; 2057 part.EveryoneMask = item.EveryonePermissions;
2079 part.NextOwnerMask = item.NextPermissions; 2058 part.NextOwnerMask = item.NextPermissions;
2080 } 2059 }
2081 2060
2082 rootPart.TrimPermissions(); 2061 group.ApplyNextOwnerPermissions();
2083 2062 }
2084 if (group.RootPart.Shape.PCode == (byte)PCode.Prim) 2063 }
2085 {
2086 group.ClearPartAttachmentData();
2087 }
2088
2089 group.UpdateGroupRotationR(rot);
2090
2091 //group.ApplyPhysics(m_physicalPrim);
2092 if (group.RootPart.PhysActor != null && group.RootPart.PhysActor.IsPhysical && vel != Vector3.Zero)
2093 {
2094 group.RootPart.ApplyImpulse((vel * group.GetMass()), false);
2095 group.Velocity = vel;
2096 rootPart.ScheduleFullUpdate();
2097 }
2098 group.CreateScriptInstances(param, true, DefaultScriptEngine, 2);
2099 rootPart.ScheduleFullUpdate();
2100 2064
2101 if (!Permissions.BypassPermissions()) 2065 foreach (SceneObjectPart part in partList)
2102 { 2066 {
2103 if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) 2067 if ((part.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0)
2104 sourcePart.Inventory.RemoveInventoryItem(item.ItemID); 2068 {
2105 } 2069 part.LastOwnerID = part.OwnerID;
2106 return rootPart.ParentGroup; 2070 part.OwnerID = item.OwnerID;
2071 part.Inventory.ChangeInventoryOwner(item.OwnerID);
2107 } 2072 }
2073
2074 part.EveryoneMask = item.EveryonePermissions;
2075 part.NextOwnerMask = item.NextPermissions;
2108 } 2076 }
2077
2078 rootPart.TrimPermissions();
2109 2079
2110 return null; 2080 if (!Permissions.BypassPermissions())
2081 {
2082 if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0)
2083 sourcePart.Inventory.RemoveInventoryItem(item.ItemID);
2084 }
2085
2086 AddNewSceneObject(group, true, pos, rot, vel);
2087
2088 // We can only call this after adding the scene object, since the scene object references the scene
2089 // to find out if scripts should be activated at all.
2090 group.CreateScriptInstances(param, true, DefaultScriptEngine, 2);
2091
2092 group.ScheduleGroupForFullUpdate();
2093
2094 return rootPart.ParentGroup;
2111 } 2095 }
2112 2096
2113 public virtual bool returnObjects(SceneObjectGroup[] returnobjects, UUID AgentId) 2097 public virtual bool returnObjects(SceneObjectGroup[] returnobjects, UUID AgentId)
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index eb5c3cb..520f1a1 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -42,7 +42,6 @@ using OpenMetaverse.Imaging;
42using OpenSim.Framework; 42using OpenSim.Framework;
43using OpenSim.Services.Interfaces; 43using OpenSim.Services.Interfaces;
44using OpenSim.Framework.Communications; 44using OpenSim.Framework.Communications;
45
46using OpenSim.Framework.Console; 45using OpenSim.Framework.Console;
47using OpenSim.Region.Framework.Interfaces; 46using OpenSim.Region.Framework.Interfaces;
48using OpenSim.Region.Framework.Scenes.Scripting; 47using OpenSim.Region.Framework.Scenes.Scripting;
@@ -2051,7 +2050,24 @@ namespace OpenSim.Region.Framework.Scenes
2051 public bool AddNewSceneObject(SceneObjectGroup sceneObject, bool attachToBackup, bool sendClientUpdates) 2050 public bool AddNewSceneObject(SceneObjectGroup sceneObject, bool attachToBackup, bool sendClientUpdates)
2052 { 2051 {
2053 return m_sceneGraph.AddNewSceneObject(sceneObject, attachToBackup, sendClientUpdates); 2052 return m_sceneGraph.AddNewSceneObject(sceneObject, attachToBackup, sendClientUpdates);
2054 } 2053 }
2054
2055 /// <summary>
2056 /// Add a newly created object to the scene.
2057 /// </summary>
2058 ///
2059 /// This method does not send updates to the client - callers need to handle this themselves.
2060 /// <param name="sceneObject"></param>
2061 /// <param name="attachToBackup"></param>
2062 /// <param name="pos">Position of the object</param>
2063 /// <param name="rot">Rotation of the object</param>
2064 /// <param name="vel">Velocity of the object. This parameter only has an effect if the object is physical</param>
2065 /// <returns></returns>
2066 public bool AddNewSceneObject(
2067 SceneObjectGroup sceneObject, bool attachToBackup, Vector3 pos, Quaternion rot, Vector3 vel)
2068 {
2069 return m_sceneGraph.AddNewSceneObject(sceneObject, attachToBackup, pos, rot, vel);
2070 }
2055 2071
2056 /// <summary> 2072 /// <summary>
2057 /// Delete every object from the scene. This does not include attachments worn by avatars. 2073 /// Delete every object from the scene. This does not include attachments worn by avatars.
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 1268259..3a0532a 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -312,6 +312,42 @@ namespace OpenSim.Region.Framework.Scenes
312 312
313 return AddSceneObject(sceneObject, attachToBackup, sendClientUpdates); 313 return AddSceneObject(sceneObject, attachToBackup, sendClientUpdates);
314 } 314 }
315
316 /// <summary>
317 /// Add a newly created object to the scene.
318 /// </summary>
319 ///
320 /// This method does not send updates to the client - callers need to handle this themselves.
321 /// <param name="sceneObject"></param>
322 /// <param name="attachToBackup"></param>
323 /// <param name="pos">Position of the object</param>
324 /// <param name="rot">Rotation of the object</param>
325 /// <param name="vel">Velocity of the object. This parameter only has an effect if the object is physical</param>
326 /// <returns></returns>
327 public bool AddNewSceneObject(
328 SceneObjectGroup sceneObject, bool attachToBackup, Vector3 pos, Quaternion rot, Vector3 vel)
329 {
330 AddNewSceneObject(sceneObject, true, false);
331
332 // we set it's position in world.
333 sceneObject.AbsolutePosition = pos;
334
335 if (sceneObject.RootPart.Shape.PCode == (byte)PCode.Prim)
336 {
337 sceneObject.ClearPartAttachmentData();
338 }
339
340 sceneObject.UpdateGroupRotationR(rot);
341
342 //group.ApplyPhysics(m_physicalPrim);
343 if (sceneObject.RootPart.PhysActor != null && sceneObject.RootPart.PhysActor.IsPhysical && vel != Vector3.Zero)
344 {
345 sceneObject.RootPart.ApplyImpulse((vel * sceneObject.GetMass()), false);
346 sceneObject.Velocity = vel;
347 }
348
349 return true;
350 }
315 351
316 /// <summary> 352 /// <summary>
317 /// Add an object to the scene. This will both update the scene, and send information about the 353 /// Add an object to the scene. This will both update the scene, and send information about the
diff --git a/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs b/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs
index fc66c85..3e2a2af 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs
@@ -134,7 +134,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
134 sop.Text = RandomName(); 134 sop.Text = RandomName();
135 sop.SitName = RandomName(); 135 sop.SitName = RandomName();
136 sop.TouchName = RandomName(); 136 sop.TouchName = RandomName();
137 sop.ObjectFlags |= (uint)PrimFlags.Phantom; 137 sop.Flags |= PrimFlags.Phantom;
138 138
139 SceneObjectGroup sog = new SceneObjectGroup(sop); 139 SceneObjectGroup sog = new SceneObjectGroup(sop);
140 scene.AddNewSceneObject(sog, false); 140 scene.AddNewSceneObject(sog, false);
diff --git a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs
new file mode 100644
index 0000000..da8199d
--- /dev/null
+++ b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs
@@ -0,0 +1,143 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Reflection;
31using System.Text;
32using System.Threading;
33using System.Timers;
34using Timer=System.Timers.Timer;
35using Nini.Config;
36using NUnit.Framework;
37using NUnit.Framework.SyntaxHelpers;
38using OpenMetaverse;
39using OpenMetaverse.Assets;
40using OpenSim.Framework;
41using OpenSim.Framework.Communications;
42using OpenSim.Region.Framework.Scenes;
43using OpenSim.Region.Framework.Interfaces;
44using OpenSim.Region.CoreModules.Avatar.Inventory.Archiver;
45using OpenSim.Region.CoreModules.World.Serialiser;
46using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation;
47using OpenSim.Services.Interfaces;
48using OpenSim.Tests.Common;
49using OpenSim.Tests.Common.Mock;
50using OpenSim.Tests.Common.Setup;
51
52namespace OpenSim.Region.Framework.Tests
53{
54 [TestFixture]
55 public class TaskInventoryTests
56 {
57 protected UserAccount CreateUser(Scene scene)
58 {
59 string userFirstName = "Jock";
60 string userLastName = "Stirrup";
61 string userPassword = "troll";
62 UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000020");
63 return UserProfileTestUtils.CreateUserWithInventory(scene, userFirstName, userLastName, userId, userPassword);
64 }
65
66 protected SceneObjectGroup CreateSO1(Scene scene, UUID ownerId)
67 {
68 string part1Name = "part1";
69 UUID part1Id = UUID.Parse("10000000-0000-0000-0000-000000000000");
70 SceneObjectPart part1
71 = new SceneObjectPart(ownerId, PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero)
72 { Name = part1Name, UUID = part1Id };
73 return new SceneObjectGroup(part1);
74 }
75
76 protected TaskInventoryItem CreateSOItem1(Scene scene, SceneObjectPart part)
77 {
78 AssetNotecard nc = new AssetNotecard("Hello World!");
79 UUID ncAssetUuid = new UUID("00000000-0000-0000-1000-000000000000");
80 UUID ncItemUuid = new UUID("00000000-0000-0000-1100-000000000000");
81 AssetBase ncAsset
82 = AssetHelpers.CreateAsset(ncAssetUuid, AssetType.Notecard, nc.AssetData, UUID.Zero);
83 scene.AssetService.Store(ncAsset);
84 TaskInventoryItem ncItem
85 = new TaskInventoryItem
86 { Name = "ncItem", AssetID = ncAssetUuid, ItemID = ncItemUuid,
87 Type = (int)AssetType.Notecard, InvType = (int)InventoryType.Notecard };
88 part.Inventory.AddInventoryItem(ncItem, true);
89
90 return ncItem;
91 }
92
93 /// <summary>
94 /// Test MoveTaskInventoryItem where the item has no parent folder assigned.
95 /// </summary>
96 /// This should place it in the most suitable user folder.
97 [Test]
98 public void TestMoveTaskInventoryItem()
99 {
100 TestHelper.InMethod();
101// log4net.Config.XmlConfigurator.Configure();
102
103 Scene scene = SceneSetupHelpers.SetupScene("inventory");
104 UserAccount user1 = CreateUser(scene);
105 SceneObjectGroup sog1 = CreateSO1(scene, user1.PrincipalID);
106 SceneObjectPart sop1 = sog1.RootPart;
107 TaskInventoryItem sopItem1 = CreateSOItem1(scene, sop1);
108 InventoryFolderBase folder
109 = InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, user1.PrincipalID, "Objects")[0];
110
111 // Perform test
112 scene.MoveTaskInventoryItem(user1.PrincipalID, folder.ID, sop1, sopItem1.ItemID);
113
114 InventoryItemBase ncUserItem
115 = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, user1.PrincipalID, "Objects/ncItem");
116 Assert.That(ncUserItem, Is.Not.Null, "Objects/ncItem was not found");
117 }
118
119 /// <summary>
120 /// Test MoveTaskInventoryItem where the item has no parent folder assigned.
121 /// </summary>
122 /// This should place it in the most suitable user folder.
123 [Test]
124 public void TestMoveTaskInventoryItemNoParent()
125 {
126 TestHelper.InMethod();
127// log4net.Config.XmlConfigurator.Configure();
128
129 Scene scene = SceneSetupHelpers.SetupScene("inventory");
130 UserAccount user1 = CreateUser(scene);
131 SceneObjectGroup sog1 = CreateSO1(scene, user1.PrincipalID);
132 SceneObjectPart sop1 = sog1.RootPart;
133 TaskInventoryItem sopItem1 = CreateSOItem1(scene, sop1);
134
135 // Perform test
136 scene.MoveTaskInventoryItem(user1.PrincipalID, UUID.Zero, sop1, sopItem1.ItemID);
137
138 InventoryItemBase ncUserItem
139 = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, user1.PrincipalID, "Notecards/ncItem");
140 Assert.That(ncUserItem, Is.Not.Null, "Notecards/ncItem was not found");
141 }
142 }
143} \ No newline at end of file