diff options
author | Melanie | 2010-08-26 23:39:20 +0100 |
---|---|---|
committer | Melanie | 2010-08-26 23:39:20 +0100 |
commit | 1f1d72eba5ca2b1e4115e93af1ed88950dce585a (patch) | |
tree | 2dfcb626f9eb5fc6244b9fe7dac4b46a9c587703 /OpenSim/Region | |
parent | Send a null result search packet when no results are passsed in (diff) | |
parent | More on mantis #4985 (diff) | |
download | opensim-SC_OLD-1f1d72eba5ca2b1e4115e93af1ed88950dce585a.zip opensim-SC_OLD-1f1d72eba5ca2b1e4115e93af1ed88950dce585a.tar.gz opensim-SC_OLD-1f1d72eba5ca2b1e4115e93af1ed88950dce585a.tar.bz2 opensim-SC_OLD-1f1d72eba5ca2b1e4115e93af1ed88950dce585a.tar.xz |
Merge branch 'master' of melanie@opensimulator.org:/var/git/opensim
Diffstat (limited to 'OpenSim/Region')
14 files changed, 193 insertions, 131 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 17c051a..34cc7d9 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | |||
@@ -327,7 +327,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
327 | /// thread servicing the m_primFullUpdates queue after a kill. If this happens the object persists as an | 327 | /// thread servicing the m_primFullUpdates queue after a kill. If this happens the object persists as an |
328 | /// ownerless phantom. | 328 | /// ownerless phantom. |
329 | /// | 329 | /// |
330 | /// All manipulation of this set has to occur under a m_primFullUpdate.SyncRoot lock | 330 | /// All manipulation of this set has to occur under an m_entityUpdates.SyncRoot lock |
331 | /// | 331 | /// |
332 | /// </value> | 332 | /// </value> |
333 | protected HashSet<uint> m_killRecord; | 333 | protected HashSet<uint> m_killRecord; |
@@ -382,18 +382,22 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
382 | public string ActiveGroupName { get { return m_activeGroupName; } } | 382 | public string ActiveGroupName { get { return m_activeGroupName; } } |
383 | public ulong ActiveGroupPowers { get { return m_activeGroupPowers; } } | 383 | public ulong ActiveGroupPowers { get { return m_activeGroupPowers; } } |
384 | public bool IsGroupMember(UUID groupID) { return m_groupPowers.ContainsKey(groupID); } | 384 | public bool IsGroupMember(UUID groupID) { return m_groupPowers.ContainsKey(groupID); } |
385 | |||
385 | /// <summary> | 386 | /// <summary> |
386 | /// First name of the agent/avatar represented by the client | 387 | /// First name of the agent/avatar represented by the client |
387 | /// </summary> | 388 | /// </summary> |
388 | public string FirstName { get { return m_firstName; } } | 389 | public string FirstName { get { return m_firstName; } } |
390 | |||
389 | /// <summary> | 391 | /// <summary> |
390 | /// Last name of the agent/avatar represented by the client | 392 | /// Last name of the agent/avatar represented by the client |
391 | /// </summary> | 393 | /// </summary> |
392 | public string LastName { get { return m_lastName; } } | 394 | public string LastName { get { return m_lastName; } } |
395 | |||
393 | /// <summary> | 396 | /// <summary> |
394 | /// Full name of the client (first name and last name) | 397 | /// Full name of the client (first name and last name) |
395 | /// </summary> | 398 | /// </summary> |
396 | public string Name { get { return FirstName + " " + LastName; } } | 399 | public string Name { get { return FirstName + " " + LastName; } } |
400 | |||
397 | public uint CircuitCode { get { return m_circuitCode; } } | 401 | public uint CircuitCode { get { return m_circuitCode; } } |
398 | public int MoneyBalance { get { return m_moneyBalance; } } | 402 | public int MoneyBalance { get { return m_moneyBalance; } } |
399 | public int NextAnimationSequenceNumber { get { return m_animationSequenceNumber++; } } | 403 | public int NextAnimationSequenceNumber { get { return m_animationSequenceNumber++; } } |
@@ -3531,6 +3535,20 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3531 | EntityUpdate update; | 3535 | EntityUpdate update; |
3532 | while (updatesThisCall < maxUpdates && m_entityUpdates.TryDequeue(out update)) | 3536 | while (updatesThisCall < maxUpdates && m_entityUpdates.TryDequeue(out update)) |
3533 | { | 3537 | { |
3538 | // Please do not remove this unless you can demonstrate on the OpenSim mailing list that a client | ||
3539 | // will never receive an update after a prim kill. Even then, keeping the kill record may be a good | ||
3540 | // safety measure. | ||
3541 | // | ||
3542 | // Receiving updates after kills results in undeleteable prims that persist until relog and | ||
3543 | // currently occurs because prims can be deleted before all queued updates are sent. | ||
3544 | if (m_killRecord.Contains(update.Entity.LocalId)) | ||
3545 | { | ||
3546 | // m_log.WarnFormat( | ||
3547 | // "[CLIENT]: Preventing full update for prim with local id {0} after client for user {1} told it was deleted", | ||
3548 | // update.Entity.LocalId, Name); | ||
3549 | continue; | ||
3550 | } | ||
3551 | |||
3534 | if (update.Entity is SceneObjectPart) | 3552 | if (update.Entity is SceneObjectPart) |
3535 | { | 3553 | { |
3536 | SceneObjectPart part = (SceneObjectPart)update.Entity; | 3554 | SceneObjectPart part = (SceneObjectPart)update.Entity; |
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 847a999..d56145a 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs | |||
@@ -37,6 +37,7 @@ using OpenSim.Framework; | |||
37 | using OpenSim.Region.Framework; | 37 | using OpenSim.Region.Framework; |
38 | using OpenSim.Region.Framework.Interfaces; | 38 | using OpenSim.Region.Framework.Interfaces; |
39 | using OpenSim.Region.Framework.Scenes; | 39 | using OpenSim.Region.Framework.Scenes; |
40 | using OpenSim.Region.Framework.Scenes.Serialization; | ||
40 | 41 | ||
41 | namespace OpenSim.Region.CoreModules.Avatar.Attachments | 42 | namespace OpenSim.Region.CoreModules.Avatar.Attachments |
42 | { | 43 | { |
@@ -448,12 +449,86 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
448 | m_scene.EventManager.TriggerOnAttach(group.LocalId, itemID, UUID.Zero); | 449 | m_scene.EventManager.TriggerOnAttach(group.LocalId, itemID, UUID.Zero); |
449 | group.DetachToInventoryPrep(); | 450 | group.DetachToInventoryPrep(); |
450 | m_log.Debug("[ATTACHMENTS MODULE]: Saving attachpoint: " + ((uint)group.GetAttachmentPoint()).ToString()); | 451 | m_log.Debug("[ATTACHMENTS MODULE]: Saving attachpoint: " + ((uint)group.GetAttachmentPoint()).ToString()); |
451 | m_scene.UpdateKnownItem(remoteClient, group,group.GetFromItemID(), group.OwnerID); | 452 | UpdateKnownItem(remoteClient, group, group.GetFromItemID(), group.OwnerID); |
452 | m_scene.DeleteSceneObject(group, false); | 453 | m_scene.DeleteSceneObject(group, false); |
453 | return; | 454 | return; |
454 | } | 455 | } |
455 | } | 456 | } |
456 | } | 457 | } |
457 | } | 458 | } |
459 | |||
460 | public void UpdateAttachmentPosition(IClientAPI client, SceneObjectGroup sog, Vector3 pos) | ||
461 | { | ||
462 | // If this is an attachment, then we need to save the modified | ||
463 | // object back into the avatar's inventory. First we save the | ||
464 | // attachment point information, then we update the relative | ||
465 | // positioning (which caused this method to get driven in the | ||
466 | // first place. Then we have to mark the object as NOT an | ||
467 | // attachment. This is necessary in order to correctly save | ||
468 | // and retrieve GroupPosition information for the attachment. | ||
469 | // Then we save the asset back into the appropriate inventory | ||
470 | // entry. Finally, we restore the object's attachment status. | ||
471 | byte attachmentPoint = sog.GetAttachmentPoint(); | ||
472 | sog.UpdateGroupPosition(pos); | ||
473 | sog.RootPart.IsAttachment = false; | ||
474 | sog.AbsolutePosition = sog.RootPart.AttachedPos; | ||
475 | UpdateKnownItem(client, sog, sog.GetFromItemID(), sog.OwnerID); | ||
476 | sog.SetAttachmentPoint(attachmentPoint); | ||
477 | } | ||
478 | |||
479 | /// <summary> | ||
480 | /// Update the attachment asset for the new sog details if they have changed. | ||
481 | /// </summary> | ||
482 | /// | ||
483 | /// This is essential for preserving attachment attributes such as permission. Unlike normal scene objects, | ||
484 | /// these details are not stored on the region. | ||
485 | /// | ||
486 | /// <param name="remoteClient"></param> | ||
487 | /// <param name="grp"></param> | ||
488 | /// <param name="itemID"></param> | ||
489 | /// <param name="agentID"></param> | ||
490 | protected void UpdateKnownItem(IClientAPI remoteClient, SceneObjectGroup grp, UUID itemID, UUID agentID) | ||
491 | { | ||
492 | if (grp != null) | ||
493 | { | ||
494 | if (!grp.HasGroupChanged) | ||
495 | { | ||
496 | m_log.WarnFormat("[ATTACHMENTS MODULE]: Save request for {0} which is unchanged", grp.UUID); | ||
497 | return; | ||
498 | } | ||
499 | |||
500 | m_log.DebugFormat( | ||
501 | "[ATTACHMENTS MODULE]: Updating asset for attachment {0}, attachpoint {1}", | ||
502 | grp.UUID, grp.GetAttachmentPoint()); | ||
503 | |||
504 | string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp); | ||
505 | |||
506 | InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); | ||
507 | item = m_scene.InventoryService.GetItem(item); | ||
508 | |||
509 | if (item != null) | ||
510 | { | ||
511 | AssetBase asset = m_scene.CreateAsset( | ||
512 | grp.GetPartName(grp.LocalId), | ||
513 | grp.GetPartDescription(grp.LocalId), | ||
514 | (sbyte)AssetType.Object, | ||
515 | Utils.StringToBytes(sceneObjectXml), | ||
516 | remoteClient.AgentId); | ||
517 | m_scene.AssetService.Store(asset); | ||
518 | |||
519 | item.AssetID = asset.FullID; | ||
520 | item.Description = asset.Description; | ||
521 | item.Name = asset.Name; | ||
522 | item.AssetType = asset.Type; | ||
523 | item.InvType = (int)InventoryType.Object; | ||
524 | |||
525 | m_scene.InventoryService.UpdateItem(item); | ||
526 | |||
527 | // this gets called when the agent logs off! | ||
528 | if (remoteClient != null) | ||
529 | remoteClient.SendInventoryItemCreateUpdate(item, 0); | ||
530 | } | ||
531 | } | ||
532 | } | ||
458 | } | 533 | } |
459 | } | 534 | } \ No newline at end of file |
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs index 4117e86..d1274e9 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs | |||
@@ -159,7 +159,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
159 | 159 | ||
160 | private void OnInstantMessage(IClientAPI client, GridInstantMessage im) | 160 | private void OnInstantMessage(IClientAPI client, GridInstantMessage im) |
161 | { | 161 | { |
162 | m_log.InfoFormat( | 162 | m_log.DebugFormat( |
163 | "[INVENTORY TRANSFER]: {0} IM type received from {1}", | 163 | "[INVENTORY TRANSFER]: {0} IM type received from {1}", |
164 | (InstantMessageDialog)im.dialog, client.Name); | 164 | (InstantMessageDialog)im.dialog, client.Name); |
165 | 165 | ||
diff --git a/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs b/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs index c489972..3c39f9e 100644 --- a/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs +++ b/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs | |||
@@ -142,9 +142,18 @@ namespace OpenSim.Region.DataSnapshot.Providers | |||
142 | node.InnerText = m_scene.RegionInfo.RegionSettings.RegionUUID.ToString(); | 142 | node.InnerText = m_scene.RegionInfo.RegionSettings.RegionUUID.ToString(); |
143 | xmlobject.AppendChild(node); | 143 | xmlobject.AppendChild(node); |
144 | 144 | ||
145 | node = nodeFactory.CreateNode(XmlNodeType.Element, "parceluuid", ""); | 145 | if (land != null && land.LandData != null) |
146 | node.InnerText = land.LandData.GlobalID.ToString(); | 146 | { |
147 | xmlobject.AppendChild(node); | 147 | node = nodeFactory.CreateNode(XmlNodeType.Element, "parceluuid", ""); |
148 | node.InnerText = land.LandData.GlobalID.ToString(); | ||
149 | xmlobject.AppendChild(node); | ||
150 | } | ||
151 | else | ||
152 | { | ||
153 | // Something is wrong with this object. Let's not list it. | ||
154 | m_log.WarnFormat("[DATASNAPSHOT]: Bad data for object {0} ({1}) in region {2}", obj.Name, obj.UUID, m_scene.RegionInfo.RegionName); | ||
155 | continue; | ||
156 | } | ||
148 | 157 | ||
149 | node = nodeFactory.CreateNode(XmlNodeType.Element, "location", ""); | 158 | node = nodeFactory.CreateNode(XmlNodeType.Element, "location", ""); |
150 | Vector3 loc = obj.AbsolutePosition; | 159 | Vector3 loc = obj.AbsolutePosition; |
diff --git a/OpenSim/Region/DataSnapshot/SnapshotStore.cs b/OpenSim/Region/DataSnapshot/SnapshotStore.cs index 70cb205..aa3d2ff 100644 --- a/OpenSim/Region/DataSnapshot/SnapshotStore.cs +++ b/OpenSim/Region/DataSnapshot/SnapshotStore.cs | |||
@@ -30,6 +30,7 @@ using System.Collections.Generic; | |||
30 | using System.IO; | 30 | using System.IO; |
31 | using System.Reflection; | 31 | using System.Reflection; |
32 | using System.Text; | 32 | using System.Text; |
33 | using System.Text.RegularExpressions; | ||
33 | using System.Xml; | 34 | using System.Xml; |
34 | using log4net; | 35 | using log4net; |
35 | using OpenSim.Region.DataSnapshot.Interfaces; | 36 | using OpenSim.Region.DataSnapshot.Interfaces; |
@@ -98,13 +99,21 @@ namespace OpenSim.Region.DataSnapshot | |||
98 | { | 99 | { |
99 | String path = DataFileNameFragment(provider.GetParentScene, provider.Name); | 100 | String path = DataFileNameFragment(provider.GetParentScene, provider.Name); |
100 | 101 | ||
101 | using (XmlTextWriter snapXWriter = new XmlTextWriter(path, Encoding.Default)) | 102 | try |
102 | { | 103 | { |
103 | snapXWriter.Formatting = Formatting.Indented; | 104 | using (XmlTextWriter snapXWriter = new XmlTextWriter(path, Encoding.Default)) |
104 | snapXWriter.WriteStartDocument(); | 105 | { |
105 | data.WriteTo(snapXWriter); | 106 | snapXWriter.Formatting = Formatting.Indented; |
106 | snapXWriter.WriteEndDocument(); | 107 | snapXWriter.WriteStartDocument(); |
108 | data.WriteTo(snapXWriter); | ||
109 | snapXWriter.WriteEndDocument(); | ||
110 | } | ||
111 | } | ||
112 | catch (Exception e) | ||
113 | { | ||
114 | m_log.WarnFormat("[DATASNAPSHOT]: Exception on writing to file {0}: {1}", path, e.Message); | ||
107 | } | 115 | } |
116 | |||
108 | } | 117 | } |
109 | 118 | ||
110 | //mark provider as not stale, parent scene as stale | 119 | //mark provider as not stale, parent scene as stale |
@@ -185,12 +194,19 @@ namespace OpenSim.Region.DataSnapshot | |||
185 | //save snapshot | 194 | //save snapshot |
186 | String path = DataFileNameScene(scene); | 195 | String path = DataFileNameScene(scene); |
187 | 196 | ||
188 | using (XmlTextWriter snapXWriter = new XmlTextWriter(path, Encoding.Default)) | 197 | try |
198 | { | ||
199 | using (XmlTextWriter snapXWriter = new XmlTextWriter(path, Encoding.Default)) | ||
200 | { | ||
201 | snapXWriter.Formatting = Formatting.Indented; | ||
202 | snapXWriter.WriteStartDocument(); | ||
203 | regionElement.WriteTo(snapXWriter); | ||
204 | snapXWriter.WriteEndDocument(); | ||
205 | } | ||
206 | } | ||
207 | catch (Exception e) | ||
189 | { | 208 | { |
190 | snapXWriter.Formatting = Formatting.Indented; | 209 | m_log.WarnFormat("[DATASNAPSHOT]: Exception on writing to file {0}: {1}", path, e.Message); |
191 | snapXWriter.WriteStartDocument(); | ||
192 | regionElement.WriteTo(snapXWriter); | ||
193 | snapXWriter.WriteEndDocument(); | ||
194 | } | 210 | } |
195 | 211 | ||
196 | m_scenes[scene] = false; | 212 | m_scenes[scene] = false; |
@@ -206,15 +222,23 @@ namespace OpenSim.Region.DataSnapshot | |||
206 | #region Helpers | 222 | #region Helpers |
207 | private string DataFileNameFragment(Scene scene, String fragmentName) | 223 | private string DataFileNameFragment(Scene scene, String fragmentName) |
208 | { | 224 | { |
209 | return Path.Combine(m_directory, Path.ChangeExtension(scene.RegionInfo.RegionName + "_" + fragmentName, "xml")); | 225 | return Path.Combine(m_directory, Path.ChangeExtension(Sanitize(scene.RegionInfo.RegionName + "_" + fragmentName), "xml")); |
210 | } | 226 | } |
211 | 227 | ||
212 | private string DataFileNameScene(Scene scene) | 228 | private string DataFileNameScene(Scene scene) |
213 | { | 229 | { |
214 | return Path.Combine(m_directory, Path.ChangeExtension(scene.RegionInfo.RegionName, "xml")); | 230 | return Path.Combine(m_directory, Path.ChangeExtension(Sanitize(scene.RegionInfo.RegionName), "xml")); |
215 | //return (m_snapsDir + Path.DirectorySeparatorChar + scene.RegionInfo.RegionName + ".xml"); | 231 | //return (m_snapsDir + Path.DirectorySeparatorChar + scene.RegionInfo.RegionName + ".xml"); |
216 | } | 232 | } |
217 | 233 | ||
234 | private static string Sanitize(string name) | ||
235 | { | ||
236 | string invalidChars = Regex.Escape(new string(Path.GetInvalidFileNameChars())); | ||
237 | string invalidReStr = string.Format(@"[{0}]", invalidChars); | ||
238 | string newname = Regex.Replace(name, invalidReStr, "_"); | ||
239 | return newname.Replace('.', '_'); | ||
240 | } | ||
241 | |||
218 | private XmlNode MakeRegionNode(Scene scene, XmlDocument basedoc) | 242 | private XmlNode MakeRegionNode(Scene scene, XmlDocument basedoc) |
219 | { | 243 | { |
220 | XmlNode docElement = basedoc.CreateNode(XmlNodeType.Element, "region", ""); | 244 | XmlNode docElement = basedoc.CreateNode(XmlNodeType.Element, "region", ""); |
diff --git a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs index 2af2548..05c1e00 100644 --- a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs | |||
@@ -131,5 +131,13 @@ namespace OpenSim.Region.Framework.Interfaces | |||
131 | /// A <see cref="IClientAPI"/> | 131 | /// A <see cref="IClientAPI"/> |
132 | /// </param> | 132 | /// </param> |
133 | void ShowDetachInUserInventory(UUID itemID, IClientAPI remoteClient); | 133 | void ShowDetachInUserInventory(UUID itemID, IClientAPI remoteClient); |
134 | |||
135 | /// <summary> | ||
136 | /// Update the position of an attachment | ||
137 | /// </summary> | ||
138 | /// <param name="client"></param> | ||
139 | /// <param name="sog"></param> | ||
140 | /// <param name="pos"></param> | ||
141 | void UpdateAttachmentPosition(IClientAPI client, SceneObjectGroup sog, Vector3 pos); | ||
134 | } | 142 | } |
135 | } \ No newline at end of file | 143 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Framework/Scenes/Prioritizer.cs b/OpenSim/Region/Framework/Scenes/Prioritizer.cs index de3c360..272f718 100644 --- a/OpenSim/Region/Framework/Scenes/Prioritizer.cs +++ b/OpenSim/Region/Framework/Scenes/Prioritizer.cs | |||
@@ -31,7 +31,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
31 | 31 | ||
32 | public class Prioritizer | 32 | public class Prioritizer |
33 | { | 33 | { |
34 | private static readonly ILog m_log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | 34 | // private static readonly ILog m_log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); |
35 | 35 | ||
36 | /// <summary> | 36 | /// <summary> |
37 | /// This is added to the priority of all child prims, to make sure that the root prim update is sent to the | 37 | /// This is added to the priority of all child prims, to make sure that the root prim update is sent to the |
@@ -75,7 +75,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
75 | break; | 75 | break; |
76 | default: | 76 | default: |
77 | throw new InvalidOperationException("UpdatePrioritizationScheme not defined."); | 77 | throw new InvalidOperationException("UpdatePrioritizationScheme not defined."); |
78 | break; | ||
79 | } | 78 | } |
80 | 79 | ||
81 | // Adjust priority so that root prims are sent to the viewer first. This is especially important for | 80 | // Adjust priority so that root prims are sent to the viewer first. This is especially important for |
@@ -122,9 +121,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
122 | // Use group position for child prims | 121 | // Use group position for child prims |
123 | Vector3 entityPos; | 122 | Vector3 entityPos; |
124 | if (entity is SceneObjectPart) | 123 | if (entity is SceneObjectPart) |
125 | entityPos = m_scene.GetGroupByPrim(entity.LocalId).AbsolutePosition; | 124 | { |
125 | // Can't use Scene.GetGroupByPrim() here, since the entity may have been delete from the scene | ||
126 | // before its scheduled update was triggered | ||
127 | //entityPos = m_scene.GetGroupByPrim(entity.LocalId).AbsolutePosition; | ||
128 | entityPos = ((SceneObjectPart)entity).ParentGroup.AbsolutePosition; | ||
129 | } | ||
126 | else | 130 | else |
131 | { | ||
127 | entityPos = entity.AbsolutePosition; | 132 | entityPos = entity.AbsolutePosition; |
133 | } | ||
128 | 134 | ||
129 | return Vector3.DistanceSquared(presencePos, entityPos); | 135 | return Vector3.DistanceSquared(presencePos, entityPos); |
130 | } | 136 | } |
@@ -144,9 +150,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
144 | // Use group position for child prims | 150 | // Use group position for child prims |
145 | Vector3 entityPos = entity.AbsolutePosition; | 151 | Vector3 entityPos = entity.AbsolutePosition; |
146 | if (entity is SceneObjectPart) | 152 | if (entity is SceneObjectPart) |
147 | entityPos = m_scene.GetGroupByPrim(entity.LocalId).AbsolutePosition; | 153 | { |
154 | // Can't use Scene.GetGroupByPrim() here, since the entity may have been delete from the scene | ||
155 | // before its scheduled update was triggered | ||
156 | //entityPos = m_scene.GetGroupByPrim(entity.LocalId).AbsolutePosition; | ||
157 | entityPos = ((SceneObjectPart)entity).ParentGroup.AbsolutePosition; | ||
158 | } | ||
148 | else | 159 | else |
160 | { | ||
149 | entityPos = entity.AbsolutePosition; | 161 | entityPos = entity.AbsolutePosition; |
162 | } | ||
150 | 163 | ||
151 | if (!presence.IsChildAgent) | 164 | if (!presence.IsChildAgent) |
152 | { | 165 | { |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 379128a..8ed8b96 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -1799,53 +1799,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1799 | } | 1799 | } |
1800 | } | 1800 | } |
1801 | 1801 | ||
1802 | public void UpdateKnownItem(IClientAPI remoteClient, SceneObjectGroup grp, UUID itemID, UUID agentID) | ||
1803 | { | ||
1804 | SceneObjectGroup objectGroup = grp; | ||
1805 | if (objectGroup != null) | ||
1806 | { | ||
1807 | if (!grp.HasGroupChanged) | ||
1808 | { | ||
1809 | m_log.InfoFormat("[ATTACHMENT]: Save request for {0} which is unchanged", grp.UUID); | ||
1810 | return; | ||
1811 | } | ||
1812 | |||
1813 | m_log.InfoFormat( | ||
1814 | "[ATTACHMENT]: Updating asset for attachment {0}, attachpoint {1}", | ||
1815 | grp.UUID, grp.GetAttachmentPoint()); | ||
1816 | |||
1817 | string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(objectGroup); | ||
1818 | |||
1819 | InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); | ||
1820 | item = InventoryService.GetItem(item); | ||
1821 | |||
1822 | if (item != null) | ||
1823 | { | ||
1824 | AssetBase asset = CreateAsset( | ||
1825 | objectGroup.GetPartName(objectGroup.LocalId), | ||
1826 | objectGroup.GetPartDescription(objectGroup.LocalId), | ||
1827 | (sbyte)AssetType.Object, | ||
1828 | Utils.StringToBytes(sceneObjectXml), | ||
1829 | remoteClient.AgentId); | ||
1830 | AssetService.Store(asset); | ||
1831 | |||
1832 | item.AssetID = asset.FullID; | ||
1833 | item.Description = asset.Description; | ||
1834 | item.Name = asset.Name; | ||
1835 | item.AssetType = asset.Type; | ||
1836 | item.InvType = (int)InventoryType.Object; | ||
1837 | |||
1838 | InventoryService.UpdateItem(item); | ||
1839 | |||
1840 | // this gets called when the agent loggs off! | ||
1841 | if (remoteClient != null) | ||
1842 | { | ||
1843 | remoteClient.SendInventoryItemCreateUpdate(item, 0); | ||
1844 | } | ||
1845 | } | ||
1846 | } | ||
1847 | } | ||
1848 | |||
1849 | public UUID attachObjectAssetStore(IClientAPI remoteClient, SceneObjectGroup grp, UUID AgentId, out UUID itemID) | 1802 | public UUID attachObjectAssetStore(IClientAPI remoteClient, SceneObjectGroup grp, UUID AgentId, out UUID itemID) |
1850 | { | 1803 | { |
1851 | itemID = UUID.Zero; | 1804 | itemID = UUID.Zero; |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 1f4d022..5fe944d 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -3608,18 +3608,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3608 | return true; | 3608 | return true; |
3609 | } | 3609 | } |
3610 | 3610 | ||
3611 | private ILandObject GetParcelAtPoint(float x, float y) | ||
3612 | { | ||
3613 | foreach (var parcel in AllParcels()) | ||
3614 | { | ||
3615 | if (parcel.ContainsPoint((int)x,(int)y)) | ||
3616 | { | ||
3617 | return parcel; | ||
3618 | } | ||
3619 | } | ||
3620 | return null; | ||
3621 | } | ||
3622 | |||
3623 | /// <summary> | 3611 | /// <summary> |
3624 | /// Update an AgentCircuitData object with new information | 3612 | /// Update an AgentCircuitData object with new information |
3625 | /// </summary> | 3613 | /// </summary> |
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index c675322..88e084e 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs | |||
@@ -70,7 +70,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
70 | /// <summary> | 70 | /// <summary> |
71 | /// A user will arrive shortly, set up appropriate credentials so it can connect | 71 | /// A user will arrive shortly, set up appropriate credentials so it can connect |
72 | /// </summary> | 72 | /// </summary> |
73 | public event ExpectUserDelegate OnExpectUser; | 73 | // public event ExpectUserDelegate OnExpectUser; |
74 | 74 | ||
75 | /// <summary> | 75 | /// <summary> |
76 | /// A Prim will arrive shortly | 76 | /// A Prim will arrive shortly |
@@ -80,7 +80,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
80 | /// <summary> | 80 | /// <summary> |
81 | /// A new prim has arrived | 81 | /// A new prim has arrived |
82 | /// </summary> | 82 | /// </summary> |
83 | public event PrimCrossing OnPrimCrossingIntoRegion; | 83 | // public event PrimCrossing OnPrimCrossingIntoRegion; |
84 | 84 | ||
85 | ///// <summary> | 85 | ///// <summary> |
86 | ///// A New Region is up and available | 86 | ///// A New Region is up and available |
@@ -90,7 +90,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
90 | /// <summary> | 90 | /// <summary> |
91 | /// We have a child agent for this avatar and we're getting a status update about it | 91 | /// We have a child agent for this avatar and we're getting a status update about it |
92 | /// </summary> | 92 | /// </summary> |
93 | public event ChildAgentUpdate OnChildAgentUpdate; | 93 | // public event ChildAgentUpdate OnChildAgentUpdate; |
94 | //public event RemoveKnownRegionsFromAvatarList OnRemoveKnownRegionFromAvatar; | 94 | //public event RemoveKnownRegionsFromAvatarList OnRemoveKnownRegionFromAvatar; |
95 | 95 | ||
96 | /// <summary> | 96 | /// <summary> |
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 1da4287..9db2691 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs | |||
@@ -1289,37 +1289,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
1289 | /// <param name="localID"></param> | 1289 | /// <param name="localID"></param> |
1290 | /// <param name="pos"></param> | 1290 | /// <param name="pos"></param> |
1291 | /// <param name="remoteClient"></param> | 1291 | /// <param name="remoteClient"></param> |
1292 | protected internal void UpdatePrimPosition(uint localID, Vector3 pos, IClientAPI remoteClient) | 1292 | public void UpdatePrimPosition(uint localID, Vector3 pos, IClientAPI remoteClient) |
1293 | { | 1293 | { |
1294 | SceneObjectGroup group = GetGroupByPrim(localID); | 1294 | SceneObjectGroup group = GetGroupByPrim(localID); |
1295 | |||
1295 | if (group != null) | 1296 | if (group != null) |
1296 | { | 1297 | { |
1297 | |||
1298 | // Vector3 oldPos = group.AbsolutePosition; | ||
1299 | if (group.IsAttachment || (group.RootPart.Shape.PCode == 9 && group.RootPart.Shape.State != 0)) | 1298 | if (group.IsAttachment || (group.RootPart.Shape.PCode == 9 && group.RootPart.Shape.State != 0)) |
1300 | { | 1299 | { |
1301 | 1300 | if (m_parentScene.AttachmentsModule != null) | |
1302 | // If this is an attachment, then we need to save the modified | 1301 | m_parentScene.AttachmentsModule.UpdateAttachmentPosition(remoteClient, group, pos); |
1303 | // object back into the avatar's inventory. First we save the | ||
1304 | // attachment point information, then we update the relative | ||
1305 | // positioning (which caused this method to get driven in the | ||
1306 | // first place. Then we have to mark the object as NOT an | ||
1307 | // attachment. This is necessary in order to correctly save | ||
1308 | // and retrieve GroupPosition information for the attachment. | ||
1309 | // Then we save the asset back into the appropriate inventory | ||
1310 | // entry. Finally, we restore the object's attachment status. | ||
1311 | |||
1312 | byte attachmentPoint = group.GetAttachmentPoint(); | ||
1313 | group.UpdateGroupPosition(pos); | ||
1314 | group.RootPart.IsAttachment = false; | ||
1315 | group.AbsolutePosition = group.RootPart.AttachedPos; | ||
1316 | m_parentScene.UpdateKnownItem(remoteClient, group, group.GetFromItemID(), group.OwnerID); | ||
1317 | group.SetAttachmentPoint(attachmentPoint); | ||
1318 | |||
1319 | } | 1302 | } |
1320 | else | 1303 | else |
1321 | { | 1304 | { |
1322 | if (m_parentScene.Permissions.CanMoveObject(group.UUID, remoteClient.AgentId) && m_parentScene.Permissions.CanObjectEntry(group.UUID, false, pos)) | 1305 | if (m_parentScene.Permissions.CanMoveObject(group.UUID, remoteClient.AgentId) |
1306 | && m_parentScene.Permissions.CanObjectEntry(group.UUID, false, pos)) | ||
1323 | { | 1307 | { |
1324 | group.UpdateGroupPosition(pos); | 1308 | group.UpdateGroupPosition(pos); |
1325 | } | 1309 | } |
@@ -1328,14 +1312,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
1328 | } | 1312 | } |
1329 | 1313 | ||
1330 | /// <summary> | 1314 | /// <summary> |
1331 | /// | 1315 | /// Update the texture entry of the given prim. |
1332 | /// </summary> | 1316 | /// </summary> |
1317 | /// | ||
1318 | /// A texture entry is an object that contains details of all the textures of the prim's face. In this case, | ||
1319 | /// the texture is given in its byte serialized form. | ||
1320 | /// | ||
1333 | /// <param name="localID"></param> | 1321 | /// <param name="localID"></param> |
1334 | /// <param name="texture"></param> | 1322 | /// <param name="texture"></param> |
1335 | /// <param name="remoteClient"></param> | 1323 | /// <param name="remoteClient"></param> |
1336 | protected internal void UpdatePrimTexture(uint localID, byte[] texture, IClientAPI remoteClient) | 1324 | protected internal void UpdatePrimTexture(uint localID, byte[] texture, IClientAPI remoteClient) |
1337 | { | 1325 | { |
1338 | SceneObjectGroup group = GetGroupByPrim(localID); | 1326 | SceneObjectGroup group = GetGroupByPrim(localID); |
1327 | |||
1339 | if (group != null) | 1328 | if (group != null) |
1340 | { | 1329 | { |
1341 | if (m_parentScene.Permissions.CanEditObject(group.UUID,remoteClient.AgentId)) | 1330 | if (m_parentScene.Permissions.CanEditObject(group.UUID,remoteClient.AgentId)) |
@@ -1700,8 +1689,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1700 | SceneObjectPart newRoot = newSet[0]; | 1689 | SceneObjectPart newRoot = newSet[0]; |
1701 | newSet.RemoveAt(0); | 1690 | newSet.RemoveAt(0); |
1702 | 1691 | ||
1703 | List<uint> linkIDs = new List<uint>(); | ||
1704 | |||
1705 | foreach (SceneObjectPart newChild in newSet) | 1692 | foreach (SceneObjectPart newChild in newSet) |
1706 | newChild.UpdateFlag = 0; | 1693 | newChild.UpdateFlag = 0; |
1707 | 1694 | ||
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 2ad4223..3ed74e1 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -4727,20 +4727,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
4727 | if (ParentGroup == null || ParentGroup.IsDeleted) | 4727 | if (ParentGroup == null || ParentGroup.IsDeleted) |
4728 | return; | 4728 | return; |
4729 | 4729 | ||
4730 | Vector3 lPos = OffsetPosition; | 4730 | if (IsAttachment && ParentGroup.RootPart != this) |
4731 | 4731 | return; | |
4732 | if (IsAttachment) | ||
4733 | { | ||
4734 | if (ParentGroup.RootPart != this) | ||
4735 | return; | ||
4736 | |||
4737 | lPos = ParentGroup.RootPart.AttachedPos; | ||
4738 | } | ||
4739 | else | ||
4740 | { | ||
4741 | if (ParentGroup.RootPart == this) | ||
4742 | lPos = AbsolutePosition; | ||
4743 | } | ||
4744 | 4732 | ||
4745 | // Causes this thread to dig into the Client Thread Data. | 4733 | // Causes this thread to dig into the Client Thread Data. |
4746 | // Remember your locking here! | 4734 | // Remember your locking here! |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index e08fa77..d7767bd 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | |||
@@ -576,8 +576,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
576 | } | 576 | } |
577 | 577 | ||
578 | public SceneObjectGroup GetRezReadySceneObject(TaskInventoryItem item) | 578 | public SceneObjectGroup GetRezReadySceneObject(TaskInventoryItem item) |
579 | { | 579 | { |
580 | UUID ownerID = item.OwnerID; | ||
581 | AssetBase rezAsset = m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString()); | 580 | AssetBase rezAsset = m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString()); |
582 | 581 | ||
583 | if (null == rezAsset) | 582 | if (null == rezAsset) |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 08c6e27..fbb3177 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -2326,15 +2326,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
2326 | { | 2326 | { |
2327 | m_perfMonMS = Util.EnvironmentTickCount(); | 2327 | m_perfMonMS = Util.EnvironmentTickCount(); |
2328 | 2328 | ||
2329 | PhysicsActor actor = m_physicsActor; | ||
2330 | Vector3 velocity = (actor != null) ? actor.Velocity : Vector3.Zero; | ||
2331 | |||
2332 | Vector3 pos = m_pos; | 2329 | Vector3 pos = m_pos; |
2333 | pos.Z += m_appearance.HipOffset; | 2330 | pos.Z += m_appearance.HipOffset; |
2334 | 2331 | ||
2335 | //m_log.DebugFormat("[SCENEPRESENCE]: TerseUpdate: Pos={0} Rot={1} Vel={2}", m_pos, m_bodyRot, m_velocity); | 2332 | //m_log.DebugFormat("[SCENEPRESENCE]: TerseUpdate: Pos={0} Rot={1} Vel={2}", m_pos, m_bodyRot, m_velocity); |
2336 | 2333 | ||
2337 | remoteClient.SendPrimUpdate(this, PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity); | 2334 | remoteClient.SendPrimUpdate( |
2335 | this, | ||
2336 | PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity | ||
2337 | | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity); | ||
2338 | 2338 | ||
2339 | m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); | 2339 | m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); |
2340 | m_scene.StatsReporter.AddAgentUpdates(1); | 2340 | m_scene.StatsReporter.AddAgentUpdates(1); |