/// <summary> /// Parses an instinct item. /// </summary> /// <param name="data"></param> private void ParseInstinct(byte[] data) { // Convert the item to a weapon structure entry.. var item = ArrayToStruct <FFXiTypes.ItemInstinct>(data); if (item.ItemId == 0) { return; } // Build the item wrapper.. var wrap = new FFXiTypes.ItemWrapper { ItemId = item.ItemId, Flags = item.Flags, StackSize = item.StackSize, ItemType = item.ItemType, ResourceId = item.ResourceID, ValidTargets = item.ValidTargets, ImageSize = item.ImageSize, ImageType = item.ImageType, ImageName = Encoding.ASCII.GetString(item.ImageName.Take(8).ToArray()).Trim(), Bitmap = GenerateBitmap(data) }; ParseStrings(wrap, item.StringData); // Add the item to the cache.. _itemCache[item.ItemId] = wrap; }
/// <summary> /// Parses a weapon item entry. /// </summary> /// <param name="data"></param> private void ParseWeapon(byte[] data) { // Convert the item to a weapon structure entry.. var item = ArrayToStruct <FFXiTypes.ItemWeapon>(data); if (item.ItemId == 0) { return; } // Build the item wrapper.. var wrap = new FFXiTypes.ItemWrapper { ItemId = item.ItemId, Flags = item.Flags, StackSize = item.StackSize, ItemType = item.ItemType, ResourceId = item.ResourceId, ValidTargets = item.ValidTargets, Level = item.Level, Slot = item.Slot, Races = item.Races, Jobs = item.Jobs, Damage = item.Damage, Delay = item.Delay, Dps = item.Dps, Skill = item.Skill, JugSize = item.JugSize, MaxCharges = item.MaxCharges, CastTime = item.CastTime, UseDelay = item.UseDelay, ReuseDelay = item.ReuseDelay, ImageSize = item.ImageSize, ImageType = item.ImageType, ImageName = Encoding.ASCII.GetString(item.ImageName.Take(8).ToArray()).Trim(), Bitmap = GenerateBitmap(data) }; ParseStrings(wrap, item.StringData); // Add the item to the cache.. _itemCache[item.ItemId] = wrap; }
/// <summary> /// Parses the strings of the given item. /// </summary> /// <param name="wrapper"></param> /// <param name="stringData"></param> private static void ParseStrings(FFXiTypes.ItemWrapper wrapper, byte[] stringData) { var stringCount = BitConverter.ToUInt32(stringData, 0); var stringOffset = BitConverter.ToUInt32(stringData, 4); if (stringCount > 9 || stringCount <= 0) { return; } var length = GetStringLength(stringData, stringOffset + 28); if (length < 1) { return; } // Read the item name.. wrapper.Name = GetString(stringData, stringOffset + 28); switch (stringCount) { case 2: // Japense { // Read the description.. stringOffset = BitConverter.ToUInt32(stringData, 4 + (8 * 1)); length = GetStringLength(stringData, stringOffset + 28); if (length > 2) { wrapper.Description = GetString(stringData, stringOffset + 28); } break; } case 5: // English { // Read the log name (singular).. stringOffset = BitConverter.ToUInt32(stringData, 4 + (8 * 2)); length = GetStringLength(stringData, stringOffset + 28); if (length > 2) { wrapper.LogNameSingular = GetString(stringData, stringOffset + 28); } // Read the log name (plural).. stringOffset = BitConverter.ToUInt32(stringData, 4 + (8 * 3)); length = GetStringLength(stringData, stringOffset + 28); if (length > 2) { wrapper.LogNamePlural = GetString(stringData, stringOffset + 28); } // Read the description.. stringOffset = BitConverter.ToUInt32(stringData, 4 + (8 * 4)); length = GetStringLength(stringData, stringOffset + 28); if (length > 2) { wrapper.Description = GetString(stringData, stringOffset + 28); } break; } case 6: // French { // Read the log name (singular).. stringOffset = BitConverter.ToUInt32(stringData, 4 + (8 * 3)); length = GetStringLength(stringData, stringOffset + 28); if (length > 2) { wrapper.LogNameSingular = GetString(stringData, stringOffset + 28); } // Read the log name (plural).. stringOffset = BitConverter.ToUInt32(stringData, 4 + (8 * 4)); length = GetStringLength(stringData, stringOffset + 28); if (length > 2) { wrapper.LogNamePlural = GetString(stringData, stringOffset + 28); } // Read the description.. stringOffset = BitConverter.ToUInt32(stringData, 4 + (8 * 5)); length = GetStringLength(stringData, stringOffset + 28); if (length > 2) { wrapper.Description = GetString(stringData, stringOffset + 28); } break; } case 9: // German { // Read the log name (singular).. stringOffset = BitConverter.ToUInt32(stringData, 4 + (8 * 4)); length = GetStringLength(stringData, stringOffset + 28); if (length > 2) { wrapper.LogNameSingular = GetString(stringData, stringOffset + 28); } // Read the log name (plural).. stringOffset = BitConverter.ToUInt32(stringData, 4 + (8 * 7)); length = GetStringLength(stringData, stringOffset + 28); if (length > 2) { wrapper.LogNamePlural = GetString(stringData, stringOffset + 28); } // Read the description.. stringOffset = BitConverter.ToUInt32(stringData, 4 + (8 * 8)); length = GetStringLength(stringData, stringOffset + 28); if (length > 2) { wrapper.Description = GetString(stringData, stringOffset + 28); } break; } default: return; } }