diff options
Diffstat (limited to 'OpenSim/Framework/ChildAgentDataUpdate.cs')
-rw-r--r-- | OpenSim/Framework/ChildAgentDataUpdate.cs | 140 |
1 files changed, 75 insertions, 65 deletions
diff --git a/OpenSim/Framework/ChildAgentDataUpdate.cs b/OpenSim/Framework/ChildAgentDataUpdate.cs index 0dc5dbc..66487f7 100644 --- a/OpenSim/Framework/ChildAgentDataUpdate.cs +++ b/OpenSim/Framework/ChildAgentDataUpdate.cs | |||
@@ -28,6 +28,8 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Reflection; | ||
32 | using log4net; | ||
31 | using OpenMetaverse; | 33 | using OpenMetaverse; |
32 | using OpenMetaverse.StructuredData; | 34 | using OpenMetaverse.StructuredData; |
33 | 35 | ||
@@ -225,46 +227,6 @@ namespace OpenSim.Framework | |||
225 | } | 227 | } |
226 | } | 228 | } |
227 | 229 | ||
228 | public class AttachmentData | ||
229 | { | ||
230 | public int AttachPoint; | ||
231 | public UUID ItemID; | ||
232 | public UUID AssetID; | ||
233 | |||
234 | public AttachmentData(int point, UUID item, UUID asset) | ||
235 | { | ||
236 | AttachPoint = point; | ||
237 | ItemID = item; | ||
238 | AssetID = asset; | ||
239 | } | ||
240 | |||
241 | public AttachmentData(OSDMap args) | ||
242 | { | ||
243 | UnpackUpdateMessage(args); | ||
244 | } | ||
245 | |||
246 | public OSDMap PackUpdateMessage() | ||
247 | { | ||
248 | OSDMap attachdata = new OSDMap(); | ||
249 | attachdata["point"] = OSD.FromInteger(AttachPoint); | ||
250 | attachdata["item"] = OSD.FromUUID(ItemID); | ||
251 | attachdata["asset"] = OSD.FromUUID(AssetID); | ||
252 | |||
253 | return attachdata; | ||
254 | } | ||
255 | |||
256 | |||
257 | public void UnpackUpdateMessage(OSDMap args) | ||
258 | { | ||
259 | if (args["point"] != null) | ||
260 | AttachPoint = args["point"].AsInteger(); | ||
261 | if (args["item"] != null) | ||
262 | ItemID = args["item"].AsUUID(); | ||
263 | if (args["asset"] != null) | ||
264 | AssetID = args["asset"].AsUUID(); | ||
265 | } | ||
266 | } | ||
267 | |||
268 | public class ControllerData | 230 | public class ControllerData |
269 | { | 231 | { |
270 | public UUID ItemID; | 232 | public UUID ItemID; |
@@ -348,11 +310,20 @@ namespace OpenSim.Framework | |||
348 | public UUID GranterID; | 310 | public UUID GranterID; |
349 | 311 | ||
350 | // Appearance | 312 | // Appearance |
313 | public AvatarAppearance Appearance; | ||
314 | |||
315 | // DEBUG ON | ||
316 | private static readonly ILog m_log = | ||
317 | LogManager.GetLogger( | ||
318 | MethodBase.GetCurrentMethod().DeclaringType); | ||
319 | // DEBUG OFF | ||
320 | |||
321 | /* | ||
351 | public byte[] AgentTextures; | 322 | public byte[] AgentTextures; |
352 | public byte[] VisualParams; | 323 | public byte[] VisualParams; |
353 | public UUID[] Wearables; | 324 | public UUID[] Wearables; |
354 | public AttachmentData[] Attachments; | 325 | public AvatarAttachment[] Attachments; |
355 | 326 | */ | |
356 | // Scripted | 327 | // Scripted |
357 | public ControllerData[] Controllers; | 328 | public ControllerData[] Controllers; |
358 | 329 | ||
@@ -360,6 +331,10 @@ namespace OpenSim.Framework | |||
360 | 331 | ||
361 | public virtual OSDMap Pack() | 332 | public virtual OSDMap Pack() |
362 | { | 333 | { |
334 | // DEBUG ON | ||
335 | m_log.WarnFormat("[CHILDAGENTDATAUPDATE] Pack data"); | ||
336 | // DEBUG OFF | ||
337 | |||
363 | OSDMap args = new OSDMap(); | 338 | OSDMap args = new OSDMap(); |
364 | args["message_type"] = OSD.FromString("AgentData"); | 339 | args["message_type"] = OSD.FromString("AgentData"); |
365 | 340 | ||
@@ -413,6 +388,9 @@ namespace OpenSim.Framework | |||
413 | args["animations"] = anims; | 388 | args["animations"] = anims; |
414 | } | 389 | } |
415 | 390 | ||
391 | if (Appearance != null) | ||
392 | args["packed_appearance"] = Appearance.Pack(); | ||
393 | |||
416 | //if ((AgentTextures != null) && (AgentTextures.Length > 0)) | 394 | //if ((AgentTextures != null) && (AgentTextures.Length > 0)) |
417 | //{ | 395 | //{ |
418 | // OSDArray textures = new OSDArray(AgentTextures.Length); | 396 | // OSDArray textures = new OSDArray(AgentTextures.Length); |
@@ -421,30 +399,39 @@ namespace OpenSim.Framework | |||
421 | // args["agent_textures"] = textures; | 399 | // args["agent_textures"] = textures; |
422 | //} | 400 | //} |
423 | 401 | ||
424 | 402 | // The code to pack textures, visuals, wearables and attachments | |
425 | if ((AgentTextures != null) && (AgentTextures.Length > 0)) | 403 | // should be removed; packed appearance contains the full appearance |
426 | args["texture_entry"] = OSD.FromBinary(AgentTextures); | 404 | // This is retained for backward compatibility only |
405 | if (Appearance.Texture != null) | ||
406 | { | ||
407 | byte[] rawtextures = Appearance.Texture.GetBytes(); | ||
408 | args["texture_entry"] = OSD.FromBinary(rawtextures); | ||
409 | } | ||
427 | 410 | ||
428 | if ((VisualParams != null) && (VisualParams.Length > 0)) | 411 | if ((Appearance.VisualParams != null) && (Appearance.VisualParams.Length > 0)) |
429 | args["visual_params"] = OSD.FromBinary(VisualParams); | 412 | args["visual_params"] = OSD.FromBinary(Appearance.VisualParams); |
430 | 413 | ||
431 | // We might not pass this in all cases... | 414 | // We might not pass this in all cases... |
432 | if ((Wearables != null) && (Wearables.Length > 0)) | 415 | if ((Appearance.Wearables != null) && (Appearance.Wearables.Length > 0)) |
433 | { | 416 | { |
434 | OSDArray wears = new OSDArray(Wearables.Length); | 417 | OSDArray wears = new OSDArray(Appearance.Wearables.Length * 2); |
435 | foreach (UUID uuid in Wearables) | 418 | foreach (AvatarWearable awear in Appearance.Wearables) |
436 | wears.Add(OSD.FromUUID(uuid)); | 419 | { |
420 | wears.Add(OSD.FromUUID(awear.ItemID)); | ||
421 | wears.Add(OSD.FromUUID(awear.AssetID)); | ||
422 | } | ||
437 | args["wearables"] = wears; | 423 | args["wearables"] = wears; |
438 | } | 424 | } |
439 | 425 | ||
440 | 426 | List<AvatarAttachment> attachments = Appearance.GetAttachments(); | |
441 | if ((Attachments != null) && (Attachments.Length > 0)) | 427 | if ((attachments != null) && (attachments.Count > 0)) |
442 | { | 428 | { |
443 | OSDArray attachs = new OSDArray(Attachments.Length); | 429 | OSDArray attachs = new OSDArray(attachments.Count); |
444 | foreach (AttachmentData att in Attachments) | 430 | foreach (AvatarAttachment att in attachments) |
445 | attachs.Add(att.PackUpdateMessage()); | 431 | attachs.Add(att.Pack()); |
446 | args["attachments"] = attachs; | 432 | args["attachments"] = attachs; |
447 | } | 433 | } |
434 | // End of code to remove | ||
448 | 435 | ||
449 | if ((Controllers != null) && (Controllers.Length > 0)) | 436 | if ((Controllers != null) && (Controllers.Length > 0)) |
450 | { | 437 | { |
@@ -469,6 +456,10 @@ namespace OpenSim.Framework | |||
469 | /// <param name="hash"></param> | 456 | /// <param name="hash"></param> |
470 | public virtual void Unpack(OSDMap args) | 457 | public virtual void Unpack(OSDMap args) |
471 | { | 458 | { |
459 | // DEBUG ON | ||
460 | m_log.WarnFormat("[CHILDAGENTDATAUPDATE] Unpack data"); | ||
461 | // DEBUG OFF | ||
462 | |||
472 | if (args.ContainsKey("region_id")) | 463 | if (args.ContainsKey("region_id")) |
473 | UUID.TryParse(args["region_id"].AsString(), out RegionID); | 464 | UUID.TryParse(args["region_id"].AsString(), out RegionID); |
474 | 465 | ||
@@ -581,34 +572,53 @@ namespace OpenSim.Framework | |||
581 | // AgentTextures[i++] = o.AsUUID(); | 572 | // AgentTextures[i++] = o.AsUUID(); |
582 | //} | 573 | //} |
583 | 574 | ||
575 | Appearance = new AvatarAppearance(AgentID); | ||
576 | |||
577 | // The code to unpack textures, visuals, wearables and attachments | ||
578 | // should be removed; packed appearance contains the full appearance | ||
579 | // This is retained for backward compatibility only | ||
584 | if (args["texture_entry"] != null) | 580 | if (args["texture_entry"] != null) |
585 | AgentTextures = args["texture_entry"].AsBinary(); | 581 | { |
582 | byte[] rawtextures = args["texture_entry"].AsBinary(); | ||
583 | Primitive.TextureEntry textures = new Primitive.TextureEntry(rawtextures,0,rawtextures.Length); | ||
584 | Appearance.SetTextureEntries(textures); | ||
585 | } | ||
586 | 586 | ||
587 | if (args["visual_params"] != null) | 587 | if (args["visual_params"] != null) |
588 | VisualParams = args["visual_params"].AsBinary(); | 588 | Appearance.SetVisualParams(args["visual_params"].AsBinary()); |
589 | 589 | ||
590 | if ((args["wearables"] != null) && (args["wearables"]).Type == OSDType.Array) | 590 | if ((args["wearables"] != null) && (args["wearables"]).Type == OSDType.Array) |
591 | { | 591 | { |
592 | OSDArray wears = (OSDArray)(args["wearables"]); | 592 | OSDArray wears = (OSDArray)(args["wearables"]); |
593 | Wearables = new UUID[wears.Count]; | 593 | for (int i = 0; i < wears.Count / 2; i++) |
594 | int i = 0; | 594 | { |
595 | foreach (OSD o in wears) | 595 | AvatarWearable awear = new AvatarWearable(wears[i*2].AsUUID(),wears[(i*2)+1].AsUUID()); |
596 | Wearables[i++] = o.AsUUID(); | 596 | Appearance.SetWearable(i,awear); |
597 | } | ||
597 | } | 598 | } |
598 | 599 | ||
599 | if ((args["attachments"] != null) && (args["attachments"]).Type == OSDType.Array) | 600 | if ((args["attachments"] != null) && (args["attachments"]).Type == OSDType.Array) |
600 | { | 601 | { |
601 | OSDArray attachs = (OSDArray)(args["attachments"]); | 602 | OSDArray attachs = (OSDArray)(args["attachments"]); |
602 | Attachments = new AttachmentData[attachs.Count]; | ||
603 | int i = 0; | ||
604 | foreach (OSD o in attachs) | 603 | foreach (OSD o in attachs) |
605 | { | 604 | { |
606 | if (o.Type == OSDType.Map) | 605 | if (o.Type == OSDType.Map) |
607 | { | 606 | { |
608 | Attachments[i++] = new AttachmentData((OSDMap)o); | 607 | // We know all of these must end up as attachments so we |
608 | // append rather than replace to ensure multiple attachments | ||
609 | // per point continues to work | ||
610 | Appearance.AppendAttachment(new AvatarAttachment((OSDMap)o)); | ||
609 | } | 611 | } |
610 | } | 612 | } |
611 | } | 613 | } |
614 | // end of code to remove | ||
615 | |||
616 | if (args.ContainsKey("packed_appearance") && (args["packed_appearance"]).Type == OSDType.Map) | ||
617 | Appearance = new AvatarAppearance(AgentID,(OSDMap)args["packed_appearance"]); | ||
618 | // DEBUG ON | ||
619 | else | ||
620 | m_log.WarnFormat("[CHILDAGENTDATAUPDATE] No packed appearance"); | ||
621 | // DEBUG OFF | ||
612 | 622 | ||
613 | if ((args["controllers"] != null) && (args["controllers"]).Type == OSDType.Array) | 623 | if ((args["controllers"] != null) && (args["controllers"]).Type == OSDType.Array) |
614 | { | 624 | { |