aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs43
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs42
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs10
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs3
4 files changed, 86 insertions, 12 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index a516a54..0e58986 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -331,6 +331,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
331 /// </value> 331 /// </value>
332 protected HashSet<uint> m_killRecord; 332 protected HashSet<uint> m_killRecord;
333 333
334 protected HashSet<uint> m_attachmentsSent;
335
334 private int m_moneyBalance; 336 private int m_moneyBalance;
335 private int m_animationSequenceNumber = 1; 337 private int m_animationSequenceNumber = 1;
336 private bool m_SendLogoutPacketWhenClosing = true; 338 private bool m_SendLogoutPacketWhenClosing = true;
@@ -427,6 +429,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
427 m_entityUpdates = new PriorityQueue(m_scene.Entities.Count); 429 m_entityUpdates = new PriorityQueue(m_scene.Entities.Count);
428 m_fullUpdateDataBlocksBuilder = new List<ObjectUpdatePacket.ObjectDataBlock>(); 430 m_fullUpdateDataBlocksBuilder = new List<ObjectUpdatePacket.ObjectDataBlock>();
429 m_killRecord = new HashSet<uint>(); 431 m_killRecord = new HashSet<uint>();
432 m_attachmentsSent = new HashSet<uint>();
430 433
431 m_assetService = m_scene.RequestModuleInterface<IAssetService>(); 434 m_assetService = m_scene.RequestModuleInterface<IAssetService>();
432 m_hyperAssets = m_scene.RequestModuleInterface<IHyperAssetService>(); 435 m_hyperAssets = m_scene.RequestModuleInterface<IHyperAssetService>();
@@ -3411,6 +3414,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3411 objupdate.ObjectData[0] = CreateAvatarUpdateBlock(presence); 3414 objupdate.ObjectData[0] = CreateAvatarUpdateBlock(presence);
3412 3415
3413 OutPacket(objupdate, ThrottleOutPacketType.Task); 3416 OutPacket(objupdate, ThrottleOutPacketType.Task);
3417
3418 // We need to record the avatar local id since the root prim of an attachment points to this.
3419 m_attachmentsSent.Add(avatar.LocalId);
3414 } 3420 }
3415 3421
3416 public void SendCoarseLocationUpdate(List<UUID> users, List<Vector3> CoarseLocations) 3422 public void SendCoarseLocationUpdate(List<UUID> users, List<Vector3> CoarseLocations)
@@ -3466,7 +3472,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3466 double priority = m_prioritizer.GetUpdatePriority(this, entity); 3472 double priority = m_prioritizer.GetUpdatePriority(this, entity);
3467 3473
3468 lock (m_entityUpdates.SyncRoot) 3474 lock (m_entityUpdates.SyncRoot)
3469 m_entityUpdates.Enqueue(priority, new EntityUpdate(entity, updateFlags), entity.LocalId); 3475 m_entityUpdates.Enqueue(priority, new EntityUpdate(entity, updateFlags), entity.LocalId);
3470 } 3476 }
3471 3477
3472 private void ProcessEntityUpdates(int maxUpdates) 3478 private void ProcessEntityUpdates(int maxUpdates)
@@ -3542,9 +3548,42 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3542 if (!canUseImproved && !canUseCompressed) 3548 if (!canUseImproved && !canUseCompressed)
3543 { 3549 {
3544 if (update.Entity is ScenePresence) 3550 if (update.Entity is ScenePresence)
3551 {
3545 objectUpdateBlocks.Value.Add(CreateAvatarUpdateBlock((ScenePresence)update.Entity)); 3552 objectUpdateBlocks.Value.Add(CreateAvatarUpdateBlock((ScenePresence)update.Entity));
3553 }
3546 else 3554 else
3547 objectUpdateBlocks.Value.Add(CreatePrimUpdateBlock((SceneObjectPart)update.Entity, this.m_agentId)); 3555 {
3556 if (update.Entity is SceneObjectPart && ((SceneObjectPart)update.Entity).IsAttachment)
3557 {
3558 SceneObjectPart sop = (SceneObjectPart)update.Entity;
3559 string text = sop.Text;
3560 if (text.IndexOf("\n") >= 0)
3561 text = text.Remove(text.IndexOf("\n"));
3562
3563 if (m_attachmentsSent.Contains(sop.ParentID))
3564 {
3565// m_log.DebugFormat(
3566// "[CLIENT]: Sending full info about attached prim {0} text {1}",
3567// sop.LocalId, text);
3568
3569 objectUpdateBlocks.Value.Add(CreatePrimUpdateBlock(sop, this.m_agentId));
3570
3571 m_attachmentsSent.Add(sop.LocalId);
3572 }
3573 else
3574 {
3575 m_log.DebugFormat(
3576 "[CLIENT]: Requeueing full update of prim {0} text {1} since we haven't sent its parent {2} yet",
3577 sop.LocalId, text, sop.ParentID);
3578
3579 m_entityUpdates.Enqueue(double.MaxValue, update, sop.LocalId);
3580 }
3581 }
3582 else
3583 {
3584 objectUpdateBlocks.Value.Add(CreatePrimUpdateBlock((SceneObjectPart)update.Entity, this.m_agentId));
3585 }
3586 }
3548 } 3587 }
3549 else if (!canUseImproved) 3588 else if (!canUseImproved)
3550 { 3589 {
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 2544359..4e90d09 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2066,8 +2066,34 @@ namespace OpenSim.Region.Framework.Scenes
2066 sceneObject.ScheduleGroupForFullUpdate(); 2066 sceneObject.ScheduleGroupForFullUpdate();
2067 2067
2068 return sceneObject; 2068 return sceneObject;
2069 }
2070
2071 /// <summary>
2072 /// Add an object into the scene that has come from storage
2073 /// </summary>
2074 ///
2075 /// <param name="sceneObject"></param>
2076 /// <param name="attachToBackup">
2077 /// If true, changes to the object will be reflected in its persisted data
2078 /// If false, the persisted data will not be changed even if the object in the scene is changed
2079 /// </param>
2080 /// <param name="alreadyPersisted">
2081 /// If true, we won't persist this object until it changes
2082 /// If false, we'll persist this object immediately
2083 /// </param>
2084 /// <param name="sendClientUpdates">
2085 /// If true, we send updates to the client to tell it about this object
2086 /// If false, we leave it up to the caller to do this
2087 /// </param>
2088 /// <returns>
2089 /// true if the object was added, false if an object with the same uuid was already in the scene
2090 /// </returns>
2091 public bool AddRestoredSceneObject(
2092 SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted, bool sendClientUpdates)
2093 {
2094 return m_sceneGraph.AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, sendClientUpdates);
2069 } 2095 }
2070 2096
2071 /// <summary> 2097 /// <summary>
2072 /// Add an object into the scene that has come from storage 2098 /// Add an object into the scene that has come from storage
2073 /// </summary> 2099 /// </summary>
@@ -2087,7 +2113,7 @@ namespace OpenSim.Region.Framework.Scenes
2087 public bool AddRestoredSceneObject( 2113 public bool AddRestoredSceneObject(
2088 SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted) 2114 SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted)
2089 { 2115 {
2090 return m_sceneGraph.AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted); 2116 return AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, true);
2091 } 2117 }
2092 2118
2093 /// <summary> 2119 /// <summary>
@@ -2527,7 +2553,10 @@ namespace OpenSim.Region.Framework.Scenes
2527 sceneObject.RootPart.AddFlag(PrimFlags.TemporaryOnRez); 2553 sceneObject.RootPart.AddFlag(PrimFlags.TemporaryOnRez);
2528 sceneObject.RootPart.AddFlag(PrimFlags.Phantom); 2554 sceneObject.RootPart.AddFlag(PrimFlags.Phantom);
2529 2555
2530 AddRestoredSceneObject(sceneObject, false, false); 2556
2557 // Don't sent a full update here because this will cause full updates to be sent twice for
2558 // attachments on region crossings, resulting in viewer glitches.
2559 AddRestoredSceneObject(sceneObject, false, false, false);
2531 2560
2532 // Handle attachment special case 2561 // Handle attachment special case
2533 SceneObjectPart RootPrim = sceneObject.RootPart; 2562 SceneObjectPart RootPrim = sceneObject.RootPart;
@@ -2554,12 +2583,13 @@ namespace OpenSim.Region.Framework.Scenes
2554 m_log.DebugFormat( 2583 m_log.DebugFormat(
2555 "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); 2584 "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition);
2556 2585
2586 RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
2587
2557 if (AttachmentsModule != null) 2588 if (AttachmentsModule != null)
2558 AttachmentsModule.AttachObject( 2589 AttachmentsModule.AttachObject(
2559 sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false); 2590 sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false);
2560 2591
2561 RootPrim.RemFlag(PrimFlags.TemporaryOnRez); 2592 //grp.SendGroupFullUpdate();
2562 grp.SendGroupFullUpdate();
2563 } 2593 }
2564 else 2594 else
2565 { 2595 {
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index a02f614..5902080 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -222,11 +222,15 @@ namespace OpenSim.Region.Framework.Scenes
222 /// If true, we won't persist this object until it changes 222 /// If true, we won't persist this object until it changes
223 /// If false, we'll persist this object immediately 223 /// If false, we'll persist this object immediately
224 /// </param> 224 /// </param>
225 /// <param name="sendClientUpdates">
226 /// If true, we send updates to the client to tell it about this object
227 /// If false, we leave it up to the caller to do this
228 /// </param>
225 /// <returns> 229 /// <returns>
226 /// true if the object was added, false if an object with the same uuid was already in the scene 230 /// true if the object was added, false if an object with the same uuid was already in the scene
227 /// </returns> 231 /// </returns>
228 protected internal bool AddRestoredSceneObject( 232 protected internal bool AddRestoredSceneObject(
229 SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted) 233 SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted, bool sendClientUpdates)
230 { 234 {
231 if (!alreadyPersisted) 235 if (!alreadyPersisted)
232 { 236 {
@@ -234,9 +238,9 @@ namespace OpenSim.Region.Framework.Scenes
234 sceneObject.HasGroupChanged = true; 238 sceneObject.HasGroupChanged = true;
235 } 239 }
236 240
237 return AddSceneObject(sceneObject, attachToBackup, true); 241 return AddSceneObject(sceneObject, attachToBackup, sendClientUpdates);
238 } 242 }
239 243
240 /// <summary> 244 /// <summary>
241 /// Add a newly created object to the scene. This will both update the scene, and send information about the 245 /// Add a newly created object to the scene. This will both update the scene, and send information about the
242 /// new object to all clients interested in the scene. 246 /// new object to all clients interested in the scene.
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 837d3a2..78c2566 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -2012,7 +2012,8 @@ namespace OpenSim.Region.Framework.Scenes
2012 /// </summary> 2012 /// </summary>
2013 public void ScheduleGroupForFullUpdate() 2013 public void ScheduleGroupForFullUpdate()
2014 { 2014 {
2015// m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1}", Name, UUID); 2015 if (IsAttachment)
2016 m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1}", Name, LocalId);
2016 2017
2017 checkAtTargets(); 2018 checkAtTargets();
2018 RootPart.ScheduleFullUpdate(); 2019 RootPart.ScheduleFullUpdate();