aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/SceneGraph.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneGraph.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs121
1 files changed, 5 insertions, 116 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 22613e9..380722d 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -452,7 +452,7 @@ namespace OpenSim.Region.Framework.Scenes
452 if (group != null) 452 if (group != null)
453 { 453 {
454 //group.DetachToGround(); 454 //group.DetachToGround();
455 m_parentScene.DetachSingleAttachmentToInv(group.GetFromItemID(), remoteClient); 455 m_parentScene.AttachmentsModule.ShowDetachInUserInventory(group.GetFromItemID(), remoteClient);
456 } 456 }
457 } 457 }
458 458
@@ -504,7 +504,7 @@ namespace OpenSim.Region.Framework.Scenes
504 return; 504 return;
505 505
506 // Calls attach with a Zero position 506 // Calls attach with a Zero position
507 if (AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, Vector3.Zero, false)) 507 if (m_parentScene.AttachmentsModule.AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, Vector3.Zero, false))
508 { 508 {
509 m_parentScene.SendAttachEvent(objectLocalID, part.ParentGroup.GetFromItemID(), remoteClient.AgentId); 509 m_parentScene.SendAttachEvent(objectLocalID, part.ParentGroup.GetFromItemID(), remoteClient.AgentId);
510 510
@@ -547,8 +547,10 @@ namespace OpenSim.Region.Framework.Scenes
547 if (AttachmentPt != 0 && AttachmentPt != objatt.GetAttachmentPoint()) 547 if (AttachmentPt != 0 && AttachmentPt != objatt.GetAttachmentPoint())
548 tainted = true; 548 tainted = true;
549 549
550 AttachObject(remoteClient, objatt.LocalId, AttachmentPt, Quaternion.Identity, objatt.AbsolutePosition, false); 550 m_parentScene.AttachmentsModule.AttachObject(
551 remoteClient, objatt.LocalId, AttachmentPt, Quaternion.Identity, objatt.AbsolutePosition, false);
551 //objatt.ScheduleGroupForFullUpdate(); 552 //objatt.ScheduleGroupForFullUpdate();
553
552 if (tainted) 554 if (tainted)
553 objatt.HasGroupChanged = true; 555 objatt.HasGroupChanged = true;
554 556
@@ -572,119 +574,6 @@ namespace OpenSim.Region.Framework.Scenes
572 return null; 574 return null;
573 } 575 }
574 576
575 // What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards.
576 // To LocalId or UUID, *THAT* is the question. How now Brown UUID??
577 public void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient)
578 {
579 if (itemID == UUID.Zero) // If this happened, someone made a mistake....
580 return;
581
582 // We can NOT use the dictionries here, as we are looking
583 // for an entity by the fromAssetID, which is NOT the prim UUID
584 //
585 List<EntityBase> detachEntities = GetEntities();
586 SceneObjectGroup group;
587
588 foreach (EntityBase entity in detachEntities)
589 {
590 if (entity is SceneObjectGroup)
591 {
592 group = (SceneObjectGroup)entity;
593 if (group.GetFromItemID() == itemID)
594 {
595 m_parentScene.SendAttachEvent(group.LocalId, itemID, UUID.Zero);
596 group.DetachToInventoryPrep();
597 m_log.Debug("[DETACH]: Saving attachpoint: " +
598 ((uint)group.GetAttachmentPoint()).ToString());
599 m_parentScene.UpdateKnownItem(remoteClient, group,
600 group.GetFromItemID(), group.OwnerID);
601 m_parentScene.DeleteSceneObject(group, false);
602 return;
603 }
604 }
605 }
606 }
607
608 /// <summary>
609 /// Attach a scene object to an avatar.
610 /// </summary>
611 /// <param name="remoteClient"></param>
612 /// <param name="objectLocalID"></param>
613 /// <param name="AttachmentPt"></param>
614 /// <param name="rot"></param>
615 /// <param name="attachPos"></param>
616 /// <param name="silent"></param>
617 /// <returns>true if the attachment was successful, false otherwise</returns>
618 protected internal bool AttachObject(
619 IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, Quaternion rot, Vector3 attachPos, bool silent)
620 {
621 SceneObjectGroup group = GetGroupByPrim(objectLocalID);
622 if (group != null)
623 {
624 if (m_parentScene.Permissions.CanTakeObject(group.UUID, remoteClient.AgentId))
625 {
626 // If the attachment point isn't the same as the one previously used
627 // set it's offset position = 0 so that it appears on the attachment point
628 // and not in a weird location somewhere unknown.
629 if (AttachmentPt != 0 && AttachmentPt != (uint)group.GetAttachmentPoint())
630 {
631 attachPos = Vector3.Zero;
632 }
633
634 // AttachmentPt 0 means the client chose to 'wear' the attachment.
635 if (AttachmentPt == 0)
636 {
637 // Check object for stored attachment point
638 AttachmentPt = (uint)group.GetAttachmentPoint();
639 }
640
641 // if we still didn't find a suitable attachment point.......
642 if (AttachmentPt == 0)
643 {
644 // Stick it on left hand with Zero Offset from the attachment point.
645 AttachmentPt = (uint)AttachmentPoint.LeftHand;
646 attachPos = Vector3.Zero;
647 }
648
649 group.SetAttachmentPoint((byte)AttachmentPt);
650 group.AbsolutePosition = attachPos;
651
652 // Saves and gets itemID
653 UUID itemId;
654
655 if (group.GetFromItemID() == UUID.Zero)
656 {
657 m_parentScene.attachObjectAssetStore(remoteClient, group, remoteClient.AgentId, out itemId);
658 }
659 else
660 {
661 itemId = group.GetFromItemID();
662 }
663
664 m_parentScene.AttachObject(remoteClient, AttachmentPt, itemId, group);
665
666 group.AttachToAgent(remoteClient.AgentId, AttachmentPt, attachPos, silent);
667 // In case it is later dropped again, don't let
668 // it get cleaned up
669 //
670 group.RootPart.RemFlag(PrimFlags.TemporaryOnRez);
671 group.HasGroupChanged = false;
672 }
673 else
674 {
675 remoteClient.SendAgentAlertMessage("You don't have sufficient permissions to attach this object", false);
676 return false;
677 }
678 }
679 else
680 {
681 m_log.DebugFormat("[SCENE GRAPH]: AttachObject found no such scene object {0}", objectLocalID);
682 return false;
683 }
684
685 return true;
686 }
687
688 protected internal ScenePresence CreateAndAddChildScenePresence(IClientAPI client, AvatarAppearance appearance) 577 protected internal ScenePresence CreateAndAddChildScenePresence(IClientAPI client, AvatarAppearance appearance)
689 { 578 {
690 ScenePresence newAvatar = null; 579 ScenePresence newAvatar = null;