diff options
author | Teravus Ovares | 2008-04-25 21:41:55 +0000 |
---|---|---|
committer | Teravus Ovares | 2008-04-25 21:41:55 +0000 |
commit | a534257b0e0861bb7656389675044fa905a11bf4 (patch) | |
tree | c879b8b46c13bd5afffb660ca3154ed8a94d51ce /OpenSim/Region/Environment | |
parent | * Check in odds and ends which remain as an attempt to get the item propertie... (diff) | |
download | opensim-SC-a534257b0e0861bb7656389675044fa905a11bf4.zip opensim-SC-a534257b0e0861bb7656389675044fa905a11bf4.tar.gz opensim-SC-a534257b0e0861bb7656389675044fa905a11bf4.tar.bz2 opensim-SC-a534257b0e0861bb7656389675044fa905a11bf4.tar.xz |
* Fixes prim crossing. See bug 1050.
* Causes the internal handling of attachments to put the prim group conceptually at the position of the avatar instead of 0,0,0
Diffstat (limited to 'OpenSim/Region/Environment')
-rw-r--r-- | OpenSim/Region/Environment/PermissionManager.cs | 13 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/InnerScene.cs | 3 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Scene.cs | 15 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs | 23 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | 16 |
5 files changed, 65 insertions, 5 deletions
diff --git a/OpenSim/Region/Environment/PermissionManager.cs b/OpenSim/Region/Environment/PermissionManager.cs index 0343d21..5658be7 100644 --- a/OpenSim/Region/Environment/PermissionManager.cs +++ b/OpenSim/Region/Environment/PermissionManager.cs | |||
@@ -168,12 +168,25 @@ namespace OpenSim.Region.Environment | |||
168 | /// <returns>Has permission?</returns> | 168 | /// <returns>Has permission?</returns> |
169 | public virtual bool CanObjectEntry(LLUUID user, LLVector3 oldPos, LLVector3 newPos) | 169 | public virtual bool CanObjectEntry(LLUUID user, LLVector3 oldPos, LLVector3 newPos) |
170 | { | 170 | { |
171 | |||
172 | |||
173 | if ((newPos.X > 257f || newPos.X < -1f || newPos.Y > 257f || newPos.Y < -1f)) | ||
174 | { | ||
175 | return true; | ||
176 | } | ||
177 | |||
171 | ILandObject land1 = m_scene.LandChannel.getLandObject(oldPos.X, oldPos.Y); | 178 | ILandObject land1 = m_scene.LandChannel.getLandObject(oldPos.X, oldPos.Y); |
172 | ILandObject land2 = m_scene.LandChannel.getLandObject(newPos.X, newPos.Y); | 179 | ILandObject land2 = m_scene.LandChannel.getLandObject(newPos.X, newPos.Y); |
180 | |||
173 | if (land1 == null || land2 == null) | 181 | if (land1 == null || land2 == null) |
174 | { | 182 | { |
175 | return false; | 183 | return false; |
176 | } | 184 | } |
185 | if (land2 == null) | ||
186 | { | ||
187 | // need this for crossing borders | ||
188 | return true; | ||
189 | } | ||
177 | 190 | ||
178 | if (land1.landData.globalID == land2.landData.globalID) | 191 | if (land1.landData.globalID == land2.landData.globalID) |
179 | { | 192 | { |
diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs index 668e50f..2aa51b8 100644 --- a/OpenSim/Region/Environment/Scenes/InnerScene.cs +++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs | |||
@@ -314,6 +314,9 @@ namespace OpenSim.Region.Environment.Scenes | |||
314 | { | 314 | { |
315 | List<EntityBase> EntityList = GetEntities(); | 315 | List<EntityBase> EntityList = GetEntities(); |
316 | 316 | ||
317 | if (AttachmentPt == 0) | ||
318 | AttachmentPt = (uint)AttachmentPoint.LeftHand; | ||
319 | |||
317 | foreach (EntityBase obj in EntityList) | 320 | foreach (EntityBase obj in EntityList) |
318 | { | 321 | { |
319 | if (obj is SceneObjectGroup) | 322 | if (obj is SceneObjectGroup) |
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index ae914b3..ce713c5 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs | |||
@@ -1368,14 +1368,19 @@ namespace OpenSim.Region.Environment.Scenes | |||
1368 | m_sceneXmlLoader.SavePrimsToXml2(fileName); | 1368 | m_sceneXmlLoader.SavePrimsToXml2(fileName); |
1369 | } | 1369 | } |
1370 | 1370 | ||
1371 | /// <summary> | ||
1372 | /// Locate New region Handle and offset the prim position for the new region | ||
1373 | /// | ||
1374 | /// </summary> | ||
1375 | /// <param name="position">current position of Group</param> | ||
1376 | /// <param name="grp">Scene Object Group that we're crossing</param> | ||
1377 | |||
1371 | public void CrossPrimGroupIntoNewRegion(LLVector3 position, SceneObjectGroup grp) | 1378 | public void CrossPrimGroupIntoNewRegion(LLVector3 position, SceneObjectGroup grp) |
1372 | { | 1379 | { |
1373 | m_log.Warn("Prim crossing: " + grp.UUID.ToString()); | 1380 | m_log.Warn("Prim crossing: " + grp.UUID.ToString()); |
1374 | int thisx = (int)RegionInfo.RegionLocX; | 1381 | int thisx = (int)RegionInfo.RegionLocX; |
1375 | int thisy = (int)RegionInfo.RegionLocY; | 1382 | int thisy = (int)RegionInfo.RegionLocY; |
1376 | 1383 | ||
1377 | int primcrossingXMLmethod = 0; | ||
1378 | |||
1379 | ulong newRegionHandle = 0; | 1384 | ulong newRegionHandle = 0; |
1380 | LLVector3 pos = position; | 1385 | LLVector3 pos = position; |
1381 | 1386 | ||
@@ -1410,6 +1415,12 @@ namespace OpenSim.Region.Environment.Scenes | |||
1410 | // Offset the positions for the new region across the border | 1415 | // Offset the positions for the new region across the border |
1411 | grp.OffsetForNewRegion(pos); | 1416 | grp.OffsetForNewRegion(pos); |
1412 | 1417 | ||
1418 | CrossPrimGroupIntoNewRegion(newRegionHandle, grp); | ||
1419 | |||
1420 | } | ||
1421 | public void CrossPrimGroupIntoNewRegion(ulong newRegionHandle, SceneObjectGroup grp) | ||
1422 | { | ||
1423 | int primcrossingXMLmethod = 0; | ||
1413 | if (newRegionHandle != 0) | 1424 | if (newRegionHandle != 0) |
1414 | { | 1425 | { |
1415 | bool successYN = false; | 1426 | bool successYN = false; |
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 7251e9c..fbf0a73 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs | |||
@@ -1077,7 +1077,14 @@ namespace OpenSim.Region.Environment.Scenes | |||
1077 | { | 1077 | { |
1078 | if (m_rootPart.UUID == part.UUID) | 1078 | if (m_rootPart.UUID == part.UUID) |
1079 | { | 1079 | { |
1080 | part.SendFullUpdateToClient(remoteClient, AbsolutePosition, clientFlags); | 1080 | if (m_rootPart.m_IsAttachment) |
1081 | { | ||
1082 | part.SendFullUpdateToClient(remoteClient, m_rootPart.m_attachedPos, clientFlags); | ||
1083 | } | ||
1084 | else | ||
1085 | { | ||
1086 | part.SendFullUpdateToClient(remoteClient, AbsolutePosition, clientFlags); | ||
1087 | } | ||
1081 | } | 1088 | } |
1082 | else | 1089 | else |
1083 | { | 1090 | { |
@@ -1094,7 +1101,14 @@ namespace OpenSim.Region.Environment.Scenes | |||
1094 | { | 1101 | { |
1095 | if (m_rootPart.UUID == part.UUID) | 1102 | if (m_rootPart.UUID == part.UUID) |
1096 | { | 1103 | { |
1097 | part.SendTerseUpdateToClient(remoteClient, AbsolutePosition); | 1104 | if (m_rootPart.m_IsAttachment) |
1105 | { | ||
1106 | part.SendTerseUpdateToClient(remoteClient, m_rootPart.m_attachedPos); | ||
1107 | } | ||
1108 | else | ||
1109 | { | ||
1110 | part.SendTerseUpdateToClient(remoteClient, AbsolutePosition); | ||
1111 | } | ||
1098 | } | 1112 | } |
1099 | else | 1113 | else |
1100 | { | 1114 | { |
@@ -2143,6 +2157,11 @@ namespace OpenSim.Region.Environment.Scenes | |||
2143 | { | 2157 | { |
2144 | if (m_scene.EventManager.TriggerGroupMove(UUID, pos)) | 2158 | if (m_scene.EventManager.TriggerGroupMove(UUID, pos)) |
2145 | { | 2159 | { |
2160 | if (m_rootPart.m_IsAttachment) | ||
2161 | { | ||
2162 | m_rootPart.m_attachedPos = pos; | ||
2163 | } | ||
2164 | |||
2146 | AbsolutePosition = pos; | 2165 | AbsolutePosition = pos; |
2147 | } | 2166 | } |
2148 | //we need to do a terse update even if the move wasn't allowed | 2167 | //we need to do a terse update even if the move wasn't allowed |
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index 2357c2f..6a12fb9 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | |||
@@ -103,6 +103,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
103 | [XmlIgnore] public bool m_IsAttachment = false; | 103 | [XmlIgnore] public bool m_IsAttachment = false; |
104 | [XmlIgnore] public uint m_attachmentPoint = (byte)0; | 104 | [XmlIgnore] public uint m_attachmentPoint = (byte)0; |
105 | [XmlIgnore] public LLUUID m_attachedAvatar = LLUUID.Zero; | 105 | [XmlIgnore] public LLUUID m_attachedAvatar = LLUUID.Zero; |
106 | [XmlIgnore] public LLVector3 m_attachedPos = LLVector3.Zero; | ||
106 | 107 | ||
107 | public Int32 CreationDate; | 108 | public Int32 CreationDate; |
108 | public uint ParentID = 0; | 109 | public uint ParentID = 0; |
@@ -276,6 +277,15 @@ namespace OpenSim.Region.Environment.Scenes | |||
276 | m_groupPosition.Y = PhysActor.Position.Y; | 277 | m_groupPosition.Y = PhysActor.Position.Y; |
277 | m_groupPosition.Z = PhysActor.Position.Z; | 278 | m_groupPosition.Z = PhysActor.Position.Z; |
278 | } | 279 | } |
280 | if (m_IsAttachment) | ||
281 | { | ||
282 | ScenePresence sp = m_parentGroup.Scene.GetScenePresence(m_attachedAvatar); | ||
283 | if (sp != null) | ||
284 | { | ||
285 | return sp.AbsolutePosition; | ||
286 | } | ||
287 | } | ||
288 | |||
279 | return m_groupPosition; | 289 | return m_groupPosition; |
280 | } | 290 | } |
281 | set | 291 | set |
@@ -340,7 +350,11 @@ namespace OpenSim.Region.Environment.Scenes | |||
340 | 350 | ||
341 | public LLVector3 AbsolutePosition | 351 | public LLVector3 AbsolutePosition |
342 | { | 352 | { |
343 | get { return m_offsetPosition + m_groupPosition; } | 353 | get { |
354 | if (m_IsAttachment) | ||
355 | return GroupPosition; | ||
356 | |||
357 | return m_offsetPosition + m_groupPosition; } | ||
344 | } | 358 | } |
345 | 359 | ||
346 | protected LLQuaternion m_rotationOffset; | 360 | protected LLQuaternion m_rotationOffset; |