/// <summary> /// Converts byte[] data from a data transfer into a bodypart class /// </summary> /// <returns></returns> internal void UpdateFromAssetData() { if (AssetData == null || AssetData.Length == 0) { return; } string wearableData = Helpers.FieldToUTF8String(this._AssetData); int version = -1; int n = -1; try { n = wearableData.IndexOf('\n'); version = Int32.Parse(wearableData.Substring(19, n - 18)); wearableData = wearableData.Remove(0, n); if (version != 22) { Console.WriteLine("** WARNING ** : Wearable asset has unrecognized version " + version); return; } n = wearableData.IndexOf('\n'); Name = wearableData.Substring(0, n); wearableData = wearableData.Remove(0, n); n = wearableData.IndexOf('\n'); Description = wearableData.Substring(0, n); wearableData = wearableData.Remove(0, n); // Split in to an upper and lower half string[] parts = wearableData.Split(new string[] { "parameters" }, StringSplitOptions.None); parts[1] = "parameters" + parts[1]; // Parse the upper half string[] lines = parts[0].Split('\n'); foreach (string thisline in lines) { string line = thisline.Trim(); string[] fields = line.Split('\t'); if (fields.Length == 2) { if (fields[0] == "creator_mask") { // Deprecated, apply this as the base mask _Permission_Base_Mask = UInt32.Parse(fields[1], System.Globalization.NumberStyles.HexNumber); } else if (fields[0] == "base_mask") { _Permission_Base_Mask = UInt32.Parse(fields[1], System.Globalization.NumberStyles.HexNumber); } else if (fields[0] == "owner_mask") { _Permission_Owner_Mask = UInt32.Parse(fields[1], System.Globalization.NumberStyles.HexNumber); } else if (fields[0] == "group_mask") { _Permission_Group_Mask = UInt32.Parse(fields[1], System.Globalization.NumberStyles.HexNumber); } else if (fields[0] == "everyone_mask") { _Permission_Everyone_Mask = UInt32.Parse(fields[1], System.Globalization.NumberStyles.HexNumber); } else if (fields[0] == "next_owner_mask") { _Permission_Next_Owner_Mask = UInt32.Parse(fields[1], System.Globalization.NumberStyles.HexNumber); } else if (fields[0] == "creator_id") { _Creator_ID = new LLUUID(fields[1]); } else if (fields[0] == "owner_id") { _Owner_ID = new LLUUID(fields[1]); } else if (fields[0] == "last_owner_id") { _Last_Owner_ID = new LLUUID(fields[1]); } else if (fields[0] == "group_id") { _Group_ID = new LLUUID(fields[1]); } else if (fields[0] == "group_owned") { _Group_Owned = (Int32.Parse(fields[1]) != 0); } else if (fields[0] == "sale_type") { for (int i = 0; i < _ForSaleNames.Length; i++) { if (fields[1] == _ForSaleNames[i]) { _Sale = (_ForSale)i; break; } } } else if (fields[0] == "sale_price") { _Sale_Price = UInt32.Parse(fields[1]); } else if (fields[0] == "perm_mask") { Console.WriteLine("** WARNING ** : Wearable asset has deprecated perm_mask field, ignoring"); } } else if (line.StartsWith("type ")) { AppearanceLayer = (AppearanceLayerType)Int32.Parse(line.Substring(5)); break; } } // Break up the lower half in to parameters and textures string[] lowerparts = parts[1].Split(new string[] { "textures" }, StringSplitOptions.None); lowerparts[1] = "textures" + lowerparts[1]; // Parse the parameters lines = lowerparts[0].Split('\n'); foreach (string line in lines) { string[] fields = line.Split(' '); int id; if (Int32.TryParse(fields[0], out id) == false) { continue; // Not interested in this line } float weight = 0.0f; Single.TryParse(fields[1], System.Globalization.NumberStyles.Float, Helpers.EnUsCulture.NumberFormat, out weight); _Parameters[id] = weight; } // Parse the textures lines = lowerparts[1].Split('\n'); foreach (string line in lines) { string[] fields = line.Split(' '); uint id; if (UInt32.TryParse(fields[0], out id) == false) { continue; // Not interested in this line } LLUUID texture; if (LLUUID.TryParse(fields[1], out texture) == false) { continue; // if it won't parse, ignore and continue } _Textures[id] = texture; } return; } catch (Exception e) { Console.WriteLine("** WARNING **", "Failed to parse wearable asset: " + e.ToString()); } return; }
/// <summary> /// Converts byte[] data from a data transfer into a bodypart class /// </summary> /// <returns></returns> internal void UpdateFromAssetData() { if ( AssetData == null || AssetData.Length == 0) { return; } string wearableData = Helpers.FieldToUTF8String(this._AssetData); int version = -1; int n = -1; try { n = wearableData.IndexOf('\n'); version = Int32.Parse(wearableData.Substring(19, n - 18)); wearableData = wearableData.Remove(0, n); if (version != 22) { Console.WriteLine("** WARNING ** : Wearable asset has unrecognized version " + version); return; } n = wearableData.IndexOf('\n'); Name = wearableData.Substring(0, n); wearableData = wearableData.Remove(0, n); n = wearableData.IndexOf('\n'); Description = wearableData.Substring(0, n); wearableData = wearableData.Remove(0, n); // Split in to an upper and lower half string[] parts = wearableData.Split(new string[] { "parameters" }, StringSplitOptions.None); parts[1] = "parameters" + parts[1]; // Parse the upper half string[] lines = parts[0].Split('\n'); foreach (string thisline in lines) { string line = thisline.Trim(); string[] fields = line.Split('\t'); if (fields.Length == 2) { if (fields[0] == "creator_mask") { // Deprecated, apply this as the base mask _Permission_Base_Mask = UInt32.Parse(fields[1], System.Globalization.NumberStyles.HexNumber); } else if (fields[0] == "base_mask") { _Permission_Base_Mask = UInt32.Parse(fields[1], System.Globalization.NumberStyles.HexNumber); } else if (fields[0] == "owner_mask") { _Permission_Owner_Mask = UInt32.Parse(fields[1], System.Globalization.NumberStyles.HexNumber); } else if (fields[0] == "group_mask") { _Permission_Group_Mask = UInt32.Parse(fields[1], System.Globalization.NumberStyles.HexNumber); } else if (fields[0] == "everyone_mask") { _Permission_Everyone_Mask = UInt32.Parse(fields[1], System.Globalization.NumberStyles.HexNumber); } else if (fields[0] == "next_owner_mask") { _Permission_Next_Owner_Mask = UInt32.Parse(fields[1], System.Globalization.NumberStyles.HexNumber); } else if (fields[0] == "creator_id") { _Creator_ID = new LLUUID(fields[1]); } else if (fields[0] == "owner_id") { _Owner_ID = new LLUUID(fields[1]); } else if (fields[0] == "last_owner_id") { _Last_Owner_ID = new LLUUID(fields[1]); } else if (fields[0] == "group_id") { _Group_ID = new LLUUID(fields[1]); } else if (fields[0] == "group_owned") { _Group_Owned = (Int32.Parse(fields[1]) != 0); } else if (fields[0] == "sale_type") { for (int i = 0; i < _ForSaleNames.Length; i++) { if (fields[1] == _ForSaleNames[i]) { _Sale = (_ForSale)i; break; } } } else if (fields[0] == "sale_price") { _Sale_Price = UInt32.Parse(fields[1]); } else if (fields[0] == "perm_mask") { Console.WriteLine("** WARNING ** : Wearable asset has deprecated perm_mask field, ignoring"); } } else if (line.StartsWith("type ")) { AppearanceLayer = (AppearanceLayerType)Int32.Parse(line.Substring(5)); break; } } // Break up the lower half in to parameters and textures string[] lowerparts = parts[1].Split(new string[] { "textures" }, StringSplitOptions.None); lowerparts[1] = "textures" + lowerparts[1]; // Parse the parameters lines = lowerparts[0].Split('\n'); foreach (string line in lines) { string[] fields = line.Split(' '); int id; if( Int32.TryParse(fields[0], out id) == false ) { continue; // Not interested in this line } float weight = 0.0f; Single.TryParse(fields[1], System.Globalization.NumberStyles.Float, Helpers.EnUsCulture.NumberFormat, out weight); _Parameters[id] = weight; } // Parse the textures lines = lowerparts[1].Split('\n'); foreach (string line in lines) { string[] fields = line.Split(' '); uint id; if (UInt32.TryParse(fields[0], out id) == false) { continue; // Not interested in this line } LLUUID texture; if( LLUUID.TryParse(fields[1], out texture) == false ) { continue; // if it won't parse, ignore and continue } _Textures[id] = texture; } return; } catch (Exception e) { Console.WriteLine("** WARNING **", "Failed to parse wearable asset: " + e.ToString()); } return; }