aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs14
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs77
2 files changed, 64 insertions, 27 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 11754ea..7df3e50 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -2376,9 +2376,19 @@ namespace OpenSim.Region.Framework.Scenes
2376 } 2376 }
2377 } 2377 }
2378 2378
2379 public void AttachObject(IClientAPI controllingClient, uint localID, uint attachPoint, Quaternion rot, Vector3 pos, bool silent) 2379 /// <summary>
2380 /// Attach an object.
2381 /// </summary>
2382 /// <param name="controllingClient"></param>
2383 /// <param name="localID"></param>
2384 /// <param name="attachPoint"></param>
2385 /// <param name="rot"></param>
2386 /// <param name="pos"></param>
2387 /// <param name="silent"></param>
2388 /// <returns>true if the object was successfully attached, false otherwise</returns>
2389 public bool AttachObject(IClientAPI controllingClient, uint localID, uint attachPoint, Quaternion rot, Vector3 pos, bool silent)
2380 { 2390 {
2381 m_sceneGraph.AttachObject(controllingClient, localID, attachPoint, rot, pos, silent); 2391 return m_sceneGraph.AttachObject(controllingClient, localID, attachPoint, rot, pos, silent);
2382 } 2392 }
2383 2393
2384 public void AttachObject(IClientAPI remoteClient, uint AttachmentPt, UUID itemID, SceneObjectGroup att) 2394 public void AttachObject(IClientAPI remoteClient, uint AttachmentPt, UUID itemID, SceneObjectGroup att)
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index f74fd5d..fc2798d 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -478,46 +478,59 @@ namespace OpenSim.Region.Framework.Scenes
478 if (part == null) 478 if (part == null)
479 return; 479 return;
480 480
481 if (!m_parentScene.Permissions.CanTakeObject( 481 if (!m_parentScene.Permissions.CanTakeObject(part.UUID, remoteClient.AgentId))
482 part.UUID, remoteClient.AgentId))
483 return; 482 return;
484 483
485 // Calls attach with a Zero position 484 // Calls attach with a Zero position
486 AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, Vector3.Zero, false); 485 if (AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, Vector3.Zero, false))
487 m_parentScene.SendAttachEvent(objectLocalID, part.ParentGroup.GetFromItemID(), remoteClient.AgentId);
488
489 // Save avatar attachment information
490 ScenePresence presence;
491 if (m_parentScene.AvatarFactory != null && m_parentScene.TryGetAvatar(remoteClient.AgentId, out presence))
492 { 486 {
493 m_log.Info("[SCENE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId + ", AttachmentPoint: " + AttachmentPt); 487 m_parentScene.SendAttachEvent(objectLocalID, part.ParentGroup.GetFromItemID(), remoteClient.AgentId);
494 m_parentScene.AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance); 488
489 // Save avatar attachment information
490 ScenePresence presence;
491 if (m_parentScene.AvatarFactory != null && m_parentScene.TryGetAvatar(remoteClient.AgentId, out presence))
492 {
493 m_log.Info(
494 "[SCENE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId
495 + ", AttachmentPoint: " + AttachmentPt);
496
497 m_parentScene.AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance);
498 }
495 } 499 }
496 } 500 }
497 501
498 public SceneObjectGroup RezSingleAttachment( 502 /// <summary>
499 IClientAPI remoteClient, UUID itemID, uint AttachmentPt) 503 /// Rez an attachment
504 /// </summary>
505 /// <param name="remoteClient"></param>
506 /// <param name="itemID"></param>
507 /// <param name="AttachmentPt"></param>
508 /// <returns>The scene object that was attached. Null if the scene object could not be found</returns>
509 public SceneObjectGroup RezSingleAttachment(IClientAPI remoteClient, UUID itemID, uint AttachmentPt)
500 { 510 {
501 SceneObjectGroup objatt = m_parentScene.RezObject(remoteClient, 511 SceneObjectGroup objatt = m_parentScene.RezObject(remoteClient,
502 itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, 512 itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true,
503 false, false, remoteClient.AgentId, true); 513 false, false, remoteClient.AgentId, true);
504 514
505
506 if (objatt != null) 515 if (objatt != null)
507 { 516 {
508 bool tainted = false; 517 bool tainted = false;
509 if (AttachmentPt != 0 && AttachmentPt != objatt.GetAttachmentPoint()) 518 if (AttachmentPt != 0 && AttachmentPt != objatt.GetAttachmentPoint())
510 tainted = true; 519 tainted = true;
511 520
512 AttachObject(remoteClient, objatt.LocalId, AttachmentPt, Quaternion.Identity, objatt.AbsolutePosition, false); 521 if (AttachObject(
513 objatt.ScheduleGroupForFullUpdate(); 522 remoteClient, objatt.LocalId, AttachmentPt, Quaternion.Identity, objatt.AbsolutePosition, false))
514 if (tainted) 523 {
515 objatt.HasGroupChanged = true; 524 objatt.ScheduleGroupForFullUpdate();
516 525 if (tainted)
517 // Fire after attach, so we don't get messy perms dialogs 526 objatt.HasGroupChanged = true;
518 // 3 == AttachedRez 527
519 objatt.CreateScriptInstances(0, true, m_parentScene.DefaultScriptEngine, 3); 528 // Fire after attach, so we don't get messy perms dialogs
529 // 3 == AttachedRez
530 objatt.CreateScriptInstances(0, true, m_parentScene.DefaultScriptEngine, 3);
531 }
520 } 532 }
533
521 return objatt; 534 return objatt;
522 } 535 }
523 536
@@ -554,7 +567,17 @@ namespace OpenSim.Region.Framework.Scenes
554 } 567 }
555 } 568 }
556 569
557 protected internal void AttachObject( 570 /// <summary>
571 /// Attach a scene object to an avatar.
572 /// </summary>
573 /// <param name="remoteClient"></param>
574 /// <param name="objectLocalID"></param>
575 /// <param name="AttachmentPt"></param>
576 /// <param name="rot"></param>
577 /// <param name="attachPos"></param>
578 /// <param name="silent"></param>
579 /// <returns>true if the attachment was successful, false otherwise</returns>
580 protected internal bool AttachObject(
558 IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, Quaternion rot, Vector3 attachPos, bool silent) 581 IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, Quaternion rot, Vector3 attachPos, bool silent)
559 { 582 {
560 SceneObjectGroup group = GetGroupByPrim(objectLocalID); 583 SceneObjectGroup group = GetGroupByPrim(objectLocalID);
@@ -583,10 +606,8 @@ namespace OpenSim.Region.Framework.Scenes
583 // Stick it on left hand with Zero Offset from the attachment point. 606 // Stick it on left hand with Zero Offset from the attachment point.
584 AttachmentPt = (uint)AttachmentPoint.LeftHand; 607 AttachmentPt = (uint)AttachmentPoint.LeftHand;
585 attachPos = Vector3.Zero; 608 attachPos = Vector3.Zero;
586
587 } 609 }
588 610
589
590 group.SetAttachmentPoint((byte)AttachmentPt); 611 group.SetAttachmentPoint((byte)AttachmentPt);
591 group.AbsolutePosition = attachPos; 612 group.AbsolutePosition = attachPos;
592 613
@@ -609,15 +630,21 @@ namespace OpenSim.Region.Framework.Scenes
609 // it get cleaned up 630 // it get cleaned up
610 // 631 //
611 group.RootPart.RemFlag(PrimFlags.TemporaryOnRez); 632 group.RootPart.RemFlag(PrimFlags.TemporaryOnRez);
612 group.HasGroupChanged = false; 633 group.HasGroupChanged = false;
613 } 634 }
614 else 635 else
615 { 636 {
616 remoteClient.SendAgentAlertMessage("You don't have sufficient permissions to attach this object", false); 637 remoteClient.SendAgentAlertMessage("You don't have sufficient permissions to attach this object", false);
638 return false;
617 } 639 }
618 } 640 }
619 else 641 else
642 {
620 m_log.DebugFormat("[SCENE GRAPH]: AttachObject found no such scene object {0}", objectLocalID); 643 m_log.DebugFormat("[SCENE GRAPH]: AttachObject found no such scene object {0}", objectLocalID);
644 return false;
645 }
646
647 return true;
621 } 648 }
622 649
623 protected internal ScenePresence CreateAndAddChildScenePresence(IClientAPI client, AvatarAppearance appearance) 650 protected internal ScenePresence CreateAndAddChildScenePresence(IClientAPI client, AvatarAppearance appearance)