aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs135
-rw-r--r--OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs8
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs2
3 files changed, 84 insertions, 61 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index 97a1be6..c96de3a 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -105,6 +105,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
105 105
106 try 106 try
107 { 107 {
108 ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId);
109
110 if (sp == null)
111 {
112 m_log.ErrorFormat(
113 "[ATTACHMENTS MODULE]: Could not find presence for client {0} {1}", remoteClient.Name, remoteClient.AgentId);
114 return;
115 }
116
108 // If we can't take it, we can't attach it! 117 // If we can't take it, we can't attach it!
109 SceneObjectPart part = m_scene.GetSceneObjectPart(objectLocalID); 118 SceneObjectPart part = m_scene.GetSceneObjectPart(objectLocalID);
110 if (part == null) 119 if (part == null)
@@ -123,7 +132,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
123 AttachmentPt &= 0x7f; 132 AttachmentPt &= 0x7f;
124 133
125 // Calls attach with a Zero position 134 // Calls attach with a Zero position
126 if (AttachObject(remoteClient, part.ParentGroup, AttachmentPt, false)) 135 if (AttachObject(sp, part.ParentGroup, AttachmentPt, false))
127 { 136 {
128 m_scene.EventManager.TriggerOnAttach(objectLocalID, part.ParentGroup.GetFromItemID(), remoteClient.AgentId); 137 m_scene.EventManager.TriggerOnAttach(objectLocalID, part.ParentGroup.GetFromItemID(), remoteClient.AgentId);
129 138
@@ -136,12 +145,26 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
136 } 145 }
137 catch (Exception e) 146 catch (Exception e)
138 { 147 {
139 m_log.DebugFormat("[ATTACHMENTS MODULE]: exception upon Attach Object {0}", e); 148 m_log.ErrorFormat("[ATTACHMENTS MODULE]: exception upon Attach Object {0}{1}", e.Message, e.StackTrace);
140 } 149 }
141 } 150 }
142 151
143 public bool AttachObject(IClientAPI remoteClient, SceneObjectGroup group, uint AttachmentPt, bool silent) 152 public bool AttachObject(IClientAPI remoteClient, SceneObjectGroup group, uint AttachmentPt, bool silent)
144 { 153 {
154 ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId);
155
156 if (sp == null)
157 {
158 m_log.ErrorFormat(
159 "[ATTACHMENTS MODULE]: Could not find presence for client {0} {1}", remoteClient.Name, remoteClient.AgentId);
160 return false;
161 }
162
163 return AttachObject(sp, group, AttachmentPt, silent);
164 }
165
166 public bool AttachObject(ScenePresence sp, SceneObjectGroup group, uint AttachmentPt, bool silent)
167 {
145 Vector3 attachPos = group.AbsolutePosition; 168 Vector3 attachPos = group.AbsolutePosition;
146 169
147 // TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should 170 // TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should
@@ -175,32 +198,29 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
175 group.AbsolutePosition = attachPos; 198 group.AbsolutePosition = attachPos;
176 199
177 // Remove any previous attachments 200 // Remove any previous attachments
178 ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId);
179 UUID itemID = UUID.Zero; 201 UUID itemID = UUID.Zero;
180 if (sp != null) 202 foreach (SceneObjectGroup grp in sp.Attachments)
181 { 203 {
182 foreach (SceneObjectGroup grp in sp.Attachments) 204 if (grp.GetAttachmentPoint() == (byte)AttachmentPt)
183 { 205 {
184 if (grp.GetAttachmentPoint() == (byte)AttachmentPt) 206 itemID = grp.GetFromItemID();
185 { 207 break;
186 itemID = grp.GetFromItemID();
187 break;
188 }
189 } 208 }
190 if (itemID != UUID.Zero)
191 DetachSingleAttachmentToInv(itemID, remoteClient);
192 } 209 }
193 210
211 if (itemID != UUID.Zero)
212 DetachSingleAttachmentToInv(itemID, sp);
213
194 if (group.GetFromItemID() == UUID.Zero) 214 if (group.GetFromItemID() == UUID.Zero)
195 { 215 {
196 m_scene.attachObjectAssetStore(remoteClient, group, remoteClient.AgentId, out itemID); 216 m_scene.attachObjectAssetStore(sp.ControllingClient, group, sp.UUID, out itemID);
197 } 217 }
198 else 218 else
199 { 219 {
200 itemID = group.GetFromItemID(); 220 itemID = group.GetFromItemID();
201 } 221 }
202 222
203 ShowAttachInUserInventory(remoteClient, AttachmentPt, itemID, group); 223 ShowAttachInUserInventory(sp, AttachmentPt, itemID, group);
204 224
205 AttachToAgent(sp, group, AttachmentPt, attachPos, silent); 225 AttachToAgent(sp, group, AttachmentPt, attachPos, silent);
206 226
@@ -229,19 +249,29 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
229// m_log.DebugFormat( 249// m_log.DebugFormat(
230// "[ATTACHMENTS MODULE]: Rezzing attachment to point {0} from item {1} for {2}", 250// "[ATTACHMENTS MODULE]: Rezzing attachment to point {0} from item {1} for {2}",
231// (AttachmentPoint)AttachmentPt, itemID, remoteClient.Name); 251// (AttachmentPoint)AttachmentPt, itemID, remoteClient.Name);
252
253 ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId);
254
255 if (sp == null)
256 {
257 m_log.ErrorFormat(
258 "[ATTACHMENTS MODULE]: Could not find presence for client {0} {1} in RezSingleAttachmentFromInventory()",
259 remoteClient.Name, remoteClient.AgentId);
260 return UUID.Zero;
261 }
232 262
233 // TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should 263 // TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should
234 // be removed when that functionality is implemented in opensim 264 // be removed when that functionality is implemented in opensim
235 AttachmentPt &= 0x7f; 265 AttachmentPt &= 0x7f;
236 266
237 SceneObjectGroup att = RezSingleAttachmentFromInventoryInternal(remoteClient, itemID, AttachmentPt); 267 SceneObjectGroup att = RezSingleAttachmentFromInventoryInternal(sp, itemID, AttachmentPt);
238 268
239 if (updateInventoryStatus) 269 if (updateInventoryStatus)
240 { 270 {
241 if (att == null) 271 if (att == null)
242 ShowDetachInUserInventory(itemID, remoteClient); 272 ShowDetachInUserInventory(itemID, sp.ControllingClient);
243 else 273 else
244 ShowAttachInUserInventory(att, remoteClient, itemID, AttachmentPt); 274 ShowAttachInUserInventory(att, sp, itemID, AttachmentPt);
245 } 275 }
246 276
247 if (null == att) 277 if (null == att)
@@ -250,15 +280,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
250 return att.UUID; 280 return att.UUID;
251 } 281 }
252 282
253 protected SceneObjectGroup RezSingleAttachmentFromInventoryInternal( 283 private SceneObjectGroup RezSingleAttachmentFromInventoryInternal(
254 IClientAPI remoteClient, UUID itemID, uint AttachmentPt) 284 ScenePresence sp, UUID itemID, uint AttachmentPt)
255 { 285 {
256 IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>(); 286 IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>();
257 if (invAccess != null) 287 if (invAccess != null)
258 { 288 {
259 SceneObjectGroup objatt = invAccess.RezObject(remoteClient, 289 SceneObjectGroup objatt = invAccess.RezObject(sp.ControllingClient,
260 itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, 290 itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true,
261 false, false, remoteClient.AgentId, true); 291 false, false, sp.UUID, true);
262 292
263// m_log.DebugFormat( 293// m_log.DebugFormat(
264// "[ATTACHMENTS MODULE]: Retrieved single object {0} for attachment to {1} on point {2}", 294// "[ATTACHMENTS MODULE]: Retrieved single object {0} for attachment to {1} on point {2}",
@@ -277,10 +307,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
277 // This will throw if the attachment fails 307 // This will throw if the attachment fails
278 try 308 try
279 { 309 {
280 AttachObject(remoteClient, objatt, AttachmentPt, false); 310 AttachObject(sp, objatt, AttachmentPt, false);
281 } 311 }
282 catch 312 catch (Exception e)
283 { 313 {
314 m_log.ErrorFormat(
315 "[ATTACHMENTS MODULE]: Failed to attach {0} {1} for {2}, exception {3}{4}",
316 objatt.Name, objatt.UUID, sp.Name, e.Message, e.StackTrace);
317
284 // Make sure the object doesn't stick around and bail 318 // Make sure the object doesn't stick around and bail
285 m_scene.DeleteSceneObject(objatt, false); 319 m_scene.DeleteSceneObject(objatt, false);
286 return null; 320 return null;
@@ -295,13 +329,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
295 objatt.ResumeScripts(); 329 objatt.ResumeScripts();
296 330
297 // Do this last so that event listeners have access to all the effects of the attachment 331 // Do this last so that event listeners have access to all the effects of the attachment
298 m_scene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, remoteClient.AgentId); 332 m_scene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, sp.UUID);
299 } 333 }
300 else 334 else
301 { 335 {
302 m_log.WarnFormat( 336 m_log.WarnFormat(
303 "[ATTACHMENTS MODULE]: Could not retrieve item {0} for attaching to avatar {1} at point {2}", 337 "[ATTACHMENTS MODULE]: Could not retrieve item {0} for attaching to avatar {1} at point {2}",
304 itemID, remoteClient.Name, AttachmentPt); 338 itemID, sp.Name, AttachmentPt);
305 } 339 }
306 340
307 return objatt; 341 return objatt;
@@ -314,12 +348,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
314 /// Update the user inventory to the attachment of an item 348 /// Update the user inventory to the attachment of an item
315 /// </summary> 349 /// </summary>
316 /// <param name="att"></param> 350 /// <param name="att"></param>
317 /// <param name="remoteClient"></param> 351 /// <param name="sp"></param>
318 /// <param name="itemID"></param> 352 /// <param name="itemID"></param>
319 /// <param name="AttachmentPt"></param> 353 /// <param name="AttachmentPt"></param>
320 /// <returns></returns> 354 /// <returns></returns>
321 protected UUID ShowAttachInUserInventory( 355 private UUID ShowAttachInUserInventory(
322 SceneObjectGroup att, IClientAPI remoteClient, UUID itemID, uint AttachmentPt) 356 SceneObjectGroup att, ScenePresence sp, UUID itemID, uint AttachmentPt)
323 { 357 {
324// m_log.DebugFormat( 358// m_log.DebugFormat(
325// "[ATTACHMENTS MODULE]: Updating inventory of {0} to show attachment of {1} (item ID {2})", 359// "[ATTACHMENTS MODULE]: Updating inventory of {0} to show attachment of {1} (item ID {2})",
@@ -328,16 +362,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
328 if (!att.IsDeleted) 362 if (!att.IsDeleted)
329 AttachmentPt = att.RootPart.AttachmentPoint; 363 AttachmentPt = att.RootPart.AttachmentPoint;
330 364
331 ScenePresence presence; 365 InventoryItemBase item = new InventoryItemBase(itemID, sp.UUID);
332 if (m_scene.TryGetScenePresence(remoteClient.AgentId, out presence)) 366 item = m_scene.InventoryService.GetItem(item);
333 {
334 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
335 item = m_scene.InventoryService.GetItem(item);
336 367
337 bool changed = presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID); 368 bool changed = sp.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID);
338 if (changed && m_scene.AvatarFactory != null) 369 if (changed && m_scene.AvatarFactory != null)
339 m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId); 370 m_scene.AvatarFactory.QueueAppearanceSave(sp.UUID);
340 }
341 371
342 return att.UUID; 372 return att.UUID;
343 } 373 }
@@ -345,12 +375,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
345 /// <summary> 375 /// <summary>
346 /// Update the user inventory to reflect an attachment 376 /// Update the user inventory to reflect an attachment
347 /// </summary> 377 /// </summary>
348 /// <param name="remoteClient"></param> 378 /// <param name="sp"></param>
349 /// <param name="AttachmentPt"></param> 379 /// <param name="AttachmentPt"></param>
350 /// <param name="itemID"></param> 380 /// <param name="itemID"></param>
351 /// <param name="att"></param> 381 /// <param name="att"></param>
352 protected void ShowAttachInUserInventory( 382 private void ShowAttachInUserInventory(
353 IClientAPI remoteClient, uint AttachmentPt, UUID itemID, SceneObjectGroup att) 383 ScenePresence sp, uint AttachmentPt, UUID itemID, SceneObjectGroup att)
354 { 384 {
355// m_log.DebugFormat( 385// m_log.DebugFormat(
356// "[USER INVENTORY]: Updating attachment {0} for {1} at {2} using item ID {3}", 386// "[USER INVENTORY]: Updating attachment {0} for {1} at {2} using item ID {3}",
@@ -374,16 +404,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
374 return; 404 return;
375 } 405 }
376 406
377 ScenePresence presence; 407 InventoryItemBase item = new InventoryItemBase(itemID, sp.UUID);
378 if (m_scene.TryGetScenePresence(remoteClient.AgentId, out presence)) 408 item = m_scene.InventoryService.GetItem(item);
379 { 409 bool changed = sp.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID);
380 // XXYY!! 410 if (changed && m_scene.AvatarFactory != null)
381 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); 411 m_scene.AvatarFactory.QueueAppearanceSave(sp.UUID);
382 item = m_scene.InventoryService.GetItem(item);
383 bool changed = presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID);
384 if (changed && m_scene.AvatarFactory != null)
385 m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId);
386 }
387 } 412 }
388 413
389 public void DetachObject(uint objectLocalID, IClientAPI remoteClient) 414 public void DetachObject(uint objectLocalID, IClientAPI remoteClient)
@@ -407,9 +432,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
407 bool changed = presence.Appearance.DetachAttachment(itemID); 432 bool changed = presence.Appearance.DetachAttachment(itemID);
408 if (changed && m_scene.AvatarFactory != null) 433 if (changed && m_scene.AvatarFactory != null)
409 m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId); 434 m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId);
410 }
411 435
412 DetachSingleAttachmentToInv(itemID, remoteClient); 436 DetachSingleAttachmentToInv(itemID, presence);
437 }
413 } 438 }
414 439
415 public void DetachSingleAttachmentToGround(UUID itemID, IClientAPI remoteClient) 440 public void DetachSingleAttachmentToGround(UUID itemID, IClientAPI remoteClient)
@@ -447,7 +472,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
447 472
448 // What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards. 473 // What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards.
449 // To LocalId or UUID, *THAT* is the question. How now Brown UUID?? 474 // To LocalId or UUID, *THAT* is the question. How now Brown UUID??
450 protected void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient) 475 private void DetachSingleAttachmentToInv(UUID itemID, ScenePresence sp)
451 { 476 {
452 if (itemID == UUID.Zero) // If this happened, someone made a mistake.... 477 if (itemID == UUID.Zero) // If this happened, someone made a mistake....
453 return; 478 return;
@@ -474,7 +499,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
474 if (p.Inventory.ContainsScripts()) 499 if (p.Inventory.ContainsScripts())
475 group.HasGroupChanged = true; 500 group.HasGroupChanged = true;
476 501
477 UpdateKnownItem(remoteClient, group, group.GetFromItemID(), group.OwnerID); 502 UpdateKnownItem(sp.ControllingClient, group, group.GetFromItemID(), group.OwnerID);
478 m_scene.DeleteSceneObject(group, false); 503 m_scene.DeleteSceneObject(group, false);
479 return; 504 return;
480 } 505 }
diff --git a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
index 4cb3df2..e012885 100644
--- a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
@@ -49,11 +49,9 @@ namespace OpenSim.Region.Framework.Interfaces
49 /// <summary> 49 /// <summary>
50 /// Attach an object to an avatar. 50 /// Attach an object to an avatar.
51 /// </summary> 51 /// </summary>
52 /// <param name="controllingClient"></param> 52 /// <param name="remoteClient"></param>
53 /// <param name="localID"></param> 53 /// <param name="grp"></param>
54 /// <param name="attachPoint"></param> 54 /// <param name="AttachmentPt"></param>
55 /// <param name="rot"></param>
56 /// <param name="attachPos"></param>
57 /// <param name="silent"></param> 55 /// <param name="silent"></param>
58 /// <returns>true if the object was successfully attached, false otherwise</returns> 56 /// <returns>true if the object was successfully attached, false otherwise</returns>
59 bool AttachObject( 57 bool AttachObject(
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 53c3b85..9f9af45 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -3540,7 +3540,7 @@ namespace OpenSim.Region.Framework.Scenes
3540 } 3540 }
3541 } 3541 }
3542 } 3542 }
3543 3543
3544 return true; 3544 return true;
3545 } 3545 }
3546 3546