/// <summary> /// Reads data from a SaveReader. Override this in a derived class to read object-specific data. /// </summary> /// <param name="reader">The SaveReader to read from. No guarantees can be made about its ending offset.</param> /// <param name="baseOffset">The offset of the start of the object data.</param> protected virtual void ReadFrom(SaveReader reader, long baseOffset) { _tag = DatumIndex.ReadFrom(reader); reader.SeekTo(baseOffset + StrengthInfoOffset); // Using the default Master Chief values is kind of hackish, // but at the same time it would be overkill to have a huge DB of original health/shield values. _healthInfo = new HealthInfo(reader, DefaultChiefHealthModifier, DefaultChiefShieldModifier); reader.SeekTo(baseOffset + PositionOffset1); _position.X = reader.ReadFloat(); _position.Y = reader.ReadFloat(); _position.Z = reader.ReadFloat(); reader.SeekTo(baseOffset + PositionOffset2); _unkPosition.X = reader.ReadFloat(); _unkPosition.Y = reader.ReadFloat(); _unkPosition.Z = reader.ReadFloat(); _unkPosition = Vector3.Subtract(_unkPosition, _position); reader.SeekTo(baseOffset + CarryInfoOffset); _nextCarriedIndex = DatumIndex.ReadFrom(reader); _firstCarriedIndex = DatumIndex.ReadFrom(reader); _carrierIndex = DatumIndex.ReadFrom(reader); }
private void ReadPlayerInfo(SaveReader reader, long baseOffset) { reader.SeekTo(baseOffset + PlayerBipedOffset); _bipedIndex = DatumIndex.ReadFrom(reader); reader.Seek(baseOffset + 0x50, System.IO.SeekOrigin.Begin); _gamertag = reader.ReadUTF16(); reader.Seek(baseOffset + 0x86, System.IO.SeekOrigin.Begin); _serviceTag = reader.ReadUTF16(); }
private void ReadPlayerInfo(EndianReader reader, long baseOffset) { reader.SeekTo(baseOffset + PlayerBipedOffset); _bipedIndex = DatumIndex.ReadFrom(reader); reader.SeekTo(baseOffset + 0x50); _gamertag = reader.ReadUTF16(); reader.SeekTo(baseOffset + 0x86); _serviceTag = reader.ReadUTF16(); }
/// <summary> /// Reads data from a SaveReader. Override this in a derived class to read object-specific data. /// </summary> /// <param name="reader">The SaveReader to read from. No guarantees can be made about its ending offset.</param> /// <param name="baseOffset">The offset of the start of the object data.</param> protected virtual void ReadFrom(SaveReader reader, long baseOffset) { _tag = DatumIndex.ReadFrom(reader); reader.SeekTo(baseOffset + StrengthInfoOffset); _healthInfo = new HealthInfo(reader, DefaultChiefHealthModifier, DefaultChiefShieldModifier, float.PositiveInfinity); //reader.SeekTo(baseOffset + 0x18); // TODO: get offset for BSP zone //_zone = (ushort)((reader.ReadUInt32() & 0xFFFF0000) >> 16); // Read Position reader.SeekTo(baseOffset + PositionOffset1); _positionMain.X = reader.ReadFloat(); _positionMain.Y = reader.ReadFloat(); _positionMain.Z = reader.ReadFloat(); // Read Position2 Vector3 position2 = new Vector3(); reader.SeekTo(baseOffset + PositionOffset2); position2.X = reader.ReadFloat(); position2.Y = reader.ReadFloat(); position2.Z = reader.ReadFloat(); // Read Position3 Vector3 position3 = new Vector3(); reader.SeekTo(baseOffset + PositionOffset3); position3.X = reader.ReadFloat(); position3.Y = reader.ReadFloat(); position3.Z = reader.ReadFloat(); // Read Position4 Vector3 position4 = new Vector3(); reader.SeekTo(baseOffset + PositionOffset4); position4.X = reader.ReadFloat(); position4.Y = reader.ReadFloat(); position4.Z = reader.ReadFloat(); // Compute position deltas _position2Delta = Vector3.Subtract(position2, _positionMain); _position3Delta = Vector3.Subtract(position3, _positionMain); _position4Delta = Vector3.Subtract(position4, _positionMain); reader.SeekTo(baseOffset + CarryInfoOffset); _nextCarriedIndex = DatumIndex.ReadFrom(reader); _firstCarriedIndex = DatumIndex.ReadFrom(reader); _carrierIndex = DatumIndex.ReadFrom(reader); }
protected override void ReadFrom(SaveReader reader, long baseOffset) { base.ReadFrom(reader, baseOffset); reader.SeekTo(baseOffset + WeaponsOffset); _primaryWeaponIndex = DatumIndex.ReadFrom(reader); _secondaryWeaponIndex = DatumIndex.ReadFrom(reader); _tertiaryWeaponIndex = DatumIndex.ReadFrom(reader); _quaternaryWeaponIndex = DatumIndex.ReadFrom(reader); reader.SeekTo(baseOffset + GrenadesOffset); _fragGrenades = reader.ReadSByte(); _plasmaGrenades = reader.ReadSByte(); }
public void VisitTagRef(TagRefData field) { SeekToOffset(field.Offset); TagGroup tagGroup = null; DatumIndex index; if (field.WithGroup) { // Read the datum index based upon the layout StructureValueCollection values = StructureReader.ReadStructure(_reader, _tagRefLayout); index = new DatumIndex(values.GetInteger("datum index")); // Check the group, in case the datum index is null var magic = values.GetInteger("tag group magic"); var str = CharConstant.ToString((int)magic); tagGroup = field.Tags.Groups.FirstOrDefault(c => c.TagGroupMagic == str); } else { // Just read the datum index at the current position index = DatumIndex.ReadFrom(_reader); } TagEntry tag = null; if (index.IsValid && index.Index < field.Tags.Entries.Count) { tag = field.Tags.Entries[index.Index]; if (tag == null || tag.RawTag == null || tag.RawTag.Index != index) { tag = null; } } if (tag != null) { field.Group = field.Tags.Groups.FirstOrDefault(c => c.RawGroup == tag.RawTag.Group); field.Value = tag; } else { field.Group = tagGroup; field.Value = null; } }
private void ReadPlayerInfo(SaveReader reader, long baseOffset) { reader.SeekTo(baseOffset + PlayerBipedOffset); _bipedIndex = DatumIndex.ReadFrom(reader); reader.SeekTo(baseOffset + PlayerWeaponOffset); _bipedPrimaryWeaponIndex = DatumIndex.ReadFrom(reader); _bipedSecondaryWeaponIndex = DatumIndex.ReadFrom(reader); _bipedThirdWeaponIndex = DatumIndex.ReadFrom(reader); _bipedFourthWeaponIndex = DatumIndex.ReadFrom(reader); reader.Seek(baseOffset + 0xB0, System.IO.SeekOrigin.Begin); _gamertag = reader.ReadUTF16(); reader.Seek(baseOffset + 0xF4, System.IO.SeekOrigin.Begin); _serviceTag = reader.ReadUTF16(); }
public void VisitTagRef(TagRefData field) { SeekToOffset(field.Offset); DatumIndex index; if (field.WithClass) { // Read the datum index based upon the layout StructureValueCollection values = StructureReader.ReadStructure(_reader, _tagRefLayout); index = new DatumIndex(values.GetInteger("datum index")); } else { // Just read the datum index at the current position index = DatumIndex.ReadFrom(_reader); } TagEntry tag = null; if (index.IsValid && index.Index < field.Tags.Entries.Count) { tag = field.Tags.Entries[index.Index]; if (tag == null || tag.RawTag == null || tag.RawTag.Index != index) { tag = null; } } if (tag != null) { field.Class = field.Tags.Classes.FirstOrDefault(c => c.RawClass == tag.RawTag.Class); field.Value = tag; } else { field.Class = null; field.Value = null; } }
/// <summary> /// Reads data from a SaveReader. Override this in a derived class to read object-specific data. /// </summary> /// <param name="reader">The SaveReader to read from. No guarantees can be made about its ending offset.</param> /// <param name="baseOffset">The offset of the start of the object data.</param> protected virtual void ReadFrom(SaveReader reader, long baseOffset) { _tag = DatumIndex.ReadFrom(reader); reader.SeekTo(baseOffset + StrengthInfoOffset); _healthInfo = new HealthInfo(reader, DefaultChiefHealthModifier, DefaultChiefShieldModifier, float.MaxValue); // Read Position reader.SeekTo(baseOffset + PositionOffset1); _positionMain.X = reader.ReadFloat(); _positionMain.Y = reader.ReadFloat(); _positionMain.Z = reader.ReadFloat(); // Read Position2 Vector3 position2 = new Vector3(); reader.SeekTo(baseOffset + PositionOffset2); position2.X = reader.ReadFloat(); position2.Y = reader.ReadFloat(); position2.Z = reader.ReadFloat(); // Read Position3 Vector3 position3 = new Vector3(); reader.SeekTo(baseOffset + PositionOffset3); position3.X = reader.ReadFloat(); position3.Y = reader.ReadFloat(); position3.Z = reader.ReadFloat(); // Compute position deltas _position2Delta = Vector3.Subtract(position2, _positionMain); _position3Delta = Vector3.Subtract(position3, _positionMain); reader.SeekTo(baseOffset + CarryInfoOffset); _nextCarriedIndex = DatumIndex.ReadFrom(reader); _firstCarriedIndex = DatumIndex.ReadFrom(reader); _carrierIndex = DatumIndex.ReadFrom(reader); }
private void ReadPlayerInfo(SaveReader reader, long baseOffset) { reader.SeekTo(baseOffset + PlayerBipedOffset); _bipedIndex = DatumIndex.ReadFrom(reader); }