aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r--OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs87
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs166
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs8
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs98
-rw-r--r--OpenSim/Region/Framework/Scenes/UndoState.cs127
6 files changed, 161 insertions, 327 deletions
diff --git a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
index 6bbdd7d..59c26e7 100644
--- a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
@@ -103,7 +103,7 @@ namespace OpenSim.Region.Framework.Interfaces
103 IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus); 103 IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus);
104 104
105 // Same as above, but also load script states from a separate doc 105 // Same as above, but also load script states from a separate doc
106 UUID RezSingleAttachmentFromInventory( 106 ISceneEntity RezSingleAttachmentFromInventory(
107 IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus, XmlDocument doc); 107 IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus, XmlDocument doc);
108 108
109 /// <summary> 109 /// <summary>
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 345c2df..a661ab8 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2695,9 +2695,9 @@ namespace OpenSim.Region.Framework.Scenes
2695 EventManager.TriggerOnClientLogin(client); 2695 EventManager.TriggerOnClientLogin(client);
2696 2696
2697 // Send initial parcel data 2697 // Send initial parcel data
2698 Vector3 pos = presence.AbsolutePosition; 2698 Vector3 pos = createdSp.AbsolutePosition;
2699 ILandObject land = LandChannel.GetLandObject(pos.X, pos.Y); 2699 ILandObject land = LandChannel.GetLandObject(pos.X, pos.Y);
2700 land.SendLandUpdateToClient(presence.ControllingClient); 2700 land.SendLandUpdateToClient(client);
2701 } 2701 }
2702 } 2702 }
2703 } 2703 }
@@ -3500,7 +3500,7 @@ namespace OpenSim.Region.Framework.Scenes
3500 // check if banned regions are to be blacked out. 3500 // check if banned regions are to be blacked out.
3501 if (vialogin || (!m_seeIntoBannedRegion)) 3501 if (vialogin || (!m_seeIntoBannedRegion))
3502 { 3502 {
3503 if (!AuthorizeUser(agent.AgentID, out reason)) 3503 if (!AuthorizeUser(agent, out reason))
3504 return false; 3504 return false;
3505 } 3505 }
3506 } 3506 }
@@ -3696,47 +3696,31 @@ namespace OpenSim.Region.Framework.Scenes
3696 /// <param name="reason">outputs the reason to this string</param> 3696 /// <param name="reason">outputs the reason to this string</param>
3697 /// <returns>True if the region accepts this agent. False if it does not. False will 3697 /// <returns>True if the region accepts this agent. False if it does not. False will
3698 /// also return a reason.</returns> 3698 /// also return a reason.</returns>
3699 protected virtual bool AuthorizeUser(UUID agentID, out string reason) 3699 protected virtual bool AuthorizeUser(AgentCircuitData agent, out string reason)
3700 { 3700 {
3701 reason = String.Empty; 3701 reason = String.Empty;
3702 3702
3703 if (!m_strictAccessControl) return true; 3703 if (!m_strictAccessControl) return true;
3704 if (Permissions.IsGod(agentID)) return true; 3704 if (Permissions.IsGod(agent.AgentID)) return true;
3705 3705
3706 if (AuthorizationService != null) 3706 if (AuthorizationService != null)
3707 { 3707 {
3708 if (!AuthorizationService.IsAuthorizedForRegion( 3708 if (!AuthorizationService.IsAuthorizedForRegion(
3709 agent.AgentID.ToString(), agent.firstname, agent.lastname, RegionInfo.RegionID.ToString(), out reason)) 3709 agent.AgentID.ToString(), agent.firstname, agent.lastname, RegionInfo.RegionID.ToString(), out reason))
3710 { 3710 {
3711 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} at {1} because the user does not have access to the region", 3711 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user does not have access to the region",
3712 agentID, RegionInfo.RegionName); 3712 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName);
3713 3713
3714 return false; 3714 return false;
3715 } 3715 }
3716 } 3716 }
3717 3717
3718 if (m_regInfo.EstateSettings != null) 3718 if (m_regInfo.EstateSettings != null)
3719 { 3719 {
3720 int flags = GetUserFlags(agentID); 3720 if (m_regInfo.EstateSettings.IsBanned(agent.AgentID,0))
3721 if (m_regInfo.EstateSettings.IsBanned(agentID, flags))
3722 { 3721 {
3723 //Add some more info to help users 3722 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user is on the banlist",
3724 if (!m_regInfo.EstateSettings.IsBanned(agentID, 32)) 3723 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName);
3725 {
3726 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} at {1} because the region requires age verification",
3727 agentID, RegionInfo.RegionName);
3728 reason = String.Format("Denied access to region {0}: Region requires age verification", RegionInfo.RegionName);
3729 return false;
3730 }
3731 if (!m_regInfo.EstateSettings.IsBanned(agentID, 4))
3732 {
3733 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} {1} because the region requires payment info on file",
3734 agentID, RegionInfo.RegionName);
3735 reason = String.Format("Denied access to region {0}: Region requires payment info on file", RegionInfo.RegionName);
3736 return false;
3737 }
3738 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} at {3} because the user is on the banlist",
3739 agentID, RegionInfo.RegionName);
3740 reason = String.Format("Denied access to region {0}: You have been banned from that region.", 3724 reason = String.Format("Denied access to region {0}: You have been banned from that region.",
3741 RegionInfo.RegionName); 3725 RegionInfo.RegionName);
3742 return false; 3726 return false;
@@ -3753,7 +3737,7 @@ namespace OpenSim.Region.Framework.Scenes
3753 if (groupsModule != null) 3737 if (groupsModule != null)
3754 { 3738 {
3755 GroupMembershipData[] GroupMembership = 3739 GroupMembershipData[] GroupMembership =
3756 groupsModule.GetMembershipData(agentID); 3740 groupsModule.GetMembershipData(agent.AgentID);
3757 3741
3758 if (GroupMembership != null) 3742 if (GroupMembership != null)
3759 { 3743 {
@@ -3782,16 +3766,44 @@ namespace OpenSim.Region.Framework.Scenes
3782 m_log.ErrorFormat("[CONNECTION BEGIN]: EstateGroups is null!"); 3766 m_log.ErrorFormat("[CONNECTION BEGIN]: EstateGroups is null!");
3783 3767
3784 if (!m_regInfo.EstateSettings.PublicAccess && 3768 if (!m_regInfo.EstateSettings.PublicAccess &&
3785 !m_regInfo.EstateSettings.HasAccess(agentID) && 3769 !m_regInfo.EstateSettings.HasAccess(agent.AgentID) &&
3786 !groupAccess) 3770 !groupAccess)
3787 { 3771 {
3788 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} at {1} because the user does not have access to the estate", 3772 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user does not have access to the estate",
3789 agentID, RegionInfo.RegionName); 3773 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName);
3790 reason = String.Format("Denied access to private region {0}: You are not on the access list for that region.", 3774 reason = String.Format("Denied access to private region {0}: You are not on the access list for that region.",
3791 RegionInfo.RegionName); 3775 RegionInfo.RegionName);
3792 return false; 3776 return false;
3793 } 3777 }
3794 3778
3779 // TODO: estate/region settings are not properly hooked up
3780 // to ILandObject.isRestrictedFromLand()
3781 // if (null != LandChannel)
3782 // {
3783 // // region seems to have local Id of 1
3784 // ILandObject land = LandChannel.GetLandObject(1);
3785 // if (null != land)
3786 // {
3787 // if (land.isBannedFromLand(agent.AgentID))
3788 // {
3789 // m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user has been banned from land",
3790 // agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName);
3791 // reason = String.Format("Denied access to private region {0}: You are banned from that region.",
3792 // RegionInfo.RegionName);
3793 // return false;
3794 // }
3795
3796 // if (land.isRestrictedFromLand(agent.AgentID))
3797 // {
3798 // m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user does not have access to the region",
3799 // agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName);
3800 // reason = String.Format("Denied access to private region {0}: You are not on the access list for that region.",
3801 // RegionInfo.RegionName);
3802 // return false;
3803 // }
3804 // }
3805 // }
3806
3795 return true; 3807 return true;
3796 } 3808 }
3797 3809
@@ -5387,9 +5399,16 @@ namespace OpenSim.Region.Framework.Scenes
5387 } 5399 }
5388 } 5400 }
5389 5401
5390 if (!AuthorizeUser(agentID, out reason)) 5402 try
5403 {
5404 if (!AuthorizeUser(GetScenePresence(agentID).ControllingClient.RequestClientInfo(), out reason))
5405 {
5406 // m_log.DebugFormat("[SCENE]: Denying access for {0}", agentID);
5407 return false;
5408 }
5409 }
5410 catch
5391 { 5411 {
5392 // m_log.DebugFormat("[SCENE]: Denying access for {0}", agentID);
5393 return false; 5412 return false;
5394 } 5413 }
5395 5414
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 35684e0..ea6aab0 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1245,7 +1245,7 @@ namespace OpenSim.Region.Framework.Scenes
1245 1245
1246 public void DetachToGround() 1246 public void DetachToGround()
1247 { 1247 {
1248 ScenePresence avatar = m_scene.GetScenePresence(m_rootPart.AttachedAvatar); 1248 ScenePresence avatar = m_scene.GetScenePresence(AttachedAvatar);
1249 if (avatar == null) 1249 if (avatar == null)
1250 return; 1250 return;
1251 1251
@@ -1259,14 +1259,14 @@ namespace OpenSim.Region.Framework.Scenes
1259 RootPart.FromItemID = UUID.Zero; 1259 RootPart.FromItemID = UUID.Zero;
1260 1260
1261 AbsolutePosition = detachedpos; 1261 AbsolutePosition = detachedpos;
1262 m_rootPart.AttachedAvatar = UUID.Zero; 1262 AttachedAvatar = UUID.Zero;
1263 1263
1264 SceneObjectPart[] parts = m_parts.GetArray(); 1264 //SceneObjectPart[] parts = m_parts.GetArray();
1265 for (int i = 0; i < parts.Length; i++) 1265 //for (int i = 0; i < parts.Length; i++)
1266 parts[i].AttachedAvatar = UUID.Zero; 1266 // parts[i].AttachedAvatar = UUID.Zero;
1267 1267
1268 m_rootPart.SetParentLocalId(0); 1268 m_rootPart.SetParentLocalId(0);
1269 SetAttachmentPoint((byte)0); 1269 AttachmentPoint = (byte)0;
1270 m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive, m_scene.m_physicalPrim); 1270 m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive, m_scene.m_physicalPrim);
1271 HasGroupChanged = true; 1271 HasGroupChanged = true;
1272 RootPart.Rezzed = DateTime.Now; 1272 RootPart.Rezzed = DateTime.Now;
@@ -1279,7 +1279,7 @@ namespace OpenSim.Region.Framework.Scenes
1279 1279
1280 public void DetachToInventoryPrep() 1280 public void DetachToInventoryPrep()
1281 { 1281 {
1282 ScenePresence avatar = m_scene.GetScenePresence(m_rootPart.AttachedAvatar); 1282 ScenePresence avatar = m_scene.GetScenePresence(AttachedAvatar);
1283 //Vector3 detachedpos = new Vector3(127f, 127f, 127f); 1283 //Vector3 detachedpos = new Vector3(127f, 127f, 127f);
1284 if (avatar != null) 1284 if (avatar != null)
1285 { 1285 {
@@ -1287,15 +1287,15 @@ namespace OpenSim.Region.Framework.Scenes
1287 avatar.RemoveAttachment(this); 1287 avatar.RemoveAttachment(this);
1288 } 1288 }
1289 1289
1290 m_rootPart.AttachedAvatar = UUID.Zero; 1290 AttachedAvatar = UUID.Zero;
1291 1291
1292 SceneObjectPart[] parts = m_parts.GetArray(); 1292 /*SceneObjectPart[] parts = m_parts.GetArray();
1293 for (int i = 0; i < parts.Length; i++) 1293 for (int i = 0; i < parts.Length; i++)
1294 parts[i].AttachedAvatar = UUID.Zero; 1294 parts[i].AttachedAvatar = UUID.Zero;*/
1295 1295
1296 m_rootPart.SetParentLocalId(0); 1296 m_rootPart.SetParentLocalId(0);
1297 //m_rootPart.SetAttachmentPoint((byte)0); 1297 //m_rootPart.SetAttachmentPoint((byte)0);
1298 m_rootPart.IsAttachment = false; 1298 IsAttachment = false;
1299 AbsolutePosition = m_rootPart.AttachedPos; 1299 AbsolutePosition = m_rootPart.AttachedPos;
1300 //m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_scene.m_physicalPrim); 1300 //m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_scene.m_physicalPrim);
1301 //AttachToBackup(); 1301 //AttachToBackup();
@@ -1471,7 +1471,7 @@ namespace OpenSim.Region.Framework.Scenes
1471 public void DeleteGroupFromScene(bool silent) 1471 public void DeleteGroupFromScene(bool silent)
1472 { 1472 {
1473 // We need to keep track of this state in case this group is still queued for backup. 1473 // We need to keep track of this state in case this group is still queued for backup.
1474 m_isDeleted = true; 1474 IsDeleted = true;
1475 1475
1476 DetachFromBackup(); 1476 DetachFromBackup();
1477 1477
@@ -1746,97 +1746,63 @@ namespace OpenSim.Region.Framework.Scenes
1746 /// <returns></returns> 1746 /// <returns></returns>
1747 public SceneObjectGroup Copy(bool userExposed) 1747 public SceneObjectGroup Copy(bool userExposed)
1748 { 1748 {
1749 SceneObjectGroup dupe; 1749 SceneObjectGroup dupe = (SceneObjectGroup)MemberwiseClone();
1750 try 1750 dupe.m_isBackedUp = false;
1751 { 1751 dupe.m_parts = new MapAndArray<OpenMetaverse.UUID, SceneObjectPart>();
1752 m_dupeInProgress = true;
1753 dupe = (SceneObjectGroup)MemberwiseClone();
1754 dupe.m_isBackedUp = false;
1755 dupe.m_parts = new MapAndArray<OpenMetaverse.UUID, SceneObjectPart>();
1756 1752
1757 // Warning, The following code related to previousAttachmentStatus is needed so that clones of 1753 // Warning, The following code related to previousAttachmentStatus is needed so that clones of
1758 // attachments do not bordercross while they're being duplicated. This is hacktastic! 1754 // attachments do not bordercross while they're being duplicated. This is hacktastic!
1759 // Normally, setting AbsolutePosition will bordercross a prim if it's outside the region! 1755 // Normally, setting AbsolutePosition will bordercross a prim if it's outside the region!
1760 // unless IsAttachment is true!, so to prevent border crossing, we save it's attachment state 1756 // unless IsAttachment is true!, so to prevent border crossing, we save it's attachment state
1761 // (which should be false anyway) set it as an Attachment and then set it's Absolute Position, 1757 // (which should be false anyway) set it as an Attachment and then set it's Absolute Position,
1762 // then restore it's attachment state 1758 // then restore it's attachment state
1763 1759
1764 // This is only necessary when userExposed is false! 1760 // This is only necessary when userExposed is false!
1765 1761
1766 bool previousAttachmentStatus = dupe.IsAttachment; 1762 bool previousAttachmentStatus = dupe.IsAttachment;
1767
1768 if (!userExposed)
1769 dupe.IsAttachment = true;
1770 1763
1771 if (!userExposed) 1764 if (!userExposed)
1772 dupe.RootPart.IsAttachment = true; 1765 dupe.IsAttachment = true;
1773 1766
1774 dupe.AbsolutePosition = new Vector3(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z); 1767 dupe.AbsolutePosition = new Vector3(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z);
1775 if (!userExposed)
1776 {
1777 dupe.IsAttachment = previousAttachmentStatus;
1778 }
1779 1768
1780 if (!userExposed) 1769 if (!userExposed)
1781 { 1770 {
1782 dupe.RootPart.IsAttachment = previousAttachmentStatus; 1771 dupe.IsAttachment = previousAttachmentStatus;
1783 } 1772 }
1784 1773
1785 dupe.CopyRootPart(m_rootPart, OwnerID, GroupID, userExposed); 1774 dupe.CopyRootPart(m_rootPart, OwnerID, GroupID, userExposed);
1786 dupe.m_rootPart.LinkNum = m_rootPart.LinkNum; 1775 dupe.m_rootPart.LinkNum = m_rootPart.LinkNum;
1787 1776
1788 if (userExposed) 1777 if (userExposed)
1789 dupe.m_rootPart.TrimPermissions(); 1778 dupe.m_rootPart.TrimPermissions();
1790 1779
1791 List<SceneObjectPart> partList = new List<SceneObjectPart>(m_parts.GetArray()); 1780 List<SceneObjectPart> partList = new List<SceneObjectPart>(m_parts.GetArray());
1792 1781
1793 partList.Sort(delegate(SceneObjectPart p1, SceneObjectPart p2) 1782 partList.Sort(delegate(SceneObjectPart p1, SceneObjectPart p2)
1794 { 1783 {
1795 return p1.LinkNum.CompareTo(p2.LinkNum); 1784 return p1.LinkNum.CompareTo(p2.LinkNum);
1796 } 1785 }
1797 ); 1786 );
1798 1787
1799 foreach (SceneObjectPart part in partList) 1788 foreach (SceneObjectPart part in partList)
1789 {
1790 SceneObjectPart newPart;
1791 if (part.UUID != m_rootPart.UUID)
1800 { 1792 {
1801 if (part.UUID != m_rootPart.UUID) 1793 newPart = dupe.CopyPart(part, OwnerID, GroupID, userExposed);
1802 { 1794 newPart.LinkNum = part.LinkNum;
1803 SceneObjectPart newPart = dupe.CopyPart(part, OwnerID, GroupID, userExposed);
1804
1805 newPart.LinkNum = part.LinkNum;
1806 }
1807
1808 // Need to duplicate the physics actor as well
1809 if (part.PhysActor != null && userExposed)
1810 {
1811 PrimitiveBaseShape pbs = part.Shape;
1812
1813 part.PhysActor
1814 = m_scene.PhysicsScene.AddPrimShape(
1815 string.Format("{0}/{1}", part.Name, part.UUID),
1816 pbs,
1817 part.AbsolutePosition,
1818 part.Scale,
1819 part.RotationOffset,
1820 part.PhysActor.IsPhysical,
1821 m_localId);
1822 part.PhysActor.SetMaterial((int)part.Material);
1823
1824 part.PhysActor.LocalID = part.LocalId;
1825 part.DoPhysicsPropertyUpdate(part.PhysActor.IsPhysical, true);
1826 }
1827 } 1795 }
1828 if (userExposed) 1796 else
1829 { 1797 {
1830 dupe.UpdateParentIDs(); 1798 newPart = dupe.m_rootPart;
1831 dupe.HasGroupChanged = true;
1832 dupe.AttachToBackup();
1833 } 1799 }
1834 ScheduleGroupForFullUpdate(); 1800
1835 // Need to duplicate the physics actor as well 1801 // Need to duplicate the physics actor as well
1836 if (part.PhysActor != null && userExposed) 1802 if (part.PhysActor != null && userExposed)
1837 { 1803 {
1838 PrimitiveBaseShape pbs = newPart.Shape; 1804 PrimitiveBaseShape pbs = newPart.Shape;
1839 1805
1840 newPart.PhysActor 1806 newPart.PhysActor
1841 = m_scene.PhysicsScene.AddPrimShape( 1807 = m_scene.PhysicsScene.AddPrimShape(
1842 string.Format("{0}/{1}", newPart.Name, newPart.UUID), 1808 string.Format("{0}/{1}", newPart.Name, newPart.UUID),
@@ -1846,14 +1812,20 @@ namespace OpenSim.Region.Framework.Scenes
1846 newPart.RotationOffset, 1812 newPart.RotationOffset,
1847 part.PhysActor.IsPhysical, 1813 part.PhysActor.IsPhysical,
1848 newPart.LocalId); 1814 newPart.LocalId);
1849 1815
1850 newPart.DoPhysicsPropertyUpdate(part.PhysActor.IsPhysical, true); 1816 newPart.DoPhysicsPropertyUpdate(part.PhysActor.IsPhysical, true);
1851 } 1817 }
1852 } 1818 }
1853 finally 1819
1820 if (userExposed)
1854 { 1821 {
1855 m_dupeInProgress = false; 1822 dupe.UpdateParentIDs();
1823 dupe.HasGroupChanged = true;
1824 dupe.AttachToBackup();
1825
1826 ScheduleGroupForFullUpdate();
1856 } 1827 }
1828
1857 return dupe; 1829 return dupe;
1858 } 1830 }
1859 1831
@@ -1983,22 +1955,8 @@ namespace OpenSim.Region.Framework.Scenes
1983 1955
1984 public void stopMoveToTarget() 1956 public void stopMoveToTarget()
1985 { 1957 {
1986 SceneObjectPart rootpart = m_rootPart; 1958 if (RootPart.PhysActor != null)
1987 if (rootpart != null) 1959 RootPart.PhysActor.PIDActive = false;
1988 {
1989 if (IsAttachment)
1990 {
1991 ScenePresence avatar = m_scene.GetScenePresence(rootpart.AttachedAvatar);
1992 if (avatar != null) avatar.StopMoveToPosition();
1993 }
1994 else
1995 {
1996 if (rootpart.PhysActor != null)
1997 {
1998 rootpart.PhysActor.PIDActive = false;
1999 }
2000 }
2001 }
2002 } 1960 }
2003 1961
2004 public void rotLookAt(Quaternion target, float strength, float damping) 1962 public void rotLookAt(Quaternion target, float strength, float damping)
@@ -3087,8 +3045,6 @@ namespace OpenSim.Region.Framework.Scenes
3087 prevScale.X *= x; 3045 prevScale.X *= x;
3088 prevScale.Y *= y; 3046 prevScale.Y *= y;
3089 prevScale.Z *= z; 3047 prevScale.Z *= z;
3090 part.IgnoreUndoUpdate = false;
3091
3092// RootPart.IgnoreUndoUpdate = true; 3048// RootPart.IgnoreUndoUpdate = true;
3093 RootPart.Resize(prevScale); 3049 RootPart.Resize(prevScale);
3094// RootPart.IgnoreUndoUpdate = false; 3050// RootPart.IgnoreUndoUpdate = false;
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 6988718..0c3b404 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -3243,6 +3243,14 @@ namespace OpenSim.Region.Framework.Scenes
3243 STATUS_ROTATE_Z = rotate; 3243 STATUS_ROTATE_Z = rotate;
3244 } 3244 }
3245 3245
3246 public void SetBuoyancy(float fvalue)
3247 {
3248 if (PhysActor != null)
3249 {
3250 PhysActor.Buoyancy = fvalue;
3251 }
3252 }
3253
3246 public void SetDieAtEdge(bool p) 3254 public void SetDieAtEdge(bool p)
3247 { 3255 {
3248 if (m_parentGroup.IsDeleted) 3256 if (m_parentGroup.IsDeleted)
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 8ee7d89..35a8df7 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -131,6 +131,7 @@ namespace OpenSim.Region.Framework.Scenes
131// private SceneObjectGroup proxyObjectGroup; 131// private SceneObjectGroup proxyObjectGroup;
132 //private SceneObjectPart proxyObjectPart = null; 132 //private SceneObjectPart proxyObjectPart = null;
133 public Vector3 lastKnownAllowedPosition; 133 public Vector3 lastKnownAllowedPosition;
134 public bool sentMessageAboutRestrictedParcelFlyingDown;
134 public Vector4 CollisionPlane = Vector4.UnitW; 135 public Vector4 CollisionPlane = Vector4.UnitW;
135 136
136 private Vector3 m_avInitialPos; // used to calculate unscripted sit rotation 137 private Vector3 m_avInitialPos; // used to calculate unscripted sit rotation
@@ -4316,103 +4317,6 @@ if (m_animator.m_jumping) force.Z = m_animator.m_jumpVelocity; // add for ju
4316 return flags; 4317 return flags;
4317 } 4318 }
4318 4319
4319 /// <summary>
4320 /// RezAttachments. This should only be called upon login on the first region.
4321 /// Attachment rezzings on crossings and TPs are done in a different way.
4322 /// </summary>
4323 public void RezAttachments()
4324 {
4325 if (null == m_appearance)
4326 {
4327 m_log.WarnFormat("[ATTACHMENT]: Appearance has not been initialized for agent {0}", UUID);
4328 return;
4329 }
4330
4331 XmlDocument doc = new XmlDocument();
4332 string stateData = String.Empty;
4333
4334 IAttachmentsService attServ = m_scene.RequestModuleInterface<IAttachmentsService>();
4335 if (attServ != null)
4336 {
4337 m_log.DebugFormat("[ATTACHMENT]: Loading attachment data from attachment service");
4338 stateData = attServ.Get(ControllingClient.AgentId.ToString());
4339 if (stateData != String.Empty)
4340 {
4341 try
4342 {
4343 doc.LoadXml(stateData);
4344 }
4345 catch { }
4346 }
4347 }
4348
4349 Dictionary<UUID, string> itemData = new Dictionary<UUID, string>();
4350
4351 XmlNodeList nodes = doc.GetElementsByTagName("Attachment");
4352 if (nodes.Count > 0)
4353 {
4354 foreach (XmlNode n in nodes)
4355 {
4356 XmlElement elem = (XmlElement)n;
4357 string itemID = elem.GetAttribute("ItemID");
4358 string xml = elem.InnerXml;
4359
4360 itemData[new UUID(itemID)] = xml;
4361 }
4362 }
4363
4364 List<AvatarAttachment> attachments = m_appearance.GetAttachments();
4365 foreach (AvatarAttachment attach in attachments)
4366 {
4367 if (IsDeleted)
4368 return;
4369
4370 int p = attach.AttachPoint;
4371 UUID itemID = attach.ItemID;
4372
4373 //UUID assetID = attach.AssetID;
4374 // For some reason assetIDs are being written as Zero's in the DB -- need to track tat down
4375 // But they're not used anyway, the item is being looked up for now, so let's proceed.
4376 //if (UUID.Zero == assetID)
4377 //{
4378 // m_log.DebugFormat("[ATTACHMENT]: Cannot rez attachment in point {0} with itemID {1}", p, itemID);
4379 // continue;
4380 //}
4381
4382 try
4383 {
4384 string xmlData;
4385 XmlDocument d = new XmlDocument();
4386 UUID asset;
4387 if (itemData.TryGetValue(itemID, out xmlData))
4388 {
4389 d.LoadXml(xmlData);
4390 m_log.InfoFormat("[ATTACHMENT]: Found saved state for item {0}, loading it", itemID);
4391
4392 // Rez from inventory
4393 asset
4394 = m_scene.AttachmentsModule.RezSingleAttachmentFromInventory(ControllingClient, itemID, (uint)p, true, d);
4395
4396 }
4397 else
4398 {
4399 // Rez from inventory (with a null doc to let
4400 // CHANGED_OWNER happen)
4401 asset
4402 = m_scene.AttachmentsModule.RezSingleAttachmentFromInventory(ControllingClient, itemID, (uint)p, true, null);
4403 }
4404
4405 m_log.InfoFormat(
4406 "[ATTACHMENT]: Rezzed attachment in point {0} from item {1} and asset {2}",
4407 p, itemID, asset);
4408 }
4409 catch (Exception e)
4410 {
4411 m_log.ErrorFormat("[ATTACHMENT]: Unable to rez attachment: {0}{1}", e.Message, e.StackTrace);
4412 }
4413 }
4414 }
4415
4416 private void ReprioritizeUpdates() 4320 private void ReprioritizeUpdates()
4417 { 4321 {
4418 if (Scene.IsReprioritizationEnabled && Scene.UpdatePrioritizationScheme != UpdatePrioritizationSchemes.Time) 4322 if (Scene.IsReprioritizationEnabled && Scene.UpdatePrioritizationScheme != UpdatePrioritizationSchemes.Time)
diff --git a/OpenSim/Region/Framework/Scenes/UndoState.cs b/OpenSim/Region/Framework/Scenes/UndoState.cs
index 81f41db..0a30f4b 100644
--- a/OpenSim/Region/Framework/Scenes/UndoState.cs
+++ b/OpenSim/Region/Framework/Scenes/UndoState.cs
@@ -50,16 +50,11 @@ namespace OpenSim.Region.Framework.Scenes
50 50
51 public class UndoState 51 public class UndoState
52 { 52 {
53// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 53 // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
54 54
55 public Vector3 Position = Vector3.Zero; 55 public Vector3 Position = Vector3.Zero;
56 public Vector3 Scale = Vector3.Zero; 56 public Vector3 Scale = Vector3.Zero;
57 public Quaternion Rotation = Quaternion.Identity; 57 public Quaternion Rotation = Quaternion.Identity;
58 public Vector3 GroupPosition = Vector3.Zero;
59 public Quaternion GroupRotation = Quaternion.Identity;
60 public Vector3 GroupScale = Vector3.Zero;
61 public DateTime LastUpdated = DateTime.Now;
62 public UndoType Type;
63 58
64 /// <summary> 59 /// <summary>
65 /// Is this undo state for an entire group? 60 /// Is this undo state for an entire group?
@@ -77,88 +72,40 @@ namespace OpenSim.Region.Framework.Scenes
77 { 72 {
78 ForGroup = forGroup; 73 ForGroup = forGroup;
79 74
80// if (ForGroup) 75 // if (ForGroup)
81 GroupScale = part.ParentGroup.RootPart.Shape.Scale; 76 Position = part.ParentGroup.AbsolutePosition;
77 // else
78 // Position = part.OffsetPosition;
82 79
83 //FUBAR WARNING: Do NOT get the group's absoluteposition here 80 // m_log.DebugFormat(
84 //or you'll experience a loop and/or a stack issue 81 // "[UNDO STATE]: Storing undo position {0} for root part", Position);
85 GroupPosition = part.ParentGroup.RootPart.AbsolutePosition;
86 GroupRotation = part.ParentGroup.GroupRotation;
87 Position = part.ParentGroup.RootPart.AbsolutePosition;
88// else
89// Position = part.OffsetPosition;
90
91// m_log.DebugFormat(
92// "[UNDO STATE]: Storing undo position {0} for root part", Position);
93 82
94 Rotation = part.RotationOffset; 83 Rotation = part.RotationOffset;
95 84
96// m_log.DebugFormat( 85 // m_log.DebugFormat(
97// "[UNDO STATE]: Storing undo rotation {0} for root part", Rotation); 86 // "[UNDO STATE]: Storing undo rotation {0} for root part", Rotation);
98 87
99 Scale = part.Shape.Scale; 88 Scale = part.Shape.Scale;
100 89
101// m_log.DebugFormat( 90 // m_log.DebugFormat(
102// "[UNDO STATE]: Storing undo scale {0} for root part", Scale); 91 // "[UNDO STATE]: Storing undo scale {0} for root part", Scale);
103 } 92 }
104 else 93 else
105 { 94 {
106 Position = part.OffsetPosition; 95 Position = part.OffsetPosition;
107// m_log.DebugFormat( 96 // m_log.DebugFormat(
108// "[UNDO STATE]: Storing undo position {0} for child part", Position); 97 // "[UNDO STATE]: Storing undo position {0} for child part", Position);
109 98
110 Rotation = part.RotationOffset; 99 Rotation = part.RotationOffset;
111// m_log.DebugFormat( 100 // m_log.DebugFormat(
112// "[UNDO STATE]: Storing undo rotation {0} for child part", Rotation); 101 // "[UNDO STATE]: Storing undo rotation {0} for child part", Rotation);
113 102
114 Scale = part.Shape.Scale; 103 Scale = part.Shape.Scale;
115// m_log.DebugFormat( 104 // m_log.DebugFormat(
116// "[UNDO STATE]: Storing undo scale {0} for child part", Scale); 105 // "[UNDO STATE]: Storing undo scale {0} for child part", Scale);
117 }
118 }
119 public void Merge(UndoState last)
120 {
121 if ((Type & UndoType.STATE_GROUP_POSITION) == 0 || ((last.Type & UndoType.STATE_GROUP_POSITION) >= (Type & UndoType.STATE_GROUP_POSITION)))
122 {
123 GroupPosition = last.GroupPosition;
124 Position = last.Position;
125 }
126 if ((Type & UndoType.STATE_GROUP_SCALE) == 0 || ((last.Type & UndoType.STATE_GROUP_SCALE) >= (Type & UndoType.STATE_GROUP_SCALE)))
127 {
128 GroupScale = last.GroupScale;
129 Scale = last.Scale;
130 }
131 if ((Type & UndoType.STATE_GROUP_ROTATION) == 0 || ((last.Type & UndoType.STATE_GROUP_ROTATION) >= (Type & UndoType.STATE_GROUP_ROTATION)))
132 {
133 GroupRotation = last.GroupRotation;
134 Rotation = last.Rotation;
135 }
136 if ((Type & UndoType.STATE_PRIM_POSITION) == 0 || ((last.Type & UndoType.STATE_PRIM_POSITION) >= (Type & UndoType.STATE_PRIM_POSITION)))
137 {
138 Position = last.Position;
139 }
140 if ((Type & UndoType.STATE_PRIM_SCALE) == 0 || ((last.Type & UndoType.STATE_PRIM_SCALE) >= (Type & UndoType.STATE_PRIM_SCALE)))
141 {
142 Scale = last.Scale;
143 }
144 if ((Type & UndoType.STATE_PRIM_ROTATION) == 0 || ((last.Type & UndoType.STATE_PRIM_ROTATION) >= (Type & UndoType.STATE_PRIM_ROTATION)))
145 {
146 Rotation = last.Rotation;
147 }
148 Type = Type | last.Type;
149 }
150 public bool Compare(UndoState undo)
151 {
152 if (undo == null || Position == null) return false;
153 if (undo.Position == Position && undo.Rotation == Rotation && undo.Scale == Scale && undo.GroupPosition == GroupPosition && undo.GroupScale == GroupScale && undo.GroupRotation == GroupRotation)
154 {
155 return true;
156 }
157 else
158 {
159 return false;
160 } 106 }
161 } 107 }
108
162 /// <summary> 109 /// <summary>
163 /// Compare the relevant state in the given part to this state. 110 /// Compare the relevant state in the given part to this state.
164 /// </summary> 111 /// </summary>
@@ -183,15 +130,15 @@ namespace OpenSim.Region.Framework.Scenes
183 return false; 130 return false;
184 } 131 }
185 132
186 private void RestoreState(SceneObjectPart part) 133 public void PlaybackState(SceneObjectPart part)
187 { 134 {
188 part.Undoing = true; 135 part.Undoing = true;
189 136
190 if (part.ParentID == 0) 137 if (part.ParentID == 0)
191 { 138 {
192// m_log.DebugFormat( 139 // m_log.DebugFormat(
193// "[UNDO STATE]: Undoing position to {0} for root part {1} {2}", 140 // "[UNDO STATE]: Undoing position to {0} for root part {1} {2}",
194// Position, part.Name, part.LocalId); 141 // Position, part.Name, part.LocalId);
195 142
196 if (Position != Vector3.Zero) 143 if (Position != Vector3.Zero)
197 { 144 {
@@ -201,9 +148,9 @@ namespace OpenSim.Region.Framework.Scenes
201 part.ParentGroup.UpdateRootPosition(Position); 148 part.ParentGroup.UpdateRootPosition(Position);
202 } 149 }
203 150
204// m_log.DebugFormat( 151 // m_log.DebugFormat(
205// "[UNDO STATE]: Undoing rotation {0} to {1} for root part {2} {3}", 152 // "[UNDO STATE]: Undoing rotation {0} to {1} for root part {2} {3}",
206// part.RotationOffset, Rotation, part.Name, part.LocalId); 153 // part.RotationOffset, Rotation, part.Name, part.LocalId);
207 154
208 if (ForGroup) 155 if (ForGroup)
209 part.UpdateRotation(Rotation); 156 part.UpdateRotation(Rotation);
@@ -212,9 +159,9 @@ namespace OpenSim.Region.Framework.Scenes
212 159
213 if (Scale != Vector3.Zero) 160 if (Scale != Vector3.Zero)
214 { 161 {
215// m_log.DebugFormat( 162 // m_log.DebugFormat(
216// "[UNDO STATE]: Undoing scale {0} to {1} for root part {2} {3}", 163 // "[UNDO STATE]: Undoing scale {0} to {1} for root part {2} {3}",
217// part.Shape.Scale, Scale, part.Name, part.LocalId); 164 // part.Shape.Scale, Scale, part.Name, part.LocalId);
218 165
219 if (ForGroup) 166 if (ForGroup)
220 part.ParentGroup.GroupResize(Scale); 167 part.ParentGroup.GroupResize(Scale);
@@ -228,24 +175,24 @@ namespace OpenSim.Region.Framework.Scenes
228 { 175 {
229 if (Position != Vector3.Zero) 176 if (Position != Vector3.Zero)
230 { 177 {
231// m_log.DebugFormat( 178 // m_log.DebugFormat(
232// "[UNDO STATE]: Undoing position {0} to {1} for child part {2} {3}", 179 // "[UNDO STATE]: Undoing position {0} to {1} for child part {2} {3}",
233// part.OffsetPosition, Position, part.Name, part.LocalId); 180 // part.OffsetPosition, Position, part.Name, part.LocalId);
234 181
235 part.OffsetPosition = Position; 182 part.OffsetPosition = Position;
236 } 183 }
237 184
238// m_log.DebugFormat( 185 // m_log.DebugFormat(
239// "[UNDO STATE]: Undoing rotation {0} to {1} for child part {2} {3}", 186 // "[UNDO STATE]: Undoing rotation {0} to {1} for child part {2} {3}",
240// part.RotationOffset, Rotation, part.Name, part.LocalId); 187 // part.RotationOffset, Rotation, part.Name, part.LocalId);
241 188
242 part.UpdateRotation(Rotation); 189 part.UpdateRotation(Rotation);
243 190
244 if (Scale != Vector3.Zero) 191 if (Scale != Vector3.Zero)
245 { 192 {
246// m_log.DebugFormat( 193 // m_log.DebugFormat(
247// "[UNDO STATE]: Undoing scale {0} to {1} for child part {2} {3}", 194 // "[UNDO STATE]: Undoing scale {0} to {1} for child part {2} {3}",
248// part.Shape.Scale, Scale, part.Name, part.LocalId); 195 // part.Shape.Scale, Scale, part.Name, part.LocalId);
249 196
250 part.Resize(Scale); 197 part.Resize(Scale);
251 } 198 }