diff --git a/OpenMetaverse/AssetTypes.cs b/OpenMetaverse/AssetTypes.cs index 8f194158..7caba619 100644 --- a/OpenMetaverse/AssetTypes.cs +++ b/OpenMetaverse/AssetTypes.cs @@ -310,6 +310,7 @@ namespace OpenMetaverse Permissions = new Permissions(); string data = Utils.BytesToString(AssetData); + data = data.Replace("\r", String.Empty); string[] lines = data.Split('\n'); for (int stri = 0; stri < lines.Length; stri++) { diff --git a/Programs/Simian/Extensions/AssetManager.cs b/Programs/Simian/Extensions/AssetManager.cs index 8cf2406a..c526033a 100644 --- a/Programs/Simian/Extensions/AssetManager.cs +++ b/Programs/Simian/Extensions/AssetManager.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using OpenMetaverse; using OpenMetaverse.Imaging; using OpenMetaverse.Packets; @@ -18,6 +19,8 @@ namespace Simian.Extensions public void Start() { + LoadDefaultAssets(Server.DataDir); + Server.UDPServer.RegisterPacketCallback(PacketType.AssetUploadRequest, new UDPServer.PacketCallback(AssetUploadRequestHandler)); Server.UDPServer.RegisterPacketCallback(PacketType.SendXferPacket, new UDPServer.PacketCallback(SendXferPacketHandler)); Server.UDPServer.RegisterPacketCallback(PacketType.AbortXfer, new UDPServer.PacketCallback(AbortXferHandler)); @@ -203,22 +206,8 @@ namespace Simian.Extensions // Check if we have this asset Asset asset; - if (Server.AssetStore.TryGetValue(assetID, out asset) || true /* HACK */) + if (Server.AssetStore.TryGetValue(assetID, out asset)) { - // HACK: Always return some clothing to get avatars appearing for now - if (asset == null) - { - asset = CreateAsset(type, assetID, System.IO.File.ReadAllBytes("testclothing.txt")); - if (asset == null) - { - response.TransferInfo.Size = 0; - response.TransferInfo.Status = (int)StatusCode.UnknownSource; - response.TransferInfo.TargetType = (int)TargetType.Unknown; - agent.SendPacket(response); - } - } - // END HACK - if (asset.AssetType == type) { Logger.DebugLog(String.Format("Transferring asset {0} ({1})", asset.AssetID, asset.AssetType)); @@ -356,5 +345,53 @@ namespace Simian.Extensions return null; } } + + void LoadDefaultAssets(string path) + { + string[] textures = Directory.GetFiles(path, "*.jp2", SearchOption.TopDirectoryOnly); + string[] clothing = Directory.GetFiles(path, "*.clothing", SearchOption.TopDirectoryOnly); + string[] bodyparts = Directory.GetFiles(path, "*.bodypart", SearchOption.TopDirectoryOnly); + + for (int i = 0; i < textures.Length; i++) + { + UUID assetID = ParseUUIDFromFilename(textures[i]); + AssetTexture item = new AssetTexture(assetID, File.ReadAllBytes(textures[i])); + Server.AssetStore[assetID] = item; + } + + for (int i = 0; i < clothing.Length; i++) + { + UUID assetID = ParseUUIDFromFilename(clothing[i]); + AssetClothing item = new AssetClothing(assetID, File.ReadAllBytes(clothing[i])); + item.Decode(); + Server.AssetStore[assetID] = item; + } + + for (int i = 0; i < bodyparts.Length; i++) + { + UUID assetID = ParseUUIDFromFilename(bodyparts[i]); + AssetBodypart item = new AssetBodypart(assetID, File.ReadAllBytes(bodyparts[i])); + item.Decode(); + Server.AssetStore[assetID] = item; + } + } + + static UUID ParseUUIDFromFilename(string filename) + { + int dot = filename.LastIndexOf('.'); + + if (dot > 35) + { + // Grab the last 36 characters of the filename + string uuidString = filename.Substring(dot - 36, 36); + UUID uuid; + UUID.TryParse(uuidString, out uuid); + return uuid; + } + else + { + return UUID.Zero; + } + } } } diff --git a/Programs/Simian/Extensions/AvatarManager.cs b/Programs/Simian/Extensions/AvatarManager.cs index dfb1bd59..6cc2ee18 100644 --- a/Programs/Simian/Extensions/AvatarManager.cs +++ b/Programs/Simian/Extensions/AvatarManager.cs @@ -68,17 +68,33 @@ namespace Simian.Extensions // Technically this should be per-agent, but if the only requirement is that it // increments this is easier update.AgentData.SerialNum = (uint)Interlocked.Increment(ref currentWearablesSerialNum); - update.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[13]; - for (int i = 0; i < 13; i++) - { - update.WearableData[i] = new AgentWearablesUpdatePacket.WearableDataBlock(); - update.WearableData[i].AssetID = UUID.Random(); - update.WearableData[i].ItemID = UUID.Random(); - update.WearableData[i].WearableType = (byte)i; - } + update.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[5]; - //HACK - //update.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[0]; + // TODO: These are hardcoded in for now, should change that + update.WearableData[0] = new AgentWearablesUpdatePacket.WearableDataBlock(); + update.WearableData[0].AssetID = new UUID("dc675529-7ba5-4976-b91d-dcb9e5e36188"); + update.WearableData[0].ItemID = UUID.Random(); + update.WearableData[0].WearableType = (byte)WearableType.Hair; + + update.WearableData[1] = new AgentWearablesUpdatePacket.WearableDataBlock(); + update.WearableData[1].AssetID = new UUID("3e8ee2d6-4f21-4a55-832d-77daa505edff"); + update.WearableData[1].ItemID = UUID.Random(); + update.WearableData[1].WearableType = (byte)WearableType.Pants; + + update.WearableData[2] = new AgentWearablesUpdatePacket.WearableDataBlock(); + update.WearableData[2].AssetID = new UUID("530a2614-052e-49a2-af0e-534bb3c05af0"); + update.WearableData[2].ItemID = UUID.Random(); + update.WearableData[2].WearableType = (byte)WearableType.Shape; + + update.WearableData[3] = new AgentWearablesUpdatePacket.WearableDataBlock(); + update.WearableData[3].AssetID = new UUID("6a714f37-fe53-4230-b46f-8db384465981"); + update.WearableData[3].ItemID = UUID.Random(); + update.WearableData[3].WearableType = (byte)WearableType.Shirt; + + update.WearableData[4] = new AgentWearablesUpdatePacket.WearableDataBlock(); + update.WearableData[4].AssetID = new UUID("5f787f25-f761-4a35-9764-6418ee4774c4"); + update.WearableData[4].ItemID = UUID.Random(); + update.WearableData[4].WearableType = (byte)WearableType.Skin; agent.SendPacket(update); } diff --git a/Programs/Simian/Extensions/SceneManager.cs b/Programs/Simian/Extensions/SceneManager.cs index 901619b5..54444133 100644 --- a/Programs/Simian/Extensions/SceneManager.cs +++ b/Programs/Simian/Extensions/SceneManager.cs @@ -24,7 +24,7 @@ namespace Simian.Extensions public void Start() { server.UDPServer.RegisterPacketCallback(PacketType.CompleteAgentMovement, new UDPServer.PacketCallback(CompleteAgentMovementHandler)); - LoadTerrain("Maps/default.tga"); + LoadTerrain(server.DataDir + "heightmap.tga"); } public void Stop() diff --git a/Programs/Simian/InventoryDefinitions.cs b/Programs/Simian/InventoryDefinitions.cs index 23e69a11..6de74956 100644 --- a/Programs/Simian/InventoryDefinitions.cs +++ b/Programs/Simian/InventoryDefinitions.cs @@ -80,21 +80,7 @@ namespace Simian return false; InventoryItem o = (InventoryItem)obj; - return o.ID == ID - && o.ParentID == ParentID - && o.Name == Name - && o.OwnerID == OwnerID - && o.AssetType == AssetType - && o.AssetID == AssetID - && o.CreationDate == CreationDate - && o.Description == Description - && o.Flags == Flags - && o.GroupID == GroupID - && o.GroupOwned == GroupOwned - && o.InventoryType == InventoryType - && o.Permissions.Equals(Permissions) - && o.SalePrice == SalePrice - && o.SaleType == SaleType; + return o.ID == ID; } public static bool operator ==(InventoryItem lhs, InventoryItem rhs) @@ -106,154 +92,6 @@ namespace Simian { return !(lhs == rhs); } - - /// - /// Returns the InventoryItem in the hierarchical bracket format - /// used in the Second Life client's notecards and inventory cache. - /// - /// a string representation of this InventoryItem - public override string ToString() - { - StringWriter writer = new StringWriter(); - ToString(writer); - return writer.ToString(); - } - - /// - /// Writes the inventory item to the TextWriter in the hierarchical bracket format - /// used in the Second Life client's notecards and inventory cache. - /// - /// Writer to write to. - public void ToString(TextWriter writer) - { - writer.WriteLine("inv_item\t0"); - writer.WriteLine('{'); - writer.WriteLine("\titem_id\t{0}", ID.ToString()); - writer.WriteLine("\tparent_id\t{0}", ParentID.ToString()); - // Permissions: - writer.WriteLine("permissions\t0"); - writer.WriteLine('{'); - writer.WriteLine("\tbase_mask\t{0}", String.Format("{0:x}", (uint)Permissions.BaseMask).PadLeft(8, '0')); - writer.WriteLine("\towner_mask\t{0}", String.Format("{0:x}", (uint)Permissions.OwnerMask).PadLeft(8, '0')); - writer.WriteLine("\tgroup_mask\t{0}", String.Format("{0:x}", (uint)Permissions.GroupMask).PadLeft(8, '0')); - writer.WriteLine("\teveryone_mask\t{0}", String.Format("{0:x}", (uint)Permissions.EveryoneMask).PadLeft(8, '0')); - writer.WriteLine("\tnext_owner_mask\t{0}", String.Format("{0:x}", (uint)Permissions.NextOwnerMask).PadLeft(8, '0')); - writer.WriteLine("\tcreator_id\t{0}", CreatorID.ToString()); - writer.WriteLine("\towner_id\t{0}", OwnerID.ToString()); - writer.WriteLine("\tlast_owner_id\t{0}", UUID.Zero); // FIXME? - writer.WriteLine("\tgroup_id\t{0}", GroupID.ToString()); - writer.WriteLine('}'); - - writer.WriteLine("\tasset_id\t{0}", AssetID.ToString()); - writer.WriteLine("\ttype\t{0}", AssetTypeParser.StringValueOf(AssetType)); - writer.WriteLine("\tinv_type\t{0}", InventoryTypeParser.StringValueOf(InventoryType)); - writer.WriteLine("\tflags\t{0}", string.Format("{0:x}", Flags).PadLeft(8, '0')); - - // Sale info: - writer.WriteLine("sale_info\t0"); - writer.WriteLine('{'); - writer.WriteLine("\tsale_type\t{0}", SaleTypeParser.StringValueOf(SaleType)); - writer.WriteLine("\tsale_price\t{0}", SalePrice); - writer.WriteLine('}'); - - writer.WriteLine("\tname\t{0}|", Name); - writer.WriteLine("\tdesc\t{0}|", Description); - writer.WriteLine("\tcreation_date\t{0}", Utils.DateTimeToUnixTime(CreationDate)); - writer.WriteLine('}'); - } - - /// - /// Reads the InventoryItem from a string source. The string is wrapped - /// in a and passed to the - /// other method. - /// - /// String to parse InventoryItem from. - /// Parsed InventoryItem - public static InventoryItem Parse(string src) - { - return Parse(new StringReader(src)); - } - - /// - /// Reads an InventoryItem from a TextReader source. The format of the text - /// should be the same as the one used by Second Life Notecards. The TextReader should - /// be placed ideally on the line containing "inv_item" but parsing will succeed as long - /// as it is before the opening bracket immediately following the inv_item line. - /// The TextReader will be placed on the line following the inv_item's closing bracket. - /// - /// text source - /// Parsed item. - public static InventoryItem Parse(TextReader reader) - { - InventoryItem item = new InventoryItem(); - #region Parsing - TextData invItem = TextHierarchyParser.Parse(reader); - Console.WriteLine(invItem); - //if (invItem.Name == "inv_item") // YAY - item.ID = new UUID(invItem.Nested["item_id"].Value); - item.ParentID = new UUID(invItem.Nested["parent_id"].Value); - item.AssetID = new UUID(invItem.Nested["asset_id"].Value); - item.AssetType = AssetTypeParser.Parse(invItem.Nested["type"].Value); - item.InventoryType = InventoryTypeParser.Parse(invItem.Nested["inv_type"].Value); - Utils.TryParseHex(invItem.Nested["flags"].Value, out item.Flags); - string rawName = invItem.Nested["name"].Value; - item.Name = rawName.Substring(0, rawName.LastIndexOf('|')); - string rawDesc = invItem.Nested["desc"].Value; - item.Description = rawDesc.Substring(0, rawDesc.LastIndexOf('|')); - item.CreationDate = Utils.UnixTimeToDateTime(uint.Parse(invItem.Nested["creation_date"].Value)); - - // Sale info: - TextData saleInfo = invItem.Nested["sale_info"]; - item.SalePrice = int.Parse(saleInfo.Nested["sale_price"].Value); - item.SaleType = SaleTypeParser.Parse(saleInfo.Nested["sale_type"].Value); - - TextData permissions = invItem.Nested["permissions"]; - item.Permissions = new Permissions(); - item.Permissions.BaseMask = (PermissionMask)uint.Parse(permissions.Nested["base_mask"].Value, NumberStyles.HexNumber); - item.Permissions.EveryoneMask = (PermissionMask)uint.Parse(permissions.Nested["everyone_mask"].Value, NumberStyles.HexNumber); - item.Permissions.GroupMask = (PermissionMask)uint.Parse(permissions.Nested["group_mask"].Value, NumberStyles.HexNumber); - item.Permissions.OwnerMask = (PermissionMask)uint.Parse(permissions.Nested["owner_mask"].Value, NumberStyles.HexNumber); - item.Permissions.NextOwnerMask = (PermissionMask)uint.Parse(permissions.Nested["next_owner_mask"].Value, NumberStyles.HexNumber); - item.CreatorID = new UUID(permissions.Nested["creator_id"].Value); - item.OwnerID = new UUID(permissions.Nested["owner_id"].Value); - item.GroupID = new UUID(permissions.Nested["group_id"].Value); - // permissions.Nested["last_owner_id"] // FIXME? - #endregion - return item; - } - - /// - /// - /// - /// String to parse from - /// Parsed InventoryItem - /// true if successful, false otherwise. - public static bool TryParse(string str, out InventoryItem item) - { - return TryParse(new StringReader(str), out item); - } - - /// - /// - /// - /// Text source. - /// Parsed InventoryItem. - /// true if successful false otherwise. - public static bool TryParse(TextReader reader, out InventoryItem item) - { - try - { - item = Parse(reader); - } - catch (Exception e) - { - item = new InventoryItem(); - Logger.Log(e.Message, Helpers.LogLevel.Error, e); - return false; - } - - return true; - } } /// @@ -286,98 +124,6 @@ namespace Simian { return !(lhs == rhs); } - - /// - /// Returns the InventoryFolder in the hierarchical bracket format - /// used in the Second Life client's notecards and inventory cache. - /// - /// a string representation of this InventoryFolder - public override string ToString() - { - StringWriter writer = new StringWriter(); - ToString(writer); - return writer.ToString(); - } - - /// - /// Writes the InventoryFolder to the TextWriter in the hierarchical bracket format - /// used in the Second Life client's notecards and inventory cache. - /// - /// Writer to write to. - public void ToString(TextWriter writer) - { - writer.WriteLine("inv_category\t0"); - writer.WriteLine('{'); - writer.WriteLine("\tcat_id\t{0}", ID.ToString()); - writer.WriteLine("\tparent_id\t{0}", ParentID.ToString()); - writer.WriteLine("\ttype\tcategory"); - // TODO: Some folders have "-1" as their perf_type, investigate this. - writer.WriteLine("\tpref_type\t{0}", AssetTypeParser.StringValueOf(PreferredType)); - writer.WriteLine("\tname\t{0}|", Name); - writer.WriteLine("\towner_id\t{0}", OwnerID.ToString()); - writer.WriteLine("\tversion\t{0}", Version); - writer.WriteLine('}'); - } - - /// - /// Reads the InventoryFolder from a string source. The string is wrapped - /// in a and passed to the - /// other method. - /// - /// String to parse InventoryFolder from. - /// Parsed InventoryFolder - public static InventoryFolder Parse(string src) - { - return Parse(new StringReader(src)); - } - - /// - /// Reads an InventoryItem from a TextReader source. The format of the text - /// should be the same as the one used by Second Life Notecards. The TextReader should - /// be placed ideally on the line containing "inv_category" but parsing will succeed as long - /// as it is before the opening bracket immediately following the inv_category line. - /// The TextReader will be placed on the line following the inv_category's closing bracket. - /// - /// text source - /// Parsed item. - public static InventoryFolder Parse(TextReader reader) - { - InventoryFolder folder = new InventoryFolder(); - #region Parsing - TextData invCategory = TextHierarchyParser.Parse(reader); - - //if (invCategory.Name == "inv_category") // YAY - folder.ID = new UUID(invCategory.Nested["cat_id"].Value); - string rawName = invCategory.Nested["name"].Value; - folder.Name = rawName.Substring(0, rawName.LastIndexOf('|')); - folder.OwnerID = new UUID(invCategory.Nested["owner_id"].Value); - folder.ParentID = new UUID(invCategory.Nested["parent_id"].Value); - folder.PreferredType = AssetTypeParser.Parse(invCategory.Nested["pref_type"].Value); - folder.Version = int.Parse(invCategory.Nested["version"].Value); - // TODO: Investigate invCategory.Nested["type"] - #endregion - return folder; - } - - public static bool TryParse(string str, out InventoryFolder folder) - { - return TryParse(new StringReader(str), out folder); - } - - public static bool TryParse(TextReader reader, out InventoryFolder folder) - { - try - { - folder = Parse(reader); - } - catch (Exception e) - { - folder = new InventoryFolder(); - Logger.Log(e.Message, Helpers.LogLevel.Error, e); - return false; - } - return true; - } } #endregion Inventory Item Containers diff --git a/Programs/Simian/Simian.cs b/Programs/Simian/Simian.cs index ef6a3616..abc5ae7e 100644 --- a/Programs/Simian/Simian.cs +++ b/Programs/Simian/Simian.cs @@ -13,6 +13,8 @@ namespace Simian { public partial class Simian { + public string DataDir = "SimianData/"; + public HttpServer HttpServer; public UDPServer UDPServer; public Dictionary SceneObjects = new Dictionary(); @@ -296,11 +298,11 @@ namespace Simian response.HomePosition = new Vector3(128f, 128f, 25f); response.HomeRegion = Helpers.UIntsToLong(regionX, regionY); response.InventoryRoot = agent.InventoryRoot; - response.InventoryFolders = null; + response.InventorySkeleton = null; response.LastName = agent.LastName; response.LibraryOwner = response.AgentID; response.LibraryRoot = agent.InventoryLibRoot; - response.LibraryFolders = null; + response.LibrarySkeleton = null; response.LookAt = Vector3.UnitX; response.Message = "Welcome to Simian"; response.Reason = String.Empty; diff --git a/bin/SimianData/default_hair-dc675529-7ba5-4976-b91d-dcb9e5e36188.bodypart b/bin/SimianData/default_hair-dc675529-7ba5-4976-b91d-dcb9e5e36188.bodypart new file mode 100644 index 00000000..e5377575 --- /dev/null +++ b/bin/SimianData/default_hair-dc675529-7ba5-4976-b91d-dcb9e5e36188.bodypart @@ -0,0 +1,63 @@ +LLWearable version 22 +Default Hair + + permissions 0 + { + base_mask 7fffffff + owner_mask 7fffffff + group_mask 00000000 + everyone_mask 00000000 + next_owner_mask 00082000 + creator_id 00000000-0000-0000-0000-000000000000 + owner_id 00000000-0000-0000-0000-000000000000 + last_owner_id 00000000-0000-0000-0000-000000000000 + group_id 00000000-0000-0000-0000-000000000000 + } + sale_info 0 + { + sale_type not + sale_price 10 + } +type 2 +parameters 39 +16 0 +31 .5 +112 0 +113 0 +114 .5 +115 0 +119 .5 +130 .45 +131 .5 +132 .39 +133 .25 +134 .5 +135 .55 +136 .5 +137 .5 +140 0 +141 0 +142 0 +143 .13 +166 0 +167 0 +168 0 +169 0 +177 0 +181 .14 +182 .7 +183 .05 +184 0 +192 0 +674 -.3 +750 .7 +752 .5 +754 0 +755 .05 +757 -1 +762 0 +763 .55 +785 0 +789 0 +textures 1 +4 7ca39b4c-bd19-4699-aff7-f93fd03d3e7b diff --git a/bin/SimianData/testclothing.txt b/bin/SimianData/default_pants-3e8ee2d6-4f21-4a55-832d-77daa505edff.clothing similarity index 100% rename from bin/SimianData/testclothing.txt rename to bin/SimianData/default_pants-3e8ee2d6-4f21-4a55-832d-77daa505edff.clothing diff --git a/bin/SimianData/default_shape-530a2614-052e-49a2-af0e-534bb3c05af0.bodypart b/bin/SimianData/default_shape-530a2614-052e-49a2-af0e-534bb3c05af0.bodypart new file mode 100644 index 00000000..e68d72e1 --- /dev/null +++ b/bin/SimianData/default_shape-530a2614-052e-49a2-af0e-534bb3c05af0.bodypart @@ -0,0 +1,105 @@ +LLWearable version 22 +Default Shape + + permissions 0 + { + base_mask 00000000 + owner_mask 00000000 + group_mask 00000000 + everyone_mask 00000000 + next_owner_mask 00000000 + creator_id 00000000-0000-0000-0000-000000000000 + owner_id 00000000-0000-0000-0000-000000000000 + last_owner_id 00000000-0000-0000-0000-000000000000 + group_id 00000000-0000-0000-0000-000000000000 + } + sale_info 0 + { + sale_type not + sale_price 0 + } +type 0 +parameters 82 +1 .21 +2 -.5 +4 -.11 +5 -.1 +6 -.3 +7 -.4 +8 -.5 +10 .7 +11 .34 +12 -.5 +13 0 +14 .04 +15 .58 +17 .56 +18 -.26 +19 -.73 +20 -.34 +21 -.01 +22 1 +23 -.5 +24 -.63 +25 .44 +27 .05 +33 -.24 +34 -.7 +35 -.16 +36 -.2 +37 -.98 +38 -.5 +80 0 +105 .07 +155 -.22 +157 0 +185 -1 +193 .86 +196 -.74 +505 .65 +506 .12 +507 -1.5 +515 0 +517 .16 +518 .8 +629 0 +637 0 +646 .4 +647 1 +649 .36 +650 .85 +652 .49 +653 -1 +656 0 +659 .65 +662 .5 +663 0 +664 0 +665 0 +675 -.15 +676 .26 +678 .28 +682 .27 +683 -.19 +684 -.09 +685 0 +690 .45 +692 .4 +693 -0 +753 -.5 +756 -.08 +758 .24 +759 .6 +760 .11 +764 -.38 +765 -.3 +769 .42 +773 .51 +795 .16 +796 .11 +799 .36 +841 0 +842 -.82 +879 0 +880 0 +textures 0 diff --git a/bin/SimianData/default_shirt-6a714f37-fe53-4230-b46f-8db384465981.clothing b/bin/SimianData/default_shirt-6a714f37-fe53-4230-b46f-8db384465981.clothing new file mode 100644 index 00000000..fc9edbdc --- /dev/null +++ b/bin/SimianData/default_shirt-6a714f37-fe53-4230-b46f-8db384465981.clothing @@ -0,0 +1,34 @@ +LLWearable version 22 +Default Shirt + + permissions 0 + { + base_mask 00000000 + owner_mask 00000000 + group_mask 00000000 + everyone_mask 00000000 + next_owner_mask 00000000 + creator_id 00000000-0000-0000-0000-000000000000 + owner_id 00000000-0000-0000-0000-000000000000 + last_owner_id 00000000-0000-0000-0000-000000000000 + group_id 00000000-0000-0000-0000-000000000000 + } + sale_info 0 + { + sale_type not + sale_price 10 + } +type 4 +parameters 10 +781 .78 +800 .65 +801 .82 +802 .78 +803 .5 +804 .5 +805 .6 +828 0 +840 0 +868 0 +textures 1 +1 5748decc-f629-461c-9a36-a35a221fe21f diff --git a/bin/SimianData/default_skin-5f787f25-f761-4a35-9764-6418ee4774c4.bodypart b/bin/SimianData/default_skin-5f787f25-f761-4a35-9764-6418ee4774c4.bodypart new file mode 100644 index 00000000..bcd05117 --- /dev/null +++ b/bin/SimianData/default_skin-5f787f25-f761-4a35-9764-6418ee4774c4.bodypart @@ -0,0 +1,52 @@ +LLWearable version 22 +Default Skin + + permissions 0 + { + base_mask 00000000 + owner_mask 00000000 + group_mask 00000000 + everyone_mask 00000000 + next_owner_mask 00000000 + creator_id 00000000-0000-0000-0000-000000000000 + owner_id 00000000-0000-0000-0000-000000000000 + last_owner_id 00000000-0000-0000-0000-000000000000 + group_id 00000000-0000-0000-0000-000000000000 + } + sale_info 0 + { + sale_type not + sale_price 10 + } +type 1 +parameters 26 +108 0 +110 0 +111 0 +116 0 +117 1 +150 0 +162 0 +163 0 +165 0 +700 .01 +701 .5 +702 .26 +703 0 +704 0 +705 .5 +706 .6 +707 0 +708 0 +709 0 +710 0 +711 .5 +712 0 +713 .7 +714 0 +715 0 +775 0 +textures 3 +0 c4e3fbf4-55ef-4a06-8497-48d4dc993cbb +5 e1a21d3f-7db4-4802-978f-4ace1bad8e7e +6 9bebfaae-6de4-41c7-af5b-f6a3bd052ed3 diff --git a/bin/SimianData/default.tga b/bin/SimianData/heightmap.tga similarity index 100% rename from bin/SimianData/default.tga rename to bin/SimianData/heightmap.tga