/// <summary> /// Gets the model info from the modelchara exd data /// </summary> /// <param name="modelCharaEx">The modelchara ex data</param> /// <param name="index">The index of the data</param> /// <returns>The XivModelInfo data</returns> public static XivModelInfo GetModelInfo(Dictionary <int, byte[]> modelCharaEx, int index) { var xivModelInfo = new XivMonsterModelInfo(); // These are the offsets to relevant data // These will need to be changed if data gets added or removed with a patch const int modelDataOffset = 4; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(modelCharaEx[index]))) { xivModelInfo.PrimaryID = br.ReadInt16(); br.BaseStream.Seek(modelDataOffset, SeekOrigin.Begin); var modelType = br.ReadByte(); xivModelInfo.SecondaryID = br.ReadByte(); xivModelInfo.ImcSubsetID = br.ReadByte(); if (modelType == 2) { xivModelInfo.ModelType = XivItemType.demihuman; } else if (modelType == 3) { xivModelInfo.ModelType = XivItemType.monster; } else { xivModelInfo.ModelType = XivItemType.unknown; } } return(xivModelInfo); }
public static byte[] DecompressRLE(byte[] bytes) { List <byte> newBytes = new List <byte>(); using (var reader = new BinaryReaderBE(new MemoryStream(bytes))) { while (reader.BaseStream.Position < reader.BaseStream.Length) { int n = reader.ReadByte(); bool alt = n >= 129 ? true : false; if (alt) { n -= 127; } else if (n == 0) { break; } byte content = reader.ReadByte(); for (int i = 0; i < n; i++) { newBytes.Add(alt ? content : (i == 0 ? content : reader.ReadByte())); } } } return(newBytes.ToArray()); }
public void Load(BinaryReaderBE reader) { Flags = reader.ReadByte(); Value = reader.ReadByte(); Red = reader.ReadUInt16(); Green = reader.ReadUInt16(); Blue = reader.ReadUInt16(); }
public void Load(BinaryReaderBE reader) { Width = reader.ReadInt16(); Height = reader.ReadInt16(); bytesPerRow = reader.ReadInt16(); flags = (BitmapFlags)reader.ReadUInt16(); BitDepth = reader.ReadInt16(); int scanlines = ColumnOrder ? Width : Height; reader.BaseStream.Seek(20 + scanlines * 4, SeekOrigin.Current); data = new byte[Width * Height]; if (bytesPerRow > -1) { // not compressed if (ColumnOrder) { // rotate short temp = Width; Width = Height; Height = temp; for (int y = Height - 1; y >= 0; --y) { for (int x = 0; x < Width; ++x) { data[x + y * Width] = reader.ReadByte(); } } } else { reader.Read(data, 0, Width * Height); } } else { for (int x = 0; x < Width; ++x) { short start = reader.ReadInt16(); short end = reader.ReadInt16(); for (int y = start; y < end; ++y) { data[x + y * Width] = reader.ReadByte(); } } } }
public void Read(BinaryReaderBE Reader) { Magic = Reader.ReadBytes(16); ServerId = Reader.ReadBytes(8); Security = Reader.ReadByte(); MTU = Reader.ReadUInt16BE(); }
public void Read(BinaryReaderBE Reader) { SequenceNumbers = new List <SequenceNumber>(); UInt16 numAcks = Reader.ReadUInt16BE(); for (var i = 0; i < numAcks; i++) { Byte type = Reader.ReadByte(); if (type == 0) { SequenceNumber first = new SequenceNumber(), last = new SequenceNumber(); first.Read(Reader); last.Read(Reader); for (UInt32 seq = first.Number; seq < last.Number; seq++) { SequenceNumber num = new SequenceNumber(); num.Number = seq; SequenceNumbers.Add(num); } } else { SequenceNumber num = new SequenceNumber(); num.Read(Reader); SequenceNumbers.Add(num); } } }
public void Read(BinaryReaderBE Reader) { ClientId = Reader.ReadBytes(8); Reader.ReadUInt32(); // Unknown Time = Reader.ReadUInt32BE(); Security = Reader.ReadByte(); }
public void Read(BinaryReaderBE Reader) { var type = Reader.ReadByte(); if (type != 4) { throw new InvalidDataException("Only IPv4 addresses are supported"); } Address = ~Reader.ReadUInt32(); Port = Reader.ReadUInt16BE(); }
/// <summary> /// Gets the model info from the modelchara exd file /// </summary> /// <param name="gameDirectory">The game directory</param> /// <param name="index">The index of the data</param> /// <returns>The XivModelInfo data</returns> public static async Task <XivModelInfo> GetModelInfo(DirectoryInfo gameDirectory, int index) { var xivModelInfo = new XivMonsterModelInfo(); // These are the offsets to relevant data // These will need to be changed if data gets added or removed with a patch int startOffset = 8; int modelDataOffset = 12; var ex = new Ex(gameDirectory); var modelCharaEx = await ex.ReadExData(XivEx.modelchara); // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(modelCharaEx[index]))) { br.BaseStream.Seek(startOffset, SeekOrigin.Begin); xivModelInfo.PrimaryID = br.ReadInt16(); br.BaseStream.Seek(modelDataOffset, SeekOrigin.Begin); var modelType = br.ReadByte(); xivModelInfo.SecondaryID = br.ReadByte(); xivModelInfo.ImcSubsetID = br.ReadByte(); if (modelType == 2) { xivModelInfo.ModelType = XivItemType.demihuman; } else if (modelType == 3) { xivModelInfo.ModelType = XivItemType.monster; } else { xivModelInfo.ModelType = XivItemType.unknown; } } return(xivModelInfo); }
public void Load(BinaryReaderBE reader) { Width = reader.ReadInt16(); Height = reader.ReadInt16(); bytesPerRow = reader.ReadInt16(); flags = (BitmapFlags)reader.ReadUInt16(); BitDepth = reader.ReadInt16(); int scanlines = ColumnOrder ? Width : Height; reader.BaseStream.Seek(20 + scanlines * 4, SeekOrigin.Current); data = new byte[Width * Height]; if (bytesPerRow > -1) { // not compressed // if (ColumnOrder) { // // rotate // short temp = Width; // Width = Height; // Height = temp; // for (int y = Height - 1; y >= 0; --y) { // for (int x = 0; x < Width; ++x) { // data[x + y * Width] = reader.ReadByte(); // } // } // } else { reader.Read(data, 0, Width * Height); // } } else { ColumnOrder = false; for (int x = 0; x < Width; x++) { short start = reader.ReadInt16(); short end = reader.ReadInt16(); for (int y = start; y < end; y++) { data[x + y * Width] = reader.ReadByte(); } // int dstp = x + start * Width; // while (start != end) { // data[dstp] = reader.ReadByte(); // dstp += Width; // start++; // } } } }
public void Read(BinaryReaderBE Reader) { var lines = Reader.ReadUInt32(); Lines = new ConsoleLine[lines]; for (var i = 0; i < lines; i++) { var consoleLine = new ConsoleLine(); var length = Reader.ReadUInt32(); var unknown = Reader.ReadByte(); var length2 = Reader.ReadUInt32(); var line = Reader.ReadBytes((int)length); consoleLine.Level = Reader.ReadUInt32(); consoleLine.Line = Encoding.UTF8.GetString(line); Lines[i] = consoleLine; } }
private int readVLV(BinaryReaderBE binaryReader) { int delta = 0; while (true) { delta += binaryReader.ReadByte(); if ((delta & 0x80) == 0x80) { delta <<= 8; } else { break; } } return(delta); }
public void Read(BinaryReaderBE Reader) { Enumerations = new List <DosEnumeration>(); var numEnums = Reader.ReadUInt32(); for (var i = 0; i < numEnums; i++) { var enumeration = new DosEnumeration(); enumeration.Name = ReadString(Reader); enumeration.Type = Reader.ReadByte(); enumeration.Values = new List <String>(); var numElems = Reader.ReadUInt32(); for (var j = 0; j < numElems; j++) { enumeration.Values.Add(ReadString(Reader)); } Enumerations.Add(enumeration); } }
/// <summary> /// Gets the list of action UI elements /// </summary> /// <remarks> /// The actions are obtained from different sources, but is not all inclusive /// There may be some actions that are missing /// </remarks> /// <returns>A list containing XivUi data</returns> public async Task <List <XivUi> > GetActionList() { var actionLock = new object(); // Data from the action_0 exd var actionExData = await _ex.ReadExData(XivEx.action); var actionCategoryExData = await _ex.ReadExData(XivEx.actioncategory); var actionList = new List <XivUi>(); var actionNames = new List <string>(); await Task.Run(() => Parallel.ForEach(actionExData.Values, (action) => { var xivUi = new XivUi() { PrimaryCategory = "UI", SecondaryCategory = XivStrings.Actions }; int actionCategory; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(action))) { br.BaseStream.Seek(8, SeekOrigin.Begin); var iconNumber = br.ReadUInt16(); if (iconNumber == 0) { return; } var dataOffset = 28; var dataLength = 60; br.BaseStream.Seek(dataOffset, SeekOrigin.Begin); actionCategory = br.ReadByte(); br.BaseStream.Seek(dataLength, SeekOrigin.Begin); var nameLength = action.Length - dataLength; var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", ""); xivUi.Name = name; xivUi.IconNumber = iconNumber; } if (xivUi.Name.Equals(string.Empty)) { return; } if (actionNames.Contains(xivUi.Name)) { return; } var actionCategoryData = actionCategoryExData[actionCategory]; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(actionCategoryData))) { br.BaseStream.Seek(4, SeekOrigin.Begin); var nameLength = actionCategoryData.Length - 4; var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", ""); if (name.Equals(string.Empty)) { xivUi.TertiaryCategory = XivStrings.None; } else { xivUi.TertiaryCategory = name; } } lock (actionLock) { actionNames.Add(xivUi.Name); actionList.Add(xivUi); } })); // Data from generalaction_0 var generalActionExData = await _ex.ReadExData(XivEx.generalaction); await Task.Run(() => Parallel.ForEach(generalActionExData.Values, (action) => { var xivUi = new XivUi() { PrimaryCategory = "UI", SecondaryCategory = XivStrings.Actions, TertiaryCategory = XivStrings.General }; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(action))) { br.BaseStream.Seek(6, SeekOrigin.Begin); var nameLength = br.ReadInt16(); br.BaseStream.Seek(10, SeekOrigin.Begin); var iconNumber = br.ReadUInt16(); if (iconNumber == 0) { return; } br.BaseStream.Seek(20, SeekOrigin.Begin); var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", ""); xivUi.Name = name; xivUi.IconNumber = iconNumber; } lock (actionLock) { actionNames.Add(xivUi.Name); actionList.Add(xivUi); } })); // Data from buddyaction_0 var buddyActionExData = await _ex.ReadExData(XivEx.buddyaction); await Task.Run(() => Parallel.ForEach(buddyActionExData.Values, (action) => { var xivUi = new XivUi() { PrimaryCategory = "UI", SecondaryCategory = XivStrings.Actions, TertiaryCategory = XivStrings.Buddy }; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(action))) { br.BaseStream.Seek(6, SeekOrigin.Begin); var nameLength = br.ReadInt16(); br.BaseStream.Seek(10, SeekOrigin.Begin); var iconNumber = br.ReadUInt16(); if (iconNumber == 0) { return; } br.BaseStream.Seek(20, SeekOrigin.Begin); var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", ""); xivUi.Name = name; xivUi.IconNumber = iconNumber; } if (actionNames.Contains(xivUi.Name)) { return; } lock (actionLock) { actionNames.Add(xivUi.Name); actionList.Add(xivUi); } })); // Data from companyaction_0 var companyActionExData = await _ex.ReadExData(XivEx.companyaction); await Task.Run(() => Parallel.ForEach(companyActionExData.Values, (action) => { var xivUi = new XivUi() { PrimaryCategory = "UI", SecondaryCategory = XivStrings.Actions, TertiaryCategory = XivStrings.Company }; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(action))) { br.BaseStream.Seek(6, SeekOrigin.Begin); var nameLength = br.ReadInt16(); br.BaseStream.Seek(14, SeekOrigin.Begin); var iconNumber = br.ReadUInt16(); if (iconNumber == 0) { return; } br.BaseStream.Seek(20, SeekOrigin.Begin); var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", ""); xivUi.Name = name; xivUi.IconNumber = iconNumber; } if (actionNames.Contains(xivUi.Name)) { return; } lock (actionLock) { actionNames.Add(xivUi.Name); actionList.Add(xivUi); } })); // Data from craftaction_100000 var craftActionExData = await _ex.ReadExData(XivEx.craftaction); await Task.Run(() => Parallel.ForEach(craftActionExData.Values, (action) => { var xivUi = new XivUi() { PrimaryCategory = "UI", SecondaryCategory = XivStrings.Actions, TertiaryCategory = XivStrings.Craft }; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(action))) { br.BaseStream.Seek(6, SeekOrigin.Begin); var nameLength = br.ReadInt16(); br.BaseStream.Seek(48, SeekOrigin.Begin); var iconNumber = br.ReadUInt16(); if (iconNumber == 0) { return; } br.BaseStream.Seek(60, SeekOrigin.Begin); var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", ""); xivUi.Name = name; xivUi.IconNumber = iconNumber; } if (actionNames.Contains(xivUi.Name)) { return; } lock (actionLock) { actionNames.Add(xivUi.Name); actionList.Add(xivUi); } })); // Data from eventaction_0 var eventActionExData = await _ex.ReadExData(XivEx.eventaction); await Task.Run(() => Parallel.ForEach(eventActionExData.Values, (action) => { var xivUi = new XivUi() { PrimaryCategory = "UI", SecondaryCategory = XivStrings.Actions, TertiaryCategory = XivStrings.Event }; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(action))) { br.BaseStream.Seek(4, SeekOrigin.Begin); var iconNumber = br.ReadUInt16(); if (iconNumber == 0) { return; } br.BaseStream.Seek(16, SeekOrigin.Begin); var nameLength = action.Length - 16; var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", ""); xivUi.Name = name; xivUi.IconNumber = iconNumber; } if (actionNames.Contains(xivUi.Name)) { return; } lock (actionLock) { actionNames.Add(xivUi.Name); actionList.Add(xivUi); } })); // Data from emote_0 var emoteExData = await _ex.ReadExData(XivEx.emote); await Task.Run(() => Parallel.ForEach(emoteExData.Values, (action) => { var xivUi = new XivUi() { PrimaryCategory = "UI", SecondaryCategory = XivStrings.Actions, TertiaryCategory = XivStrings.Emote }; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(action))) { br.BaseStream.Seek(28, SeekOrigin.Begin); var iconNumber = br.ReadUInt16(); if (iconNumber == 0) { return; } br.BaseStream.Seek(40, SeekOrigin.Begin); var nameLength = action.Length - 40; var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", ""); xivUi.Name = name; xivUi.IconNumber = iconNumber; } if (actionNames.Contains(xivUi.Name)) { return; } lock (actionLock) { actionNames.Add(xivUi.Name); actionList.Add(xivUi); } })); // Data from marker_0 var markerExData = await _ex.ReadExData(XivEx.marker); await Task.Run(() => Parallel.ForEach(markerExData.Values, (action) => { var xivUi = new XivUi() { PrimaryCategory = "UI", SecondaryCategory = XivStrings.Actions, TertiaryCategory = XivStrings.Marker }; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(action))) { br.BaseStream.Seek(6, SeekOrigin.Begin); var iconNumber = br.ReadUInt16(); if (iconNumber == 0) { return; } var nameLength = action.Length - 6; var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", ""); xivUi.Name = name; xivUi.IconNumber = iconNumber; } if (actionNames.Contains(xivUi.Name)) { return; } lock (actionLock) { actionNames.Add(xivUi.Name); actionList.Add(xivUi); } })); // Data from fieldmarker_0 var fieldMarkerExData = await _ex.ReadExData(XivEx.fieldmarker); await Task.Run(() => Parallel.ForEach(fieldMarkerExData.Values, (action) => { var xivUi = new XivUi() { PrimaryCategory = "UI", SecondaryCategory = XivStrings.Actions, TertiaryCategory = XivStrings.FieldMarker }; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(action))) { br.BaseStream.Seek(8, SeekOrigin.Begin); var iconNumber = br.ReadUInt16(); if (iconNumber == 0) { return; } br.BaseStream.Seek(12, SeekOrigin.Begin); var nameLength = action.Length - 12; var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", ""); xivUi.Name = name; xivUi.IconNumber = iconNumber; } if (actionNames.Contains(xivUi.Name)) { return; } lock (actionLock) { actionNames.Add(xivUi.Name); actionList.Add(xivUi); } })); actionList.Sort(); return(actionList); }
/// <summary> /// A getter for available gear in the Item exd files /// </summary> /// <returns>A list containing XivGear data</returns> public async Task <List <XivGear> > GetUnCachedGearList() { // These are the offsets to relevant data // These will need to be changed if data gets added or removed with a patch const int modelDataCheckOffset = 30; int dataLength = 160; const int nameDataOffset = 14; const int modelDataOffset = 24; const int iconDataOffset = 136; int slotDataOffset = 154; if (_xivLanguage == XivLanguage.Chinese) { dataLength = 168; slotDataOffset = 156; } if (_xivLanguage == XivLanguage.Korean) { dataLength = 160; slotDataOffset = 154; } var xivGearList = new List <XivGear>(); xivGearList.AddRange(GetMissingGear()); var ex = new Ex(_gameDirectory, _xivLanguage); var itemDictionary = await ex.ReadExData(XivEx.item); // Loops through all the items in the item exd files // Item files start at 0 and increment by 500 for each new file // Item_0, Item_500, Item_1000, etc. await Task.Run(() => Parallel.ForEach(itemDictionary, (item) => { try { // This checks whether there is any model data present in the current item if (item.Value[modelDataCheckOffset] <= 0 && item.Value[modelDataCheckOffset + 1] <= 0) { return; } var primaryMi = new XivGearModelInfo(); var secondaryMi = new XivGearModelInfo(); var hasSecondary = false; var xivGear = new XivGear { ExdID = item.Key, PrimaryCategory = XivStrings.Gear, ModelInfo = primaryMi, }; /* Used to determine if the given model is a weapon * This is important because the data is formatted differently * The model data is a 16 byte section separated into two 8 byte parts (primary model, secondary model) * Format is 8 bytes in length with 2 bytes per data point [short, short, short, short] * Gear: primary model [blank, blank, variant, ID] nothing in secondary model * Weapon: primary model [blank, variant, body, ID] secondary model [blank, variant, body, ID] */ var isWeapon = false; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(item.Value))) { br.BaseStream.Seek(nameDataOffset, SeekOrigin.Begin); var nameOffset = br.ReadInt16(); // Model Data br.BaseStream.Seek(modelDataOffset, SeekOrigin.Begin); // Primary Model Key primaryMi.ModelKey = Quad.Read(br.ReadBytes(8), 0); br.BaseStream.Seek(-8, SeekOrigin.Current); // Primary Blank var unused = br.ReadInt16(); // Primary Variant for weapon, blank otherwise var weaponVariant = br.ReadInt16(); if (weaponVariant != 0) { primaryMi.ImcSubsetID = weaponVariant; primaryMi.IsWeapon = true; isWeapon = true; } // Primary Body if weapon, Variant otherwise if (isWeapon) { primaryMi.SecondaryID = br.ReadInt16(); } else { primaryMi.ImcSubsetID = br.ReadInt16(); } // Primary Model ID primaryMi.PrimaryID = br.ReadInt16(); // Secondary Model Key isWeapon = false; secondaryMi.ModelKey = Quad.Read(br.ReadBytes(8), 0); br.BaseStream.Seek(-8, SeekOrigin.Current); // Secondary Blank var unused2 = br.ReadInt16(); // Secondary Variant for weapon, blank otherwise weaponVariant = br.ReadInt16(); if (weaponVariant != 0) { secondaryMi.ImcSubsetID = weaponVariant; secondaryMi.IsWeapon = true; isWeapon = true; } // Secondary Body if weapon, Variant otherwise if (isWeapon) { secondaryMi.SecondaryID = br.ReadInt16(); } else { secondaryMi.ImcSubsetID = br.ReadInt16(); } // Secondary Model ID secondaryMi.PrimaryID = br.ReadInt16(); // Icon br.BaseStream.Seek(iconDataOffset, SeekOrigin.Begin); xivGear.IconNumber = br.ReadUInt16(); // Gear Slot/Category br.BaseStream.Seek(slotDataOffset, SeekOrigin.Begin); int slotNum = br.ReadByte(); // Waist items do not have texture or model data if (slotNum == 6) { return; } xivGear.EquipSlotCategory = slotNum; xivGear.SecondaryCategory = _slotNameDictionary.ContainsKey(slotNum) ? _slotNameDictionary[slotNum] : "Unknown"; // Gear Name var gearNameOffset = dataLength + nameOffset; var gearNameLength = item.Value.Length - gearNameOffset; br.BaseStream.Seek(gearNameOffset, SeekOrigin.Begin); var nameString = Encoding.UTF8.GetString(br.ReadBytes(gearNameLength)).Replace("\0", ""); xivGear.Name = new string(nameString.Where(c => !char.IsControl(c)).ToArray()); xivGear.Name = xivGear.Name.Trim(); // If we have a secondary model XivGear secondaryItem = null; if (secondaryMi.PrimaryID != 0) { // Make a new item for it. secondaryItem = (XivGear)xivGear.Clone(); secondaryItem.ModelInfo = secondaryMi; xivGear.Name += " - " + XivStrings.Main_Hand; secondaryItem.Name += " - " + XivStrings.Off_Hand; xivGear.PairedItem = secondaryItem; secondaryItem.PairedItem = xivGear; xivGear.SecondaryCategory = XivStrings.Dual_Wield; secondaryItem.SecondaryCategory = XivStrings.Dual_Wield; } lock (_gearLock) { xivGearList.Add(xivGear); if (secondaryItem != null) { xivGearList.Add(secondaryItem); } } } } catch (Exception ex) { throw; } })); xivGearList.Sort(); return(xivGearList); }
internal Meta(BinaryReaderBE binaryReader) { type = binaryReader.ReadByte(); length = binaryReader.ReadByte(); data = binaryReader.ReadBytes(length); }
public virtual void Load(string filename) { BinaryReaderBE reader = new BinaryReaderBE(File.Open(filename, FileMode.Open)); try { // is it MacBinary? int fork_start = 0; int resourceOffset = MacBinaryHeader(reader.ReadBytes(128)); if (resourceOffset > 0) { fork_start = 128; resourceOffset = 128 + ((resourceOffset + 0x7f) & ~0x7f); } reader.BaseStream.Seek(fork_start, SeekOrigin.Begin); // read the header version = reader.ReadInt16(); DataVersion = reader.ReadInt16(); Filename = reader.ReadMacString(maxFilename); checksum = reader.ReadUInt32(); directoryOffset = reader.ReadInt32(); short wadCount = reader.ReadInt16(); applicationSpecificDirectoryDataSize = reader.ReadInt16(); entryHeaderSize = reader.ReadInt16(); directoryEntryBaseSize = reader.ReadInt16(); // sanity check the map if (Version < 2 || entryHeaderSize != 16 || directoryEntryBaseSize != 10) { throw new BadMapException("Only Marathon 2 and higher maps are supported"); } ParentChecksum = reader.ReadUInt32(); reader.ReadBytes(2 * 20); // unused // load the directory reader.BaseStream.Seek(directoryOffset + fork_start, SeekOrigin.Begin); for (int i = 0; i < wadCount; ++i) { DirectoryEntry entry = new DirectoryEntry(); entry.LoadEntry(reader); Directory[entry.Index] = entry; LoadApplicationSpecificDirectoryData(reader, entry.Index); } // load all the wads(!) foreach (KeyValuePair <int, DirectoryEntry> kvp in Directory) { reader.BaseStream.Seek(kvp.Value.Offset + fork_start, SeekOrigin.Begin); kvp.Value.LoadChunks(reader); } if (resourceOffset > 0) { reader.BaseStream.Seek(resourceOffset, SeekOrigin.Begin); UInt32 dataOffset = reader.ReadUInt32(); UInt32 mapOffset = reader.ReadUInt32(); UInt32 dataLength = reader.ReadUInt32(); UInt32 mapLength = reader.ReadUInt32(); Debug.Log(resourceOffset); Debug.Log(dataOffset); Debug.Log(mapOffset); Debug.Log(dataLength); Debug.Log(mapLength); dataOffset += (UInt32)resourceOffset; mapOffset += (UInt32)resourceOffset; ResourceMap resourceMap = new ResourceMap(); resourceMap.load(ref reader, mapOffset); for (int i = 0; i < resourceMap.refs.Count; i++) { string name = ""; if (resourceMap.refs[i].nameListOffset > 0) { reader.BaseStream.Seek(resourceMap.refs[i].nameListOffset + resourceMap.nameListOffset + mapOffset, SeekOrigin.Begin); int nameLength = reader.ReadByte(); name = reader.ReadMacString(nameLength); } if (resourceMap.refs[i].type == Pict.Tag || resourceMap.refs[i].type == Pict.Tag2) { Pict pict = new Pict(); reader.BaseStream.Seek(resourceMap.refs[i].dataOffset + dataOffset, SeekOrigin.Begin); pict.LoadWithName(reader, name); pictResources.Add(pict); } if (resourceMap.refs[i].type == Clut.Tag) { Clut clut = new Clut(); reader.BaseStream.Seek(resourceMap.refs[i].dataOffset + dataOffset, SeekOrigin.Begin); clut.Load(reader); clutResources.Add(clut); } if (resourceMap.refs[i].type == SoundResource.Tag) { SoundResource snd = new SoundResource(); reader.BaseStream.Seek(resourceMap.refs[i].dataOffset + dataOffset, SeekOrigin.Begin); snd.Load(reader); soundResources.Add(snd); } if (resourceMap.refs[i].type == TextResource.Tag || resourceMap.refs[i].type == TextResource.Tag2) { TextResource txt = new TextResource(); reader.BaseStream.Seek(resourceMap.refs[i].dataOffset + dataOffset, SeekOrigin.Begin); txt.Load(reader); textResources.Add(txt); } } } } finally { reader.Close(); } }
internal Pressure(BinaryReaderBE binaryReader, int channel) { this.Channel = (byte)channel; pressure = binaryReader.ReadByte(); }
internal PitchBend(BinaryReaderBE binaryReader, int channel) { this.Channel = (byte)channel; lsb = binaryReader.ReadByte(); msb = binaryReader.ReadByte(); }
internal Patch(BinaryReaderBE binaryReader, int channel) { this.Channel = (byte)channel; instrument = binaryReader.ReadByte(); }
public override GameFile[] Unpack() { this.file.BaseStream.Position = this.file.Position; BinaryReaderBE reader = new BinaryReaderBE(this.file.BaseStream); /** PART 1 **/ // Read header uint numEntries = reader.ReadUInt32(); uint strSecOffset = reader.ReadUInt32(); uint strSecSize = reader.ReadUInt32(); uint numStr = reader.ReadUInt32(); /** PART 2 **/ reader.BaseStream.Position = this.file.Position + strSecOffset + strSecSize; if ((reader.BaseStream.Position - this.file.Position) % 0x10 != 0) { reader.BaseStream.Position += 0x10 - ((reader.BaseStream.Position - this.file.Position) % 0x10); } long part2Offset = reader.BaseStream.Position; // Read header uint signSecOffset = reader.ReadUInt32(); uint numNames = reader.ReadUInt32(); uint namesSecOffset = reader.ReadUInt32(); uint namesSecSize = reader.ReadUInt32(); // Read names Dictionary <uint, string> entriesName = new Dictionary <uint, string>(); for (int i = 0; i < numNames; i++) { reader.BaseStream.Position = part2Offset + 0x10 + i * 8; uint id = reader.ReadUInt32(); reader.BaseStream.Position = part2Offset + namesSecOffset + reader.ReadUInt32(); entriesName.Add(id, reader.ReadString()); } // Read signature // Specially, the contextuality reader.BaseStream.Position = part2Offset + signSecOffset + 6; byte context = reader.ReadByte(); /** PART 1 **/ // At last, read config entries reader.BaseStream.Position = this.file.Position + 0x10; ConfigEntry[] entries = new ConfigEntry[numEntries]; for (int i = 0; i < numEntries; i++) { entries[i].Id = reader.ReadUInt32(); entries[i].Name = entriesName[entries[i].Id]; byte numValues = reader.ReadByte(); reader.BaseStream.Position--; uint[] types = reader.ReadUInt32s(1 + (numValues + 3) / 16); types[0] <<= 8; // Remove numValues data // Get the data entries[i].Data = new ConfigValue[numValues]; long dataOffset = reader.BaseStream.Position; for (int j = 0; j < numValues; j++) { reader.BaseStream.Position = dataOffset + j * 4; entries[i].Data[j] = this.GetValue(j, types, strSecOffset); } // Offset to next entry. reader.BaseStream.Position = dataOffset + numValues * 4; } // Write everything to a text file. //Stream txtStream = WriteText(entries, (context == 0)); Stream txtStream = WriteInfo(entries); if (txtStream == null) { txtStream = WriteText(entries, (context == 0)); } // Create the virtual file GameFile textFile = new GameFile(txtStream); textFile.Position = 0; textFile.Size = txtStream.Length; textFile.FileName = this.file.FileName + ".txt"; textFile.FilePath = this.file.FilePath; textFile.Parent = null; reader = null; return(new GameFile[] { textFile }); }
public void Load(BinaryReaderBE reader) { samples.Clear(); int depth = 8; bool signed_8bit = false; uint frames = 0; long origin = reader.BaseStream.Position; reader.BaseStream.Seek(20, SeekOrigin.Current); byte headerType = reader.ReadByte(); reader.BaseStream.Seek(origin, SeekOrigin.Begin); switch (headerType) { case StandardSoundHeader: depth = 8; signed_8bit = false; channels = 1; reader.ReadUInt32(); // sample pointer frames = reader.ReadUInt32(); sampleRate = reader.ReadFixed(); loopStart = reader.ReadUInt32(); loopEnd = reader.ReadUInt32(); reader.ReadByte(); // type frequency = reader.ReadByte(); // I think this is a MIDI note? break; case ExtendedSoundHeader: case CompressedSoundHeader: reader.ReadUInt32(); // sample pointer channels = reader.ReadUInt32() == 2 ? 2 : 1; sampleRate = reader.ReadFixed(); loopStart = reader.ReadUInt32(); loopEnd = reader.ReadUInt32(); reader.ReadByte(); // type frequency = reader.ReadByte(); // I think this is MIDI? frames = reader.ReadUInt32(); if (headerType == CompressedSoundHeader) { reader.BaseStream.Seek(10, SeekOrigin.Current); reader.ReadUInt32(); // marker chunk uint format = reader.ReadUInt32(); reader.ReadUInt32(); // future use reader.ReadUInt32(); // stateVars reader.ReadUInt32(); // leftOverSamples short compressionId = reader.ReadInt16(); if (format != SoundsFile.FourCharsToInt('t', 'w', 'o', 's') || compressionId != -1) { // fail somehow return; } signed_8bit = true; reader.ReadInt16(); // packet size reader.ReadInt16(); // unused depth = (reader.ReadInt16() == 16 ? 16 : 8); } else { signed_8bit = false; reader.BaseStream.Seek(22, SeekOrigin.Current); depth = (reader.ReadInt16() == 16 ? 16 : 8); reader.BaseStream.Seek(14, SeekOrigin.Current); } break; } for (int i = 0; i < frames; ++i) { for (int j = 0; j < channels; ++j) { float sample; if (depth == 16) { sample = (reader.ReadInt16() + 0.5f) / 32767.5f; } else if (signed_8bit) { sample = (reader.ReadSByte() + 0.5f) / 127.5f; } else { sample = reader.ReadByte() / 127.5f - 1.0f; } samples.Add(sample); } } }
/// <summary> /// Gets the list of status effect UI elements /// </summary> /// <returns>A list containing XivUi data</returns> public List <XivUi> GetStatusList() { var statusList = new List <XivUi>(); // These are the offsets to relevant data // These will need to be changed if data gets added or removed with a patch const int nameLengthDataOffset = 6; const int typeDataOffset = 13; const int dataLength = 24; var ex = new Ex(_gameDirectory, _xivLanguage); var statusExData = ex.ReadExData(XivEx.status); foreach (var status in statusExData.Values) { var xivUi = new XivUi() { Category = "UI", ItemCategory = XivStrings.Status }; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(status))) { br.BaseStream.Seek(nameLengthDataOffset, SeekOrigin.Begin); var nameLength = br.ReadInt16(); var iconNumber = br.ReadUInt16(); if (iconNumber == 0) { continue; } br.BaseStream.Seek(typeDataOffset, SeekOrigin.Begin); var type = br.ReadByte(); br.BaseStream.Seek(dataLength, SeekOrigin.Begin); var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", ""); xivUi.IconNumber = iconNumber; xivUi.Name = name; if (name.Equals(string.Empty)) { continue; } //Status effects have a byte that determines whether the effect is detrimental or beneficial if (type == 1) { xivUi.ItemSubCategory = XivStrings.Beneficial; } else if (type == 2) { xivUi.ItemSubCategory = XivStrings.Detrimental; } else { xivUi.ItemSubCategory = XivStrings.None; xivUi.Name = xivUi.Name + " " + type; } } statusList.Add(xivUi); } statusList.Sort(); return(statusList); }
/// <summary> /// Gets the list of status effect UI elements /// </summary> /// <returns>A list containing XivUi data</returns> public async Task <List <XivUi> > GetStatusList() { var statusLock = new object(); var statusList = new List <XivUi>(); // These are the offsets to relevant data // These will need to be changed if data gets added or removed with a patch const int nameLengthDataOffset = 6; var typeDataOffset = 13; var dataLength = 24; if (_xivLanguage != XivLanguage.Korean) { typeDataOffset = 16; dataLength = 28; } var statusExData = await _ex.ReadExData(XivEx.status); await Task.Run(() => Parallel.ForEach(statusExData.Values, (status) => { var xivUi = new XivUi() { PrimaryCategory = "UI", SecondaryCategory = XivStrings.Status }; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(status))) { br.BaseStream.Seek(nameLengthDataOffset, SeekOrigin.Begin); var nameLength = br.ReadInt16(); var iconNumber = br.ReadUInt16(); if (iconNumber == 0) { return; } br.BaseStream.Seek(typeDataOffset, SeekOrigin.Begin); var type = br.ReadByte(); br.BaseStream.Seek(dataLength, SeekOrigin.Begin); var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", ""); xivUi.IconNumber = iconNumber; xivUi.Name = name; if (name.Equals(string.Empty)) { return; } //Status effects have a byte that determines whether the effect is detrimental or beneficial if (type == 1) { xivUi.TertiaryCategory = XivStrings.Beneficial; } else if (type == 2) { xivUi.TertiaryCategory = XivStrings.Detrimental; } else { xivUi.TertiaryCategory = XivStrings.None; xivUi.Name = xivUi.Name + " " + type; } } lock (statusLock) { statusList.Add(xivUi); } })); statusList.Sort(); return(statusList); }
/// <summary> /// Gets the list of action UI elements /// </summary> /// <remarks> /// The actions are obtained from different sources, but is not all inclusive /// There may be some actions that are missing /// </remarks> /// <returns>A list containing XivUi data</returns> public List <XivUi> GetActionList() { var ex = new Ex(_gameDirectory, _xivLanguage); // Data from the action_0 exd var actionExData = ex.ReadExData(XivEx.action); var actionCategoryExData = ex.ReadExData(XivEx.actioncategory); var actionList = new List <XivUi>(); var actionNames = new List <string>(); foreach (var action in actionExData.Values) { var xivUi = new XivUi() { Category = "UI", ItemCategory = XivStrings.Actions }; int actionCategory; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(action))) { br.BaseStream.Seek(8, SeekOrigin.Begin); var iconNumber = br.ReadUInt16(); if (iconNumber == 0) { continue; } br.BaseStream.Seek(26, SeekOrigin.Begin); actionCategory = br.ReadByte(); br.BaseStream.Seek(56, SeekOrigin.Begin); var nameLength = action.Length - 56; var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", ""); xivUi.Name = name; xivUi.IconNumber = iconNumber; } if (actionNames.Contains(xivUi.Name)) { continue; } actionNames.Add(xivUi.Name); var actionCategoryData = actionCategoryExData[actionCategory]; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(actionCategoryData))) { br.BaseStream.Seek(4, SeekOrigin.Begin); var nameLength = actionCategoryData.Length - 4; var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", ""); if (name.Equals(string.Empty)) { xivUi.ItemSubCategory = XivStrings.None; } else { xivUi.ItemSubCategory = name; } } actionList.Add(xivUi); } // Data from generalaction_0 var generalActionExData = ex.ReadExData(XivEx.generalaction); foreach (var action in generalActionExData.Values) { var xivUi = new XivUi() { Category = "UI", ItemCategory = XivStrings.Actions, ItemSubCategory = XivStrings.General }; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(action))) { br.BaseStream.Seek(8, SeekOrigin.Begin); var nameLength = br.ReadInt16(); br.BaseStream.Seek(10, SeekOrigin.Begin); var iconNumber = br.ReadUInt16(); if (iconNumber == 0) { continue; } br.BaseStream.Seek(20, SeekOrigin.Begin); var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", ""); xivUi.Name = name; xivUi.IconNumber = iconNumber; } if (actionNames.Contains(xivUi.Name)) { continue; } actionNames.Add(xivUi.Name); actionList.Add(xivUi); } // Data from buddyaction_0 var buddyActionExData = ex.ReadExData(XivEx.buddyaction); foreach (var action in buddyActionExData.Values) { var xivUi = new XivUi() { Category = "UI", ItemCategory = XivStrings.Actions, ItemSubCategory = XivStrings.Buddy }; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(action))) { br.BaseStream.Seek(6, SeekOrigin.Begin); var nameLength = br.ReadInt16(); br.BaseStream.Seek(10, SeekOrigin.Begin); var iconNumber = br.ReadUInt16(); if (iconNumber == 0) { continue; } br.BaseStream.Seek(20, SeekOrigin.Begin); var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", ""); xivUi.Name = name; xivUi.IconNumber = iconNumber; } if (actionNames.Contains(xivUi.Name)) { continue; } actionNames.Add(xivUi.Name); actionList.Add(xivUi); } // Data from companyaction_0 var companyActionExData = ex.ReadExData(XivEx.companyaction); foreach (var action in companyActionExData.Values) { var xivUi = new XivUi() { Category = "UI", ItemCategory = XivStrings.Actions, ItemSubCategory = XivStrings.Company }; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(action))) { br.BaseStream.Seek(6, SeekOrigin.Begin); var nameLength = br.ReadInt16(); br.BaseStream.Seek(14, SeekOrigin.Begin); var iconNumber = br.ReadUInt16(); if (iconNumber == 0) { continue; } br.BaseStream.Seek(20, SeekOrigin.Begin); var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", ""); xivUi.Name = name; xivUi.IconNumber = iconNumber; } if (actionNames.Contains(xivUi.Name)) { continue; } actionNames.Add(xivUi.Name); actionList.Add(xivUi); } // Data from craftaction_100000 var craftActionExData = ex.ReadExData(XivEx.craftaction); foreach (var action in craftActionExData.Values) { var xivUi = new XivUi() { Category = "UI", ItemCategory = XivStrings.Actions, ItemSubCategory = XivStrings.Craft }; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(action))) { br.BaseStream.Seek(6, SeekOrigin.Begin); var nameLength = br.ReadInt16(); br.BaseStream.Seek(48, SeekOrigin.Begin); var iconNumber = br.ReadUInt16(); if (iconNumber == 0) { continue; } br.BaseStream.Seek(60, SeekOrigin.Begin); var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", ""); xivUi.Name = name; xivUi.IconNumber = iconNumber; } if (actionNames.Contains(xivUi.Name)) { continue; } actionNames.Add(xivUi.Name); actionList.Add(xivUi); } // Data from eventaction_0 var eventActionExData = ex.ReadExData(XivEx.eventaction); foreach (var action in eventActionExData.Values) { var xivUi = new XivUi() { Category = "UI", ItemCategory = XivStrings.Actions, ItemSubCategory = XivStrings.Event }; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(action))) { br.BaseStream.Seek(4, SeekOrigin.Begin); var iconNumber = br.ReadUInt16(); if (iconNumber == 0) { continue; } br.BaseStream.Seek(16, SeekOrigin.Begin); var nameLength = action.Length - 16; var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", ""); xivUi.Name = name; xivUi.IconNumber = iconNumber; } if (actionNames.Contains(xivUi.Name)) { continue; } actionNames.Add(xivUi.Name); actionList.Add(xivUi); } // Data from emote_0 var emoteExData = ex.ReadExData(XivEx.emote); foreach (var action in emoteExData.Values) { var xivUi = new XivUi() { Category = "UI", ItemCategory = XivStrings.Actions, ItemSubCategory = XivStrings.Emote }; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(action))) { br.BaseStream.Seek(26, SeekOrigin.Begin); var iconNumber = br.ReadUInt16(); if (iconNumber == 0) { continue; } br.BaseStream.Seek(36, SeekOrigin.Begin); var nameLength = action.Length - 36; var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", ""); xivUi.Name = name; xivUi.IconNumber = iconNumber; } if (actionNames.Contains(xivUi.Name)) { continue; } actionNames.Add(xivUi.Name); actionList.Add(xivUi); } // Data from marker_0 var markerExData = ex.ReadExData(XivEx.marker); foreach (var action in markerExData.Values) { var xivUi = new XivUi() { Category = "UI", ItemCategory = XivStrings.Actions, ItemSubCategory = XivStrings.Marker }; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(action))) { br.BaseStream.Seek(6, SeekOrigin.Begin); var iconNumber = br.ReadUInt16(); if (iconNumber == 0) { continue; } var nameLength = action.Length - 6; var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", ""); xivUi.Name = name; xivUi.IconNumber = iconNumber; } if (actionNames.Contains(xivUi.Name)) { continue; } actionNames.Add(xivUi.Name); actionList.Add(xivUi); } // Data from fieldmarker_0 var fieldMarkerExData = ex.ReadExData(XivEx.fieldmarker); foreach (var action in fieldMarkerExData.Values) { var xivUi = new XivUi() { Category = "UI", ItemCategory = XivStrings.Actions, ItemSubCategory = XivStrings.FieldMarker }; // Big Endian Byte Order using (var br = new BinaryReaderBE(new MemoryStream(action))) { br.BaseStream.Seek(8, SeekOrigin.Begin); var iconNumber = br.ReadUInt16(); if (iconNumber == 0) { continue; } br.BaseStream.Seek(12, SeekOrigin.Begin); var nameLength = action.Length - 12; var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", ""); xivUi.Name = name; xivUi.IconNumber = iconNumber; } if (actionNames.Contains(xivUi.Name)) { continue; } actionNames.Add(xivUi.Name); actionList.Add(xivUi); } actionList.Sort(); return(actionList); }
internal NoteOff(BinaryReaderBE binaryReader, int channel) { this.Channel = (byte)channel; note = binaryReader.ReadByte(); velocity = binaryReader.ReadByte(); }
/// <summary> /// Gets the list of indoor furniture /// </summary> /// <remarks> /// Housing items can be obtained one of two ways /// One: checking the housingfurniture exd for the item index, and going to that item to grab the data /// Two: iterating through the entire item list seeing if the item contains an index to a housing item (offset 112, 4 bytes) /// This method does option one /// </remarks> /// <returns>A list of XivFurniture objects containing indoor furniture item info</returns> private async Task <List <XivFurniture> > GetIndoorFurniture() { var indoorLock = new object(); // These are the offsets to relevant data // These will need to be changed if data gets added or removed with a patch const int itemIndexOffset = 10; const int modelNumberOffset = 12; const int itemCategoryOffset = 14; const int itemNameDataOffset = 14; int itemDataLength = DataLengthByPatch["5.5"]; const int itemIconDataOffset = 136; if (_xivLanguage == XivLanguage.Korean) { itemDataLength = DataLengthByPatch["5.4"]; } else if (_xivLanguage == XivLanguage.Chinese) { itemDataLength = DataLengthByPatch["5.4"]; } var ex = new Ex(_gameDirectory, _xivLanguage); var housingDictionary = await ex.ReadExData(XivEx.housingfurniture); var itemDictionary = await ex.ReadExData(XivEx.item); var furnitureList = new List <XivFurniture>(); await Task.Run(() => Parallel.ForEach(housingDictionary.Values, (housingItem) => { try { var item = new XivFurniture { PrimaryCategory = XivStrings.Housing, SecondaryCategory = XivStrings.Furniture_Indoor, ModelInfo = new XivModelInfo() }; using (var br = new BinaryReaderBE(new MemoryStream(housingItem))) { br.BaseStream.Seek(itemIndexOffset, SeekOrigin.Begin); var itemIndex = br.ReadUInt16(); br.BaseStream.Seek(modelNumberOffset, SeekOrigin.Begin); item.ModelInfo.PrimaryID = br.ReadInt16(); br.BaseStream.Seek(itemCategoryOffset, SeekOrigin.Begin); var housingCategory = br.ReadByte(); using (var br1 = new BinaryReaderBE(new MemoryStream(itemDictionary[itemIndex]))) { br1.BaseStream.Seek(itemNameDataOffset, SeekOrigin.Begin); var nameOffset = br1.ReadInt16(); br1.BaseStream.Seek(itemIconDataOffset, SeekOrigin.Begin); item.IconNumber = br1.ReadUInt16(); var gearNameOffset = itemDataLength + nameOffset; var gearNameLength = itemDictionary[itemIndex].Length - gearNameOffset; br1.BaseStream.Seek(gearNameOffset, SeekOrigin.Begin); var nameString = Encoding.UTF8.GetString(br1.ReadBytes(gearNameLength)).Replace("\0", ""); item.Name = new string(nameString.Where(c => !char.IsControl(c)).ToArray()); } } if (!item.Name.Equals(string.Empty)) { lock (indoorLock) { furnitureList.Add(item); } } } catch (Exception ex) { throw; } })); furnitureList.Sort(); return(furnitureList); }
internal AfterTouch(BinaryReaderBE binaryReader, int channel) { this.Channel = (byte)channel; note = binaryReader.ReadByte(); touch = binaryReader.ReadByte(); }
public bool GetNextMessage(QHFMessage msg) { if (fs.Position >= fs.Length - 24) { return(false); } byte[] msgBytes = null; //Trace.WriteLine("Block start: " + fs.Position); msg.Signature = br.ReadInt16(); if (msg.SignatureMismatch) { if (br.ReadByte() == 1) { // В предыдущем сообщении были ошибки и структура съехала. msg.Signature = 1; } else { // Сдвигаем позицию на исходную для достоверности отладки. fs.Position -= 1; Trace.WriteLine($"{Uin} ({Nick}). Signature mismatch. (sign={msg.Signature})"); return(true); } } var size = br.ReadInt32(); var endOfBlock = size + fs.Position; try { msg.ID = GetNextBlock(); msg.Time = UnixTimeStampToDateTime(GetNextBlock()); msg.IsMy = GetNextBlock() > 0; var msgLength = GetNextBlock(); if (msgLength < 0) { fs.Position -= 4; msgBytes = ReadBytesUntilNextMessage(msg.ID + 1); msgLength = msgBytes.Length; } else { if (msgLength > size) { fs.Position -= 4; msgLength = br.ReadInt16(); if (msgLength > size) { fs.Position -= 2; msgLength = br.ReadByte(); } } msgBytes = br.ReadBytes(msgLength); } msg.Text = encoding.GetString(DecodeBytes(msgBytes)); return(true); } catch (ArgumentException ex) { Trace.WriteLine(ex.Message); if (fs.Position == fs.Length) { msg.Text = "Сообщение потеряно."; } return(true); } }
internal Controller(BinaryReaderBE binaryReader, int channel) { this.Channel = (byte)channel; type = (ControllerType)binaryReader.ReadByte(); value = binaryReader.ReadByte(); }