From 5b6afeafbc249ba88dcc20d1fbc98ce12418b21b Mon Sep 17 00:00:00 2001 From: gareth Date: Tue, 8 May 2007 00:10:04 +0000 Subject: Brought in TestClient code for teh fork --- ExportBot/Commands/DumpOutfitCommand.cs | 98 +++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 ExportBot/Commands/DumpOutfitCommand.cs (limited to 'ExportBot/Commands/DumpOutfitCommand.cs') diff --git a/ExportBot/Commands/DumpOutfitCommand.cs b/ExportBot/Commands/DumpOutfitCommand.cs new file mode 100644 index 0000000..2d3d0d8 --- /dev/null +++ b/ExportBot/Commands/DumpOutfitCommand.cs @@ -0,0 +1,98 @@ +using System; +using System.Text; +using System.IO; +using System.Collections.Generic; +using libsecondlife; +using libsecondlife.Utilities.Assets; +using libsecondlife.Utilities.Appearance; + +namespace libsecondlife.TestClient +{ + public class DumpOutfitCommand : Command + { + libsecondlife.Utilities.Assets.AssetManager Assets; + List OutfitAssets = new List(); + + public DumpOutfitCommand(TestClient testClient) + { + Name = "dumpoutfit"; + Description = "Dumps all of the textures from an avatars outfit to the hard drive. Usage: dumpoutfit [avatar-uuid]"; + + Assets = new AssetManager(testClient); + Assets.OnImageReceived += new AssetManager.ImageReceivedCallback(Assets_OnImageReceived); + } + + public override string Execute(string[] args, LLUUID fromAgentID) + { + if (args.Length != 1) + return "Usage: dumpoutfit [avatar-uuid]"; + + LLUUID target; + + if (!LLUUID.TryParse(args[0], out target)) + return "Usage: dumpoutfit [avatar-uuid]"; + + lock (Client.AvatarList) + { + foreach (Avatar avatar in Client.AvatarList.Values) + { + if (avatar.ID == target) + { + StringBuilder output = new StringBuilder("Downloading "); + + lock (OutfitAssets) OutfitAssets.Clear(); + + foreach (KeyValuePair face in avatar.Textures.FaceTextures) + { + ImageType type = ImageType.Normal; + + switch ((AppearanceManager.TextureIndex)face.Key) + { + case AppearanceManager.TextureIndex.HeadBaked: + case AppearanceManager.TextureIndex.EyesBaked: + case AppearanceManager.TextureIndex.UpperBaked: + case AppearanceManager.TextureIndex.LowerBaked: + case AppearanceManager.TextureIndex.SkirtBaked: + type = ImageType.Baked; + break; + } + + Assets.RequestImage(face.Value.TextureID, type, 100000.0f, 0); + + output.Append(((AppearanceManager.TextureIndex)face.Key).ToString()); + output.Append(" "); + } + + return output.ToString(); + } + } + } + + return "Couldn't find avatar " + target.ToStringHyphenated(); + } + + private void Assets_OnImageReceived(ImageDownload image) + { + if (image.Success) + { + try + { + File.WriteAllBytes(image.ID.ToStringHyphenated() + ".jp2", image.AssetData); + Console.WriteLine("Wrote JPEG2000 image " + image.ID.ToStringHyphenated() + ".jp2"); + + byte[] tgaFile = OpenJPEGNet.OpenJPEG.DecodeToTGA(image.AssetData); + File.WriteAllBytes(image.ID.ToStringHyphenated() + ".tga", tgaFile); + Console.WriteLine("Wrote TGA image " + image.ID.ToStringHyphenated() + ".tga"); + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + } + } + else + { + Console.WriteLine("Failed to download image " + image.ID.ToStringHyphenated()); + } + } + } +} -- cgit v1.1