OpenSim
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros
NPCModuleTests.cs
Go to the documentation of this file.
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 
28 using System;
29 using System.Collections.Generic;
30 using System.Reflection;
31 using log4net;
32 using Nini.Config;
33 using NUnit.Framework;
34 using OpenMetaverse;
35 using OpenSim.Framework;
36 using OpenSim.Region.CoreModules.Avatar.Attachments;
37 using OpenSim.Region.CoreModules.Avatar.AvatarFactory;
38 using OpenSim.Region.CoreModules.Framework.InventoryAccess;
39 using OpenSim.Region.CoreModules.Framework.UserManagement;
40 using OpenSim.Region.CoreModules.ServiceConnectorsOut.Avatar;
41 using OpenSim.Region.Framework.Interfaces;
42 using OpenSim.Region.Framework.Scenes;
43 using OpenSim.Services.AvatarService;
44 using OpenSim.Tests.Common;
45 
46 namespace OpenSim.Region.OptionalModules.World.NPC.Tests
47 {
48  [TestFixture]
50  {
51  private TestScene m_scene;
52  private AvatarFactoryModule m_afMod;
53  private UserManagementModule m_umMod;
54  private AttachmentsModule m_attMod;
55  private NPCModule m_npcMod;
56 
57  [TestFixtureSetUp]
58  public void FixtureInit()
59  {
60  // Don't allow tests to be bamboozled by asynchronous events. Execute everything on the same thread.
61  Util.FireAndForgetMethod = FireAndForgetMethod.None;
62  }
63 
64  [TestFixtureTearDown]
65  public void TearDown()
66  {
67  // We must set this back afterwards, otherwise later tests will fail since they're expecting multiple
68  // threads. Possibly, later tests should be rewritten not to worry about such things.
69  Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod;
70  }
71 
72  public void SetUpScene()
73  {
74  SetUpScene(256, 256);
75  }
76 
77  public void SetUpScene(uint sizeX, uint sizeY)
78  {
79  IConfigSource config = new IniConfigSource();
80  config.AddConfig("NPC");
81  config.Configs["NPC"].Set("Enabled", "true");
82  config.AddConfig("Modules");
83  config.Configs["Modules"].Set("InventoryAccessModule", "BasicInventoryAccessModule");
84 
85  m_afMod = new AvatarFactoryModule();
86  m_umMod = new UserManagementModule();
87  m_attMod = new AttachmentsModule();
88  m_npcMod = new NPCModule();
89 
90  m_scene = new SceneHelpers().SetupScene("test scene", UUID.Random(), 1000, 1000, sizeX, sizeY, config);
91  SceneHelpers.SetupSceneModules(m_scene, config, m_afMod, m_umMod, m_attMod, m_npcMod, new BasicInventoryAccessModule());
92  }
93 
94  [Test]
95  public void TestCreate()
96  {
97  TestHelpers.InMethod();
98 // log4net.Config.XmlConfigurator.Configure();
99 
100  SetUpScene();
101 
102  ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, TestHelpers.ParseTail(0x1));
103 // ScenePresence originalAvatar = scene.GetScenePresence(originalClient.AgentId);
104 
105  // 8 is the index of the first baked texture in AvatarAppearance
106  UUID originalFace8TextureId = TestHelpers.ParseTail(0x10);
107  Primitive.TextureEntry originalTe = new Primitive.TextureEntry(UUID.Zero);
108  Primitive.TextureEntryFace originalTef = originalTe.CreateFace(8);
109  originalTef.TextureID = originalFace8TextureId;
110 
111  // We also need to add the texture to the asset service, otherwise the AvatarFactoryModule will tell
112  // ScenePresence.SendInitialData() to reset our entire appearance.
113  m_scene.AssetService.Store(AssetHelpers.CreateNotecardAsset(originalFace8TextureId));
114 
115  m_afMod.SetAppearance(sp, originalTe, null, new WearableCacheItem[0] );
116 
117  UUID npcId = m_npcMod.CreateNPC("John", "Smith", new Vector3(128, 128, 30), UUID.Zero, true, m_scene, sp.Appearance);
118 
119  ScenePresence npc = m_scene.GetScenePresence(npcId);
120 
121  Assert.That(npc, Is.Not.Null);
122  Assert.That(npc.Appearance.Texture.FaceTextures[8].TextureID, Is.EqualTo(originalFace8TextureId));
123  Assert.That(m_umMod.GetUserName(npc.UUID), Is.EqualTo(string.Format("{0} {1}", npc.Firstname, npc.Lastname)));
124 
125  IClientAPI client;
126  Assert.That(m_scene.TryGetClient(npcId, out client), Is.True);
127 
128  // Have to account for both SP and NPC.
129  Assert.That(m_scene.AuthenticateHandler.GetAgentCircuits().Count, Is.EqualTo(2));
130  }
131 
132  [Test]
133  public void TestRemove()
134  {
135  TestHelpers.InMethod();
136 // log4net.Config.XmlConfigurator.Configure();
137 
138  SetUpScene();
139 
140  ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, TestHelpers.ParseTail(0x1));
141 // ScenePresence originalAvatar = scene.GetScenePresence(originalClient.AgentId);
142 
143  Vector3 startPos = new Vector3(128, 128, 30);
144  UUID npcId = m_npcMod.CreateNPC("John", "Smith", startPos, UUID.Zero, true, m_scene, sp.Appearance);
145 
146  m_npcMod.DeleteNPC(npcId, m_scene);
147 
148  ScenePresence deletedNpc = m_scene.GetScenePresence(npcId);
149 
150  Assert.That(deletedNpc, Is.Null);
151  IClientAPI client;
152  Assert.That(m_scene.TryGetClient(npcId, out client), Is.False);
153 
154  // Have to account for SP still present.
155  Assert.That(m_scene.AuthenticateHandler.GetAgentCircuits().Count, Is.EqualTo(1));
156  }
157 
158  [Test]
160  {
161  TestHelpers.InMethod();
162 // TestHelpers.EnableLogging();
163 
164  SetUpScene();
165 
166  UUID userId = TestHelpers.ParseTail(0x1);
167  UserAccountHelpers.CreateUserWithInventory(m_scene, userId);
168  ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId);
169 
170  UUID attItemId = TestHelpers.ParseTail(0x2);
171  UUID attAssetId = TestHelpers.ParseTail(0x3);
172  string attName = "att";
173 
174  UserInventoryHelpers.CreateInventoryItem(m_scene, attName, attItemId, attAssetId, sp.UUID, InventoryType.Object);
175 
176  m_attMod.RezSingleAttachmentFromInventory(sp, attItemId, (uint)AttachmentPoint.Chest);
177 
178  UUID npcId = m_npcMod.CreateNPC("John", "Smith", new Vector3(128, 128, 30), UUID.Zero, true, m_scene, sp.Appearance);
179 
180  ScenePresence npc = m_scene.GetScenePresence(npcId);
181 
182  // Check scene presence status
183  Assert.That(npc.HasAttachments(), Is.True);
184  List<SceneObjectGroup> attachments = npc.GetAttachments();
185  Assert.That(attachments.Count, Is.EqualTo(1));
186  SceneObjectGroup attSo = attachments[0];
187 
188  // Just for now, we won't test the name since this is (wrongly) the asset part name rather than the item
189  // name. TODO: Do need to fix ultimately since the item may be renamed before being passed on to an NPC.
190 // Assert.That(attSo.Name, Is.EqualTo(attName));
191 
192  Assert.That(attSo.AttachmentPoint, Is.EqualTo((byte)AttachmentPoint.Chest));
193  Assert.That(attSo.IsAttachment);
194  Assert.That(attSo.UsesPhysics, Is.False);
195  Assert.That(attSo.IsTemporary, Is.False);
196  Assert.That(attSo.OwnerID, Is.EqualTo(npc.UUID));
197  }
198 
199  [Test]
201  {
202  TestHelpers.InMethod();
203 // TestHelpers.EnableLogging();
204 
205  SetUpScene();
206 // m_attMod.DebugLevel = 1;
207 
208  UUID userId = TestHelpers.ParseTail(0x1);
209  UserAccountHelpers.CreateUserWithInventory(m_scene, userId);
210  ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId);
211 
212  InventoryItemBase att1Item
213  = UserInventoryHelpers.CreateInventoryItem(
214  m_scene, "att1", TestHelpers.ParseTail(0x2), TestHelpers.ParseTail(0x3), sp.UUID, InventoryType.Object);
215  InventoryItemBase att2Item
216  = UserInventoryHelpers.CreateInventoryItem(
217  m_scene, "att2", TestHelpers.ParseTail(0x12), TestHelpers.ParseTail(0x13), sp.UUID, InventoryType.Object);
218 
219  m_attMod.RezSingleAttachmentFromInventory(sp, att1Item.ID, (uint)AttachmentPoint.Chest);
220  m_attMod.RezSingleAttachmentFromInventory(sp, att2Item.ID, (uint)AttachmentPoint.Chest | 0x80);
221 
222  UUID npcId = m_npcMod.CreateNPC("John", "Smith", new Vector3(128, 128, 30), UUID.Zero, true, m_scene, sp.Appearance);
223 
224  ScenePresence npc = m_scene.GetScenePresence(npcId);
225 
226  // Check scene presence status
227  Assert.That(npc.HasAttachments(), Is.True);
228  List<SceneObjectGroup> attachments = npc.GetAttachments();
229  Assert.That(attachments.Count, Is.EqualTo(2));
230 
231  // Just for now, we won't test the name since this is (wrongly) the asset part name rather than the item
232  // name. TODO: Do need to fix ultimately since the item may be renamed before being passed on to an NPC.
233 // Assert.That(attSo.Name, Is.EqualTo(attName));
234 
235  TestAttachedObject(attachments[0], AttachmentPoint.Chest, npc.UUID);
236  TestAttachedObject(attachments[1], AttachmentPoint.Chest, npc.UUID);
237 
238  // Attached objects on the same point must have different FromItemIDs to be shown to other avatars, at least
239  // on Singularity 1.8.5. Otherwise, only one (the first ObjectUpdate sent) appears.
240  Assert.AreNotEqual(attachments[0].FromItemID, attachments[1].FromItemID);
241  }
242 
243  private void TestAttachedObject(SceneObjectGroup attSo, AttachmentPoint attPoint, UUID ownerId)
244  {
245  Assert.That(attSo.AttachmentPoint, Is.EqualTo((byte)attPoint));
246  Assert.That(attSo.IsAttachment);
247  Assert.That(attSo.UsesPhysics, Is.False);
248  Assert.That(attSo.IsTemporary, Is.False);
249  Assert.That(attSo.OwnerID, Is.EqualTo(ownerId));
250  }
251 
252  [Test]
253  public void TestLoadAppearance()
254  {
255  TestHelpers.InMethod();
256 // log4net.Config.XmlConfigurator.Configure();
257 
258  SetUpScene();
259 
260  UUID userId = TestHelpers.ParseTail(0x1);
261  UserAccountHelpers.CreateUserWithInventory(m_scene, userId);
262  ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId);
263 
264  UUID npcId = m_npcMod.CreateNPC("John", "Smith", new Vector3(128, 128, 30), UUID.Zero, true, m_scene, sp.Appearance);
265 
266  // Now add the attachment to the original avatar and use that to load a new appearance
267  // TODO: Could also run tests loading from a notecard though this isn't much different for our purposes here
268  UUID attItemId = TestHelpers.ParseTail(0x2);
269  UUID attAssetId = TestHelpers.ParseTail(0x3);
270  string attName = "att";
271 
272  UserInventoryHelpers.CreateInventoryItem(m_scene, attName, attItemId, attAssetId, sp.UUID, InventoryType.Object);
273 
274  m_attMod.RezSingleAttachmentFromInventory(sp, attItemId, (uint)AttachmentPoint.Chest);
275 
276  m_npcMod.SetNPCAppearance(npcId, sp.Appearance, m_scene);
277 
278  ScenePresence npc = m_scene.GetScenePresence(npcId);
279 
280  // Check scene presence status
281  Assert.That(npc.HasAttachments(), Is.True);
282  List<SceneObjectGroup> attachments = npc.GetAttachments();
283  Assert.That(attachments.Count, Is.EqualTo(1));
284  SceneObjectGroup attSo = attachments[0];
285 
286  // Just for now, we won't test the name since this is (wrongly) the asset part name rather than the item
287  // name. TODO: Do need to fix ultimately since the item may be renamed before being passed on to an NPC.
288 // Assert.That(attSo.Name, Is.EqualTo(attName));
289 
290  Assert.That(attSo.AttachmentPoint, Is.EqualTo((byte)AttachmentPoint.Chest));
291  Assert.That(attSo.IsAttachment);
292  Assert.That(attSo.UsesPhysics, Is.False);
293  Assert.That(attSo.IsTemporary, Is.False);
294  Assert.That(attSo.OwnerID, Is.EqualTo(npc.UUID));
295  }
296 
297  [Test]
298  public void TestMove()
299  {
300  TestHelpers.InMethod();
301 // TestHelpers.EnableLogging();
302 
303  SetUpScene();
304 
305  ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, TestHelpers.ParseTail(0x1));
306 // ScenePresence originalAvatar = scene.GetScenePresence(originalClient.AgentId);
307 
308  Vector3 startPos = new Vector3(128, 128, 30);
309  UUID npcId = m_npcMod.CreateNPC("John", "Smith", startPos, UUID.Zero, true, m_scene, sp.Appearance);
310 
311  ScenePresence npc = m_scene.GetScenePresence(npcId);
312  Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos));
313 
314  // For now, we'll make the scene presence fly to simplify this test, but this needs to change.
315  npc.Flying = true;
316 
317  m_scene.Update(1);
318  Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos));
319 
320  Vector3 targetPos = startPos + new Vector3(0, 10, 0);
321  m_npcMod.MoveToTarget(npc.UUID, m_scene, targetPos, false, false, false);
322 
323  Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos));
324  //Assert.That(npc.Rotation, Is.EqualTo(new Quaternion(0, 0, 0.7071068f, 0.7071068f)));
325  Assert.That(
326  npc.Rotation, new QuaternionToleranceConstraint(new Quaternion(0, 0, 0.7071068f, 0.7071068f), 0.000001));
327 
328  m_scene.Update(1);
329 
330  // We should really check the exact figure.
331  Assert.That(npc.AbsolutePosition.X, Is.EqualTo(startPos.X));
332  Assert.That(npc.AbsolutePosition.Y, Is.GreaterThan(startPos.Y));
333  Assert.That(npc.AbsolutePosition.Z, Is.EqualTo(startPos.Z));
334  Assert.That(npc.AbsolutePosition.Z, Is.LessThan(targetPos.X));
335 
336  m_scene.Update(10);
337 
338  double distanceToTarget = Util.GetDistanceTo(npc.AbsolutePosition, targetPos);
339  Assert.That(distanceToTarget, Is.LessThan(1), "NPC not within 1 unit of target position on first move");
340  Assert.That(npc.AbsolutePosition, Is.EqualTo(targetPos));
341  Assert.That(npc.AgentControlFlags, Is.EqualTo((uint)AgentManager.ControlFlags.NONE));
342 
343  // Try a second movement
344  startPos = npc.AbsolutePosition;
345  targetPos = startPos + new Vector3(10, 0, 0);
346  m_npcMod.MoveToTarget(npc.UUID, m_scene, targetPos, false, false, false);
347 
348  Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos));
349 // Assert.That(npc.Rotation, Is.EqualTo(new Quaternion(0, 0, 0, 1)));
350  Assert.That(
351  npc.Rotation, new QuaternionToleranceConstraint(new Quaternion(0, 0, 0, 1), 0.000001));
352 
353  m_scene.Update(1);
354 
355  // We should really check the exact figure.
356  Assert.That(npc.AbsolutePosition.X, Is.GreaterThan(startPos.X));
357  Assert.That(npc.AbsolutePosition.X, Is.LessThan(targetPos.X));
358  Assert.That(npc.AbsolutePosition.Y, Is.EqualTo(startPos.Y));
359  Assert.That(npc.AbsolutePosition.Z, Is.EqualTo(startPos.Z));
360 
361  m_scene.Update(10);
362 
363  distanceToTarget = Util.GetDistanceTo(npc.AbsolutePosition, targetPos);
364  Assert.That(distanceToTarget, Is.LessThan(1), "NPC not within 1 unit of target position on second move");
365  Assert.That(npc.AbsolutePosition, Is.EqualTo(targetPos));
366  }
367 
368  [Test]
369  public void TestMoveInVarRegion()
370  {
371  TestHelpers.InMethod();
372 // TestHelpers.EnableLogging();
373 
374  SetUpScene(512, 512);
375 
376  ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, TestHelpers.ParseTail(0x1));
377 // ScenePresence originalAvatar = scene.GetScenePresence(originalClient.AgentId);
378 
379  Vector3 startPos = new Vector3(128, 246, 30);
380  UUID npcId = m_npcMod.CreateNPC("John", "Smith", startPos, UUID.Zero, true, m_scene, sp.Appearance);
381 
382  ScenePresence npc = m_scene.GetScenePresence(npcId);
383  Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos));
384 
385  // For now, we'll make the scene presence fly to simplify this test, but this needs to change.
386  npc.Flying = true;
387 
388  m_scene.Update(1);
389  Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos));
390 
391  Vector3 targetPos = startPos + new Vector3(0, 20, 0);
392  m_npcMod.MoveToTarget(npc.UUID, m_scene, targetPos, false, false, false);
393 
394  Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos));
395  //Assert.That(npc.Rotation, Is.EqualTo(new Quaternion(0, 0, 0.7071068f, 0.7071068f)));
396  Assert.That(
397  npc.Rotation, new QuaternionToleranceConstraint(new Quaternion(0, 0, 0.7071068f, 0.7071068f), 0.000001));
398 
399  m_scene.Update(1);
400 
401  // We should really check the exact figure.
402  Assert.That(npc.AbsolutePosition.X, Is.EqualTo(startPos.X));
403  Assert.That(npc.AbsolutePosition.Y, Is.GreaterThan(startPos.Y));
404  Assert.That(npc.AbsolutePosition.Z, Is.EqualTo(startPos.Z));
405  Assert.That(npc.AbsolutePosition.Z, Is.LessThan(targetPos.X));
406 
407  for (int i = 0; i < 20; i++)
408  {
409  m_scene.Update(1);
410 // Console.WriteLine("pos: {0}", npc.AbsolutePosition);
411  }
412 
413  double distanceToTarget = Util.GetDistanceTo(npc.AbsolutePosition, targetPos);
414  Assert.That(distanceToTarget, Is.LessThan(1), "NPC not within 1 unit of target position on first move");
415  Assert.That(npc.AbsolutePosition, Is.EqualTo(targetPos));
416  Assert.That(npc.AgentControlFlags, Is.EqualTo((uint)AgentManager.ControlFlags.NONE));
417  }
418 
419  [Test]
421  {
422  TestHelpers.InMethod();
423 // log4net.Config.XmlConfigurator.Configure();
424 
425  SetUpScene();
426 
427  ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, TestHelpers.ParseTail(0x1));
428 
429  Vector3 startPos = new Vector3(128, 128, 30);
430  UUID npcId = m_npcMod.CreateNPC("John", "Smith", startPos, UUID.Zero, true, m_scene, sp.Appearance);
431 
432  ScenePresence npc = m_scene.GetScenePresence(npcId);
433  SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene).RootPart;
434 
435  part.SitTargetPosition = new Vector3(0, 0, 1);
436  m_npcMod.Sit(npc.UUID, part.UUID, m_scene);
437 
438  Assert.That(part.SitTargetAvatar, Is.EqualTo(npcId));
439  Assert.That(npc.ParentID, Is.EqualTo(part.LocalId));
440 // Assert.That(
441 // npc.AbsolutePosition,
442 // Is.EqualTo(part.AbsolutePosition + part.SitTargetPosition + ScenePresence.SIT_TARGET_ADJUSTMENT));
443 
444  m_npcMod.Stand(npc.UUID, m_scene);
445 
446  Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero));
447  Assert.That(npc.ParentID, Is.EqualTo(0));
448  }
449 
450  [Test]
452  {
453  TestHelpers.InMethod();
454 // TestHelpers.EnableLogging();
455 
456  SetUpScene();
457 
458  ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, TestHelpers.ParseTail(0x1));
459 
460  // FIXME: To get this to work for now, we are going to place the npc right next to the target so that
461  // the autopilot doesn't trigger
462  Vector3 startPos = new Vector3(1, 1, 1);
463 
464  UUID npcId = m_npcMod.CreateNPC("John", "Smith", startPos, UUID.Zero, true, m_scene, sp.Appearance);
465 
466  ScenePresence npc = m_scene.GetScenePresence(npcId);
467  SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene).RootPart;
468 
469  m_npcMod.Sit(npc.UUID, part.UUID, m_scene);
470 
471  Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero));
472  Assert.That(npc.ParentID, Is.EqualTo(part.LocalId));
473 
474  // We should really be using the NPC size but this would mean preserving the physics actor since it is
475  // removed on sit.
476  Assert.That(
477  npc.AbsolutePosition,
478  Is.EqualTo(part.AbsolutePosition + new Vector3(0, 0, sp.PhysicsActor.Size.Z / 2)));
479 
480  m_npcMod.Stand(npc.UUID, m_scene);
481 
482  Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero));
483  Assert.That(npc.ParentID, Is.EqualTo(0));
484  }
485  }
486 }
PhysicsActor PhysicsActor
Physical scene representation of this Avatar.
A scene object group is conceptually an object in the scene. The object is constituted of SceneObject...
static UUID ParseTail(int tail)
Parse tail section into full UUID.
Definition: TestHelpers.cs:140
Inventory Item - contains all the properties associated with an individual inventory piece...
Helpers for setting up scenes.
Definition: SceneHelpers.cs:60
Interactive OpenSim region server
Definition: OpenSim.cs:55