diff options
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r-- | OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs | 72 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 109 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.cs | 26 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneGraph.cs | 121 |
4 files changed, 95 insertions, 233 deletions
diff --git a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs new file mode 100644 index 0000000..367ff3d --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs | |||
@@ -0,0 +1,72 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using OpenMetaverse; | ||
30 | using OpenSim.Framework; | ||
31 | using OpenSim.Region.Framework.Scenes; | ||
32 | |||
33 | namespace OpenSim.Region.Framework.Interfaces | ||
34 | { | ||
35 | public interface IAttachmentsModule | ||
36 | { | ||
37 | /// <summary> | ||
38 | /// Attach an object to an avatar. | ||
39 | /// </summary> | ||
40 | /// <param name="controllingClient"></param> | ||
41 | /// <param name="localID"></param> | ||
42 | /// <param name="attachPoint"></param> | ||
43 | /// <param name="rot"></param> | ||
44 | /// <param name="pos"></param> | ||
45 | /// <param name="silent"></param> | ||
46 | /// <returns>true if the object was successfully attached, false otherwise</returns> | ||
47 | bool AttachObject( | ||
48 | IClientAPI controllingClient, uint localID, uint attachPoint, Quaternion rot, Vector3 pos, bool silent); | ||
49 | |||
50 | /// <summary> | ||
51 | /// Update the user inventory to the attachment of an item | ||
52 | /// </summary> | ||
53 | /// <param name="att"></param> | ||
54 | /// <param name="remoteClient"></param> | ||
55 | /// <param name="itemID"></param> | ||
56 | /// <param name="AttachmentPt"></param> | ||
57 | /// <returns></returns> | ||
58 | UUID SetAttachmentInventoryStatus( | ||
59 | SceneObjectGroup att, IClientAPI remoteClient, UUID itemID, uint AttachmentPt); | ||
60 | |||
61 | /// <summary> | ||
62 | /// Update the user inventory to show a detach. | ||
63 | /// </summary> | ||
64 | /// <param name="itemID"> | ||
65 | /// A <see cref="UUID"/> | ||
66 | /// </param> | ||
67 | /// <param name="remoteClient"> | ||
68 | /// A <see cref="IClientAPI"/> | ||
69 | /// </param> | ||
70 | void ShowDetachInUserInventory(UUID itemID, IClientAPI remoteClient); | ||
71 | } | ||
72 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 5f3cd8c..dad0efd 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -1858,39 +1858,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
1858 | 1858 | ||
1859 | if (att == null) | 1859 | if (att == null) |
1860 | { | 1860 | { |
1861 | DetachSingleAttachmentToInv(itemID, remoteClient); | 1861 | AttachmentsModule.ShowDetachInUserInventory(itemID, remoteClient); |
1862 | return UUID.Zero; | 1862 | return UUID.Zero; |
1863 | } | 1863 | } |
1864 | 1864 | ||
1865 | return RezSingleAttachment(att, remoteClient, itemID, AttachmentPt); | 1865 | return AttachmentsModule.SetAttachmentInventoryStatus(att, remoteClient, itemID, AttachmentPt); |
1866 | } | ||
1867 | |||
1868 | /// <summary> | ||
1869 | /// Update the user inventory to reflect an attachment | ||
1870 | /// </summary> | ||
1871 | /// <param name="att"></param> | ||
1872 | /// <param name="remoteClient"></param> | ||
1873 | /// <param name="itemID"></param> | ||
1874 | /// <param name="AttachmentPt"></param> | ||
1875 | /// <returns></returns> | ||
1876 | public UUID RezSingleAttachment(SceneObjectGroup att, IClientAPI remoteClient, UUID itemID, uint AttachmentPt) | ||
1877 | { | ||
1878 | m_log.DebugFormat( | ||
1879 | "[USER INVENTORY]: Updating inventory of {0} to show attachment of {1} (item ID {2})", | ||
1880 | remoteClient.Name, att.Name, itemID); | ||
1881 | |||
1882 | if (!att.IsDeleted) | ||
1883 | AttachmentPt = att.RootPart.AttachmentPoint; | ||
1884 | |||
1885 | ScenePresence presence; | ||
1886 | if (TryGetAvatar(remoteClient.AgentId, out presence)) | ||
1887 | { | ||
1888 | InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); | ||
1889 | item = InventoryService.GetItem(item); | ||
1890 | |||
1891 | presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /*att.UUID*/); | ||
1892 | } | ||
1893 | return att.UUID; | ||
1894 | } | 1866 | } |
1895 | 1867 | ||
1896 | public void RezMultipleAttachments(IClientAPI remoteClient, RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header, | 1868 | public void RezMultipleAttachments(IClientAPI remoteClient, RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header, |
@@ -1902,65 +1874,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1902 | } | 1874 | } |
1903 | } | 1875 | } |
1904 | 1876 | ||
1905 | /// <summary> | ||
1906 | /// Attach an object. | ||
1907 | /// </summary> | ||
1908 | /// <param name="controllingClient"></param> | ||
1909 | /// <param name="localID"></param> | ||
1910 | /// <param name="attachPoint"></param> | ||
1911 | /// <param name="rot"></param> | ||
1912 | /// <param name="pos"></param> | ||
1913 | /// <param name="silent"></param> | ||
1914 | /// <returns>true if the object was successfully attached, false otherwise</returns> | ||
1915 | public bool AttachObject(IClientAPI controllingClient, uint localID, uint attachPoint, Quaternion rot, Vector3 pos, bool silent) | ||
1916 | { | ||
1917 | return m_sceneGraph.AttachObject(controllingClient, localID, attachPoint, rot, pos, silent); | ||
1918 | } | ||
1919 | |||
1920 | /// <summary> | ||
1921 | /// This registers the item as attached in a user's inventory | ||
1922 | /// </summary> | ||
1923 | /// <param name="remoteClient"></param> | ||
1924 | /// <param name="AttachmentPt"></param> | ||
1925 | /// <param name="itemID"></param> | ||
1926 | /// <param name="att"></param> | ||
1927 | public void AttachObject(IClientAPI remoteClient, uint AttachmentPt, UUID itemID, SceneObjectGroup att) | ||
1928 | { | ||
1929 | // m_log.DebugFormat( | ||
1930 | // "[USER INVENTORY]: Updating attachment {0} for {1} at {2} using item ID {3}", | ||
1931 | // att.Name, remoteClient.Name, AttachmentPt, itemID); | ||
1932 | |||
1933 | if (UUID.Zero == itemID) | ||
1934 | { | ||
1935 | m_log.Error("[SCENE INVENTORY]: Unable to save attachment. Error inventory item ID."); | ||
1936 | return; | ||
1937 | } | ||
1938 | |||
1939 | if (0 == AttachmentPt) | ||
1940 | { | ||
1941 | m_log.Error("[SCENE INVENTORY]: Unable to save attachment. Error attachment point."); | ||
1942 | return; | ||
1943 | } | ||
1944 | |||
1945 | if (null == att.RootPart) | ||
1946 | { | ||
1947 | m_log.Error("[SCENE INVENTORY]: Unable to save attachment for a prim without the rootpart!"); | ||
1948 | return; | ||
1949 | } | ||
1950 | |||
1951 | ScenePresence presence; | ||
1952 | if (TryGetAvatar(remoteClient.AgentId, out presence)) | ||
1953 | { | ||
1954 | // XXYY!! | ||
1955 | InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); | ||
1956 | item = InventoryService.GetItem(item); | ||
1957 | presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /* att.UUID */); | ||
1958 | |||
1959 | if (m_AvatarFactory != null) | ||
1960 | m_AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance); | ||
1961 | } | ||
1962 | } | ||
1963 | |||
1964 | public void DetachSingleAttachmentToGround(UUID itemID, IClientAPI remoteClient) | 1877 | public void DetachSingleAttachmentToGround(UUID itemID, IClientAPI remoteClient) |
1965 | { | 1878 | { |
1966 | SceneObjectPart part = GetSceneObjectPart(itemID); | 1879 | SceneObjectPart part = GetSceneObjectPart(itemID); |
@@ -1991,24 +1904,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1991 | SendAttachEvent(part.ParentGroup.LocalId, itemID, UUID.Zero); | 1904 | SendAttachEvent(part.ParentGroup.LocalId, itemID, UUID.Zero); |
1992 | } | 1905 | } |
1993 | 1906 | ||
1994 | public void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient) | ||
1995 | { | ||
1996 | ScenePresence presence; | ||
1997 | if (TryGetAvatar(remoteClient.AgentId, out presence)) | ||
1998 | { | ||
1999 | presence.Appearance.DetachAttachment(itemID); | ||
2000 | |||
2001 | // Save avatar attachment information | ||
2002 | if (m_AvatarFactory != null) | ||
2003 | { | ||
2004 | m_log.Info("[SCENE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId + ", ItemID: " + itemID); | ||
2005 | m_AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance); | ||
2006 | } | ||
2007 | } | ||
2008 | |||
2009 | m_sceneGraph.DetachSingleAttachmentToInv(itemID, remoteClient); | ||
2010 | } | ||
2011 | |||
2012 | public void GetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID) | 1907 | public void GetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID) |
2013 | { | 1908 | { |
2014 | EventManager.TriggerGetScriptRunning(controllingClient, objectID, itemID); | 1909 | EventManager.TriggerGetScriptRunning(controllingClient, objectID, itemID); |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 8f9663c..30c69a8 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -307,6 +307,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
307 | 307 | ||
308 | protected IXMLRPC m_xmlrpcModule; | 308 | protected IXMLRPC m_xmlrpcModule; |
309 | protected IWorldComm m_worldCommModule; | 309 | protected IWorldComm m_worldCommModule; |
310 | public IAttachmentsModule AttachmentsModule { get; set; } | ||
310 | protected IAvatarFactory m_AvatarFactory; | 311 | protected IAvatarFactory m_AvatarFactory; |
311 | public IAvatarFactory AvatarFactory | 312 | public IAvatarFactory AvatarFactory |
312 | { | 313 | { |
@@ -1212,6 +1213,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1212 | m_worldCommModule = RequestModuleInterface<IWorldComm>(); | 1213 | m_worldCommModule = RequestModuleInterface<IWorldComm>(); |
1213 | XferManager = RequestModuleInterface<IXfer>(); | 1214 | XferManager = RequestModuleInterface<IXfer>(); |
1214 | m_AvatarFactory = RequestModuleInterface<IAvatarFactory>(); | 1215 | m_AvatarFactory = RequestModuleInterface<IAvatarFactory>(); |
1216 | AttachmentsModule = RequestModuleInterface<IAttachmentsModule>(); | ||
1215 | m_serialiser = RequestModuleInterface<IRegionSerialiserModule>(); | 1217 | m_serialiser = RequestModuleInterface<IRegionSerialiserModule>(); |
1216 | m_dialogModule = RequestModuleInterface<IDialogModule>(); | 1218 | m_dialogModule = RequestModuleInterface<IDialogModule>(); |
1217 | m_capsModule = RequestModuleInterface<ICapabilitiesModule>(); | 1219 | m_capsModule = RequestModuleInterface<ICapabilitiesModule>(); |
@@ -2402,9 +2404,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
2402 | //grp.SetFromAssetID(grp.RootPart.LastOwnerID); | 2404 | //grp.SetFromAssetID(grp.RootPart.LastOwnerID); |
2403 | m_log.DebugFormat( | 2405 | m_log.DebugFormat( |
2404 | "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); | 2406 | "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); |
2407 | |||
2408 | if (AttachmentsModule != null) | ||
2409 | AttachmentsModule.AttachObject( | ||
2410 | sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false); | ||
2405 | 2411 | ||
2406 | AttachObject( | ||
2407 | sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false); | ||
2408 | RootPrim.RemFlag(PrimFlags.TemporaryOnRez); | 2412 | RootPrim.RemFlag(PrimFlags.TemporaryOnRez); |
2409 | grp.SendGroupFullUpdate(); | 2413 | grp.SendGroupFullUpdate(); |
2410 | } | 2414 | } |
@@ -2639,10 +2643,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
2639 | public virtual void SubscribeToClientAttachmentEvents(IClientAPI client) | 2643 | public virtual void SubscribeToClientAttachmentEvents(IClientAPI client) |
2640 | { | 2644 | { |
2641 | client.OnRezSingleAttachmentFromInv += RezSingleAttachment; | 2645 | client.OnRezSingleAttachmentFromInv += RezSingleAttachment; |
2642 | client.OnRezMultipleAttachmentsFromInv += RezMultipleAttachments; | 2646 | client.OnRezMultipleAttachmentsFromInv += RezMultipleAttachments; |
2643 | client.OnDetachAttachmentIntoInv += DetachSingleAttachmentToInv; | ||
2644 | client.OnObjectAttach += m_sceneGraph.AttachObject; | 2647 | client.OnObjectAttach += m_sceneGraph.AttachObject; |
2645 | client.OnObjectDetach += m_sceneGraph.DetachObject; | 2648 | client.OnObjectDetach += m_sceneGraph.DetachObject; |
2649 | |||
2650 | if (AttachmentsModule != null) | ||
2651 | client.OnDetachAttachmentIntoInv += AttachmentsModule.ShowDetachInUserInventory; | ||
2646 | } | 2652 | } |
2647 | 2653 | ||
2648 | public virtual void SubscribeToClientTeleportEvents(IClientAPI client) | 2654 | public virtual void SubscribeToClientTeleportEvents(IClientAPI client) |
@@ -2689,8 +2695,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2689 | } | 2695 | } |
2690 | 2696 | ||
2691 | protected virtual void UnsubscribeToClientEvents(IClientAPI client) | 2697 | protected virtual void UnsubscribeToClientEvents(IClientAPI client) |
2692 | { | 2698 | { |
2693 | |||
2694 | } | 2699 | } |
2695 | 2700 | ||
2696 | /// <summary> | 2701 | /// <summary> |
@@ -2712,7 +2717,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2712 | 2717 | ||
2713 | UnSubscribeToClientNetworkEvents(client); | 2718 | UnSubscribeToClientNetworkEvents(client); |
2714 | 2719 | ||
2715 | |||
2716 | // EventManager.TriggerOnNewClient(client); | 2720 | // EventManager.TriggerOnNewClient(client); |
2717 | } | 2721 | } |
2718 | 2722 | ||
@@ -2792,12 +2796,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
2792 | } | 2796 | } |
2793 | 2797 | ||
2794 | public virtual void UnSubscribeToClientAttachmentEvents(IClientAPI client) | 2798 | public virtual void UnSubscribeToClientAttachmentEvents(IClientAPI client) |
2795 | { | 2799 | { |
2796 | client.OnRezSingleAttachmentFromInv -= RezSingleAttachment; | ||
2797 | client.OnRezMultipleAttachmentsFromInv -= RezMultipleAttachments; | 2800 | client.OnRezMultipleAttachmentsFromInv -= RezMultipleAttachments; |
2798 | client.OnDetachAttachmentIntoInv -= DetachSingleAttachmentToInv; | 2801 | client.OnRezSingleAttachmentFromInv -= RezSingleAttachment; |
2799 | client.OnObjectAttach -= m_sceneGraph.AttachObject; | 2802 | client.OnObjectAttach -= m_sceneGraph.AttachObject; |
2800 | client.OnObjectDetach -= m_sceneGraph.DetachObject; | 2803 | client.OnObjectDetach -= m_sceneGraph.DetachObject; |
2804 | |||
2805 | if (AttachmentsModule != null) | ||
2806 | client.OnDetachAttachmentIntoInv -= AttachmentsModule.ShowDetachInUserInventory; | ||
2801 | } | 2807 | } |
2802 | 2808 | ||
2803 | public virtual void UnSubscribeToClientTeleportEvents(IClientAPI client) | 2809 | public virtual void UnSubscribeToClientTeleportEvents(IClientAPI client) |
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; |