aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Environment/Scenes/InnerScene.cs32
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.cs22
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs2
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs57
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectPart.cs7
-rw-r--r--OpenSim/Region/Environment/Scenes/ScenePresence.cs43
6 files changed, 141 insertions, 22 deletions
diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs
index 2aa51b8..cbe5798 100644
--- a/OpenSim/Region/Environment/Scenes/InnerScene.cs
+++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs
@@ -310,13 +310,22 @@ namespace OpenSim.Region.Environment.Scenes
310 } 310 }
311 311
312 } 312 }
313 /// <summary>
314 /// Event Handling routine for Attach Object
315 /// </summary>
316 /// <param name="remoteClient"></param>
317 /// <param name="objectLocalID"></param>
318 /// <param name="AttachmentPt"></param>
319 /// <param name="rot"></param>
313 public void AttachObject(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, LLQuaternion rot) 320 public void AttachObject(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, LLQuaternion rot)
314 { 321 {
315 List<EntityBase> EntityList = GetEntities(); 322 // Calls attach with a Zero position
316 323 AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, LLVector3.Zero);
317 if (AttachmentPt == 0) 324 }
318 AttachmentPt = (uint)AttachmentPoint.LeftHand;
319 325
326 public void AttachObject(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, LLQuaternion rot, LLVector3 attachPos)
327 {
328 List<EntityBase> EntityList = GetEntities();
320 foreach (EntityBase obj in EntityList) 329 foreach (EntityBase obj in EntityList)
321 { 330 {
322 if (obj is SceneObjectGroup) 331 if (obj is SceneObjectGroup)
@@ -324,7 +333,20 @@ namespace OpenSim.Region.Environment.Scenes
324 if (((SceneObjectGroup)obj).LocalId == objectLocalID) 333 if (((SceneObjectGroup)obj).LocalId == objectLocalID)
325 { 334 {
326 SceneObjectGroup group = (SceneObjectGroup)obj; 335 SceneObjectGroup group = (SceneObjectGroup)obj;
327 group.AttachToAgent(remoteClient.AgentId, AttachmentPt); 336 if (AttachmentPt == 0)
337 {
338 // Check object for stored attachment point
339 AttachmentPt = (uint)group.GetAttachmentPoint();
340
341 // if we still didn't find a suitable attachment point.......
342 if (AttachmentPt == 0)
343 {
344 AttachmentPt = (uint)AttachmentPoint.LeftHand;
345 }
346
347 }
348
349 group.AttachToAgent(remoteClient.AgentId, AttachmentPt, attachPos);
328 350
329 } 351 }
330 352
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index ce713c5..9ca845f 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -1457,6 +1457,28 @@ namespace OpenSim.Region.Environment.Scenes
1457 if (XMLMethod == 0) 1457 if (XMLMethod == 0)
1458 { 1458 {
1459 m_sceneXmlLoader.LoadGroupFromXml2String(objXMLData); 1459 m_sceneXmlLoader.LoadGroupFromXml2String(objXMLData);
1460 SceneObjectPart RootPrim = GetSceneObjectPart(primID);
1461 if (RootPrim != null)
1462 {
1463 if (RootPrim.Shape.PCode == (byte)PCode.Prim)
1464 {
1465 SceneObjectGroup grp = RootPrim.ParentGroup;
1466 if (grp != null)
1467 {
1468 if (RootPrim.Shape.State != 0)
1469 {
1470 // Attachment
1471 ScenePresence sp = GetScenePresence(grp.OwnerID);
1472 if (sp != null)
1473 {
1474 m_innerScene.AttachObject(sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition);
1475 }
1476 }
1477 }
1478
1479
1480 }
1481 }
1460 return true; 1482 return true;
1461 } 1483 }
1462 else 1484 else
diff --git a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
index 0062e4d..27967bc 100644
--- a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
@@ -580,6 +580,8 @@ namespace OpenSim.Region.Environment.Scenes
580 avatar.ControllingClient.SendRegionTeleport(regionHandle, 13, reg.ExternalEndPoint, 4, (1 << 4), 580 avatar.ControllingClient.SendRegionTeleport(regionHandle, 13, reg.ExternalEndPoint, 4, (1 << 4),
581 capsPath); 581 capsPath);
582 avatar.MakeChildAgent(); 582 avatar.MakeChildAgent();
583 System.Threading.Thread.Sleep(5000);
584 avatar.CrossAttachmentsIntoNewRegion(regionHandle);
583 if (KillObject != null) 585 if (KillObject != null)
584 { 586 {
585 KillObject(avatar.LocalId); 587 KillObject(avatar.LocalId);
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
index fbf0a73..7020eb8 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
@@ -628,24 +628,39 @@ namespace OpenSim.Region.Environment.Scenes
628 } 628 }
629 629
630 630
631 public void AttachToAgent(LLUUID agentID, uint attachmentpoint) 631 public void AttachToAgent(LLUUID agentID, uint attachmentpoint, LLVector3 AttachOffset)
632 { 632 {
633 ScenePresence avatar = m_scene.GetScenePresence(agentID); 633 ScenePresence avatar = m_scene.GetScenePresence(agentID);
634 if (avatar != null) 634 if (avatar != null)
635 { 635 {
636 DetachFromBackup(this);
636 m_rootPart.m_attachedAvatar = agentID; 637 m_rootPart.m_attachedAvatar = agentID;
637 m_rootPart.SetParentLocalId(avatar.LocalId); 638
638 m_rootPart.SetAttachmentPoint(attachmentpoint); 639
639 m_rootPart.m_IsAttachment = true;
640 if (m_rootPart.PhysActor != null) 640 if (m_rootPart.PhysActor != null)
641 { 641 {
642 m_scene.PhysicsScene.RemovePrim(m_rootPart.PhysActor); 642 m_scene.PhysicsScene.RemovePrim(m_rootPart.PhysActor);
643 m_rootPart.PhysActor = null; 643 m_rootPart.PhysActor = null;
644 AbsolutePosition = LLVector3.Zero; 644 AbsolutePosition = AttachOffset;
645 m_rootPart.m_attachedPos = AttachOffset;
645 } 646 }
647 m_rootPart.m_IsAttachment = true;
648
649 m_rootPart.SetParentLocalId(avatar.LocalId);
650 m_rootPart.SetAttachmentPoint(attachmentpoint);
651
652 avatar.AddAttachment(this);
646 m_rootPart.ScheduleFullUpdate(); 653 m_rootPart.ScheduleFullUpdate();
647 } 654 }
648 } 655 }
656 public byte GetAttachmentPoint()
657 {
658 if (m_rootPart != null)
659 {
660 return m_rootPart.Shape.State;
661 }
662 return (byte)0;
663 }
649 664
650 public void DetachToGround() 665 public void DetachToGround()
651 { 666 {
@@ -654,6 +669,7 @@ namespace OpenSim.Region.Environment.Scenes
654 if (avatar != null) 669 if (avatar != null)
655 { 670 {
656 detachedpos = avatar.AbsolutePosition; 671 detachedpos = avatar.AbsolutePosition;
672 avatar.RemoveAttachment(this);
657 } 673 }
658 AbsolutePosition = detachedpos; 674 AbsolutePosition = detachedpos;
659 m_rootPart.m_attachedAvatar = LLUUID.Zero; 675 m_rootPart.m_attachedAvatar = LLUUID.Zero;
@@ -661,6 +677,7 @@ namespace OpenSim.Region.Environment.Scenes
661 m_rootPart.SetAttachmentPoint((byte)0); 677 m_rootPart.SetAttachmentPoint((byte)0);
662 m_rootPart.m_IsAttachment = false; 678 m_rootPart.m_IsAttachment = false;
663 m_rootPart.ApplyPhysics(m_rootPart.ObjectFlags, m_scene.m_physicalPrim); 679 m_rootPart.ApplyPhysics(m_rootPart.ObjectFlags, m_scene.m_physicalPrim);
680 AttachToBackup();
664 m_rootPart.ScheduleFullUpdate(); 681 m_rootPart.ScheduleFullUpdate();
665 } 682 }
666 /// <summary> 683 /// <summary>
@@ -1395,26 +1412,36 @@ namespace OpenSim.Region.Environment.Scenes
1395 1412
1396 lock (m_parts) 1413 lock (m_parts)
1397 { 1414 {
1415 //if (m_rootPart.m_IsAttachment)
1416 //{
1417 //foreach (SceneObjectPart part in m_parts.Values)
1418 //{
1419 //part.SendScheduledUpdates();
1420 //}
1421 //return;
1422 //}
1423
1398 if (Util.GetDistanceTo(lastPhysGroupPos, AbsolutePosition) > 0.02) 1424 if (Util.GetDistanceTo(lastPhysGroupPos, AbsolutePosition) > 0.02)
1399 { 1425 {
1400 foreach (SceneObjectPart part in m_parts.Values) 1426 m_rootPart.UpdateFlag = 1;
1401 {
1402 if (part.UpdateFlag == 0) part.UpdateFlag = 1;
1403 }
1404
1405 lastPhysGroupPos = AbsolutePosition; 1427 lastPhysGroupPos = AbsolutePosition;
1406 checkAtTargets();
1407 } 1428 }
1429 //foreach (SceneObjectPart part in m_parts.Values)
1430 //{
1431 //if (part.UpdateFlag == 0) part.UpdateFlag = 1;
1432 //}
1433
1434
1435
1436 checkAtTargets();
1437
1408 1438
1409 if ((Math.Abs(lastPhysGroupRot.W - GroupRotation.W) > 0.1) 1439 if ((Math.Abs(lastPhysGroupRot.W - GroupRotation.W) > 0.1)
1410 || (Math.Abs(lastPhysGroupRot.X - GroupRotation.X) > 0.1) 1440 || (Math.Abs(lastPhysGroupRot.X - GroupRotation.X) > 0.1)
1411 || (Math.Abs(lastPhysGroupRot.Y - GroupRotation.Y) > 0.1) 1441 || (Math.Abs(lastPhysGroupRot.Y - GroupRotation.Y) > 0.1)
1412 || (Math.Abs(lastPhysGroupRot.Z - GroupRotation.Z) > 0.1)) 1442 || (Math.Abs(lastPhysGroupRot.Z - GroupRotation.Z) > 0.1))
1413 { 1443 {
1414 foreach (SceneObjectPart part in m_parts.Values) 1444 m_rootPart.UpdateFlag = 1;
1415 {
1416 if (part.UpdateFlag == 0) part.UpdateFlag = 1;
1417 }
1418 1445
1419 lastPhysGroupRot = GroupRotation; 1446 lastPhysGroupRot = GroupRotation;
1420 } 1447 }
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
index 6a12fb9..b7e72ef 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
@@ -1300,6 +1300,13 @@ namespace OpenSim.Region.Environment.Scenes
1300 public void SetAttachmentPoint(uint AttachmentPoint) 1300 public void SetAttachmentPoint(uint AttachmentPoint)
1301 { 1301 {
1302 m_attachmentPoint = AttachmentPoint; 1302 m_attachmentPoint = AttachmentPoint;
1303
1304 // save the attachment point.
1305 //if (AttachmentPoint != 0)
1306 //{
1307 m_shape.State = (byte)AttachmentPoint;
1308 //}
1309
1303 } 1310 }
1304 /// <summary> 1311 /// <summary>
1305 /// 1312 ///
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
index 94dbbb3..6a56204 100644
--- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
@@ -117,6 +117,8 @@ namespace OpenSim.Region.Environment.Scenes
117 117
118 protected AvatarAppearance m_appearance; 118 protected AvatarAppearance m_appearance;
119 119
120 protected List<SceneObjectGroup> m_attachments = new List<SceneObjectGroup>();
121
120 //neighbouring regions we have enabled a child agent in 122 //neighbouring regions we have enabled a child agent in
121 private readonly List<ulong> m_knownChildRegions = new List<ulong>(); 123 private readonly List<ulong> m_knownChildRegions = new List<ulong>();
122 124
@@ -1672,8 +1674,8 @@ namespace OpenSim.Region.Environment.Scenes
1672 // When the neighbour is informed of the border crossing, it will set up CAPS handlers for the avatar 1674 // When the neighbour is informed of the border crossing, it will set up CAPS handlers for the avatar
1673 // This means we need to remove the current caps handler here and possibly compensate later, 1675 // This means we need to remove the current caps handler here and possibly compensate later,
1674 // in case both scenes are being hosted on the same region server. Messy 1676 // in case both scenes are being hosted on the same region server. Messy
1675 m_scene.RemoveCapsHandler(UUID); 1677 m_scene.RemoveCapsHandler(UUID);
1676 1678 newpos = newpos + (vel);
1677 bool res = 1679 bool res =
1678 m_scene.InformNeighbourOfCrossing(neighbourHandle, m_controllingClient.AgentId, newpos, 1680 m_scene.InformNeighbourOfCrossing(neighbourHandle, m_controllingClient.AgentId, newpos,
1679 m_physicsActor.Flying); 1681 m_physicsActor.Flying);
@@ -1692,6 +1694,7 @@ namespace OpenSim.Region.Environment.Scenes
1692 m_controllingClient.CrossRegion(neighbourHandle, newpos, vel, neighbourRegion.ExternalEndPoint, 1694 m_controllingClient.CrossRegion(neighbourHandle, newpos, vel, neighbourRegion.ExternalEndPoint,
1693 capsPath); 1695 capsPath);
1694 MakeChildAgent(); 1696 MakeChildAgent();
1697 CrossAttachmentsIntoNewRegion(neighbourHandle);
1695 m_scene.SendKillObject(m_localId); 1698 m_scene.SendKillObject(m_localId);
1696 m_scene.NotifyMyCoarseLocationChange(); 1699 m_scene.NotifyMyCoarseLocationChange();
1697 } 1700 }
@@ -1943,7 +1946,43 @@ namespace OpenSim.Region.Environment.Scenes
1943 DefaultTexture = textu.ToBytes(); 1946 DefaultTexture = textu.ToBytes();
1944 } 1947 }
1945 } 1948 }
1949 public void AddAttachment(SceneObjectGroup gobj)
1950 {
1951 lock (m_attachments)
1952 {
1953 m_attachments.Add(gobj);
1954 }
1955 }
1956 public void RemoveAttachment(SceneObjectGroup gobj)
1957 {
1958 lock (m_attachments)
1959 {
1960 if (m_attachments.Contains(gobj))
1961 {
1962 m_attachments.Remove(gobj);
1963 }
1964 }
1965 }
1966 public void CrossAttachmentsIntoNewRegion(ulong regionHandle)
1967 {
1968 lock (m_attachments)
1969 {
1970 foreach (SceneObjectGroup gobj in m_attachments)
1971 {
1972 // If the prim group is null then something must have happened to it!
1973 if (gobj != null)
1974 {
1975 // Set the parent localID to 0 so it transfers over properly.
1976 gobj.RootPart.SetParentLocalId(0);
1977 gobj.RootPart.m_IsAttachment = false;
1978 gobj.AbsolutePosition = gobj.RootPart.m_attachedPos;
1979 m_scene.CrossPrimGroupIntoNewRegion(regionHandle, gobj);
1980 }
1981 }
1982 m_attachments.Clear();
1983 }
1946 1984
1985 }
1947 public void initializeScenePresence(IClientAPI client, RegionInfo region, Scene scene) 1986 public void initializeScenePresence(IClientAPI client, RegionInfo region, Scene scene)
1948 { 1987 {
1949 m_controllingClient = client; 1988 m_controllingClient = client;