public static void WriteNullable <T>( this PrimitiveBinaryTranslation <T, MutagenFrame, MutagenWriter> transl, MutagenWriter writer, T?item, RecordType header, Action <MutagenWriter, T>?write = null) where T : struct { if (!item.HasValue) { return; } write ??= transl.Write; try { using (HeaderExport.Header(writer, header, ObjectType.Subrecord)) { write(writer, item.Value); } } catch (Exception ex) { throw SubrecordException.Factory(ex, header); } }
public virtual void Write( MutagenWriter writer, IGlobalGetter item, TypedWriteParams?translationParams = null) { using (HeaderExport.Record( writer: writer, record: translationParams.ConvertToCustom(RecordTypes.GLOB))) { try { OblivionMajorRecordBinaryWriteTranslation.WriteEmbedded( item: item, writer: writer); writer.MetaData.FormVersion = item.FormVersion; WriteRecordTypes( item: item, writer: writer, translationParams: translationParams); writer.MetaData.FormVersion = null; } catch (Exception ex) { throw RecordException.Enrich(ex, item); } } }
public static partial void WriteBinaryDisabledCloudLayersCustom(MutagenWriter writer, IWeatherGetter item) { var clouds = item.Clouds; Span <bool?> enabled = stackalloc bool?[WeatherBinaryCreateTranslation.NumLayers]; bool any = false; for (int i = 0; i < WeatherBinaryCreateTranslation.NumLayers; i++) { enabled[i] = clouds[i].Enabled; any |= enabled[i].HasValue; } if (!any) { return; } using (HeaderExport.Subrecord(writer, RecordTypes.NAM1)) { uint raw = 0; uint index = 1; for (int i = 0; i < WeatherBinaryCreateTranslation.NumLayers; i++) { var enable = enabled[i] ?? true; // Inverse because we're exposing as enabled raw = EnumExt.SetFlag(raw, index, !enable); index <<= 1; } writer.Write(raw); } }
public void Write( MutagenWriter writer, IActorValueInformationGetter item, RecordTypeConverter?recordTypeConverter = null) { using (HeaderExport.Header( writer: writer, record: recordTypeConverter.ConvertToCustom(RecordTypes.AVIF), type: Mutagen.Bethesda.Binary.ObjectType.Record)) { try { Fallout4MajorRecordBinaryWriteTranslation.WriteEmbedded( item: item, writer: writer); MajorRecordBinaryWriteTranslation.WriteRecordTypes( item: item, writer: writer, recordTypeConverter: recordTypeConverter); } catch (Exception ex) { throw RecordException.Enrich(ex, item); } } }
public static partial void WriteBinaryCountCustom(MutagenWriter writer, IFootstepSetGetter item) { var walkForwardFootsteps = item.WalkForwardFootsteps; using (HeaderExport.Subrecord(writer, RecordTypes.XCNT)) { writer.Write(walkForwardFootsteps.Count); writer.Write(item.RunForwardFootsteps.Count); writer.Write(item.WalkForwardAlternateFootsteps.Count); writer.Write(item.RunForwardAlternateFootsteps.Count); writer.Write(item.WalkForwardAlternateFootsteps2.Count); } void WriteListOfFormKeys(IReadOnlyList <IFormLinkGetter <IFootstepGetter> > formKeys) { foreach (var link in formKeys) { FormLinkBinaryTranslation.Instance.Write(writer, link); } } using (HeaderExport.Subrecord(writer, RecordTypes.DATA)) { WriteListOfFormKeys(walkForwardFootsteps); WriteListOfFormKeys(item.RunForwardFootsteps); WriteListOfFormKeys(item.WalkForwardAlternateFootsteps); WriteListOfFormKeys(item.RunForwardAlternateFootsteps); WriteListOfFormKeys(item.WalkForwardAlternateFootsteps2); } }
public void Write( MutagenWriter writer, IHairGetter item, RecordTypeConverter?recordTypeConverter = null) { using (HeaderExport.Header( writer: writer, record: recordTypeConverter.ConvertToCustom(RecordTypes.HAIR), type: Mutagen.Bethesda.Binary.ObjectType.Record)) { try { Fallout4MajorRecordBinaryWriteTranslation.WriteEmbedded( item: item, writer: writer); MajorRecordBinaryWriteTranslation.WriteRecordTypes( item: item, writer: writer, recordTypeConverter: recordTypeConverter); } catch (Exception ex) { throw RecordException.Factory(ex, item.FormKey, item.EditorID); } } }
public void Write( MutagenWriter writer, ISpellLeveledGetter item, RecordTypeConverter?recordTypeConverter = null) { using (HeaderExport.Header( writer: writer, record: recordTypeConverter.ConvertToCustom(RecordTypes.LVSP), type: ObjectType.Record)) { try { OblivionMajorRecordBinaryWriteTranslation.WriteEmbedded( item: item, writer: writer); SpellBinaryWriteTranslation.WriteRecordTypes( item: item, writer: writer, recordTypeConverter: recordTypeConverter); } catch (Exception ex) { throw RecordException.Enrich(ex, item); } } }
public void Write( MutagenWriter writer, IActorValueInformationGetter item, TypedWriteParams?translationParams = null) { using (HeaderExport.Record( writer: writer, record: translationParams.ConvertToCustom(RecordTypes.AVIF))) { try { Fallout4MajorRecordBinaryWriteTranslation.WriteEmbedded( item: item, writer: writer); MajorRecordBinaryWriteTranslation.WriteRecordTypes( item: item, writer: writer, translationParams: translationParams); } catch (Exception ex) { throw RecordException.Enrich(ex, item); } } }
public static partial void CustomBinaryEndExport(MutagenWriter writer, IDialogTopicGetter obj) { try { if (!obj.Items.TryGet(out var items) || items.Count == 0) { return; } using (HeaderExport.Header(writer, RecordTypes.GRUP, ObjectType.Group)) { FormKeyBinaryTranslation.Instance.Write( writer, obj.FormKey); writer.Write((int)GroupTypeEnum.TopicChildren); writer.Write(obj.Timestamp); ListBinaryTranslation <IDialogItemGetter> .Instance.Write( writer : writer, items : items, transl : (MutagenWriter subWriter, IDialogItemGetter subItem) => { subItem.WriteToBinary(subWriter); }); } } catch (Exception ex) { throw RecordException.Enrich(ex, obj); } }
public static partial void CustomBinaryEndExport(MutagenWriter writer, IWorldspaceGetter obj) { try { var topCell = obj.TopCell; var subCells = obj.SubCells; if (subCells?.Count == 0 && topCell == null) { return; } using (HeaderExport.Header(writer, RecordTypes.GRUP, ObjectType.Group)) { FormKeyBinaryTranslation.Instance.Write( writer, obj.FormKey); writer.Write((int)GroupTypeEnum.WorldChildren); writer.Write(obj.SubCellsTimestamp); writer.Write(obj.SubCellsUnknown); topCell?.WriteToBinary(writer); ListBinaryTranslation <IWorldspaceBlockGetter> .Instance.Write( writer : writer, items : subCells, transl : (MutagenWriter subWriter, IWorldspaceBlockGetter subItem) => { subItem.WriteToBinary(subWriter); }); } } catch (Exception ex) { throw RecordException.Enrich(ex, obj); } }
static partial void CustomBinaryEndExport(MutagenWriter writer, IWorldspaceGetter obj) { var road = obj.Road; var topCell = obj.TopCell; var subCells = obj.SubCells; if (subCells?.Count == 0 && road == null && topCell == null) { return; } using (HeaderExport.Header(writer, RecordTypes.GRUP, ObjectType.Group)) { FormKeyBinaryTranslation.Instance.Write( writer, obj.FormKey); writer.Write((int)GroupTypeEnum.WorldChildren); writer.Write(obj.SubCellsTimestamp); road?.WriteToBinary(writer); topCell?.WriteToBinary(writer); Mutagen.Bethesda.Binary.ListBinaryTranslation <IWorldspaceBlockGetter> .Instance.Write( writer : writer, items : subCells, transl : (MutagenWriter subWriter, IWorldspaceBlockGetter subItem) => { subItem.WriteToBinary(subWriter); }); } }
public virtual void Write( MutagenWriter writer, IGlobalGetter item, RecordTypeConverter?recordTypeConverter = null) { using (HeaderExport.Header( writer: writer, record: recordTypeConverter.ConvertToCustom(RecordTypes.GLOB), type: Mutagen.Bethesda.Binary.ObjectType.Record)) { try { OblivionMajorRecordBinaryWriteTranslation.WriteEmbedded( item: item, writer: writer); writer.MetaData.FormVersion = item.FormVersion; WriteRecordTypes( item: item, writer: writer, recordTypeConverter: recordTypeConverter); writer.MetaData.FormVersion = null; } catch (Exception ex) { throw RecordException.Factory(ex, item.FormKey, item.EditorID); } } }
public void Write( MutagenWriter writer, ISpellLeveledGetter item, TypedWriteParams?translationParams = null) { using (HeaderExport.Record( writer: writer, record: translationParams.ConvertToCustom(RecordTypes.LVSP))) { try { OblivionMajorRecordBinaryWriteTranslation.WriteEmbedded( item: item, writer: writer); SpellBinaryWriteTranslation.WriteRecordTypes( item: item, writer: writer, translationParams: translationParams); } catch (Exception ex) { throw RecordException.Enrich(ex, item); } } }
public void Write( MutagenWriter writer, IMaterialSwapGetter item, RecordTypeConverter?recordTypeConverter = null) { using (HeaderExport.Header( writer: writer, record: recordTypeConverter.ConvertToCustom(RecordTypes.MSWP), type: ObjectType.Record)) { try { Fallout4MajorRecordBinaryWriteTranslation.WriteEmbedded( item: item, writer: writer); MajorRecordBinaryWriteTranslation.WriteRecordTypes( item: item, writer: writer, recordTypeConverter: recordTypeConverter); } catch (Exception ex) { throw RecordException.Enrich(ex, item); } } }
public void Write( MutagenWriter writer, ILensFlareGetter item, RecordTypeConverter?recordTypeConverter = null) { using (HeaderExport.Header( writer: writer, record: recordTypeConverter.ConvertToCustom(RecordTypes.LENS), type: Mutagen.Bethesda.Binary.ObjectType.Record)) { try { SkyrimMajorRecordBinaryWriteTranslation.WriteEmbedded( item: item, writer: writer); MajorRecordBinaryWriteTranslation.WriteRecordTypes( item: item, writer: writer, recordTypeConverter: recordTypeConverter); } catch (Exception ex) { throw RecordException.Enrich(ex, item); } } }
public void Write( MutagenWriter writer, ILensFlareGetter item, TypedWriteParams?translationParams = null) { using (HeaderExport.Record( writer: writer, record: translationParams.ConvertToCustom(RecordTypes.LENS))) { try { SkyrimMajorRecordBinaryWriteTranslation.WriteEmbedded( item: item, writer: writer); MajorRecordBinaryWriteTranslation.WriteRecordTypes( item: item, writer: writer, translationParams: translationParams); } catch (Exception ex) { throw RecordException.Enrich(ex, item); } } }
public override ReadOnlyMemorySlice <byte> GetBytes(IMutagenReadStream inputStream) { var dataList = new List <byte[]>(); MutagenWriter stream; while (!inputStream.Complete) { var subType = HeaderTranslation.ReadNextSubrecordType( inputStream, out var subLen); if (!SubTypes.Contains(subType)) { inputStream.Position -= 6; break; } var data = new byte[subLen + 6]; stream = new MutagenWriter(new MemoryStream(data), inputStream.MetaData.Constants); using (HeaderExport.Subrecord(stream, subType)) { inputStream.WriteTo(stream.BaseStream, subLen); } dataList.Add(data); } byte[] ret = new byte[dataList.Sum((d) => d.Length)]; stream = new MutagenWriter(new MemoryStream(ret), inputStream.MetaData.Constants); foreach (var data in dataList) { stream.Write(data); } return(ret); }
public virtual void Write( MutagenWriter writer, IGameSettingGetter item, RecordTypeConverter?recordTypeConverter = null) { using (HeaderExport.Header( writer: writer, record: recordTypeConverter.ConvertToCustom(RecordTypes.GMST), type: ObjectType.Record)) { try { SkyrimMajorRecordBinaryWriteTranslation.WriteEmbedded( item: item, writer: writer); MajorRecordBinaryWriteTranslation.WriteRecordTypes( item: item, writer: writer, recordTypeConverter: recordTypeConverter); } catch (Exception ex) { throw RecordException.Enrich(ex, item); } } }
public static partial void WriteBinaryAnimationCountCustom(MutagenWriter writer, IIdleMarkerGetter item) { if (item.Animations is not {} anims) return; using (HeaderExport.Subrecord(writer, RecordTypes.IDLC)) { writer.Write(checked((byte)anims.Count)); } }
public void ParseRecordLocationsByCount_Alternating_MoreData() { MemoryTributary data = new MemoryTributary(); using (MutagenWriter writer = new MutagenWriter(data, GameConstants.Oblivion)) { using (HeaderExport.Subrecord(writer, RecordTypes.EDID)) { writer.Write(1); } using (HeaderExport.Subrecord(writer, RecordTypes.DATA)) { writer.Write(-1); } using (HeaderExport.Subrecord(writer, RecordTypes.EDID)) { writer.Write(2); } using (HeaderExport.Subrecord(writer, RecordTypes.DATA)) { writer.Write(-2); } using (HeaderExport.Subrecord(writer, RecordTypes.EDID)) { writer.Write(3); } using (HeaderExport.Subrecord(writer, RecordTypes.DATA)) { writer.Write(-3); } using (HeaderExport.Subrecord(writer, RecordTypes.MAST)) { writer.Write(-3); } } data.Position = 0; var triggers = new HashSet <RecordType>() { RecordTypes.EDID, RecordTypes.DATA, }; var stream = new OverlayStream(data.ToArray(), new ParsingBundle(GameConstants.Oblivion, masterReferences: null !)); var pos = BinaryOverlay.ParseRecordLocationsByCount( stream, 3, triggers.ToGetter(), GameConstants.Oblivion.SubConstants, skipHeader: false); Assert.Equal(3, pos.Length); Assert.Equal(0, pos[0]); Assert.Equal(20, pos[1]); Assert.Equal(40, pos[2]); Assert.Equal(60, stream.Position); Assert.False(stream.Complete); }
public static partial void WriteBinaryOpenByDefaultCustom(MutagenWriter writer, IPlacedObjectGetter item) { if (item.OpenByDefault) { using (HeaderExport.Subrecord(writer, RecordTypes.ONAM)) { } } }
public static partial void WriteBinaryEffectInitialCustom(MutagenWriter writer, IEffectGetter item) { using (HeaderExport.Subrecord(writer, RecordTypes.EFID)) { RecordTypeBinaryTranslation.Instance.Write( writer: writer, item: item.Data.MagicEffect); } }
static partial void WriteBinaryMinCustom(MutagenWriter writer, IWorldspaceObjectBoundsGetter item) { using (HeaderExport.Subrecord(writer, RecordTypes.NAM0)) { var min = item.Min; writer.Write(min.X * 4096f); writer.Write(min.Y * 4096f); } }
public static partial void WriteBinaryMaxCustom(MutagenWriter writer, IWorldspaceObjectBoundsGetter item) { using (HeaderExport.Subrecord(writer, RecordTypes.NAM9)) { var max = item.Max; writer.Write(max.X * 4096f); writer.Write(max.Y * 4096f); } }
static partial void WriteBinaryConditionsCustom(MutagenWriter writer, IAStoryManagerNodeGetter item) { var conditions = item.Conditions; using (HeaderExport.Subrecord(writer, RecordTypes.CITC)) { writer.Write(conditions.Count); } ConditionBinaryWriteTranslation.WriteConditionsList(conditions, writer); }
public static partial void WriteBinaryResponseCountCustom(MutagenWriter writer, IDialogTopicGetter item) { if (!item.Responses.TryGet(out var resp) || resp.Count == 0) { using (HeaderExport.Subrecord(writer, RecordTypes.TIFC)) { writer.WriteZeros(4); } }
public static partial void WriteBinaryAliasIndexCustom(MutagenWriter writer, IFindMatchingRefNearAliasGetter item) { if (!item.AliasIndex.TryGet(out var index)) { return; } using (HeaderExport.Subrecord(writer, RecordTypes.ALNA)) { writer.Write((int)index); } }
public void Overflow() { Assert.Throws <OverflowException>(() => { byte[] b = new byte[ushort.MaxValue + 100]; byte[] b2 = new byte[ushort.MaxValue + 1]; using var writer = new MutagenWriter(new MemoryStream(b), GameConstants.Oblivion); using var header = HeaderExport.Header(writer, RecordTypes.EDID, ObjectType.Subrecord); writer.Write(b2); }); }
static partial void WriteBinaryAnimationCountCustom(MutagenWriter writer, IIdleMarkerGetter item) { if (!item.Animations.TryGet(out var anims)) { return; } using (HeaderExport.Subrecord(writer, RecordTypes.IDLC)) { writer.Write(checked ((byte)anims.Count)); } }
static partial void WriteBinaryDataCustom(MutagenWriter writer, IGameSettingBoolGetter item) { if (!item.Data.TryGet(out var data)) { return; } using (HeaderExport.Subrecord(writer, RecordTypes.DATA)) { writer.Write(data ? 1 : 0); } }