aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs7
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs20
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs5
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs8
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs115
-rw-r--r--OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs152
-rw-r--r--OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs8
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs43
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs51
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs15
-rw-r--r--OpenSim/Region/CoreModules/World/Land/LandObject.cs7
-rw-r--r--OpenSim/Region/Framework/Scenes/EventManager.cs49
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs81
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs8
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs41
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs82
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs16
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs3
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs125
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs10
20 files changed, 617 insertions, 229 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 3118613..1004be6 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -1923,7 +1923,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1923 1923
1924 folderBlock.FolderID = folder.ID; 1924 folderBlock.FolderID = folder.ID;
1925 folderBlock.ParentID = folder.ParentID; 1925 folderBlock.ParentID = folder.ParentID;
1926 folderBlock.Type = -1; 1926 //folderBlock.Type = -1;
1927 folderBlock.Type = (sbyte)folder.Type;
1927 folderBlock.Name = Util.StringToBytes256(folder.Name); 1928 folderBlock.Name = Util.StringToBytes256(folder.Name);
1928 1929
1929 return folderBlock; 1930 return folderBlock;
@@ -4360,7 +4361,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4360 block.OwnerID = sop.OwnerID; 4361 block.OwnerID = sop.OwnerID;
4361 4362
4362 block.ItemID = sop.FromUserInventoryItemID; 4363 block.ItemID = sop.FromUserInventoryItemID;
4363 block.FolderID = UUID.Zero; // sop.FromFolderID ?? 4364 block.FolderID = UUID.Zero; // sog.FromFolderID ??
4364 block.FromTaskID = UUID.Zero; // ??? 4365 block.FromTaskID = UUID.Zero; // ???
4365 block.InventorySerial = (short)sop.InventorySerial; 4366 block.InventorySerial = (short)sop.InventorySerial;
4366 4367
@@ -5082,7 +5083,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5082 update.MediaURL = Utils.EmptyBytes; // FIXME: Support this in OpenSim 5083 update.MediaURL = Utils.EmptyBytes; // FIXME: Support this in OpenSim
5083 if (data.ParentGroup.IsAttachment) 5084 if (data.ParentGroup.IsAttachment)
5084 { 5085 {
5085 update.NameValue = Util.StringToBytes256("AttachItemID STRING RW SV " + data.FromItemID); 5086 update.NameValue = Util.StringToBytes256("AttachItemID STRING RW SV " + data.ParentGroup.FromItemID);
5086 update.State = (byte)((data.ParentGroup.AttachmentPoint % 16) * 16 + (data.ParentGroup.AttachmentPoint / 16)); 5087 update.State = (byte)((data.ParentGroup.AttachmentPoint % 16) * 16 + (data.ParentGroup.AttachmentPoint / 16));
5087 } 5088 }
5088 else 5089 else
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index c5cec59..78ae5e9 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -285,7 +285,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
285 // At the moment we can only deal with a single attachment 285 // At the moment we can only deal with a single attachment
286 if (attachments.Count != 0) 286 if (attachments.Count != 0)
287 { 287 {
288 UUID oldAttachmentItemID = attachments[0].GetFromItemID(); 288 UUID oldAttachmentItemID = attachments[0].FromItemID;
289 289
290 if (oldAttachmentItemID != UUID.Zero) 290 if (oldAttachmentItemID != UUID.Zero)
291 DetachSingleAttachmentToInvInternal(sp, oldAttachmentItemID); 291 DetachSingleAttachmentToInvInternal(sp, oldAttachmentItemID);
@@ -296,7 +296,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
296 } 296 }
297 297
298 // Add the new attachment to inventory if we don't already have it. 298 // Add the new attachment to inventory if we don't already have it.
299 UUID newAttachmentItemID = group.GetFromItemID(); 299 UUID newAttachmentItemID = group.FromItemID;
300 if (newAttachmentItemID == UUID.Zero) 300 if (newAttachmentItemID == UUID.Zero)
301 newAttachmentItemID = AddSceneObjectAsNewAttachmentInInv(sp, group).ID; 301 newAttachmentItemID = AddSceneObjectAsNewAttachmentInInv(sp, group).ID;
302 302
@@ -336,7 +336,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
336 List<SceneObjectGroup> existingAttachments = sp.GetAttachments(); 336 List<SceneObjectGroup> existingAttachments = sp.GetAttachments();
337 foreach (SceneObjectGroup so in existingAttachments) 337 foreach (SceneObjectGroup so in existingAttachments)
338 { 338 {
339 if (so.GetFromItemID() == itemID) 339 if (so.FromItemID == itemID)
340 { 340 {
341 alreadyOn = true; 341 alreadyOn = true;
342 break; 342 break;
@@ -393,7 +393,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
393 if (so.AttachedAvatar != sp.UUID) 393 if (so.AttachedAvatar != sp.UUID)
394 return; 394 return;
395 395
396 UUID inventoryID = so.GetFromItemID(); 396 UUID inventoryID = so.FromItemID;
397 397
398// m_log.DebugFormat( 398// m_log.DebugFormat(
399// "[ATTACHMENTS MODULE]: In DetachSingleAttachmentToGround(), object is {0} {1}, associated item is {2}", 399// "[ATTACHMENTS MODULE]: In DetachSingleAttachmentToGround(), object is {0} {1}, associated item is {2}",
@@ -410,9 +410,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
410 m_scene.AvatarFactory.QueueAppearanceSave(sp.UUID); 410 m_scene.AvatarFactory.QueueAppearanceSave(sp.UUID);
411 411
412 sp.RemoveAttachment(so); 412 sp.RemoveAttachment(so);
413 so.FromItemID = UUID.Zero;
413 414
414 SceneObjectPart rootPart = so.RootPart; 415 SceneObjectPart rootPart = so.RootPart;
415 rootPart.FromItemID = UUID.Zero;
416 so.AbsolutePosition = sp.AbsolutePosition; 416 so.AbsolutePosition = sp.AbsolutePosition;
417 so.AttachedAvatar = UUID.Zero; 417 so.AttachedAvatar = UUID.Zero;
418 rootPart.SetParentLocalId(0); 418 rootPart.SetParentLocalId(0);
@@ -526,7 +526,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
526 526
527 string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp); 527 string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp);
528 528
529 InventoryItemBase item = new InventoryItemBase(grp.GetFromItemID(), sp.UUID); 529 InventoryItemBase item = new InventoryItemBase(grp.FromItemID, sp.UUID);
530 item = m_scene.InventoryService.GetItem(item); 530 item = m_scene.InventoryService.GetItem(item);
531 531
532 if (item != null) 532 if (item != null)
@@ -698,7 +698,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
698 item.CreationDate = Util.UnixTimeSinceEpoch(); 698 item.CreationDate = Util.UnixTimeSinceEpoch();
699 699
700 // sets itemID so client can show item as 'attached' in inventory 700 // sets itemID so client can show item as 'attached' in inventory
701 grp.SetFromItemID(item.ID); 701 grp.FromItemID = item.ID;
702 702
703 if (m_scene.AddInventoryItem(item)) 703 if (m_scene.AddInventoryItem(item))
704 { 704 {
@@ -734,7 +734,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
734 if (entity is SceneObjectGroup) 734 if (entity is SceneObjectGroup)
735 { 735 {
736 group = (SceneObjectGroup)entity; 736 group = (SceneObjectGroup)entity;
737 if (group.GetFromItemID() == itemID) 737 if (group.FromItemID == itemID)
738 { 738 {
739 m_scene.EventManager.TriggerOnAttach(group.LocalId, itemID, UUID.Zero); 739 m_scene.EventManager.TriggerOnAttach(group.LocalId, itemID, UUID.Zero);
740 sp.RemoveAttachment(group); 740 sp.RemoveAttachment(group);
@@ -946,7 +946,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
946 // Calls attach with a Zero position 946 // Calls attach with a Zero position
947 if (AttachObject(sp, part.ParentGroup, AttachmentPt, false)) 947 if (AttachObject(sp, part.ParentGroup, AttachmentPt, false))
948 { 948 {
949 m_scene.EventManager.TriggerOnAttach(objectLocalID, part.ParentGroup.GetFromItemID(), remoteClient.AgentId); 949 m_scene.EventManager.TriggerOnAttach(objectLocalID, part.ParentGroup.FromItemID, remoteClient.AgentId);
950 950
951 // Save avatar attachment information 951 // Save avatar attachment information
952 m_log.Debug( 952 m_log.Debug(
@@ -969,7 +969,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
969 ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId); 969 ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId);
970 SceneObjectGroup group = m_scene.GetGroupByPrim(objectLocalID); 970 SceneObjectGroup group = m_scene.GetGroupByPrim(objectLocalID);
971 if (sp != null && group != null) 971 if (sp != null && group != null)
972 DetachSingleAttachmentToInv(sp, group.GetFromItemID()); 972 DetachSingleAttachmentToInv(sp, group.FromItemID);
973 } 973 }
974 974
975 private void Client_OnDetachAttachmentIntoInv(UUID itemID, IClientAPI remoteClient) 975 private void Client_OnDetachAttachmentIntoInv(UUID itemID, IClientAPI remoteClient)
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
index 86cfb32..bfe5e4a 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
@@ -120,8 +120,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
120 Assert.That(attSo.IsTemporary, Is.False); 120 Assert.That(attSo.IsTemporary, Is.False);
121 121
122 // Check item status 122 // Check item status
123 Assert.That(m_presence.Appearance.GetAttachpoint( 123 Assert.That(
124 attSo.GetFromItemID()), Is.EqualTo((int)AttachmentPoint.Chest)); 124 m_presence.Appearance.GetAttachpoint(attSo.FromItemID),
125 Is.EqualTo((int)AttachmentPoint.Chest));
125 } 126 }
126 127
127 [Test] 128 [Test]
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index b64d372..2b790f4 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -562,12 +562,18 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
562 // Finally, kill the agent we just created at the destination. 562 // Finally, kill the agent we just created at the destination.
563 m_aScene.SimulationService.CloseAgent(finalDestination, sp.UUID); 563 m_aScene.SimulationService.CloseAgent(finalDestination, sp.UUID);
564 564
565 sp.Scene.EventManager.TriggerTeleportFail(sp.ControllingClient, logout);
565 } 566 }
566 567
567 protected virtual bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason, out bool logout) 568 protected virtual bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason, out bool logout)
568 { 569 {
569 logout = false; 570 logout = false;
570 return m_aScene.SimulationService.CreateAgent(finalDestination, agentCircuit, teleportFlags, out reason); 571 bool success = m_aScene.SimulationService.CreateAgent(finalDestination, agentCircuit, teleportFlags, out reason);
572
573 if (success)
574 sp.Scene.EventManager.TriggerTeleportStart(sp.ControllingClient, reg, finalDestination, teleportFlags, logout);
575
576 return success;
571 } 577 }
572 578
573 protected virtual bool UpdateAgent(GridRegion reg, GridRegion finalDestination, AgentData agent) 579 protected virtual bool UpdateAgent(GridRegion reg, GridRegion finalDestination, AgentData agent)
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
index 6fc8e4d..8b5ad23 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
@@ -51,8 +51,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
51 51
52 private bool m_Initialized = false; 52 private bool m_Initialized = false;
53 53
54 private bool m_RestrictInventoryAccessAbroad = false;
55
56 private GatekeeperServiceConnector m_GatekeeperConnector; 54 private GatekeeperServiceConnector m_GatekeeperConnector;
57 55
58 #region ISharedRegionModule 56 #region ISharedRegionModule
@@ -71,10 +69,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
71 if (name == Name) 69 if (name == Name)
72 { 70 {
73 InitialiseCommon(source); 71 InitialiseCommon(source);
74 IConfig transferConfig = source.Configs["HGEntityTransferModule"];
75 if (transferConfig != null)
76 m_RestrictInventoryAccessAbroad = transferConfig.GetBoolean("RestrictInventoryAccessAbroad", false);
77
78 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: {0} enabled.", Name); 72 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: {0} enabled.", Name);
79 } 73 }
80 } 74 }
@@ -94,34 +88,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
94 client.OnTeleportHomeRequest += TriggerTeleportHome; 88 client.OnTeleportHomeRequest += TriggerTeleportHome;
95 client.OnTeleportLandmarkRequest += RequestTeleportLandmark; 89 client.OnTeleportLandmarkRequest += RequestTeleportLandmark;
96 client.OnConnectionClosed += new Action<IClientAPI>(OnConnectionClosed); 90 client.OnConnectionClosed += new Action<IClientAPI>(OnConnectionClosed);
97 client.OnCompleteMovementToRegion += new Action<IClientAPI, bool>(OnCompleteMovementToRegion);
98 }
99
100 protected void OnCompleteMovementToRegion(IClientAPI client, bool arg2)
101 {
102 // HACK HACK -- just seeing how the viewer responds
103 // Let's send the Suitcase or the real root folder folder for incoming HG agents
104 // Visiting agents get their suitcase contents; incoming local users get their real root folder's content
105 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: OnCompleteMovementToRegion of user {0}", client.AgentId);
106 object sp = null;
107 if (client.Scene.TryGetScenePresence(client.AgentId, out sp))
108 {
109 if (sp is ScenePresence)
110 {
111 AgentCircuitData aCircuit = ((ScenePresence)sp).Scene.AuthenticateHandler.GetAgentCircuitData(client.AgentId);
112 if ((aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0)
113 {
114 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: ViaHGLogin");
115 if (m_RestrictInventoryAccessAbroad)
116 {
117 RestoreRootFolderContents(client);
118 }
119 }
120 }
121 }
122 } 91 }
123 92
124
125 public override void RegionLoaded(Scene scene) 93 public override void RegionLoaded(Scene scene)
126 { 94 {
127 base.RegionLoaded(scene); 95 base.RegionLoaded(scene);
@@ -131,12 +99,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
131 m_GatekeeperConnector = new GatekeeperServiceConnector(scene.AssetService); 99 m_GatekeeperConnector = new GatekeeperServiceConnector(scene.AssetService);
132 m_Initialized = true; 100 m_Initialized = true;
133 101
134 scene.AddCommand(
135 "HG", this, "send inventory",
136 "send inventory",
137 "Don't use this",
138 HandleSendInventory);
139
140 } 102 }
141 103
142 } 104 }
@@ -209,8 +171,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
209 bool success = connector.LoginAgentToGrid(agentCircuit, reg, finalDestination, out reason); 171 bool success = connector.LoginAgentToGrid(agentCircuit, reg, finalDestination, out reason);
210 logout = success; // flag for later logout from this grid; this is an HG TP 172 logout = success; // flag for later logout from this grid; this is an HG TP
211 173
212 if (success && m_RestrictInventoryAccessAbroad) 174 if (success)
213 RemoveRootFolderContents(sp.ControllingClient); 175 sp.Scene.EventManager.TriggerTeleportStart(sp.ControllingClient, reg, finalDestination, teleportFlags, logout);
214 176
215 return success; 177 return success;
216 } 178 }
@@ -221,7 +183,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
221 } 183 }
222 } 184 }
223 185
224 return m_aScene.SimulationService.CreateAgent(reg, agentCircuit, teleportFlags, out reason); 186 return base.CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout);
225 } 187 }
226 188
227 public void TriggerTeleportHome(UUID id, IClientAPI client) 189 public void TriggerTeleportHome(UUID id, IClientAPI client)
@@ -330,15 +292,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
330 292
331 } 293 }
332 294
333 protected override void Fail(ScenePresence sp, GridRegion finalDestination, bool logout)
334 {
335 base.Fail(sp, finalDestination, logout);
336 if (logout && m_RestrictInventoryAccessAbroad)
337 {
338 RestoreRootFolderContents(sp.ControllingClient);
339 }
340 }
341
342 #endregion 295 #endregion
343 296
344 #region IUserAgentVerificationModule 297 #region IUserAgentVerificationModule
@@ -393,60 +346,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
393 346
394 #endregion 347 #endregion
395 348
396 private void RemoveRootFolderContents(IClientAPI client)
397 {
398 // TODO tell the viewer to remove the root folder's content
399 if (client is IClientCore)
400 {
401 IClientCore core = (IClientCore)client;
402 IClientInventory inv;
403
404 if (core.TryGet<IClientInventory>(out inv))
405 {
406 InventoryFolderBase root = m_Scenes[0].InventoryService.GetRootFolder(client.AgentId);
407 if (root != null)
408 {
409 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Removing root inventory for user {0}", client.AgentId);
410 InventoryCollection content = m_Scenes[0].InventoryService.GetFolderContent(client.AgentId, root.ID);
411 UUID[] ids = new UUID[content.Folders.Count];
412 int i = 0;
413 foreach (InventoryFolderBase f in content.Folders)
414 ids[i++] = f.ID;
415 inv.SendRemoveInventoryFolders(ids);
416 ids = new UUID[content.Items.Count];
417 i = 0;
418 foreach (InventoryItemBase it in content.Items)
419 ids[i++] = it.ID;
420 inv.SendRemoveInventoryItems(ids);
421 }
422 }
423 }
424 }
425
426 private void RestoreRootFolderContents(IClientAPI client)
427 {
428 if (client is IClientCore)
429 {
430 IClientCore core = (IClientCore)client;
431 IClientInventory inv;
432
433 if (core.TryGet<IClientInventory>(out inv))
434 {
435 InventoryFolderBase root = m_Scenes[0].InventoryService.GetRootFolder(client.AgentId);
436 client.SendBulkUpdateInventory(root);
437 //if (root != null)
438 //{
439 // m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Restoring root inventory for user {0}", client.AgentId);
440 // InventoryCollection content = m_Scenes[0].InventoryService.GetFolderContent(client.AgentId, root.ID);
441 // m_log.DebugFormat("[XXX]: Folder name {0}, id {1}, parent {2}", root.Name, root.ID, root.ParentID);
442 // foreach (InventoryItemBase i in content.Items)
443 // m_log.DebugFormat("[XXX]: Name={0}, folderID={1}", i.Name, i.Folder);
444
445 // inv.SendBulkUpdateInventory(content.Folders.ToArray(), content.Items.ToArray());
446 //}
447 }
448 }
449 }
450 349
451 private GridRegion MakeRegion(AgentCircuitData aCircuit) 350 private GridRegion MakeRegion(AgentCircuitData aCircuit)
452 { 351 {
@@ -465,13 +364,5 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
465 return region; 364 return region;
466 } 365 }
467 366
468 protected void HandleSendInventory(string module, string[] cmd)
469 {
470 m_Scenes[0].ForEachClient(delegate(IClientAPI client)
471 {
472 RestoreRootFolderContents(client);
473 });
474 }
475
476 } 367 }
477} 368}
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
index d2fe388..a71584a 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
@@ -30,6 +30,7 @@ using System.Collections.Generic;
30using System.Reflection; 30using System.Reflection;
31 31
32using OpenSim.Framework; 32using OpenSim.Framework;
33using OpenSim.Framework.Client;
33using OpenSim.Region.Framework.Interfaces; 34using OpenSim.Region.Framework.Interfaces;
34using OpenSim.Region.Framework.Scenes; 35using OpenSim.Region.Framework.Scenes;
35using OpenSim.Services.Connectors.Hypergrid; 36using OpenSim.Services.Connectors.Hypergrid;
@@ -57,6 +58,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
57 private string m_HomeURI; 58 private string m_HomeURI;
58 private bool m_OutboundPermission; 59 private bool m_OutboundPermission;
59 private string m_ThisGatekeeper; 60 private string m_ThisGatekeeper;
61 private bool m_RestrictInventoryAccessAbroad;
60 62
61// private bool m_Initialized = false; 63// private bool m_Initialized = false;
62 64
@@ -90,6 +92,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
90 m_HomeURI = thisModuleConfig.GetString("HomeURI", m_HomeURI); 92 m_HomeURI = thisModuleConfig.GetString("HomeURI", m_HomeURI);
91 m_OutboundPermission = thisModuleConfig.GetBoolean("OutboundPermission", true); 93 m_OutboundPermission = thisModuleConfig.GetBoolean("OutboundPermission", true);
92 m_ThisGatekeeper = thisModuleConfig.GetString("Gatekeeper", string.Empty); 94 m_ThisGatekeeper = thisModuleConfig.GetString("Gatekeeper", string.Empty);
95 m_RestrictInventoryAccessAbroad = thisModuleConfig.GetBoolean("RestrictInventoryAccessAbroad", false);
93 } 96 }
94 else 97 else
95 m_log.Warn("[HG INVENTORY ACCESS MODULE]: HGInventoryAccessModule configs not found. ProfileServerURI not set!"); 98 m_log.Warn("[HG INVENTORY ACCESS MODULE]: HGInventoryAccessModule configs not found. ProfileServerURI not set!");
@@ -105,13 +108,79 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
105 base.AddRegion(scene); 108 base.AddRegion(scene);
106 m_assMapper = new HGAssetMapper(scene, m_HomeURI); 109 m_assMapper = new HGAssetMapper(scene, m_HomeURI);
107 scene.EventManager.OnNewInventoryItemUploadComplete += UploadInventoryItem; 110 scene.EventManager.OnNewInventoryItemUploadComplete += UploadInventoryItem;
108 111 scene.EventManager.OnTeleportStart += TeleportStart;
112 scene.EventManager.OnTeleportFail += TeleportFail;
109 } 113 }
110 114
111 #endregion 115 #endregion
112 116
113 #region Event handlers 117 #region Event handlers
114 118
119 protected override void OnNewClient(IClientAPI client)
120 {
121 base.OnNewClient(client);
122 client.OnCompleteMovementToRegion += new Action<IClientAPI, bool>(OnCompleteMovementToRegion);
123 }
124
125 protected void OnCompleteMovementToRegion(IClientAPI client, bool arg2)
126 {
127 //m_log.DebugFormat("[HG INVENTORY ACCESS MODULE]: OnCompleteMovementToRegion of user {0}", client.Name);
128 object sp = null;
129 if (client.Scene.TryGetScenePresence(client.AgentId, out sp))
130 {
131 if (sp is ScenePresence)
132 {
133 AgentCircuitData aCircuit = ((ScenePresence)sp).Scene.AuthenticateHandler.GetAgentCircuitData(client.AgentId);
134 if ((aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0)
135 {
136 if (m_RestrictInventoryAccessAbroad)
137 {
138 IUserManagement uMan = m_Scene.RequestModuleInterface<IUserManagement>();
139 if (uMan.IsLocalGridUser(client.AgentId))
140 ProcessInventoryForComingHome(client);
141 else
142 ProcessInventoryForArriving(client);
143 }
144 }
145 }
146 }
147 }
148
149 protected void TeleportStart(IClientAPI client, GridRegion destination, GridRegion finalDestination, uint teleportFlags, bool gridLogout)
150 {
151 if (gridLogout && m_RestrictInventoryAccessAbroad)
152 {
153 IUserManagement uMan = m_Scene.RequestModuleInterface<IUserManagement>();
154 if (uMan != null && uMan.IsLocalGridUser(client.AgentId))
155 {
156 // local grid user
157 ProcessInventoryForHypergriding(client);
158 }
159 else
160 {
161 // Foreigner
162 ProcessInventoryForLeaving(client);
163 }
164 }
165
166 }
167
168 protected void TeleportFail(IClientAPI client, bool gridLogout)
169 {
170 if (gridLogout && m_RestrictInventoryAccessAbroad)
171 {
172 IUserManagement uMan = m_Scene.RequestModuleInterface<IUserManagement>();
173 if (uMan.IsLocalGridUser(client.AgentId))
174 {
175 ProcessInventoryForComingHome(client);
176 }
177 else
178 {
179 ProcessInventoryForArriving(client);
180 }
181 }
182 }
183
115 public void UploadInventoryItem(UUID avatarID, UUID assetID, string name, int userlevel) 184 public void UploadInventoryItem(UUID avatarID, UUID assetID, string name, int userlevel)
116 { 185 {
117 string userAssetServer = string.Empty; 186 string userAssetServer = string.Empty;
@@ -236,8 +305,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
236 return false; 305 return false;
237 } 306 }
238 307
239 #endregion
240
241 protected override InventoryItemBase GetItem(UUID agentID, UUID itemID) 308 protected override InventoryItemBase GetItem(UUID agentID, UUID itemID)
242 { 309 {
243 InventoryItemBase item = base.GetItem(agentID, itemID); 310 InventoryItemBase item = base.GetItem(agentID, itemID);
@@ -248,5 +315,84 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
248 315
249 return item; 316 return item;
250 } 317 }
318
319 #endregion
320
321 #region Inventory manipulation upon arriving/leaving
322
323 //
324 // These 2 are for local and foreign users coming back, respectively
325 //
326
327 private void ProcessInventoryForComingHome(IClientAPI client)
328 {
329 m_log.DebugFormat("[HG INVENTORY ACCESS MODULE]: Restoring root folder for local user {0}", client.Name);
330 if (client is IClientCore)
331 {
332 IClientCore core = (IClientCore)client;
333 IClientInventory inv;
334
335 if (core.TryGet<IClientInventory>(out inv))
336 {
337 InventoryFolderBase root = m_Scene.InventoryService.GetRootFolder(client.AgentId);
338 InventoryCollection content = m_Scene.InventoryService.GetFolderContent(client.AgentId, root.ID);
339
340 inv.SendBulkUpdateInventory(content.Folders.ToArray(), content.Items.ToArray());
341 }
342 }
343 }
344
345 private void ProcessInventoryForArriving(IClientAPI client)
346 {
347 }
348
349 //
350 // These 2 are for local and foreign users going away respectively
351 //
352
353 private void ProcessInventoryForHypergriding(IClientAPI client)
354 {
355 if (client is IClientCore)
356 {
357 IClientCore core = (IClientCore)client;
358 IClientInventory inv;
359
360 if (core.TryGet<IClientInventory>(out inv))
361 {
362 InventoryFolderBase root = m_Scene.InventoryService.GetRootFolder(client.AgentId);
363 if (root != null)
364 {
365 m_log.DebugFormat("[HG INVENTORY ACCESS MODULE]: Changing root inventory for user {0}", client.Name);
366 InventoryCollection content = m_Scene.InventoryService.GetFolderContent(client.AgentId, root.ID);
367 List<UUID> fids = new List<UUID>();
368 List<UUID> iids = new List<UUID>();
369 List<InventoryFolderBase> keep = new List<InventoryFolderBase>();
370
371 foreach (InventoryFolderBase f in content.Folders)
372 {
373 if (f.Name != "My Suitcase")
374 {
375 f.Name = f.Name + " (Unavailable)";
376 keep.Add(f);
377 }
378 }
379
380 // items directly under the root folder
381 foreach (InventoryItemBase it in content.Items)
382 it.Name = it.Name + " (Unavailable)"; ;
383
384 // Send the new names
385 inv.SendBulkUpdateInventory(keep.ToArray(), content.Items.ToArray());
386
387 }
388 }
389 }
390 }
391
392 private void ProcessInventoryForLeaving(IClientAPI client)
393 {
394 }
395
396 #endregion
251 } 397 }
252} 398}
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index aa99692..74701a5 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -674,9 +674,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
674 // 674 //
675 if (action == DeRezAction.Take || action == DeRezAction.TakeCopy) 675 if (action == DeRezAction.Take || action == DeRezAction.TakeCopy)
676 { 676 {
677 if (so.RootPart.FromFolderID != UUID.Zero && userID == remoteClient.AgentId) 677 if (so.FromFolderID != UUID.Zero && userID == remoteClient.AgentId)
678 { 678 {
679 InventoryFolderBase f = new InventoryFolderBase(so.RootPart.FromFolderID, userID); 679 InventoryFolderBase f = new InventoryFolderBase(so.FromFolderID, userID);
680 if (f != null) 680 if (f != null)
681 folder = m_Scene.InventoryService.GetFolder(f); 681 folder = m_Scene.InventoryService.GetFolder(f);
682 } 682 }
@@ -1012,7 +1012,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
1012 } 1012 }
1013 } 1013 }
1014 1014
1015 rootPart.FromFolderID = item.Folder; 1015 so.FromFolderID = item.Folder;
1016 1016
1017// Console.WriteLine("rootPart.OwnedID {0}, item.Owner {1}, item.CurrentPermissions {2:X}", 1017// Console.WriteLine("rootPart.OwnedID {0}, item.Owner {1}, item.CurrentPermissions {2:X}",
1018// rootPart.OwnerID, item.Owner, item.CurrentPermissions); 1018// rootPart.OwnerID, item.Owner, item.CurrentPermissions);
@@ -1071,7 +1071,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
1071 rootPart.TrimPermissions(); 1071 rootPart.TrimPermissions();
1072 1072
1073 if (isAttachment) 1073 if (isAttachment)
1074 so.SetFromItemID(item.ID); 1074 so.FromItemID = item.ID;
1075 } 1075 }
1076 1076
1077 return true; 1077 return true;
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs
index 4be3804..cf6d2f7 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs
@@ -297,14 +297,35 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
297 return m_LocalGridInventoryService.CreateUserInventory(userID); 297 return m_LocalGridInventoryService.CreateUserInventory(userID);
298 } 298 }
299 299
300 public List<InventoryFolderBase> GetInventorySkeleton(UUID userId) 300 public List<InventoryFolderBase> GetInventorySkeleton(UUID userID)
301 { 301 {
302 return m_LocalGridInventoryService.GetInventorySkeleton(userId); 302 string invURL = GetInventoryServiceURL(userID);
303
304 if (invURL == null) // not there, forward to local inventory connector to resolve
305 return m_LocalGridInventoryService.GetInventorySkeleton(userID);
306
307 IInventoryService connector = GetConnector(invURL);
308
309 return connector.GetInventorySkeleton(userID);
303 } 310 }
304 311
305 public InventoryCollection GetUserInventory(UUID userID) 312 public InventoryCollection GetUserInventory(UUID userID)
306 { 313 {
307 return null; 314 string invURL = GetInventoryServiceURL(userID);
315 m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetUserInventory for {0} {1}", userID, invURL);
316
317 if (invURL == null) // not there, forward to local inventory connector to resolve
318 return m_LocalGridInventoryService.GetUserInventory(userID);
319
320 InventoryCollection c = m_Cache.GetUserInventory(userID);
321 if (c != null)
322 return c;
323
324 IInventoryService connector = GetConnector(invURL);
325 c = connector.GetUserInventory(userID);
326
327 m_Cache.Cache(userID, c);
328 return c;
308 } 329 }
309 330
310 public void GetUserInventory(UUID userID, InventoryReceiptCallback callback) 331 public void GetUserInventory(UUID userID, InventoryReceiptCallback callback)
@@ -362,8 +383,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
362 if (invURL == null) // not there, forward to local inventory connector to resolve 383 if (invURL == null) // not there, forward to local inventory connector to resolve
363 return m_LocalGridInventoryService.GetFolderContent(userID, folderID); 384 return m_LocalGridInventoryService.GetFolderContent(userID, folderID);
364 385
365 IInventoryService connector = GetConnector(invURL); 386 InventoryCollection c = m_Cache.GetFolderContent(userID, folderID);
387 if (c != null)
388 {
389 m_log.Debug("[HG INVENTORY CONNECTOR]: GetFolderContent found content in cache " + folderID);
390 return c;
391 }
366 392
393 IInventoryService connector = GetConnector(invURL);
367 return connector.GetFolderContent(userID, folderID); 394 return connector.GetFolderContent(userID, folderID);
368 395
369 } 396 }
@@ -377,8 +404,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
377 if (invURL == null) // not there, forward to local inventory connector to resolve 404 if (invURL == null) // not there, forward to local inventory connector to resolve
378 return m_LocalGridInventoryService.GetFolderItems(userID, folderID); 405 return m_LocalGridInventoryService.GetFolderItems(userID, folderID);
379 406
380 IInventoryService connector = GetConnector(invURL); 407 List<InventoryItemBase> items = m_Cache.GetFolderItems(userID, folderID);
408 if (items != null)
409 {
410 m_log.Debug("[HG INVENTORY CONNECTOR]: GetFolderItems found items in cache " + folderID);
411 return items;
412 }
381 413
414 IInventoryService connector = GetConnector(invURL);
382 return connector.GetFolderItems(userID, folderID); 415 return connector.GetFolderItems(userID, folderID);
383 416
384 } 417 }
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs
index 0fe778d..1e434b9 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs
@@ -12,6 +12,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
12 12
13 private static ExpiringCache<UUID, InventoryFolderBase> m_RootFolders = new ExpiringCache<UUID, InventoryFolderBase>(); 13 private static ExpiringCache<UUID, InventoryFolderBase> m_RootFolders = new ExpiringCache<UUID, InventoryFolderBase>();
14 private static ExpiringCache<UUID, Dictionary<AssetType, InventoryFolderBase>> m_FolderTypes = new ExpiringCache<UUID, Dictionary<AssetType, InventoryFolderBase>>(); 14 private static ExpiringCache<UUID, Dictionary<AssetType, InventoryFolderBase>> m_FolderTypes = new ExpiringCache<UUID, Dictionary<AssetType, InventoryFolderBase>>();
15 private static ExpiringCache<UUID, InventoryCollection> m_Inventories = new ExpiringCache<UUID, InventoryCollection>();
15 16
16 public void Cache(UUID userID, InventoryFolderBase root) 17 public void Cache(UUID userID, InventoryFolderBase root)
17 { 18 {
@@ -55,5 +56,55 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
55 56
56 return null; 57 return null;
57 } 58 }
59
60 public void Cache(UUID userID, InventoryCollection inv)
61 {
62 lock (m_Inventories)
63 m_Inventories.AddOrUpdate(userID, inv, 120);
64 }
65
66 public InventoryCollection GetUserInventory(UUID userID)
67 {
68 InventoryCollection inv = null;
69 if (m_Inventories.TryGetValue(userID, out inv))
70 return inv;
71 return null;
72 }
73
74 public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
75 {
76 InventoryCollection inv = null;
77 InventoryCollection c;
78 if (m_Inventories.TryGetValue(userID, out inv))
79 {
80 c = new InventoryCollection();
81 c.UserID = userID;
82
83 c.Folders = inv.Folders.FindAll(delegate(InventoryFolderBase f)
84 {
85 return f.ParentID == folderID;
86 });
87 c.Items = inv.Items.FindAll(delegate(InventoryItemBase i)
88 {
89 return i.Folder == folderID;
90 });
91 return c;
92 }
93 return null;
94 }
95
96 public List<InventoryItemBase> GetFolderItems(UUID userID, UUID folderID)
97 {
98 InventoryCollection inv = null;
99 if (m_Inventories.TryGetValue(userID, out inv))
100 {
101 List<InventoryItemBase> items = inv.Items.FindAll(delegate(InventoryItemBase i)
102 {
103 return i.Folder == folderID;
104 });
105 return items;
106 }
107 return null;
108 }
58 } 109 }
59} 110}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs
index 77573c3..990dffb 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs
@@ -172,7 +172,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
172 172
173 public InventoryCollection GetUserInventory(UUID userID) 173 public InventoryCollection GetUserInventory(UUID userID)
174 { 174 {
175 return null; 175 return m_RemoteConnector.GetUserInventory(userID);
176 } 176 }
177 177
178 public void GetUserInventory(UUID userID, InventoryReceiptCallback callback) 178 public void GetUserInventory(UUID userID, InventoryReceiptCallback callback)
@@ -193,16 +193,17 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
193 { 193 {
194 InventoryCollection invCol = m_RemoteConnector.GetFolderContent(userID, folderID); 194 InventoryCollection invCol = m_RemoteConnector.GetFolderContent(userID, folderID);
195 195
196 if (UserManager != null) 196 if (invCol != null && UserManager != null)
197 { 197 {
198 // Protect ourselves against the caller subsequently modifying the items list 198 // Protect ourselves against the caller subsequently modifying the items list
199 List<InventoryItemBase> items = new List<InventoryItemBase>(invCol.Items); 199 List<InventoryItemBase> items = new List<InventoryItemBase>(invCol.Items);
200 200
201 Util.FireAndForget(delegate 201 if (items != null && items.Count > 0)
202 { 202 Util.FireAndForget(delegate
203 foreach (InventoryItemBase item in items) 203 {
204 UserManager.AddUser(item.CreatorIdAsUuid, item.CreatorData); 204 foreach (InventoryItemBase item in items)
205 }); 205 UserManager.AddUser(item.CreatorIdAsUuid, item.CreatorData);
206 });
206 } 207 }
207 208
208 return invCol; 209 return invCol;
diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs
index 1f3f075..509c4d7 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs
@@ -464,7 +464,7 @@ namespace OpenSim.Region.CoreModules.World.Land
464 { 464 {
465 if (d.GroupID == LandData.GroupID) 465 if (d.GroupID == LandData.GroupID)
466 { 466 {
467 m_groupMemberCache.Add(avatar, false, m_groupMemberCacheTimeout); 467 m_groupMemberCache.Add(avatar, true, m_groupMemberCacheTimeout);
468 return true; 468 return true;
469 } 469 }
470 } 470 }
@@ -472,10 +472,7 @@ namespace OpenSim.Region.CoreModules.World.Land
472 return false; 472 return false;
473 } 473 }
474 474
475 if (!sp.ControllingClient.IsGroupMember(LandData.GroupID)) 475 return sp.ControllingClient.IsGroupMember(LandData.GroupID);
476 return false;
477
478 return true;
479 } 476 }
480 return false; 477 return false;
481 } 478 }
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs
index 741d233..2365cfe 100644
--- a/OpenSim/Region/Framework/Scenes/EventManager.cs
+++ b/OpenSim/Region/Framework/Scenes/EventManager.cs
@@ -506,6 +506,12 @@ namespace OpenSim.Region.Framework.Scenes
506 public delegate void PrimsLoaded(Scene s); 506 public delegate void PrimsLoaded(Scene s);
507 public event PrimsLoaded OnPrimsLoaded; 507 public event PrimsLoaded OnPrimsLoaded;
508 508
509 public delegate void TeleportStart(IClientAPI client, GridRegion destination, GridRegion finalDestination, uint teleportFlags, bool gridLogout);
510 public event TeleportStart OnTeleportStart;
511
512 public delegate void TeleportFail(IClientAPI client, bool gridLogout);
513 public event TeleportFail OnTeleportFail;
514
509 public class MoneyTransferArgs : EventArgs 515 public class MoneyTransferArgs : EventArgs
510 { 516 {
511 public UUID sender; 517 public UUID sender;
@@ -2487,5 +2493,48 @@ namespace OpenSim.Region.Framework.Scenes
2487 } 2493 }
2488 } 2494 }
2489 } 2495 }
2496
2497 public void TriggerTeleportStart(IClientAPI client, GridRegion destination, GridRegion finalDestination, uint teleportFlags, bool gridLogout)
2498 {
2499 TeleportStart handler = OnTeleportStart;
2500
2501 if (handler != null)
2502 {
2503 foreach (TeleportStart d in handler.GetInvocationList())
2504 {
2505 try
2506 {
2507 d(client, destination, finalDestination, teleportFlags, gridLogout);
2508 }
2509 catch (Exception e)
2510 {
2511 m_log.ErrorFormat("[EVENT MANAGER]: Delegate for TeleportStart failed - continuing {0} - {1}",
2512 e.Message, e.StackTrace);
2513 }
2514 }
2515 }
2516 }
2517
2518 public void TriggerTeleportFail(IClientAPI client, bool gridLogout)
2519 {
2520 TeleportFail handler = OnTeleportFail;
2521
2522 if (handler != null)
2523 {
2524 foreach (TeleportFail d in handler.GetInvocationList())
2525 {
2526 try
2527 {
2528 d(client, gridLogout);
2529 }
2530 catch (Exception e)
2531 {
2532 m_log.ErrorFormat("[EVENT MANAGER]: Delegate for TeleportFail failed - continuing {0} - {1}",
2533 e.Message, e.StackTrace);
2534 }
2535 }
2536 }
2537 }
2538
2490 } 2539 }
2491} 2540}
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 6cf1067..0089c7d 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -36,6 +36,7 @@ using OpenMetaverse.Packets;
36using log4net; 36using log4net;
37using OpenSim.Framework; 37using OpenSim.Framework;
38using OpenSim.Region.Framework; 38using OpenSim.Region.Framework;
39using OpenSim.Framework.Client;
39using OpenSim.Region.Framework.Interfaces; 40using OpenSim.Region.Framework.Interfaces;
40using OpenSim.Region.Framework.Scenes.Serialization; 41using OpenSim.Region.Framework.Scenes.Serialization;
41 42
@@ -117,20 +118,43 @@ namespace OpenSim.Region.Framework.Scenes
117 /// <param name="item"></param> 118 /// <param name="item"></param>
118 public bool AddInventoryItem(InventoryItemBase item) 119 public bool AddInventoryItem(InventoryItemBase item)
119 { 120 {
120 InventoryFolderBase folder; 121 if (item.Folder != UUID.Zero && InventoryService.AddItem(item))
121
122 if (item.Folder == UUID.Zero)
123 { 122 {
124 folder = InventoryService.GetFolderForType(item.Owner, (AssetType)item.AssetType); 123 int userlevel = 0;
125 if (folder == null) 124 if (Permissions.IsGod(item.Owner))
126 { 125 {
127 folder = InventoryService.GetRootFolder(item.Owner); 126 userlevel = 1;
128
129 if (folder == null)
130 return false;
131 } 127 }
128 EventManager.TriggerOnNewInventoryItemUploadComplete(item.Owner, item.AssetID, item.Name, userlevel);
129
130 return true;
131 }
132 132
133 item.Folder = folder.ID; 133 // OK so either the viewer didn't send a folderID or AddItem failed
134 UUID originalFolder = item.Folder;
135 InventoryFolderBase f = InventoryService.GetFolderForType(item.Owner, (AssetType)item.AssetType);
136 if (f != null)
137 {
138 m_log.DebugFormat(
139 "[AGENT INVENTORY]: Found folder {0} type {1} for item {2}",
140 f.Name, (AssetType)f.Type, item.Name);
141
142 item.Folder = f.ID;
143 }
144 else
145 {
146 f = InventoryService.GetRootFolder(item.Owner);
147 if (f != null)
148 {
149 item.Folder = f.ID;
150 }
151 else
152 {
153 m_log.WarnFormat(
154 "[AGENT INVENTORY]: Could not find root folder for {0} when trying to add item {1} with no parent folder specified",
155 item.Owner, item.Name);
156 return false;
157 }
134 } 158 }
135 159
136 if (InventoryService.AddItem(item)) 160 if (InventoryService.AddItem(item))
@@ -141,7 +165,13 @@ namespace OpenSim.Region.Framework.Scenes
141 userlevel = 1; 165 userlevel = 1;
142 } 166 }
143 EventManager.TriggerOnNewInventoryItemUploadComplete(item.Owner, item.AssetID, item.Name, userlevel); 167 EventManager.TriggerOnNewInventoryItemUploadComplete(item.Owner, item.AssetID, item.Name, userlevel);
144 168
169 if (originalFolder != UUID.Zero)
170 {
171 // Tell the viewer that the item didn't go there
172 ChangePlacement(item, f);
173 }
174
145 return true; 175 return true;
146 } 176 }
147 else 177 else
@@ -153,7 +183,32 @@ namespace OpenSim.Region.Framework.Scenes
153 return false; 183 return false;
154 } 184 }
155 } 185 }
156 186
187 private void ChangePlacement(InventoryItemBase item, InventoryFolderBase f)
188 {
189 ScenePresence sp = GetScenePresence(item.Owner);
190 if (sp != null)
191 {
192 if (sp.ControllingClient is IClientCore)
193 {
194 IClientCore core = (IClientCore)sp.ControllingClient;
195 IClientInventory inv;
196
197 if (core.TryGet<IClientInventory>(out inv))
198 {
199 InventoryFolderBase parent = new InventoryFolderBase(f.ParentID, f.Owner);
200 parent = InventoryService.GetFolder(parent);
201 inv.SendRemoveInventoryItems(new UUID[] { item.ID });
202 inv.SendBulkUpdateInventory(new InventoryFolderBase[0], new InventoryItemBase[] { item });
203 string message = "The item was placed in folder " + f.Name;
204 if (parent != null)
205 message += " under " + parent.Name;
206 sp.ControllingClient.SendAgentAlertMessage(message, false);
207 }
208 }
209 }
210 }
211
157 /// <summary> 212 /// <summary>
158 /// Add the given inventory item to a user's inventory. 213 /// Add the given inventory item to a user's inventory.
159 /// </summary> 214 /// </summary>
@@ -2085,7 +2140,7 @@ namespace OpenSim.Region.Framework.Scenes
2085 item.CreationDate = Util.UnixTimeSinceEpoch(); 2140 item.CreationDate = Util.UnixTimeSinceEpoch();
2086 2141
2087 // sets itemID so client can show item as 'attached' in inventory 2142 // sets itemID so client can show item as 'attached' in inventory
2088 grp.SetFromItemID(item.ID); 2143 grp.FromItemID = item.ID;
2089 2144
2090 if (AddInventoryItem(item)) 2145 if (AddInventoryItem(item))
2091 remoteClient.SendInventoryItemCreateUpdate(item, 0); 2146 remoteClient.SendInventoryItemCreateUpdate(item, 0);
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index df37b98..a34079c 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2248,12 +2248,6 @@ namespace OpenSim.Region.Framework.Scenes
2248 part.RemoveFromPhysics(); 2248 part.RemoveFromPhysics();
2249 } 2249 }
2250 } 2250 }
2251
2252// if (rootPart.PhysActor != null)
2253// {
2254// PhysicsScene.RemovePrim(rootPart.PhysActor);
2255// rootPart.PhysActor = null;
2256// }
2257 2251
2258 if (UnlinkSceneObject(group, false)) 2252 if (UnlinkSceneObject(group, false))
2259 { 2253 {
@@ -2668,7 +2662,7 @@ namespace OpenSim.Region.Framework.Scenes
2668 SceneObjectGroup grp = sceneObject; 2662 SceneObjectGroup grp = sceneObject;
2669 2663
2670 m_log.DebugFormat( 2664 m_log.DebugFormat(
2671 "[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.GetFromItemID(), grp.UUID); 2665 "[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.FromItemID, grp.UUID);
2672 m_log.DebugFormat( 2666 m_log.DebugFormat(
2673 "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); 2667 "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition);
2674 2668
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 54e8d50..107d9b6 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -775,7 +775,9 @@ namespace OpenSim.Region.Framework.Scenes
775 set { m_LoopSoundSlavePrims = value; } 775 set { m_LoopSoundSlavePrims = value; }
776 } 776 }
777 777
778 // The UUID for the Region this Object is in. 778 /// <summary>
779 /// The UUID for the region this object is in.
780 /// </summary>
779 public UUID RegionUUID 781 public UUID RegionUUID
780 { 782 {
781 get 783 get
@@ -788,6 +790,22 @@ namespace OpenSim.Region.Framework.Scenes
788 } 790 }
789 } 791 }
790 792
793 /// <summary>
794 /// The item ID that this object was rezzed from, if applicable.
795 /// </summary>
796 /// <remarks>
797 /// If not applicable will be UUID.Zero
798 /// </remarks>
799 public UUID FromItemID { get; set; }
800
801 /// <summary>
802 /// The folder ID that this object was rezzed from, if applicable.
803 /// </summary>
804 /// <remarks>
805 /// If not applicable will be UUID.Zero
806 /// </remarks>
807 public UUID FromFolderID { get; set; }
808
791 #endregion 809 #endregion
792 810
793// ~SceneObjectGroup() 811// ~SceneObjectGroup()
@@ -851,18 +869,6 @@ namespace OpenSim.Region.Framework.Scenes
851 } 869 }
852 } 870 }
853 871
854 public void SetFromItemID(UUID AssetId)
855 {
856 SceneObjectPart[] parts = m_parts.GetArray();
857 for (int i = 0; i < parts.Length; i++)
858 parts[i].FromItemID = AssetId;
859 }
860
861 public UUID GetFromItemID()
862 {
863 return m_rootPart.FromItemID;
864 }
865
866 /// <summary> 872 /// <summary>
867 /// Hooks this object up to the backup event so that it is persisted to the database when the update thread executes. 873 /// Hooks this object up to the backup event so that it is persisted to the database when the update thread executes.
868 /// </summary> 874 /// </summary>
@@ -1498,7 +1504,7 @@ namespace OpenSim.Region.Framework.Scenes
1498 return; 1504 return;
1499 1505
1500 detachedpos = avatar.AbsolutePosition; 1506 detachedpos = avatar.AbsolutePosition;
1501 RootPart.FromItemID = UUID.Zero; 1507 FromItemID = UUID.Zero;
1502 1508
1503 AbsolutePosition = detachedpos; 1509 AbsolutePosition = detachedpos;
1504 AttachedAvatar = UUID.Zero; 1510 AttachedAvatar = UUID.Zero;
@@ -3379,6 +3385,7 @@ namespace OpenSim.Region.Framework.Scenes
3379 { 3385 {
3380 m_rootPart.AttachedPos = pos; 3386 m_rootPart.AttachedPos = pos;
3381 } 3387 }
3388
3382 if (RootPart.GetStatusSandbox()) 3389 if (RootPart.GetStatusSandbox())
3383 { 3390 {
3384 if (Util.GetDistanceTo(RootPart.StatusSandboxPos, pos) > 10) 3391 if (Util.GetDistanceTo(RootPart.StatusSandboxPos, pos) > 10)
@@ -3389,8 +3396,8 @@ namespace OpenSim.Region.Framework.Scenes
3389 ChatTypeEnum.DebugChannel, 0x7FFFFFFF, RootPart.AbsolutePosition, Name, UUID, false); 3396 ChatTypeEnum.DebugChannel, 0x7FFFFFFF, RootPart.AbsolutePosition, Name, UUID, false);
3390 } 3397 }
3391 } 3398 }
3392 AbsolutePosition = pos;
3393 3399
3400 AbsolutePosition = pos;
3394 HasGroupChanged = true; 3401 HasGroupChanged = true;
3395 } 3402 }
3396 3403
@@ -4032,7 +4039,7 @@ namespace OpenSim.Region.Framework.Scenes
4032 4039
4033 public virtual string ExtraToXmlString() 4040 public virtual string ExtraToXmlString()
4034 { 4041 {
4035 return "<ExtraFromItemID>" + GetFromItemID().ToString() + "</ExtraFromItemID>"; 4042 return "<ExtraFromItemID>" + FromItemID.ToString() + "</ExtraFromItemID>";
4036 } 4043 }
4037 4044
4038 public virtual void ExtraFromXmlString(string xmlstr) 4045 public virtual void ExtraFromXmlString(string xmlstr)
@@ -4044,7 +4051,7 @@ namespace OpenSim.Region.Framework.Scenes
4044 UUID uuid = UUID.Zero; 4051 UUID uuid = UUID.Zero;
4045 UUID.TryParse(id, out uuid); 4052 UUID.TryParse(id, out uuid);
4046 4053
4047 SetFromItemID(uuid); 4054 FromItemID = uuid;
4048 } 4055 }
4049 4056
4050 public void ResetOwnerChangeFlag() 4057 public void ResetOwnerChangeFlag()
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 951e987..969ddaf 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -126,12 +126,14 @@ namespace OpenSim.Region.Framework.Scenes
126 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 126 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
127 127
128 /// <value> 128 /// <value>
129 /// Is this sop a root part? 129 /// Is this a root part?
130 /// </value> 130 /// </value>
131 131 /// <remarks>
132 /// This will return true even if the whole object is attached to an avatar.
133 /// </remarks>
132 public bool IsRoot 134 public bool IsRoot
133 { 135 {
134 get { return ParentGroup.RootPart == this; } 136 get { return ParentGroup.RootPart == this; }
135 } 137 }
136 138
137 #region Fields 139 #region Fields
@@ -160,15 +162,7 @@ namespace OpenSim.Region.Framework.Scenes
160 /// If another thread is simultaneously turning physics off on this part then this refernece could become 162 /// If another thread is simultaneously turning physics off on this part then this refernece could become
161 /// null at any time. 163 /// null at any time.
162 /// </remarks> 164 /// </remarks>
163 public PhysicsActor PhysActor 165 public PhysicsActor PhysActor { get; set; }
164 {
165 get { return m_physActor; }
166 set
167 {
168// m_log.DebugFormat("[SOP]: PhysActor set to {0} for {1} {2}", value, Name, UUID);
169 m_physActor = value;
170 }
171 }
172 166
173 //Xantor 20080528 Sound stuff: 167 //Xantor 20080528 Sound stuff:
174 // Note: This isn't persisted in the database right now, as the fields for that aren't just there yet. 168 // Note: This isn't persisted in the database right now, as the fields for that aren't just there yet.
@@ -188,10 +182,6 @@ namespace OpenSim.Region.Framework.Scenes
188 public uint TimeStampLastActivity; // Will be used for AutoReturn 182 public uint TimeStampLastActivity; // Will be used for AutoReturn
189 183
190 public uint TimeStampTerse; 184 public uint TimeStampTerse;
191
192 public UUID FromItemID;
193
194 public UUID FromFolderID;
195 185
196 // The following two are to hold the attachment data 186 // The following two are to hold the attachment data
197 // while an object is inworld 187 // while an object is inworld
@@ -275,7 +265,6 @@ namespace OpenSim.Region.Framework.Scenes
275 265
276 private bool m_passTouches; 266 private bool m_passTouches;
277 267
278 private PhysicsActor m_physActor;
279 protected Vector3 m_acceleration; 268 protected Vector3 m_acceleration;
280 protected Vector3 m_angularVelocity; 269 protected Vector3 m_angularVelocity;
281 270
@@ -1149,6 +1138,14 @@ namespace OpenSim.Region.Framework.Scenes
1149 } 1138 }
1150 } 1139 }
1151 1140
1141 /// <summary>
1142 /// The parent ID of this part.
1143 /// </summary>
1144 /// <remarks>
1145 /// If this is a root part which is not attached to an avatar then the value will be 0.
1146 /// If this is a root part which is attached to an avatar then the value is the local id of that avatar.
1147 /// If this is a child part then the value is the local ID of the root part.
1148 /// </remarks>
1152 public uint ParentID 1149 public uint ParentID
1153 { 1150 {
1154 get { return _parentID; } 1151 get { return _parentID; }
@@ -1847,9 +1844,6 @@ namespace OpenSim.Region.Framework.Scenes
1847// if (VolumeDetectActive) 1844// if (VolumeDetectActive)
1848// isPhantom = false; 1845// isPhantom = false;
1849 1846
1850 // Added clarification.. since A rigid body is an object that you can kick around, etc.
1851// bool RigidBody = isPhysical && !isPhantom;
1852
1853 // The only time the physics scene shouldn't know about the prim is if it's phantom or an attachment, which is phantom by definition 1847 // The only time the physics scene shouldn't know about the prim is if it's phantom or an attachment, which is phantom by definition
1854 // or flexible 1848 // or flexible
1855 // if (!isPhantom && !ParentGroup.IsAttachment && !(Shape.PathCurve == (byte)Extrusion.Flexible)) 1849 // if (!isPhantom && !ParentGroup.IsAttachment && !(Shape.PathCurve == (byte)Extrusion.Flexible))
@@ -1876,7 +1870,6 @@ namespace OpenSim.Region.Framework.Scenes
1876 PhysActor = null; 1870 PhysActor = null;
1877 } 1871 }
1878 1872
1879 // Basic Physics can also return null as well as an exception catch.
1880 PhysicsActor pa = PhysActor; 1873 PhysicsActor pa = PhysActor;
1881 1874
1882 if (pa != null) 1875 if (pa != null)
@@ -4859,7 +4852,52 @@ namespace OpenSim.Region.Framework.Scenes
4859 } 4852 }
4860 4853
4861 /// <summary> 4854 /// <summary>
4862 /// This removes the part from physics 4855 /// Adds this part to the physics scene.
4856 /// </summary>
4857 /// <remarks>This method also sets the PhysActor property.</remarks>
4858 /// <param name="rigidBody">Add this prim with a rigid body.</param>
4859 /// <returns>
4860 /// The physics actor. null if there was a failure.
4861 /// </returns>
4862 private PhysicsActor AddToPhysics(bool rigidBody)
4863 {
4864 PhysicsActor pa;
4865
4866 try
4867 {
4868 pa = ParentGroup.Scene.PhysicsScene.AddPrimShape(
4869 string.Format("{0}/{1}", Name, UUID),
4870 Shape,
4871 AbsolutePosition,
4872 Scale,
4873 RotationOffset,
4874 rigidBody,
4875 m_localId);
4876 }
4877 catch
4878 {
4879 m_log.ErrorFormat("[SCENE]: caught exception meshing object {0}. Object set to phantom.", m_uuid);
4880 pa = null;
4881 }
4882
4883 // FIXME: Ideally we wouldn't set the property here to reduce situations where threads changing physical
4884 // properties can stop on each other. However, DoPhysicsPropertyUpdate() currently relies on PhysActor
4885 // being set.
4886 PhysActor = pa;
4887
4888 // Basic Physics can also return null as well as an exception catch.
4889 if (pa != null)
4890 {
4891 pa.SOPName = this.Name; // save object into the PhysActor so ODE internals know the joint/body info
4892 pa.SetMaterial(Material);
4893 DoPhysicsPropertyUpdate(rigidBody, true);
4894 }
4895
4896 return pa;
4897 }
4898
4899 /// <summary>
4900 /// This removes the part from the physics scene.
4863 /// </summary> 4901 /// </summary>
4864 /// <remarks> 4902 /// <remarks>
4865 /// This isn't the same as turning off physical, since even without being physical the prim has a physics 4903 /// This isn't the same as turning off physical, since even without being physical the prim has a physics
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index ed3a7f1..b51d41b 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -3617,6 +3617,22 @@ namespace OpenSim.Region.Framework.Scenes
3617 }); 3617 });
3618 } 3618 }
3619 3619
3620 /// <summary>
3621 /// Gets the mass.
3622 /// </summary>
3623 /// <returns>
3624 /// The mass.
3625 /// </returns>
3626 public float GetMass()
3627 {
3628 PhysicsActor pa = PhysicsActor;
3629
3630 if (pa != null)
3631 return pa.Mass;
3632 else
3633 return 0;
3634 }
3635
3620 internal void PushForce(Vector3 impulse) 3636 internal void PushForce(Vector3 impulse)
3621 { 3637 {
3622 if (PhysicsActor != null) 3638 if (PhysicsActor != null)
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
index 9ff3652..65bd26c 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
@@ -1294,7 +1294,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1294 1294
1295 OnAgentDataUpdateRequest(remoteClient, dataForAgentID, UUID.Zero); 1295 OnAgentDataUpdateRequest(remoteClient, dataForAgentID, UUID.Zero);
1296 1296
1297
1298 // Need to send a group membership update to the client 1297 // Need to send a group membership update to the client
1299 // UDP version doesn't seem to behave nicely. But we're going to send it out here 1298 // UDP version doesn't seem to behave nicely. But we're going to send it out here
1300 // with an empty group membership to hopefully remove groups being displayed due 1299 // with an empty group membership to hopefully remove groups being displayed due
@@ -1305,6 +1304,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1305 SendGroupMembershipInfoViaCaps(remoteClient, dataForAgentID, membershipArray); 1304 SendGroupMembershipInfoViaCaps(remoteClient, dataForAgentID, membershipArray);
1306 remoteClient.SendAvatarGroupsReply(dataForAgentID, membershipArray); 1305 remoteClient.SendAvatarGroupsReply(dataForAgentID, membershipArray);
1307 1306
1307 if (remoteClient.AgentId == dataForAgentID)
1308 remoteClient.RefreshGroupMembership();
1308 } 1309 }
1309 1310
1310 /// <summary> 1311 /// <summary>
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 5268ade..7cf284d 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -2271,11 +2271,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2271 protected LSL_Vector GetPartLocalPos(SceneObjectPart part) 2271 protected LSL_Vector GetPartLocalPos(SceneObjectPart part)
2272 { 2272 {
2273 m_host.AddScriptLPS(1); 2273 m_host.AddScriptLPS(1);
2274 if (part.ParentID == 0) 2274
2275 Vector3 pos;
2276
2277 if (!part.IsRoot)
2275 { 2278 {
2276 return new LSL_Vector(part.AbsolutePosition.X, 2279 pos = part.OffsetPosition;
2277 part.AbsolutePosition.Y,
2278 part.AbsolutePosition.Z);
2279 } 2280 }
2280 else 2281 else
2281 { 2282 {
@@ -2287,11 +2288,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2287 } 2288 }
2288 else 2289 else
2289 { 2290 {
2290 return new LSL_Vector(part.OffsetPosition.X, 2291 pos = part.AbsolutePosition;
2291 part.OffsetPosition.Y,
2292 part.OffsetPosition.Z);
2293 } 2292 }
2294 } 2293 }
2294
2295// m_log.DebugFormat("[LSL API]: Returning {0} in GetPartLocalPos()", pos);
2296
2297 return new LSL_Vector(pos.X, pos.Y, pos.Z);
2295 } 2298 }
2296 2299
2297 public void llSetRot(LSL_Rotation rot) 2300 public void llSetRot(LSL_Rotation rot)
@@ -3165,7 +3168,31 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3165 public LSL_Float llGetMass() 3168 public LSL_Float llGetMass()
3166 { 3169 {
3167 m_host.AddScriptLPS(1); 3170 m_host.AddScriptLPS(1);
3168 return m_host.GetMass(); 3171
3172 if (m_host.ParentGroup.IsAttachment)
3173 {
3174 ScenePresence attachedAvatar = World.GetScenePresence(m_host.ParentGroup.AttachedAvatar);
3175
3176 if (attachedAvatar != null)
3177 {
3178 return attachedAvatar.GetMass();
3179 }
3180 else
3181 {
3182 return 0;
3183 }
3184 }
3185 else
3186 {
3187 if (m_host.IsRoot)
3188 {
3189 return m_host.ParentGroup.GetMass();
3190 }
3191 else
3192 {
3193 return m_host.GetMass();
3194 }
3195 }
3169 } 3196 }
3170 3197
3171 public void llCollisionFilter(string name, string id, int accept) 3198 public void llCollisionFilter(string name, string id, int accept)
@@ -3334,7 +3361,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3334 SceneObjectPart host = (SceneObjectPart)o; 3361 SceneObjectPart host = (SceneObjectPart)o;
3335 3362
3336 SceneObjectGroup grp = host.ParentGroup; 3363 SceneObjectGroup grp = host.ParentGroup;
3337 UUID itemID = grp.GetFromItemID(); 3364 UUID itemID = grp.FromItemID;
3338 ScenePresence presence = World.GetScenePresence(host.OwnerID); 3365 ScenePresence presence = World.GetScenePresence(host.OwnerID);
3339 3366
3340 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; 3367 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
@@ -7782,14 +7809,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7782 switch (code) 7809 switch (code)
7783 { 7810 {
7784 case (int)ScriptBaseClass.PRIM_POSITION: 7811 case (int)ScriptBaseClass.PRIM_POSITION:
7785 if (remain < 1)
7786 return;
7787
7788 v=rules.GetVector3Item(idx++);
7789 positionChanged = true;
7790 currentPosition = GetSetPosTarget(part, v, currentPosition);
7791
7792 break;
7793 case (int)ScriptBaseClass.PRIM_POS_LOCAL: 7812 case (int)ScriptBaseClass.PRIM_POS_LOCAL:
7794 if (remain < 1) 7813 if (remain < 1)
7795 return; 7814 return;
@@ -11154,6 +11173,35 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11154 case ScriptBaseClass.OBJECT_CREATOR: 11173 case ScriptBaseClass.OBJECT_CREATOR:
11155 ret.Add(new LSL_String(UUID.Zero.ToString())); 11174 ret.Add(new LSL_String(UUID.Zero.ToString()));
11156 break; 11175 break;
11176 // For the following 8 see the Object version below
11177 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT:
11178 ret.Add(new LSL_Integer(0));
11179 break;
11180 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT:
11181 ret.Add(new LSL_Integer(0));
11182 break;
11183 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY:
11184 ret.Add(new LSL_Integer(0));
11185 break;
11186 case ScriptBaseClass.OBJECT_SCRIPT_TIME:
11187 ret.Add(new LSL_Float(0));
11188 break;
11189 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE:
11190 ret.Add(new LSL_Integer(0));
11191 break;
11192 case ScriptBaseClass.OBJECT_SERVER_COST:
11193 ret.Add(new LSL_Float(0));
11194 break;
11195 case ScriptBaseClass.OBJECT_STREAMING_COST:
11196 ret.Add(new LSL_Float(0));
11197 break;
11198 case ScriptBaseClass.OBJECT_PHYSICS_COST:
11199 ret.Add(new LSL_Float(0));
11200 break;
11201 default:
11202 // Invalid or unhandled constant.
11203 ret.Add(new LSL_Integer(ScriptBaseClass.OBJECT_UNKNOWN_DETAIL));
11204 break;
11157 } 11205 }
11158 } 11206 }
11159 11207
@@ -11191,6 +11239,49 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11191 case ScriptBaseClass.OBJECT_CREATOR: 11239 case ScriptBaseClass.OBJECT_CREATOR:
11192 ret.Add(new LSL_String(obj.CreatorID.ToString())); 11240 ret.Add(new LSL_String(obj.CreatorID.ToString()));
11193 break; 11241 break;
11242 // The following 8 I have intentionaly coded to return zero. They are part of
11243 // "Land Impact" calculations. These calculations are probably not applicable
11244 // to OpenSim, required figures (cpu/memory usage) are not currently tracked
11245 // I have intentionally left these all at zero rather than return possibly
11246 // missleading numbers
11247 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT:
11248 // in SL this currently includes crashed scripts
11249 ret.Add(new LSL_Integer(0));
11250 break;
11251 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT:
11252 ret.Add(new LSL_Integer(0));
11253 break;
11254 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY:
11255 // The value returned in SL for mono scripts is 65536 * number of active scripts
11256 ret.Add(new LSL_Integer(0));
11257 break;
11258 case ScriptBaseClass.OBJECT_SCRIPT_TIME:
11259 // Average cpu time per simulator frame expended on all scripts in the objetc
11260 ret.Add(new LSL_Float(0));
11261 break;
11262 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE:
11263 // according to the SL wiki A prim or linkset will have prim
11264 // equivalent of the number of prims in a linkset if it does not
11265 // contain a mesh anywhere in the link set or is not a normal prim
11266 // The value returned in SL for normal prims is prim count
11267 ret.Add(new LSL_Integer(0));
11268 break;
11269 case ScriptBaseClass.OBJECT_SERVER_COST:
11270 // The value returned in SL for normal prims is prim count
11271 ret.Add(new LSL_Float(0));
11272 break;
11273 case ScriptBaseClass.OBJECT_STREAMING_COST:
11274 // The value returned in SL for normal prims is prim count * 0.06
11275 ret.Add(new LSL_Float(0));
11276 break;
11277 case ScriptBaseClass.OBJECT_PHYSICS_COST:
11278 // The value returned in SL for normal prims is prim count
11279 ret.Add(new LSL_Float(0));
11280 break;
11281 default:
11282 // Invalid or unhandled constant.
11283 ret.Add(new LSL_Integer(ScriptBaseClass.OBJECT_UNKNOWN_DETAIL));
11284 break;
11194 } 11285 }
11195 } 11286 }
11196 11287
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
index 4ce3cf1..6246b57 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
@@ -481,6 +481,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
481 public const int DEBUG_CHANNEL = 0x7FFFFFFF; 481 public const int DEBUG_CHANNEL = 0x7FFFFFFF;
482 public const int PUBLIC_CHANNEL = 0x00000000; 482 public const int PUBLIC_CHANNEL = 0x00000000;
483 483
484 // Constants for llGetObjectDetails
485 public const int OBJECT_UNKNOWN_DETAIL = -1;
484 public const int OBJECT_NAME = 1; 486 public const int OBJECT_NAME = 1;
485 public const int OBJECT_DESC = 2; 487 public const int OBJECT_DESC = 2;
486 public const int OBJECT_POS = 3; 488 public const int OBJECT_POS = 3;
@@ -489,6 +491,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
489 public const int OBJECT_OWNER = 6; 491 public const int OBJECT_OWNER = 6;
490 public const int OBJECT_GROUP = 7; 492 public const int OBJECT_GROUP = 7;
491 public const int OBJECT_CREATOR = 8; 493 public const int OBJECT_CREATOR = 8;
494 public const int OBJECT_RUNNING_SCRIPT_COUNT = 9;
495 public const int OBJECT_TOTAL_SCRIPT_COUNT = 10;
496 public const int OBJECT_SCRIPT_MEMORY = 11;
497 public const int OBJECT_SCRIPT_TIME = 12;
498 public const int OBJECT_PRIM_EQUIVALENCE = 13;
499 public const int OBJECT_SERVER_COST = 14;
500 public const int OBJECT_STREAMING_COST = 15;
501 public const int OBJECT_PHYSICS_COST = 16;
492 502
493 // Can not be public const? 503 // Can not be public const?
494 public static readonly vector ZERO_VECTOR = new vector(0.0, 0.0, 0.0); 504 public static readonly vector ZERO_VECTOR = new vector(0.0, 0.0, 0.0);