diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes')
10 files changed, 170 insertions, 64 deletions
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index 57e1c37..4365ece 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs | |||
@@ -107,21 +107,24 @@ namespace OpenSim.Region.Framework.Scenes | |||
107 | public event OnSetRootAgentSceneDelegate OnSetRootAgentScene; | 107 | public event OnSetRootAgentSceneDelegate OnSetRootAgentScene; |
108 | 108 | ||
109 | /// <summary> | 109 | /// <summary> |
110 | /// Called when an object is touched/grabbed. | 110 | /// Fired when an object is touched/grabbed. |
111 | /// </summary> | 111 | /// </summary> |
112 | /// The originalID is the local ID of the part that was actually touched. The localID itself is always that of | 112 | /// The originalID is the local ID of the part that was actually touched. The localID itself is always that of |
113 | /// the root part. | 113 | /// the root part. |
114 | public delegate void ObjectGrabDelegate(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs); | ||
115 | public event ObjectGrabDelegate OnObjectGrab; | 114 | public event ObjectGrabDelegate OnObjectGrab; |
115 | public delegate void ObjectGrabDelegate(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs); | ||
116 | 116 | ||
117 | public event ObjectGrabDelegate OnObjectGrabbing; | 117 | public event ObjectGrabDelegate OnObjectGrabbing; |
118 | public event ObjectDeGrabDelegate OnObjectDeGrab; | 118 | public event ObjectDeGrabDelegate OnObjectDeGrab; |
119 | public event ScriptResetDelegate OnScriptReset; | 119 | public event ScriptResetDelegate OnScriptReset; |
120 | 120 | ||
121 | public event OnPermissionErrorDelegate OnPermissionError; | 121 | public event OnPermissionErrorDelegate OnPermissionError; |
122 | 122 | ||
123 | public delegate void NewRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource); | 123 | /// <summary> |
124 | /// Fired when a new script is created. | ||
125 | /// </summary> | ||
124 | public event NewRezScript OnRezScript; | 126 | public event NewRezScript OnRezScript; |
127 | public delegate void NewRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource); | ||
125 | 128 | ||
126 | public delegate void RemoveScript(uint localID, UUID itemID); | 129 | public delegate void RemoveScript(uint localID, UUID itemID); |
127 | public event RemoveScript OnRemoveScript; | 130 | public event RemoveScript OnRemoveScript; |
@@ -163,38 +166,35 @@ namespace OpenSim.Region.Framework.Scenes | |||
163 | 166 | ||
164 | public delegate void ClientClosed(UUID clientID, Scene scene); | 167 | public delegate void ClientClosed(UUID clientID, Scene scene); |
165 | 168 | ||
166 | public event ClientClosed OnClientClosed; | 169 | public event ClientClosed OnClientClosed; |
167 | |||
168 | public delegate void ScriptChangedEvent(uint localID, uint change); | ||
169 | 170 | ||
171 | /// <summary> | ||
172 | /// This is fired when a scene object property that a script might be interested in (such as color, scale or | ||
173 | /// inventory) changes. Only enough information is sent for the LSL changed event | ||
174 | /// (see http://lslwiki.net/lslwiki/wakka.php?wakka=changed) | ||
175 | /// </summary> | ||
170 | public event ScriptChangedEvent OnScriptChangedEvent; | 176 | public event ScriptChangedEvent OnScriptChangedEvent; |
177 | public delegate void ScriptChangedEvent(uint localID, uint change); | ||
171 | 178 | ||
172 | public delegate void ScriptControlEvent(uint localID, UUID item, UUID avatarID, uint held, uint changed); | 179 | public delegate void ScriptControlEvent(uint localID, UUID item, UUID avatarID, uint held, uint changed); |
173 | |||
174 | public event ScriptControlEvent OnScriptControlEvent; | 180 | public event ScriptControlEvent OnScriptControlEvent; |
175 | 181 | ||
176 | public delegate void ScriptAtTargetEvent(uint localID, uint handle, Vector3 targetpos, Vector3 atpos); | 182 | public delegate void ScriptAtTargetEvent(uint localID, uint handle, Vector3 targetpos, Vector3 atpos); |
177 | |||
178 | public event ScriptAtTargetEvent OnScriptAtTargetEvent; | 183 | public event ScriptAtTargetEvent OnScriptAtTargetEvent; |
179 | 184 | ||
180 | public delegate void ScriptNotAtTargetEvent(uint localID); | 185 | public delegate void ScriptNotAtTargetEvent(uint localID); |
181 | |||
182 | public event ScriptNotAtTargetEvent OnScriptNotAtTargetEvent; | 186 | public event ScriptNotAtTargetEvent OnScriptNotAtTargetEvent; |
183 | 187 | ||
184 | public delegate void ScriptAtRotTargetEvent(uint localID, uint handle, Quaternion targetrot, Quaternion atrot); | 188 | public delegate void ScriptAtRotTargetEvent(uint localID, uint handle, Quaternion targetrot, Quaternion atrot); |
185 | |||
186 | public event ScriptAtRotTargetEvent OnScriptAtRotTargetEvent; | 189 | public event ScriptAtRotTargetEvent OnScriptAtRotTargetEvent; |
187 | 190 | ||
188 | public delegate void ScriptNotAtRotTargetEvent(uint localID); | 191 | public delegate void ScriptNotAtRotTargetEvent(uint localID); |
189 | |||
190 | public event ScriptNotAtRotTargetEvent OnScriptNotAtRotTargetEvent; | 192 | public event ScriptNotAtRotTargetEvent OnScriptNotAtRotTargetEvent; |
191 | 193 | ||
192 | public delegate void ScriptColliding(uint localID, ColliderArgs colliders); | 194 | public delegate void ScriptColliding(uint localID, ColliderArgs colliders); |
193 | |||
194 | public event ScriptColliding OnScriptColliderStart; | 195 | public event ScriptColliding OnScriptColliderStart; |
195 | public event ScriptColliding OnScriptColliding; | 196 | public event ScriptColliding OnScriptColliding; |
196 | public event ScriptColliding OnScriptCollidingEnd; | 197 | public event ScriptColliding OnScriptCollidingEnd; |
197 | |||
198 | public event ScriptColliding OnScriptLandColliderStart; | 198 | public event ScriptColliding OnScriptLandColliderStart; |
199 | public event ScriptColliding OnScriptLandColliding; | 199 | public event ScriptColliding OnScriptLandColliding; |
200 | public event ScriptColliding OnScriptLandColliderEnd; | 200 | public event ScriptColliding OnScriptLandColliderEnd; |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 4f2b446..f556b35 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -438,29 +438,31 @@ namespace OpenSim.Region.Framework.Scenes | |||
438 | itemCopy.InvType = item.InvType; | 438 | itemCopy.InvType = item.InvType; |
439 | itemCopy.Folder = recipientFolderId; | 439 | itemCopy.Folder = recipientFolderId; |
440 | 440 | ||
441 | if (Permissions.PropagatePermissions()) | 441 | if (Permissions.PropagatePermissions() && recipient != senderId) |
442 | { | 442 | { |
443 | // First, make sore base is limited to the next perms | ||
444 | itemCopy.BasePermissions = item.BasePermissions & item.NextPermissions; | ||
445 | // By default, current equals base | ||
446 | itemCopy.CurrentPermissions = itemCopy.BasePermissions; | ||
447 | |||
448 | // If this is an object, replace current perms | ||
449 | // with folded perms | ||
443 | if (item.InvType == (int)InventoryType.Object) | 450 | if (item.InvType == (int)InventoryType.Object) |
444 | { | 451 | { |
445 | itemCopy.BasePermissions &= ~(uint)(PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer); | 452 | itemCopy.CurrentPermissions &= ~(uint)(PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer); |
446 | itemCopy.BasePermissions |= (item.CurrentPermissions & 7) << 13; | 453 | itemCopy.CurrentPermissions |= (item.CurrentPermissions & 7) << 13; |
447 | } | ||
448 | else | ||
449 | { | ||
450 | itemCopy.BasePermissions = item.BasePermissions & item.NextPermissions; | ||
451 | } | 454 | } |
452 | 455 | ||
453 | itemCopy.CurrentPermissions = itemCopy.BasePermissions; | 456 | // Ensure there is no escalation |
454 | if ((item.CurrentPermissions & 8) != 0) // Propagate slam bit | 457 | itemCopy.CurrentPermissions &= item.NextPermissions; |
455 | { | 458 | |
456 | itemCopy.BasePermissions &= item.NextPermissions; | 459 | // Need slam bit on xfer |
457 | itemCopy.CurrentPermissions = itemCopy.BasePermissions; | 460 | itemCopy.CurrentPermissions |= 8; |
458 | itemCopy.CurrentPermissions |= 8; | ||
459 | } | ||
460 | 461 | ||
461 | itemCopy.NextPermissions = item.NextPermissions; | 462 | itemCopy.NextPermissions = item.NextPermissions; |
462 | itemCopy.EveryOnePermissions = item.EveryOnePermissions & item.NextPermissions; | 463 | |
463 | itemCopy.GroupPermissions = item.GroupPermissions & item.NextPermissions; | 464 | itemCopy.EveryOnePermissions = 0; |
465 | itemCopy.GroupPermissions = 0; | ||
464 | } | 466 | } |
465 | else | 467 | else |
466 | { | 468 | { |
@@ -531,7 +533,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
531 | return null; | 533 | return null; |
532 | } | 534 | } |
533 | 535 | ||
534 | |||
535 | if (recipientParentFolderId == UUID.Zero) | 536 | if (recipientParentFolderId == UUID.Zero) |
536 | { | 537 | { |
537 | InventoryFolderBase recipientRootFolder = InventoryService.GetRootFolder(recipientId); | 538 | InventoryFolderBase recipientRootFolder = InventoryService.GetRootFolder(recipientId); |
@@ -910,12 +911,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
910 | 911 | ||
911 | if ((part.OwnerID != destAgent) && Permissions.PropagatePermissions()) | 912 | if ((part.OwnerID != destAgent) && Permissions.PropagatePermissions()) |
912 | { | 913 | { |
914 | agentItem.BasePermissions = taskItem.BasePermissions & taskItem.NextPermissions; | ||
913 | if (taskItem.InvType == (int)InventoryType.Object) | 915 | if (taskItem.InvType == (int)InventoryType.Object) |
914 | agentItem.BasePermissions = taskItem.BasePermissions & ((taskItem.CurrentPermissions & 7) << 13); | 916 | agentItem.CurrentPermissions = agentItem.BasePermissions & ((taskItem.CurrentPermissions & 7) << 13); |
915 | else | 917 | agentItem.CurrentPermissions = agentItem.BasePermissions ; |
916 | agentItem.BasePermissions = taskItem.BasePermissions; | 918 | |
917 | agentItem.BasePermissions &= taskItem.NextPermissions; | 919 | agentItem.CurrentPermissions |= 8; |
918 | agentItem.CurrentPermissions = agentItem.BasePermissions | 8; | ||
919 | agentItem.NextPermissions = taskItem.NextPermissions; | 920 | agentItem.NextPermissions = taskItem.NextPermissions; |
920 | agentItem.EveryOnePermissions = taskItem.EveryonePermissions & taskItem.NextPermissions; | 921 | agentItem.EveryOnePermissions = taskItem.EveryonePermissions & taskItem.NextPermissions; |
921 | agentItem.GroupPermissions = taskItem.GroupPermissions & taskItem.NextPermissions; | 922 | agentItem.GroupPermissions = taskItem.GroupPermissions & taskItem.NextPermissions; |
@@ -2075,7 +2076,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
2075 | group.RootPart.IsAttachment = true; | 2076 | group.RootPart.IsAttachment = true; |
2076 | } | 2077 | } |
2077 | 2078 | ||
2078 | AddNewSceneObject(group, true); | 2079 | // If we're rezzing an attachment then don't ask AddNewSceneObject() to update the client since |
2080 | // we'll be doing that later on. Scheduling more than one full update during the attachment | ||
2081 | // process causes some clients to fail to display the attachment properly. | ||
2082 | AddNewSceneObject(group, true, !attachment); | ||
2079 | 2083 | ||
2080 | // m_log.InfoFormat("ray end point for inventory rezz is {0} {1} {2} ", RayEnd.X, RayEnd.Y, RayEnd.Z); | 2084 | // m_log.InfoFormat("ray end point for inventory rezz is {0} {1} {2} ", RayEnd.X, RayEnd.Y, RayEnd.Z); |
2081 | // if attachment we set it's asset id so object updates can reflect that | 2085 | // if attachment we set it's asset id so object updates can reflect that |
@@ -2445,6 +2449,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
2445 | return; | 2449 | return; |
2446 | } | 2450 | } |
2447 | 2451 | ||
2452 | m_log.DebugFormat("[SCENE INVENTORY]: {0} {1} IsAttachment={2}", att.Name, att.LocalId, att.IsAttachment); | ||
2453 | Console.WriteLine("HERE X"); | ||
2448 | ScenePresence presence; | 2454 | ScenePresence presence; |
2449 | if (TryGetAvatar(remoteClient.AgentId, out presence)) | 2455 | if (TryGetAvatar(remoteClient.AgentId, out presence)) |
2450 | { | 2456 | { |
@@ -2452,9 +2458,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
2452 | InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); | 2458 | InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); |
2453 | item = InventoryService.GetItem(item); | 2459 | item = InventoryService.GetItem(item); |
2454 | presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /*att.UUID*/); | 2460 | presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /*att.UUID*/); |
2461 | Console.WriteLine("HERE Y"); | ||
2455 | 2462 | ||
2456 | if (m_AvatarFactory != null) | 2463 | if (m_AvatarFactory != null) |
2457 | m_AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance); | 2464 | m_AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance); |
2465 | |||
2466 | Console.WriteLine("HERE Z"); | ||
2458 | } | 2467 | } |
2459 | } | 2468 | } |
2460 | 2469 | ||
@@ -2637,4 +2646,4 @@ namespace OpenSim.Region.Framework.Scenes | |||
2637 | m_sceneGraph.LinkObjects(root, children); | 2646 | m_sceneGraph.LinkObjects(root, children); |
2638 | } | 2647 | } |
2639 | } | 2648 | } |
2640 | } | 2649 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index ac04dc7..d8e604f 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs | |||
@@ -124,6 +124,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
124 | { | 124 | { |
125 | if (((SceneObjectGroup)ent).LocalId == primLocalID) | 125 | if (((SceneObjectGroup)ent).LocalId == primLocalID) |
126 | { | 126 | { |
127 | m_log.DebugFormat("[SCENE]: Received full update request for {0} from {1}", primLocalID, remoteClient.Name); | ||
127 | ((SceneObjectGroup)ent).SendFullUpdateToClient(remoteClient); | 128 | ((SceneObjectGroup)ent).SendFullUpdateToClient(remoteClient); |
128 | return; | 129 | return; |
129 | } | 130 | } |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 637ebff..f8ca047 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -1850,9 +1850,31 @@ namespace OpenSim.Region.Framework.Scenes | |||
1850 | /// true if the object was added, false if an object with the same uuid was already in the scene | 1850 | /// true if the object was added, false if an object with the same uuid was already in the scene |
1851 | /// </returns> | 1851 | /// </returns> |
1852 | public bool AddRestoredSceneObject( | 1852 | public bool AddRestoredSceneObject( |
1853 | SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted, bool sendClientUpdates) | ||
1854 | { | ||
1855 | return m_sceneGraph.AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, sendClientUpdates); | ||
1856 | } | ||
1857 | |||
1858 | /// <summary> | ||
1859 | /// Add an object into the scene that has come from storage | ||
1860 | /// </summary> | ||
1861 | /// | ||
1862 | /// <param name="sceneObject"></param> | ||
1863 | /// <param name="attachToBackup"> | ||
1864 | /// If true, changes to the object will be reflected in its persisted data | ||
1865 | /// If false, the persisted data will not be changed even if the object in the scene is changed | ||
1866 | /// </param> | ||
1867 | /// <param name="alreadyPersisted"> | ||
1868 | /// If true, we won't persist this object until it changes | ||
1869 | /// If false, we'll persist this object immediately | ||
1870 | /// </param> | ||
1871 | /// <returns> | ||
1872 | /// true if the object was added, false if an object with the same uuid was already in the scene | ||
1873 | /// </returns> | ||
1874 | public bool AddRestoredSceneObject( | ||
1853 | SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted) | 1875 | SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted) |
1854 | { | 1876 | { |
1855 | return m_sceneGraph.AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted); | 1877 | return AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, true); |
1856 | } | 1878 | } |
1857 | 1879 | ||
1858 | /// <summary> | 1880 | /// <summary> |
@@ -1886,7 +1908,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1886 | } | 1908 | } |
1887 | 1909 | ||
1888 | /// <summary> | 1910 | /// <summary> |
1889 | /// Delete every object from the scene | 1911 | /// Delete every object from the scene. This does not include attachments worn by avatars. |
1890 | /// </summary> | 1912 | /// </summary> |
1891 | public void DeleteAllSceneObjects() | 1913 | public void DeleteAllSceneObjects() |
1892 | { | 1914 | { |
@@ -1897,7 +1919,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
1897 | foreach (EntityBase e in entities) | 1919 | foreach (EntityBase e in entities) |
1898 | { | 1920 | { |
1899 | if (e is SceneObjectGroup) | 1921 | if (e is SceneObjectGroup) |
1900 | DeleteSceneObject((SceneObjectGroup)e, false); | 1922 | { |
1923 | SceneObjectGroup sog = (SceneObjectGroup)e; | ||
1924 | if (!sog.IsAttachment) | ||
1925 | DeleteSceneObject((SceneObjectGroup)e, false); | ||
1926 | } | ||
1901 | } | 1927 | } |
1902 | } | 1928 | } |
1903 | } | 1929 | } |
@@ -2461,7 +2487,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2461 | /// <returns></returns> | 2487 | /// <returns></returns> |
2462 | public bool IncomingCreateObject(ISceneObject sog) | 2488 | public bool IncomingCreateObject(ISceneObject sog) |
2463 | { | 2489 | { |
2464 | //m_log.Debug(" >>> IncomingCreateObject(sog) <<< " + ((SceneObjectGroup)sog).AbsolutePosition + " deleted? " + ((SceneObjectGroup)sog).IsDeleted); | 2490 | m_log.Debug(" >>> IncomingCreateObject(sog) <<< " + ((SceneObjectGroup)sog).AbsolutePosition + " deleted? " + ((SceneObjectGroup)sog).IsDeleted); |
2465 | SceneObjectGroup newObject; | 2491 | SceneObjectGroup newObject; |
2466 | try | 2492 | try |
2467 | { | 2493 | { |
@@ -2533,10 +2559,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
2533 | 2559 | ||
2534 | if (sceneObject.IsAttachmentCheckFull()) // Attachment | 2560 | if (sceneObject.IsAttachmentCheckFull()) // Attachment |
2535 | { | 2561 | { |
2562 | m_log.DebugFormat("[SCENE]: Adding attachment {0} {1}", sceneObject.Name, sceneObject.LocalId); | ||
2563 | |||
2536 | sceneObject.RootPart.AddFlag(PrimFlags.TemporaryOnRez); | 2564 | sceneObject.RootPart.AddFlag(PrimFlags.TemporaryOnRez); |
2537 | sceneObject.RootPart.AddFlag(PrimFlags.Phantom); | 2565 | sceneObject.RootPart.AddFlag(PrimFlags.Phantom); |
2538 | 2566 | ||
2539 | AddRestoredSceneObject(sceneObject, false, false); | 2567 | AddRestoredSceneObject(sceneObject, false, false, false); |
2540 | 2568 | ||
2541 | // Handle attachment special case | 2569 | // Handle attachment special case |
2542 | SceneObjectPart RootPrim = sceneObject.RootPart; | 2570 | SceneObjectPart RootPrim = sceneObject.RootPart; |
@@ -2544,6 +2572,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
2544 | // Fix up attachment Parent Local ID | 2572 | // Fix up attachment Parent Local ID |
2545 | ScenePresence sp = GetScenePresence(sceneObject.OwnerID); | 2573 | ScenePresence sp = GetScenePresence(sceneObject.OwnerID); |
2546 | 2574 | ||
2575 | Console.WriteLine("AAAA"); | ||
2576 | |||
2547 | //uint parentLocalID = 0; | 2577 | //uint parentLocalID = 0; |
2548 | if (sp != null) | 2578 | if (sp != null) |
2549 | { | 2579 | { |
@@ -2562,20 +2592,25 @@ namespace OpenSim.Region.Framework.Scenes | |||
2562 | //grp.SetFromAssetID(grp.RootPart.LastOwnerID); | 2592 | //grp.SetFromAssetID(grp.RootPart.LastOwnerID); |
2563 | m_log.DebugFormat( | 2593 | m_log.DebugFormat( |
2564 | "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); | 2594 | "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); |
2565 | 2595 | ||
2596 | RootPrim.RemFlag(PrimFlags.TemporaryOnRez); | ||
2566 | AttachObject( | 2597 | AttachObject( |
2567 | sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false); | 2598 | sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false); |
2568 | RootPrim.RemFlag(PrimFlags.TemporaryOnRez); | 2599 | |
2569 | grp.SendGroupFullUpdate(); | 2600 | //grp.SendGroupFullUpdate(); |
2570 | } | 2601 | } |
2571 | else | 2602 | else |
2572 | { | 2603 | { |
2573 | RootPrim.RemFlag(PrimFlags.TemporaryOnRez); | 2604 | RootPrim.RemFlag(PrimFlags.TemporaryOnRez); |
2574 | RootPrim.AddFlag(PrimFlags.TemporaryOnRez); | 2605 | RootPrim.AddFlag(PrimFlags.TemporaryOnRez); |
2575 | } | 2606 | } |
2607 | |||
2608 | Console.WriteLine("BBBB"); | ||
2576 | } | 2609 | } |
2577 | else | 2610 | else |
2578 | { | 2611 | { |
2612 | m_log.DebugFormat("[SCENE]: Adding ordinary object {0} {1}", sceneObject.Name, sceneObject.LocalId); | ||
2613 | |||
2579 | AddRestoredSceneObject(sceneObject, true, false); | 2614 | AddRestoredSceneObject(sceneObject, true, false); |
2580 | 2615 | ||
2581 | if (!Permissions.CanObjectEntry(sceneObject.UUID, | 2616 | if (!Permissions.CanObjectEntry(sceneObject.UUID, |
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index 2f6a0db..50feb17 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs | |||
@@ -1383,7 +1383,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
1383 | // now we have a child agent in this region. Request all interesting data about other (root) agents | 1383 | // now we have a child agent in this region. Request all interesting data about other (root) agents |
1384 | agent.SendInitialFullUpdateToAllClients(); | 1384 | agent.SendInitialFullUpdateToAllClients(); |
1385 | 1385 | ||
1386 | Console.WriteLine("SCS 1"); | ||
1386 | agent.CrossAttachmentsIntoNewRegion(neighbourHandle, true); | 1387 | agent.CrossAttachmentsIntoNewRegion(neighbourHandle, true); |
1388 | Console.WriteLine("SCS 2"); | ||
1387 | 1389 | ||
1388 | // m_scene.SendKillObject(m_localId); | 1390 | // m_scene.SendKillObject(m_localId); |
1389 | 1391 | ||
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index ad24160..fa3c5eb 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs | |||
@@ -216,11 +216,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
216 | /// If true, we won't persist this object until it changes | 216 | /// If true, we won't persist this object until it changes |
217 | /// If false, we'll persist this object immediately | 217 | /// If false, we'll persist this object immediately |
218 | /// </param> | 218 | /// </param> |
219 | /// <param name="sendClientUpdate"> | ||
220 | /// If true, we send updates to the client to tell it about this object | ||
221 | /// If false, we leave it up to the caller to do this | ||
222 | /// </param> | ||
219 | /// <returns> | 223 | /// <returns> |
220 | /// true if the object was added, false if an object with the same uuid was already in the scene | 224 | /// true if the object was added, false if an object with the same uuid was already in the scene |
221 | /// </returns> | 225 | /// </returns> |
222 | protected internal bool AddRestoredSceneObject( | 226 | protected internal bool AddRestoredSceneObject( |
223 | SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted) | 227 | SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted, bool sendClientUpdates) |
224 | { | 228 | { |
225 | if (!alreadyPersisted) | 229 | if (!alreadyPersisted) |
226 | { | 230 | { |
@@ -228,8 +232,29 @@ namespace OpenSim.Region.Framework.Scenes | |||
228 | sceneObject.HasGroupChanged = true; | 232 | sceneObject.HasGroupChanged = true; |
229 | } | 233 | } |
230 | 234 | ||
231 | return AddSceneObject(sceneObject, attachToBackup, true); | 235 | return AddSceneObject(sceneObject, attachToBackup, sendClientUpdates); |
232 | } | 236 | } |
237 | |||
238 | // /// <summary> | ||
239 | // /// Add an object into the scene that has come from storage | ||
240 | // /// </summary> | ||
241 | // /// <param name="sceneObject"></param> | ||
242 | // /// <param name="attachToBackup"> | ||
243 | // /// If true, changes to the object will be reflected in its persisted data | ||
244 | // /// If false, the persisted data will not be changed even if the object in the scene is changed | ||
245 | // /// </param> | ||
246 | // /// <param name="alreadyPersisted"> | ||
247 | // /// If true, we won't persist this object until it changes | ||
248 | // /// If false, we'll persist this object immediately | ||
249 | // /// </param> | ||
250 | // /// <returns> | ||
251 | // /// true if the object was added, false if an object with the same uuid was already in the scene | ||
252 | // /// </returns> | ||
253 | // protected internal bool AddRestoredSceneObject( | ||
254 | // SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted) | ||
255 | // { | ||
256 | // AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, true); | ||
257 | // } | ||
233 | 258 | ||
234 | /// <summary> | 259 | /// <summary> |
235 | /// Add a newly created object to the scene. This will both update the scene, and send information about the | 260 | /// Add a newly created object to the scene. This will both update the scene, and send information about the |
@@ -536,7 +561,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
536 | // m_log.DebugFormat( | 561 | // m_log.DebugFormat( |
537 | // "[SCENE GRAPH]: Retrieved single object {0} for attachment to {1} on point {2}", | 562 | // "[SCENE GRAPH]: Retrieved single object {0} for attachment to {1} on point {2}", |
538 | // objatt.Name, remoteClient.Name, AttachmentPt); | 563 | // objatt.Name, remoteClient.Name, AttachmentPt); |
539 | |||
540 | if (objatt != null) | 564 | if (objatt != null) |
541 | { | 565 | { |
542 | bool tainted = false; | 566 | bool tainted = false; |
@@ -612,11 +636,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
612 | protected internal bool AttachObject( | 636 | protected internal bool AttachObject( |
613 | IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, Quaternion rot, Vector3 attachPos, bool silent) | 637 | IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, Quaternion rot, Vector3 attachPos, bool silent) |
614 | { | 638 | { |
639 | Console.WriteLine("HERE A"); | ||
615 | SceneObjectGroup group = GetGroupByPrim(objectLocalID); | 640 | SceneObjectGroup group = GetGroupByPrim(objectLocalID); |
616 | if (group != null) | 641 | if (group != null) |
617 | { | 642 | { |
618 | if (m_parentScene.Permissions.CanTakeObject(group.UUID, remoteClient.AgentId)) | 643 | if (m_parentScene.Permissions.CanTakeObject(group.UUID, remoteClient.AgentId)) |
619 | { | 644 | { |
645 | Console.WriteLine("HERE -1"); | ||
620 | // If the attachment point isn't the same as the one previously used | 646 | // If the attachment point isn't the same as the one previously used |
621 | // set it's offset position = 0 so that it appears on the attachment point | 647 | // set it's offset position = 0 so that it appears on the attachment point |
622 | // and not in a weird location somewhere unknown. | 648 | // and not in a weird location somewhere unknown. |
@@ -655,9 +681,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
655 | itemId = group.GetFromItemID(); | 681 | itemId = group.GetFromItemID(); |
656 | } | 682 | } |
657 | 683 | ||
684 | Console.WriteLine("HERE 0"); | ||
658 | m_parentScene.AttachObject(remoteClient, AttachmentPt, itemId, group); | 685 | m_parentScene.AttachObject(remoteClient, AttachmentPt, itemId, group); |
659 | 686 | ||
687 | Console.WriteLine("HERE 1"); | ||
660 | group.AttachToAgent(remoteClient.AgentId, AttachmentPt, attachPos, silent); | 688 | group.AttachToAgent(remoteClient.AgentId, AttachmentPt, attachPos, silent); |
689 | Console.WriteLine("HERE 2"); | ||
661 | // In case it is later dropped again, don't let | 690 | // In case it is later dropped again, don't let |
662 | // it get cleaned up | 691 | // it get cleaned up |
663 | // | 692 | // |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index c14b39a..ba3fde7 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -1494,6 +1494,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
1494 | 1494 | ||
1495 | public void SendFullUpdateToClient(IClientAPI remoteClient) | 1495 | public void SendFullUpdateToClient(IClientAPI remoteClient) |
1496 | { | 1496 | { |
1497 | if (IsAttachment) | ||
1498 | m_log.DebugFormat( | ||
1499 | "[SOG]: Sending full update to client {0} for {1} {2}", remoteClient.Name, Name, LocalId); | ||
1500 | |||
1497 | SendPartFullUpdate(remoteClient, RootPart, m_scene.Permissions.GenerateClientFlags(remoteClient.AgentId, RootPart.UUID)); | 1501 | SendPartFullUpdate(remoteClient, RootPart, m_scene.Permissions.GenerateClientFlags(remoteClient.AgentId, RootPart.UUID)); |
1498 | 1502 | ||
1499 | lock (m_parts) | 1503 | lock (m_parts) |
@@ -1513,8 +1517,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
1513 | /// <param name="part"></param> | 1517 | /// <param name="part"></param> |
1514 | internal void SendPartFullUpdate(IClientAPI remoteClient, SceneObjectPart part, uint clientFlags) | 1518 | internal void SendPartFullUpdate(IClientAPI remoteClient, SceneObjectPart part, uint clientFlags) |
1515 | { | 1519 | { |
1516 | // m_log.DebugFormat( | 1520 | if (IsAttachment) |
1517 | // "[SOG]: Sendinging part full update to {0} for {1} {2}", remoteClient.Name, part.Name, part.LocalId); | 1521 | m_log.DebugFormat( |
1522 | "[SOG]: Sending part full update to {0} for {1} {2}", remoteClient.Name, part.Name, part.LocalId); | ||
1518 | 1523 | ||
1519 | if (m_rootPart.UUID == part.UUID) | 1524 | if (m_rootPart.UUID == part.UUID) |
1520 | { | 1525 | { |
@@ -1994,7 +1999,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1994 | 1999 | ||
1995 | public void ScheduleFullUpdateToAvatar(ScenePresence presence) | 2000 | public void ScheduleFullUpdateToAvatar(ScenePresence presence) |
1996 | { | 2001 | { |
1997 | // m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1} just to avatar {2}", Name, UUID, presence.Name); | 2002 | if (IsAttachment) |
2003 | m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1} just to avatar {2}", Name, UUID, presence.Name); | ||
1998 | 2004 | ||
1999 | RootPart.AddFullUpdateToAvatar(presence); | 2005 | RootPart.AddFullUpdateToAvatar(presence); |
2000 | 2006 | ||
@@ -2026,7 +2032,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
2026 | /// </summary> | 2032 | /// </summary> |
2027 | public void ScheduleGroupForFullUpdate() | 2033 | public void ScheduleGroupForFullUpdate() |
2028 | { | 2034 | { |
2029 | // m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1}", Name, UUID); | 2035 | if (IsAttachment) |
2036 | m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1}", Name, UUID); | ||
2030 | 2037 | ||
2031 | checkAtTargets(); | 2038 | checkAtTargets(); |
2032 | RootPart.ScheduleFullUpdate(); | 2039 | RootPart.ScheduleFullUpdate(); |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index a85a4b3..ffbb427 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -1259,16 +1259,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
1259 | /// Tell all scene presences that they should send updates for this part to their clients | 1259 | /// Tell all scene presences that they should send updates for this part to their clients |
1260 | /// </summary> | 1260 | /// </summary> |
1261 | public void AddFullUpdateToAllAvatars() | 1261 | public void AddFullUpdateToAllAvatars() |
1262 | { | 1262 | { |
1263 | ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences(); | 1263 | ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences(); |
1264 | for (int i = 0; i < avatars.Length; i++) | 1264 | for (int i = 0; i < avatars.Length; i++) |
1265 | { | 1265 | AddFullUpdateToAvatar(avatars[i]); |
1266 | avatars[i].SceneViewer.QueuePartForUpdate(this); | ||
1267 | } | ||
1268 | } | 1266 | } |
1269 | 1267 | ||
1270 | public void AddFullUpdateToAvatar(ScenePresence presence) | 1268 | public void AddFullUpdateToAvatar(ScenePresence presence) |
1271 | { | 1269 | { |
1270 | if (IsAttachment) | ||
1271 | m_log.DebugFormat("AddFullUpdateToAllAvatar() {0} for {1} {2}", presence.Name, Name, LocalId); | ||
1272 | |||
1272 | presence.SceneViewer.QueuePartForUpdate(this); | 1273 | presence.SceneViewer.QueuePartForUpdate(this); |
1273 | } | 1274 | } |
1274 | 1275 | ||
@@ -1287,13 +1288,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
1287 | { | 1288 | { |
1288 | ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences(); | 1289 | ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences(); |
1289 | for (int i = 0; i < avatars.Length; i++) | 1290 | for (int i = 0; i < avatars.Length; i++) |
1290 | { | 1291 | AddTerseUpdateToAvatar(avatars[i]); |
1291 | avatars[i].SceneViewer.QueuePartForUpdate(this); | ||
1292 | } | ||
1293 | } | 1292 | } |
1294 | 1293 | ||
1295 | public void AddTerseUpdateToAvatar(ScenePresence presence) | 1294 | public void AddTerseUpdateToAvatar(ScenePresence presence) |
1296 | { | 1295 | { |
1296 | if (IsAttachment) | ||
1297 | m_log.DebugFormat("AddTerseUpdateToAvatar() {0} for {1} {2}", presence.Name, Name, LocalId); | ||
1298 | |||
1297 | presence.SceneViewer.QueuePartForUpdate(this); | 1299 | presence.SceneViewer.QueuePartForUpdate(this); |
1298 | } | 1300 | } |
1299 | 1301 | ||
@@ -2727,7 +2729,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
2727 | /// </summary> | 2729 | /// </summary> |
2728 | public void ScheduleFullUpdate() | 2730 | public void ScheduleFullUpdate() |
2729 | { | 2731 | { |
2730 | // m_log.DebugFormat("[SCENE OBJECT PART]: Scheduling full update for {0} {1}", Name, LocalId); | 2732 | if (IsAttachment) |
2733 | m_log.DebugFormat("[SOP]: Scheduling full update for {0} {1}", Name, LocalId); | ||
2731 | 2734 | ||
2732 | if (m_parentGroup != null) | 2735 | if (m_parentGroup != null) |
2733 | { | 2736 | { |
@@ -2840,6 +2843,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
2840 | /// <param name="remoteClient"></param> | 2843 | /// <param name="remoteClient"></param> |
2841 | public void SendFullUpdate(IClientAPI remoteClient, uint clientFlags) | 2844 | public void SendFullUpdate(IClientAPI remoteClient, uint clientFlags) |
2842 | { | 2845 | { |
2846 | if (IsAttachment) | ||
2847 | m_log.DebugFormat( | ||
2848 | "[SCENE OBJECT PART]: Sending part full update to {0} for {1} {2}", remoteClient.Name, Name, LocalId); | ||
2849 | |||
2843 | m_parentGroup.SendPartFullUpdate(remoteClient, this, clientFlags); | 2850 | m_parentGroup.SendPartFullUpdate(remoteClient, this, clientFlags); |
2844 | } | 2851 | } |
2845 | 2852 | ||
@@ -2848,6 +2855,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
2848 | /// </summary> | 2855 | /// </summary> |
2849 | public void SendFullUpdateToAllClients() | 2856 | public void SendFullUpdateToAllClients() |
2850 | { | 2857 | { |
2858 | if (IsAttachment) | ||
2859 | m_log.DebugFormat( | ||
2860 | "[SCENE OBJECT PART]: Sending full update for {0} {1} for all clients", Name, LocalId); | ||
2861 | |||
2851 | ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences(); | 2862 | ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences(); |
2852 | for (int i = 0; i < avatars.Length; i++) | 2863 | for (int i = 0; i < avatars.Length; i++) |
2853 | { | 2864 | { |
@@ -2859,6 +2870,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
2859 | 2870 | ||
2860 | public void SendFullUpdateToAllClientsExcept(UUID agentID) | 2871 | public void SendFullUpdateToAllClientsExcept(UUID agentID) |
2861 | { | 2872 | { |
2873 | if (IsAttachment) | ||
2874 | m_log.DebugFormat( | ||
2875 | "[SCENE OBJECT PART]: Sending full update for {0} {1} to all clients except {2}", Name, LocalId, agentID); | ||
2876 | |||
2862 | ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences(); | 2877 | ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences(); |
2863 | for (int i = 0; i < avatars.Length; i++) | 2878 | for (int i = 0; i < avatars.Length; i++) |
2864 | { | 2879 | { |
@@ -2965,6 +2980,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
2965 | { | 2980 | { |
2966 | if (m_updateFlag == 2) // is a new prim, just created/reloaded or has major changes | 2981 | if (m_updateFlag == 2) // is a new prim, just created/reloaded or has major changes |
2967 | { | 2982 | { |
2983 | if (IsAttachment) | ||
2984 | m_log.DebugFormat("[SOP]: Sending scheduled full update for {0} {1}", Name, LocalId); | ||
2985 | |||
2968 | AddFullUpdateToAllAvatars(); | 2986 | AddFullUpdateToAllAvatars(); |
2969 | ClearUpdateSchedule(); | 2987 | ClearUpdateSchedule(); |
2970 | } | 2988 | } |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index a555eae..21ca1de 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | |||
@@ -638,7 +638,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
638 | m_items[item.ItemID] = item; | 638 | m_items[item.ItemID] = item; |
639 | m_inventorySerial++; | 639 | m_inventorySerial++; |
640 | m_part.TriggerScriptChangedEvent(Changed.INVENTORY); | 640 | m_part.TriggerScriptChangedEvent(Changed.INVENTORY); |
641 | |||
642 | HasInventoryChanged = true; | 641 | HasInventoryChanged = true; |
643 | m_part.ParentGroup.HasGroupChanged = true; | 642 | m_part.ParentGroup.HasGroupChanged = true; |
644 | 643 | ||
diff --git a/OpenSim/Region/Framework/Scenes/SceneViewer.cs b/OpenSim/Region/Framework/Scenes/SceneViewer.cs index e4296ef..6f2bef9 100644 --- a/OpenSim/Region/Framework/Scenes/SceneViewer.cs +++ b/OpenSim/Region/Framework/Scenes/SceneViewer.cs | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.Reflection; | ||
30 | using OpenMetaverse; | 31 | using OpenMetaverse; |
31 | using log4net; | 32 | using log4net; |
32 | using OpenSim.Framework; | 33 | using OpenSim.Framework; |
@@ -39,6 +40,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
39 | { | 40 | { |
40 | public class SceneViewer : ISceneViewer | 41 | public class SceneViewer : ISceneViewer |
41 | { | 42 | { |
43 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
44 | |||
42 | protected ScenePresence m_presence; | 45 | protected ScenePresence m_presence; |
43 | protected UpdateQueue m_partsUpdateQueue = new UpdateQueue(); | 46 | protected UpdateQueue m_partsUpdateQueue = new UpdateQueue(); |
44 | protected Queue<SceneObjectGroup> m_pendingObjects; | 47 | protected Queue<SceneObjectGroup> m_pendingObjects; |
@@ -60,6 +63,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
60 | /// <param name="part"></param> | 63 | /// <param name="part"></param> |
61 | public void QueuePartForUpdate(SceneObjectPart part) | 64 | public void QueuePartForUpdate(SceneObjectPart part) |
62 | { | 65 | { |
66 | if (part.IsAttachment) | ||
67 | m_log.DebugFormat("[SCENE VIEWER]: Queueing part {0} {1} for update", part.Name, part.LocalId); | ||
68 | |||
63 | lock (m_partsUpdateQueue) | 69 | lock (m_partsUpdateQueue) |
64 | { | 70 | { |
65 | m_partsUpdateQueue.Enqueue(part); | 71 | m_partsUpdateQueue.Enqueue(part); |
@@ -134,7 +140,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
134 | } | 140 | } |
135 | else if (update.LastTerseUpdateTime <= part.TimeStampTerse) | 141 | else if (update.LastTerseUpdateTime <= part.TimeStampTerse) |
136 | { | 142 | { |
137 | // m_log.DebugFormat( | 143 | // m_log.DebugFormat(AddFullUpdateToAvatar |
138 | // "[SCENE PRESENCE]: Tersely updating prim {0}, {1} - part timestamp {2}", | 144 | // "[SCENE PRESENCE]: Tersely updating prim {0}, {1} - part timestamp {2}", |
139 | // part.Name, part.UUID, part.TimeStampTerse); | 145 | // part.Name, part.UUID, part.TimeStampTerse); |
140 | 146 | ||