diff options
Diffstat (limited to 'OpenSim/Region')
7 files changed, 499 insertions, 238 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs new file mode 100644 index 0000000..d458364 --- /dev/null +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs | |||
@@ -0,0 +1,257 @@ | |||
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 OpenSimulator 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.Collections.Generic; | ||
29 | using System.Reflection; | ||
30 | using log4net; | ||
31 | using Nini.Config; | ||
32 | using OpenMetaverse; | ||
33 | using OpenSim.Framework; | ||
34 | using OpenSim.Region.Framework; | ||
35 | using OpenSim.Region.Framework.Interfaces; | ||
36 | using OpenSim.Region.Framework.Scenes; | ||
37 | |||
38 | namespace OpenSim.Region.CoreModules.Avatar.Attachments | ||
39 | { | ||
40 | public class AttachmentsModule : IAttachmentsModule, IRegionModule | ||
41 | { | ||
42 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
43 | |||
44 | protected Scene m_scene = null; | ||
45 | |||
46 | public void Initialise(Scene scene, IConfigSource source) | ||
47 | { | ||
48 | scene.RegisterModuleInterface<IAttachmentsModule>(this); | ||
49 | m_scene = scene; | ||
50 | } | ||
51 | |||
52 | public void PostInitialise() | ||
53 | { | ||
54 | } | ||
55 | |||
56 | public void Close() | ||
57 | { | ||
58 | } | ||
59 | |||
60 | public string Name | ||
61 | { | ||
62 | get { return "Attachments Module"; } | ||
63 | } | ||
64 | |||
65 | public bool IsSharedModule | ||
66 | { | ||
67 | get { return false; } | ||
68 | } | ||
69 | |||
70 | public bool AttachObject( | ||
71 | IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, Quaternion rot, Vector3 attachPos, bool silent) | ||
72 | { | ||
73 | SceneObjectGroup group = m_scene.GetGroupByPrim(objectLocalID); | ||
74 | if (group != null) | ||
75 | { | ||
76 | if (m_scene.Permissions.CanTakeObject(group.UUID, remoteClient.AgentId)) | ||
77 | { | ||
78 | // If the attachment point isn't the same as the one previously used | ||
79 | // set it's offset position = 0 so that it appears on the attachment point | ||
80 | // and not in a weird location somewhere unknown. | ||
81 | if (AttachmentPt != 0 && AttachmentPt != (uint)group.GetAttachmentPoint()) | ||
82 | { | ||
83 | attachPos = Vector3.Zero; | ||
84 | } | ||
85 | |||
86 | // AttachmentPt 0 means the client chose to 'wear' the attachment. | ||
87 | if (AttachmentPt == 0) | ||
88 | { | ||
89 | // Check object for stored attachment point | ||
90 | AttachmentPt = (uint)group.GetAttachmentPoint(); | ||
91 | } | ||
92 | |||
93 | // if we still didn't find a suitable attachment point....... | ||
94 | if (AttachmentPt == 0) | ||
95 | { | ||
96 | // Stick it on left hand with Zero Offset from the attachment point. | ||
97 | AttachmentPt = (uint)AttachmentPoint.LeftHand; | ||
98 | attachPos = Vector3.Zero; | ||
99 | } | ||
100 | |||
101 | group.SetAttachmentPoint((byte)AttachmentPt); | ||
102 | group.AbsolutePosition = attachPos; | ||
103 | |||
104 | // Saves and gets itemID | ||
105 | UUID itemId; | ||
106 | |||
107 | if (group.GetFromItemID() == UUID.Zero) | ||
108 | { | ||
109 | m_scene.attachObjectAssetStore(remoteClient, group, remoteClient.AgentId, out itemId); | ||
110 | } | ||
111 | else | ||
112 | { | ||
113 | itemId = group.GetFromItemID(); | ||
114 | } | ||
115 | |||
116 | SetAttachmentInventoryStatus(remoteClient, AttachmentPt, itemId, group); | ||
117 | |||
118 | group.AttachToAgent(remoteClient.AgentId, AttachmentPt, attachPos, silent); | ||
119 | |||
120 | // In case it is later dropped again, don't let | ||
121 | // it get cleaned up | ||
122 | group.RootPart.RemFlag(PrimFlags.TemporaryOnRez); | ||
123 | group.HasGroupChanged = false; | ||
124 | } | ||
125 | else | ||
126 | { | ||
127 | remoteClient.SendAgentAlertMessage( | ||
128 | "You don't have sufficient permissions to attach this object", false); | ||
129 | |||
130 | return false; | ||
131 | } | ||
132 | } | ||
133 | else | ||
134 | { | ||
135 | m_log.DebugFormat("[ATTACHMENTS MODULE]: AttachObject found no such scene object {0}", objectLocalID); | ||
136 | return false; | ||
137 | } | ||
138 | |||
139 | return true; | ||
140 | } | ||
141 | |||
142 | public UUID SetAttachmentInventoryStatus( | ||
143 | SceneObjectGroup att, IClientAPI remoteClient, UUID itemID, uint AttachmentPt) | ||
144 | { | ||
145 | m_log.DebugFormat( | ||
146 | "[ATTACHMENTS MODULEY]: Updating inventory of {0} to show attachment of {1} (item ID {2})", | ||
147 | remoteClient.Name, att.Name, itemID); | ||
148 | |||
149 | if (!att.IsDeleted) | ||
150 | AttachmentPt = att.RootPart.AttachmentPoint; | ||
151 | |||
152 | ScenePresence presence; | ||
153 | if (m_scene.TryGetAvatar(remoteClient.AgentId, out presence)) | ||
154 | { | ||
155 | InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); | ||
156 | item = m_scene.InventoryService.GetItem(item); | ||
157 | |||
158 | presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /*att.UUID*/); | ||
159 | } | ||
160 | |||
161 | return att.UUID; | ||
162 | } | ||
163 | |||
164 | /// <summary> | ||
165 | /// Update the user inventory to reflect an attachment | ||
166 | /// </summary> | ||
167 | /// <param name="remoteClient"></param> | ||
168 | /// <param name="AttachmentPt"></param> | ||
169 | /// <param name="itemID"></param> | ||
170 | /// <param name="att"></param> | ||
171 | public void SetAttachmentInventoryStatus( | ||
172 | IClientAPI remoteClient, uint AttachmentPt, UUID itemID, SceneObjectGroup att) | ||
173 | { | ||
174 | // m_log.DebugFormat( | ||
175 | // "[USER INVENTORY]: Updating attachment {0} for {1} at {2} using item ID {3}", | ||
176 | // att.Name, remoteClient.Name, AttachmentPt, itemID); | ||
177 | |||
178 | if (UUID.Zero == itemID) | ||
179 | { | ||
180 | m_log.Error("[ATTACHMENTS MODULE]: Unable to save attachment. Error inventory item ID."); | ||
181 | return; | ||
182 | } | ||
183 | |||
184 | if (0 == AttachmentPt) | ||
185 | { | ||
186 | m_log.Error("[ATTACHMENTS MODULE]: Unable to save attachment. Error attachment point."); | ||
187 | return; | ||
188 | } | ||
189 | |||
190 | if (null == att.RootPart) | ||
191 | { | ||
192 | m_log.Error("[ATTACHMENTS MODULE]: Unable to save attachment for a prim without the rootpart!"); | ||
193 | return; | ||
194 | } | ||
195 | |||
196 | ScenePresence presence; | ||
197 | if (m_scene.TryGetAvatar(remoteClient.AgentId, out presence)) | ||
198 | { | ||
199 | // XXYY!! | ||
200 | InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); | ||
201 | item = m_scene.InventoryService.GetItem(item); | ||
202 | presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /* att.UUID */); | ||
203 | |||
204 | if (m_scene.AvatarFactory != null) | ||
205 | m_scene.AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance); | ||
206 | } | ||
207 | } | ||
208 | |||
209 | public void ShowDetachInUserInventory(UUID itemID, IClientAPI remoteClient) | ||
210 | { | ||
211 | ScenePresence presence; | ||
212 | if (m_scene.TryGetAvatar(remoteClient.AgentId, out presence)) | ||
213 | { | ||
214 | presence.Appearance.DetachAttachment(itemID); | ||
215 | |||
216 | // Save avatar attachment information | ||
217 | if (m_scene.AvatarFactory != null) | ||
218 | { | ||
219 | m_log.Debug("[ATTACHMENTS MODULE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId + ", ItemID: " + itemID); | ||
220 | m_scene.AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance); | ||
221 | } | ||
222 | } | ||
223 | |||
224 | DetachSingleAttachmentToInv(itemID, remoteClient); | ||
225 | } | ||
226 | |||
227 | // What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards. | ||
228 | // To LocalId or UUID, *THAT* is the question. How now Brown UUID?? | ||
229 | protected void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient) | ||
230 | { | ||
231 | if (itemID == UUID.Zero) // If this happened, someone made a mistake.... | ||
232 | return; | ||
233 | |||
234 | // We can NOT use the dictionries here, as we are looking | ||
235 | // for an entity by the fromAssetID, which is NOT the prim UUID | ||
236 | List<EntityBase> detachEntities = m_scene.GetEntities(); | ||
237 | SceneObjectGroup group; | ||
238 | |||
239 | foreach (EntityBase entity in detachEntities) | ||
240 | { | ||
241 | if (entity is SceneObjectGroup) | ||
242 | { | ||
243 | group = (SceneObjectGroup)entity; | ||
244 | if (group.GetFromItemID() == itemID) | ||
245 | { | ||
246 | m_scene.EventManager.TriggerOnAttach(group.LocalId, itemID, UUID.Zero); | ||
247 | group.DetachToInventoryPrep(); | ||
248 | m_log.Debug("[ATTACHMENTS MODULE]: Saving attachpoint: " + ((uint)group.GetAttachmentPoint()).ToString()); | ||
249 | m_scene.UpdateKnownItem(remoteClient, group,group.GetFromItemID(), group.OwnerID); | ||
250 | m_scene.DeleteSceneObject(group, false); | ||
251 | return; | ||
252 | } | ||
253 | } | ||
254 | } | ||
255 | } | ||
256 | } | ||
257 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserGrid/LocalUserGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserGrid/LocalUserGridServiceConnector.cs new file mode 100644 index 0000000..f4309fe --- /dev/null +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserGrid/LocalUserGridServiceConnector.cs | |||
@@ -0,0 +1,139 @@ | |||
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 OpenSimulator 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 System.Collections.Generic; | ||
30 | using System.Reflection; | ||
31 | using log4net; | ||
32 | using Nini.Config; | ||
33 | using OpenSim.Region.Framework.Interfaces; | ||
34 | using OpenSim.Region.Framework.Scenes; | ||
35 | using OpenSim.Server.Base; | ||
36 | using OpenSim.Services.Interfaces; | ||
37 | |||
38 | using OpenMetaverse; | ||
39 | |||
40 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserGrid | ||
41 | { | ||
42 | public class LocalUserGridServicesConnector : ISharedRegionModule, IUserGridService | ||
43 | { | ||
44 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
45 | |||
46 | private IUserGridService m_service; | ||
47 | |||
48 | private bool m_Enabled = false; | ||
49 | |||
50 | public Type ReplaceableInterface | ||
51 | { | ||
52 | get { return null; } | ||
53 | } | ||
54 | |||
55 | public string Name | ||
56 | { | ||
57 | get { return "LocalUserGridServicesConnector"; } | ||
58 | } | ||
59 | |||
60 | public void Initialise(IConfigSource source) | ||
61 | { | ||
62 | IConfig moduleConfig = source.Configs["Modules"]; | ||
63 | if (moduleConfig != null) | ||
64 | { | ||
65 | string name = moduleConfig.GetString("UserGridServices", ""); | ||
66 | if (name == Name) | ||
67 | { | ||
68 | IConfig userConfig = source.Configs["UserGridService"]; | ||
69 | if (userConfig == null) | ||
70 | { | ||
71 | m_log.Error("[LOCAL USER GRID SERVICE CONNECTOR]: UserGridService missing from ini files"); | ||
72 | return; | ||
73 | } | ||
74 | |||
75 | string serviceDll = userConfig.GetString("LocalServiceModule", String.Empty); | ||
76 | |||
77 | if (serviceDll == String.Empty) | ||
78 | { | ||
79 | m_log.Error("[LOCAL USER GRID SERVICE CONNECTOR]: No LocalServiceModule named in section UserGridService"); | ||
80 | return; | ||
81 | } | ||
82 | |||
83 | Object[] args = new Object[] { source }; | ||
84 | m_service = ServerUtils.LoadPlugin<IUserGridService>(serviceDll, args); | ||
85 | |||
86 | if (m_service == null) | ||
87 | { | ||
88 | m_log.Error("[LOCAL USER GRID SERVICE CONNECTOR]: Can't load UserGrid service"); | ||
89 | return; | ||
90 | } | ||
91 | m_Enabled = true; | ||
92 | m_log.Info("[LOCAL USER GRID SERVICE CONNECTOR]: Local UserGrid connector enabled"); | ||
93 | } | ||
94 | } | ||
95 | } | ||
96 | |||
97 | public void PostInitialise() | ||
98 | { | ||
99 | if (!m_Enabled) | ||
100 | return; | ||
101 | } | ||
102 | |||
103 | public void Close() | ||
104 | { | ||
105 | if (!m_Enabled) | ||
106 | return; | ||
107 | } | ||
108 | |||
109 | public void AddRegion(Scene scene) | ||
110 | { | ||
111 | if (!m_Enabled) | ||
112 | return; | ||
113 | |||
114 | scene.RegisterModuleInterface<IUserGridService>(m_service); | ||
115 | } | ||
116 | |||
117 | public void RemoveRegion(Scene scene) | ||
118 | { | ||
119 | if (!m_Enabled) | ||
120 | return; | ||
121 | } | ||
122 | |||
123 | public void RegionLoaded(Scene scene) | ||
124 | { | ||
125 | if (!m_Enabled) | ||
126 | return; | ||
127 | } | ||
128 | |||
129 | public UserGridInfo GetUserGridInfo(string userID) | ||
130 | { | ||
131 | return m_service.GetUserGridInfo(userID); | ||
132 | } | ||
133 | |||
134 | public bool StoreUserGridInfo(UserGridInfo info) | ||
135 | { | ||
136 | return m_service.StoreUserGridInfo(info); | ||
137 | } | ||
138 | } | ||
139 | } \ No newline at end of file | ||
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; |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 0134b03..8217248 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -2896,9 +2896,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2896 | 2896 | ||
2897 | ScenePresence presence = World.GetScenePresence(m_host.OwnerID); | 2897 | ScenePresence presence = World.GetScenePresence(m_host.OwnerID); |
2898 | 2898 | ||
2899 | m_ScriptEngine.World.AttachObject(presence.ControllingClient, | 2899 | IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; |
2900 | grp.LocalId, (uint)attachment, Quaternion.Identity, | 2900 | if (attachmentsModule != null) |
2901 | Vector3.Zero, false); | 2901 | attachmentsModule.AttachObject( |
2902 | presence.ControllingClient, grp.LocalId, | ||
2903 | (uint)attachment, Quaternion.Identity, Vector3.Zero, false); | ||
2902 | } | 2904 | } |
2903 | } | 2905 | } |
2904 | 2906 | ||
@@ -2929,8 +2931,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2929 | 2931 | ||
2930 | ScenePresence presence = World.GetScenePresence(m_host.OwnerID); | 2932 | ScenePresence presence = World.GetScenePresence(m_host.OwnerID); |
2931 | 2933 | ||
2932 | m_ScriptEngine.World.DetachSingleAttachmentToInv(itemID, | 2934 | IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; |
2933 | presence.ControllingClient); | 2935 | if (attachmentsModule != null) |
2936 | attachmentsModule.ShowDetachInUserInventory(itemID, presence.ControllingClient); | ||
2934 | } | 2937 | } |
2935 | } | 2938 | } |
2936 | 2939 | ||