diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneGraph.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneGraph.cs | 121 |
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; |