diff options
Diffstat (limited to 'OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs')
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs | 72 |
1 files changed, 40 insertions, 32 deletions
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 8c5afab..60cf061 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs | |||
@@ -99,6 +99,8 @@ namespace OpenSim.Region.Environment.Scenes | |||
99 | private Vector3 lastPhysGroupPos; | 99 | private Vector3 lastPhysGroupPos; |
100 | private Quaternion lastPhysGroupRot; | 100 | private Quaternion lastPhysGroupRot; |
101 | 101 | ||
102 | private bool m_isBackedUp = false; | ||
103 | |||
102 | /// <summary> | 104 | /// <summary> |
103 | /// The constituent parts of this group | 105 | /// The constituent parts of this group |
104 | /// </summary> | 106 | /// </summary> |
@@ -120,7 +122,11 @@ namespace OpenSim.Region.Environment.Scenes | |||
120 | /// </summary> | 122 | /// </summary> |
121 | public override string Name | 123 | public override string Name |
122 | { | 124 | { |
123 | get { return RootPart.Name; } | 125 | get { |
126 | if (RootPart == null) | ||
127 | return ""; | ||
128 | return RootPart.Name; | ||
129 | } | ||
124 | set { RootPart.Name = value; } | 130 | set { RootPart.Name = value; } |
125 | } | 131 | } |
126 | 132 | ||
@@ -544,7 +550,9 @@ namespace OpenSim.Region.Environment.Scenes | |||
544 | //m_log.DebugFormat( | 550 | //m_log.DebugFormat( |
545 | // "[SCENE OBJECT GROUP]: Attaching object {0} {1} to scene presistence sweep", Name, UUID); | 551 | // "[SCENE OBJECT GROUP]: Attaching object {0} {1} to scene presistence sweep", Name, UUID); |
546 | 552 | ||
547 | m_scene.EventManager.OnBackup += ProcessBackup; | 553 | if (!m_isBackedUp) |
554 | m_scene.EventManager.OnBackup += ProcessBackup; | ||
555 | m_isBackedUp = true; | ||
548 | } | 556 | } |
549 | } | 557 | } |
550 | 558 | ||
@@ -786,6 +794,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
786 | SetAttachmentPoint((byte)0); | 794 | SetAttachmentPoint((byte)0); |
787 | m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_scene.m_physicalPrim); | 795 | m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_scene.m_physicalPrim); |
788 | HasGroupChanged = true; | 796 | HasGroupChanged = true; |
797 | RootPart.Rezzed = DateTime.Now; | ||
789 | AttachToBackup(); | 798 | AttachToBackup(); |
790 | m_scene.EventManager.TriggerParcelPrimCountTainted(); | 799 | m_scene.EventManager.TriggerParcelPrimCountTainted(); |
791 | m_rootPart.ScheduleFullUpdate(); | 800 | m_rootPart.ScheduleFullUpdate(); |
@@ -1000,6 +1009,8 @@ namespace OpenSim.Region.Environment.Scenes | |||
1000 | // that they don't happen, otherwise the deleted objects will reappear | 1009 | // that they don't happen, otherwise the deleted objects will reappear |
1001 | m_isDeleted = true; | 1010 | m_isDeleted = true; |
1002 | 1011 | ||
1012 | DetachFromBackup(); | ||
1013 | |||
1003 | foreach (SceneObjectPart part in m_parts.Values) | 1014 | foreach (SceneObjectPart part in m_parts.Values) |
1004 | { | 1015 | { |
1005 | List<ScenePresence> avatars = Scene.GetScenePresences(); | 1016 | List<ScenePresence> avatars = Scene.GetScenePresences(); |
@@ -1149,6 +1160,28 @@ namespace OpenSim.Region.Environment.Scenes | |||
1149 | // any exception propogate upwards. | 1160 | // any exception propogate upwards. |
1150 | try | 1161 | try |
1151 | { | 1162 | { |
1163 | ILandObject parcel = m_scene.LandChannel.GetLandObject( | ||
1164 | m_rootPart.GroupPosition.X, m_rootPart.GroupPosition.Y); | ||
1165 | |||
1166 | if (parcel.landData.OtherCleanTime != 0) | ||
1167 | { | ||
1168 | if (parcel.landData.OwnerID != OwnerID && | ||
1169 | (parcel.landData.GroupID != GroupID || | ||
1170 | parcel.landData.GroupID == UUID.Zero)) | ||
1171 | { | ||
1172 | if ((DateTime.Now - RootPart.Rezzed).TotalMinutes > | ||
1173 | parcel.landData.OtherCleanTime) | ||
1174 | { | ||
1175 | m_log.InfoFormat("[SCENE] Returning object {0} due to parcel auto return", RootPart.UUID.ToString()); | ||
1176 | m_scene.AddReturn(OwnerID, Name, AbsolutePosition); | ||
1177 | m_scene.DeRezObject(null, RootPart.LocalId, | ||
1178 | RootPart.GroupID, 9, UUID.Zero); | ||
1179 | |||
1180 | return; | ||
1181 | } | ||
1182 | } | ||
1183 | } | ||
1184 | |||
1152 | if (HasGroupChanged) | 1185 | if (HasGroupChanged) |
1153 | { | 1186 | { |
1154 | // don't backup while it's selected or you're asking for changes mid stream. | 1187 | // don't backup while it's selected or you're asking for changes mid stream. |
@@ -1226,35 +1259,6 @@ namespace OpenSim.Region.Environment.Scenes | |||
1226 | } | 1259 | } |
1227 | } | 1260 | } |
1228 | 1261 | ||
1229 | /// <summary> | ||
1230 | /// Send a terse update to the client for the given part | ||
1231 | /// </summary> | ||
1232 | /// <param name="remoteClient"></param> | ||
1233 | /// <param name="part"></param> | ||
1234 | internal void SendPartTerseUpdate(IClientAPI remoteClient, SceneObjectPart part) | ||
1235 | { | ||
1236 | SceneObjectPart rootPart = m_rootPart; | ||
1237 | |||
1238 | // TODO: that could by caused by some race condition with attachments on sim-crossing | ||
1239 | if (rootPart == null) return; | ||
1240 | |||
1241 | if (rootPart.UUID == part.UUID) | ||
1242 | { | ||
1243 | if (rootPart.IsAttachment) | ||
1244 | { | ||
1245 | part.SendTerseUpdateToClient(remoteClient, rootPart.AttachedPos); | ||
1246 | } | ||
1247 | else | ||
1248 | { | ||
1249 | part.SendTerseUpdateToClient(remoteClient, AbsolutePosition); | ||
1250 | } | ||
1251 | } | ||
1252 | else | ||
1253 | { | ||
1254 | part.SendTerseUpdateToClient(remoteClient); | ||
1255 | } | ||
1256 | } | ||
1257 | |||
1258 | #endregion | 1262 | #endregion |
1259 | 1263 | ||
1260 | #region Copying | 1264 | #region Copying |
@@ -1920,6 +1924,8 @@ namespace OpenSim.Region.Environment.Scenes | |||
1920 | if (sendEvents) | 1924 | if (sendEvents) |
1921 | linkPart.TriggerScriptChangedEvent(Changed.LINK); | 1925 | linkPart.TriggerScriptChangedEvent(Changed.LINK); |
1922 | 1926 | ||
1927 | linkPart.Rezzed = RootPart.Rezzed; | ||
1928 | |||
1923 | HasGroupChanged = true; | 1929 | HasGroupChanged = true; |
1924 | ScheduleGroupForFullUpdate(); | 1930 | ScheduleGroupForFullUpdate(); |
1925 | } | 1931 | } |
@@ -1937,7 +1943,9 @@ namespace OpenSim.Region.Environment.Scenes | |||
1937 | /// <param name="objectGroup"></param> | 1943 | /// <param name="objectGroup"></param> |
1938 | public void DetachFromBackup() | 1944 | public void DetachFromBackup() |
1939 | { | 1945 | { |
1940 | m_scene.EventManager.OnBackup -= ProcessBackup; | 1946 | if (m_isBackedUp) |
1947 | m_scene.EventManager.OnBackup -= ProcessBackup; | ||
1948 | m_isBackedUp = false; | ||
1941 | } | 1949 | } |
1942 | 1950 | ||
1943 | private void LinkNonRootPart(SceneObjectPart part, Vector3 oldGroupPosition, Quaternion oldGroupRotation) | 1951 | private void LinkNonRootPart(SceneObjectPart part, Vector3 oldGroupPosition, Quaternion oldGroupRotation) |