private PlayerInfoKeyPair ReadOffsets(BinaryReader reader, long startOffset, byte[] key, byte keyStart) { var offset = startOffset > 0? startOffset:0; var keyData = new PlayerInfoKeyPair(); keyData.KeyNameLength = keyStart; keyData.KeyId = key; reader.BaseStream.Seek(offset, SeekOrigin.Begin); try { while (reader.BaseStream.Position < reader.BaseStream.Length) { keyData.KeyOffset = reader.BaseStream.Position; var b = reader.ReadByte(); var backOf = reader.BaseStream.Position; if (b == keyStart) { var scan = reader.ReadBytes(key.Length); if (scan.SequenceEqual(key)) { keyData.ValueOffset = reader.BaseStream.Position; return(keyData); } reader.BaseStream.Seek(backOf, SeekOrigin.Begin); } } } catch { } return(null); }
/// <summary> /// Updates the raw file only if the value has changed. /// </summary> /// <param name="writer">data writer</param> /// <param name="data">data</param> /// <param name="newValue">new value to write</param> /// <returns></returns> private bool UpdateIfChanged(BinaryWriter writer, PlayerInfoKeyPair data, int newValue) { if (newValue != data.Value4byte) { data.Value4byte = newValue; WriteKeyValue(writer, data); ///set modified to true to notify program the player.chr file needs to be updated _modified = true; return(true); } return(false); }
protected void WriteKeyValue(BinaryWriter writer, PlayerInfoKeyPair keyPair) { writer.BaseStream.Seek(keyPair.ValueOffset, SeekOrigin.Begin); if (typeof(Single) == keyPair.Type) { writer.Write(Convert.ToSingle(keyPair.Value4byte)); } else if (typeof(Int32) == keyPair.Type) { writer.Write(keyPair.Value4byte); } else { writer.Write(keyPair.Value4byte); } }