/// <summary> /// Generic loader for loading Item names /// </summary> /// <param name="filetype">FileTypes enum to indicate which file to load.</param> /// <param name="language">Preferred language as an Languages enum.</param> private void LoadItemFile(FileTypes filetype, Languages language) { String Path = GetFilePath(filetype, language); if (!String.IsNullOrEmpty(Path)) { FileInfo fi = new FileInfo(Path); Boolean file_error = false; if (!fi.Exists) return; if ((fi.Length % 0xC00) != 0) return; int items_in_file = (int)(fi.Length / 0xC00); BinaryReader iteminfo = null; try { iteminfo = new BinaryReader(File.Open(Path, FileMode.Open, FileAccess.Read)); } catch (IOException e) { // this line isn't necessary, but it avoids the annoying (e is assigned but never used) Path = e.Message; file_error = true; } if (file_error == true) return; // Attempt a Sanity Check for (int item_counter = 0; item_counter < items_in_file; item_counter++) { iteminfo.BaseStream.Position = 0xC00 * item_counter; byte[] readbytes = DecodeBlock(iteminfo.ReadBytes(0x200), 5); BinaryReader data = new BinaryReader(new MemoryStream(readbytes, false)); itemFormat itemObjects = new itemFormat(data); // INSERT ITEM CHECK DATA HERE data.Close(); //if ((itemObjects.itemHeader.ID < 0xFFFF) && (itemObjects.itemHeader.ID > 0x6FFF)) // continue; if (String.IsNullOrEmpty(itemObjects.text) || String.IsNullOrEmpty(itemObjects.text.Trim('.'))) continue; if ((itemObjects.itemHeader.Flags & (ushort)ItemFlags.Nothing) == (ushort)ItemFlags.Nothing) continue; if (itemObjects.itemHeader.ID == 0x00) continue; // 0x0100 0x0040 0x1000 /* UINT32 ID * UINT16 Flags * UINT16 Stack Size * UINT16 Type * UINT16 ResourceID * UINT16 ValidTargets * 14 Bytes - Common Header Size */ if (String.IsNullOrEmpty(itemObjects.text)) continue; else if (Char.IsSymbol(itemObjects.text[0])) continue; ResourcesCache.Add((int)itemObjects.itemHeader.ID, itemObjects.text); // or itemObjects.logtext } iteminfo.Close(); } }
/// <summary> /// Generic loader for loading Item names into a permanent array for use by GetPhrases(). /// </summary> /// <param name="file_num">File number to load (OBJ, ITEMS, PUPP, ARMR, WEPN, GIL)</param> private void LoadItemFile(int file_num, int language) { if (_fileNumberArrayList == null) return; else if ((file_num < 0) || (file_num >= _fileNumberArrayList.Length)) return; FileInfo fi = new FileInfo(_fileNumberArrayList[file_num]); Boolean file_error = false; if (!fi.Exists) return; if ((fi.Length % 0xC00) != 0) return; int items_in_file = (int)(fi.Length / 0xC00); BinaryReader iteminfo = null; try { iteminfo = new BinaryReader(File.Open(_fileNumberArrayList[file_num], FileMode.Open, FileAccess.Read)); } catch (IOException e) { System.Windows.Forms.MessageBox.Show(e.Message + "\r\nSome Auto-Translate phrases may not be available."); file_error = true; } if (file_error == true) return; // Attempt a Sanity Check for (int item_counter = 0; item_counter < items_in_file; item_counter++) { SplashScreen.SetStatus(String.Empty, 7); // 49 * 10 = 490/10000 = 5% iteminfo.BaseStream.Position = 0xC00 * item_counter; byte[] readbytes = DecodeBlock(iteminfo.ReadBytes(0x200), 5); BinaryReader data = new BinaryReader(new MemoryStream(readbytes, false)); itemFormat itemObjects = new itemFormat(data, FFXIConvert); // INSERT ITEM CHECK DATA HERE data.Close(); //if ((itemObjects.itemHeader.ID < 0xFFFF) && (itemObjects.itemHeader.ID > 0x6FFF)) // continue; //else if (itemObjects.text == String.Empty) // continue; //else if ((itemObjects.itemHeader.Flags & (ushort)ItemFlags.Nothing) == (ushort)ItemFlags.Nothing) continue; else if (itemObjects.itemHeader.ID == 0x00) continue; // 0x0100 0x0040 0x1000 /* UINT32 ID * UINT16 Flags * UINT16 Stack Size * UINT16 Type * UINT16 ResourceID * UINT16 ValidTargets * 14 Bytes - Common Header Size */ int atp = 0; if (_ATKeys_Items == null) _ATKeys_Items = new FFXIATPhrase[1]; else Array.Resize(ref _ATKeys_Items, (int)(_ATKeys_Items.Length + 1)); atp = _ATKeys_Items.Length - 1; _ATKeys_Items[atp] = new FFXIATPhrase(); _ATKeys_Items[atp].StringResource = 0x07; _ATKeys_Items[atp].Language = (byte)language; _ATKeys_Items[atp].GroupID = (byte)((itemObjects.itemHeader.ID & 0xFF00) >> 8); _ATKeys_Items[atp].MessageID = (byte)(itemObjects.itemHeader.ID & 0x00FF); _ATKeys_Items[atp].Flags = itemObjects.itemHeader.Flags; _ATKeys_Items[atp].ActualType = itemObjects.itemHeader.Type; if ((itemObjects.itemHeader.ID >= 0x0000) && (itemObjects.itemHeader.ID <= 0x0FFF)) _ATKeys_Items[atp].BaseType = (ushort)FFXIATPhraseLoader.ffxiFileTypes.ITEMS; else if ((itemObjects.itemHeader.ID >= 0x1000) && (itemObjects.itemHeader.ID <= 0x1FFF)) _ATKeys_Items[atp].BaseType = (ushort)FFXIATPhraseLoader.ffxiFileTypes.OBJS; else if ((itemObjects.itemHeader.ID >= 0x2000) && (itemObjects.itemHeader.ID <= 0x2FFF)) _ATKeys_Items[atp].BaseType = (ushort)FFXIATPhraseLoader.ffxiFileTypes.PUPP; else if ((itemObjects.itemHeader.ID >= 0x2C00) && (itemObjects.itemHeader.ID <= 0x3FFF)) _ATKeys_Items[atp].BaseType = (ushort)FFXIATPhraseLoader.ffxiFileTypes.ARMR; else if ((itemObjects.itemHeader.ID >= 0x4000) && (itemObjects.itemHeader.ID <= 0x6FFF)) _ATKeys_Items[atp].BaseType = (ushort)FFXIATPhraseLoader.ffxiFileTypes.WPNS; else if (itemObjects.itemHeader.ID == 0xFFFF) // Gil _ATKeys_Items[atp].BaseType = (ushort)FFXIATPhraseLoader.ffxiFileTypes.GIL; if (itemObjects.itemHeader.Type != 0) // if it's nothing, categorize at as something else { _ATKeys_Items[atp].Type = itemObjects.itemHeader.Type; } else { if ((itemObjects.itemHeader.ID <= 0x2FFF) && (itemObjects.itemHeader.ID >= 0x2000)) _ATKeys_Items[atp].Type = 13; // Puppet Items else if ((itemObjects.itemHeader.ID <= 0x3FFF) && (itemObjects.itemHeader.ID >= 0x3000)) _ATKeys_Items[atp].Type = 5; // Armor Items else if ((itemObjects.itemHeader.ID <= 0x6FFF) && (itemObjects.itemHeader.ID >= 0x4000)) _ATKeys_Items[atp].Type = 4; // Weapon Items } _ATKeys_Items[atp].value = itemObjects.text; _ATKeys_Items[atp].shortvalue = itemObjects.logtext; // misleading i know } iteminfo.Close(); }