aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorMelanie2012-03-08 18:31:58 +0100
committerMelanie2012-03-08 19:14:34 +0000
commit675d40357c2ba0bf2d268cc35874dabe7dbb724d (patch)
tree0aa6feb1b9628acf710ecdeee9697720c69e6762
parentMove "change region" command into general category (diff)
downloadopensim-SC-675d40357c2ba0bf2d268cc35874dabe7dbb724d.zip
opensim-SC-675d40357c2ba0bf2d268cc35874dabe7dbb724d.tar.gz
opensim-SC-675d40357c2ba0bf2d268cc35874dabe7dbb724d.tar.bz2
opensim-SC-675d40357c2ba0bf2d268cc35874dabe7dbb724d.tar.xz
Hold a ref to the prim we're sat on rather than querying scene each time
the check for significant is carried out. Prevents a deadlock condition.
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs56
1 files changed, 29 insertions, 27 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index ec6bb89..9d5cdfa 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -457,15 +457,8 @@ namespace OpenSim.Region.Framework.Scenes
457 // without the parent rotation applied. 457 // without the parent rotation applied.
458 if (ParentID != 0) 458 if (ParentID != 0)
459 { 459 {
460 SceneObjectPart part = m_scene.GetSceneObjectPart(ParentID); 460 SceneObjectPart part = ParentPart;
461 if (part != null) 461 return part.AbsolutePosition + (m_pos * part.GetWorldRotation());
462 {
463 return part.AbsolutePosition + (m_pos * part.GetWorldRotation());
464 }
465 else
466 {
467 return ParentPosition + m_pos;
468 }
469 } 462 }
470 } 463 }
471 return m_pos; 464 return m_pos;
@@ -576,6 +569,13 @@ namespace OpenSim.Region.Framework.Scenes
576 } 569 }
577 private uint m_parentID; 570 private uint m_parentID;
578 571
572 public SceneObjectPart ParentPart
573 {
574 get { return m_parentPart; }
575 set { m_parentPart = value; }
576 }
577 private SceneObjectPart m_parentPart = null;
578
579 public float Health 579 public float Health
580 { 580 {
581 get { return m_health; } 581 get { return m_health; }
@@ -1751,36 +1751,34 @@ namespace OpenSim.Region.Framework.Scenes
1751 1751
1752 if (ParentID != 0) 1752 if (ParentID != 0)
1753 { 1753 {
1754 SceneObjectPart part = m_scene.GetSceneObjectPart(ParentID); 1754 SceneObjectPart part = ParentPart;
1755 if (part != null) 1755 TaskInventoryDictionary taskIDict = part.TaskInventory;
1756 if (taskIDict != null)
1756 { 1757 {
1757 TaskInventoryDictionary taskIDict = part.TaskInventory; 1758 lock (taskIDict)
1758 if (taskIDict != null)
1759 { 1759 {
1760 lock (taskIDict) 1760 foreach (UUID taskID in taskIDict.Keys)
1761 { 1761 {
1762 foreach (UUID taskID in taskIDict.Keys) 1762 UnRegisterControlEventsToScript(LocalId, taskID);
1763 { 1763 taskIDict[taskID].PermsMask &= ~(
1764 UnRegisterControlEventsToScript(LocalId, taskID); 1764 2048 | //PERMISSION_CONTROL_CAMERA
1765 taskIDict[taskID].PermsMask &= ~( 1765 4); // PERMISSION_TAKE_CONTROLS
1766 2048 | //PERMISSION_CONTROL_CAMERA
1767 4); // PERMISSION_TAKE_CONTROLS
1768 }
1769 } 1766 }
1770 } 1767 }
1768 }
1771 1769
1772 // Reset sit target. 1770 // Reset sit target.
1773 if (part.SitTargetAvatar == UUID) 1771 if (part.SitTargetAvatar == UUID)
1774 part.SitTargetAvatar = UUID.Zero; 1772 part.SitTargetAvatar = UUID.Zero;
1775 1773
1776 ParentPosition = part.GetWorldPosition(); 1774 ParentPosition = part.GetWorldPosition();
1777 ControllingClient.SendClearFollowCamProperties(part.ParentUUID); 1775 ControllingClient.SendClearFollowCamProperties(part.ParentUUID);
1778 }
1779 1776
1780 m_pos += ParentPosition + new Vector3(0.0f, 0.0f, 2.0f * m_sitAvatarHeight); 1777 m_pos += ParentPosition + new Vector3(0.0f, 0.0f, 2.0f * m_sitAvatarHeight);
1781 ParentPosition = Vector3.Zero; 1778 ParentPosition = Vector3.Zero;
1782 1779
1783 ParentID = 0; 1780 ParentID = 0;
1781 ParentPart = null;
1784 SendAvatarDataToAllAgents(); 1782 SendAvatarDataToAllAgents();
1785 m_requestedSitTargetID = 0; 1783 m_requestedSitTargetID = 0;
1786 1784
@@ -2212,6 +2210,10 @@ namespace OpenSim.Region.Framework.Scenes
2212 return; 2210 return;
2213 } 2211 }
2214 2212
2213 ParentPart = m_scene.GetSceneObjectPart(m_requestedSitTargetID);
2214 if (ParentPart == null)
2215 return;
2216
2215 ParentID = m_requestedSitTargetID; 2217 ParentID = m_requestedSitTargetID;
2216 2218
2217 Velocity = Vector3.Zero; 2219 Velocity = Vector3.Zero;