public void TestDoesNothing() { var linkCache = loadOrder.ToImmutableLinkCache(); Program program = new(loadOrder, linkCache, patchMod, new(new Settings())); program.RunPatch(); Assert.Empty(patchMod.EnumerateMajorRecords()); }
public void AddAHearthFiresThing(SkyrimRelease release) { var xHFSxConstructionFLSTFormLink = release switch { SkyrimRelease.SkyrimLE => HearthFireStores_GS.FormList.xHFSxConstructionFLST, SkyrimRelease.SkyrimSE or SkyrimRelease.SkyrimVR => GeneralStores.FormList.xHFSxConstructionFLST, _ => throw new ArgumentException(null, nameof(release)), }; var gameRelease = release switch { SkyrimRelease.SkyrimLE => GameRelease.SkyrimLE, SkyrimRelease.SkyrimSE => GameRelease.SkyrimSE, SkyrimRelease.SkyrimVR => GameRelease.SkyrimVR, _ => throw new ArgumentException(null, nameof(release)), }; var generalStores = new SkyrimMod(xHFSxConstructionFLSTFormLink.FormKey.ModKey, release); var xHFSxConstructionFLST = new FormList(xHFSxConstructionFLSTFormLink.FormKey, release); generalStores.FormLists.Add(xHFSxConstructionFLST); SkyrimMod masterMod = new(masterModKey, release); var newThing = masterMod.MiscItems.AddNew("newItem"); SkyrimMod patchMod = new(patchModKey, release); var loadOrder = new LoadOrder <IModListing <ISkyrimModGetter> > { new ModListing <ISkyrimModGetter>(generalStores, true), new ModListing <ISkyrimModGetter>(masterMod, true), new ModListing <ISkyrimModGetter>(patchMod, true) }; var linkCache = loadOrder.ToImmutableLinkCache(); Program program = new(loadOrder, linkCache, patchMod, gameRelease); program.hearthFiresConstructionSet.Add(newThing.AsLink()); program.RecordClassifiedItems(); Assert.Single(patchMod.FormLists); var updatedFlst = patchMod.FormLists.Single(); Assert.Equal(xHFSxConstructionFLSTFormLink, updatedFlst.AsLink()); Assert.Single(updatedFlst.Items); var newThingLink = updatedFlst.Items.Single(); Assert.False(newThingLink.IsNull); Assert.Equal(newThing.AsLink(), newThingLink); }
public void AddAThing() { var generalStores = new SkyrimMod(GeneralStores.ModKey, SkyrimRelease.SkyrimSE); var xGSxFoodAllFLST = new FormList(GeneralStores.FormList.xGSxFoodAllFLST.FormKey, SkyrimRelease.SkyrimSE); generalStores.FormLists.Add(xGSxFoodAllFLST); SkyrimMod masterMod = new(masterModKey, SkyrimRelease.SkyrimSE); var newThing = masterMod.MiscItems.AddNew("newItem"); SkyrimMod patchMod = new(patchModKey, SkyrimRelease.SkyrimSE); var loadOrder = new LoadOrder <IModListing <ISkyrimModGetter> > { new ModListing <ISkyrimModGetter>(generalStores, true), new ModListing <ISkyrimModGetter>(masterMod, true), new ModListing <ISkyrimModGetter>(patchMod, true) }; var linkCache = loadOrder.ToImmutableLinkCache(); Program program = new(loadOrder, linkCache, patchMod, GameRelease.SkyrimSE); program.allFoodSet.Add(newThing.AsLink()); program.RecordClassifiedItems(); Assert.Single(patchMod.FormLists); var updatedFlst = patchMod.FormLists.Single(); Assert.Single(updatedFlst.Items); var newThingLink = updatedFlst.Items.Single(); Assert.False(newThingLink.IsNull); Assert.Equal(newThing.AsLink(), newThingLink); }
public void ComplexOverrides() { WarmupSkyrim.Init(); // Construct base mod const string Mod1Name = "Mod1"; var mod = new SkyrimMod(TestConstants.PluginModKey, SkyrimRelease.SkyrimSE); var worldspace = mod.Worldspaces.AddNew(); worldspace.EditorID = Mod1Name; var block = new WorldspaceBlock() { BlockNumberX = 2, BlockNumberY = 3, GroupType = GroupTypeEnum.ExteriorCellBlock, }; var subBlock = new WorldspaceSubBlock() { BlockNumberX = 4, BlockNumberY = 5, GroupType = GroupTypeEnum.ExteriorCellSubBlock, }; block.Items.Add(subBlock); worldspace.SubCells.Add(block); var cell = new Cell(mod.GetNextFormKey(), SkyrimRelease.SkyrimSE); cell.EditorID = Mod1Name; subBlock.Items.Add(cell); var placedObj = new PlacedObject(mod.GetNextFormKey(), SkyrimRelease.SkyrimSE); placedObj.EditorID = Mod1Name; cell.Persistent.Add(placedObj); // Override cell in 2nd mod const string Mod2Name = "Mod2"; var mod2 = new SkyrimMod(TestConstants.PluginModKey2, SkyrimRelease.SkyrimSE); var worldspace2 = new Worldspace(worldspace.FormKey, SkyrimRelease.SkyrimSE); worldspace2.EditorID = Mod2Name; mod2.Worldspaces.Add(worldspace2); var block2 = new WorldspaceBlock() { BlockNumberX = 2, BlockNumberY = 3, GroupType = GroupTypeEnum.ExteriorCellBlock, }; var subBlock2 = new WorldspaceSubBlock() { BlockNumberX = 4, BlockNumberY = 5, GroupType = GroupTypeEnum.ExteriorCellSubBlock, }; block2.Items.Add(subBlock2); worldspace2.SubCells.Add(block2); var cell2 = new Cell(cell.FormKey, SkyrimRelease.SkyrimSE); cell2.EditorID = Mod2Name; subBlock2.Items.Add(cell2); // Override worldspace in 3rd mod const string Mod3Name = "Mod3"; var mod3 = new SkyrimMod(TestConstants.PluginModKey3, SkyrimRelease.SkyrimSE); var worldspace3 = new Worldspace(worldspace.FormKey, SkyrimRelease.SkyrimSE); worldspace3.EditorID = Mod3Name; mod3.Worldspaces.Add(worldspace3); // Override in 4th, and check sources var loadOrder = new LoadOrder <ISkyrimModGetter>(mod.AsEnumerable().And(mod2).And(mod3)); var cache = loadOrder.ToImmutableLinkCache(); var contexts = mod.EnumerateMajorRecordContexts <IPlaced, IPlacedGetter>(linkCache: cache).ToArray(); contexts.Should().HaveCount(1); var mod4 = new SkyrimMod(TestConstants.PluginModKey4, SkyrimRelease.SkyrimSE); var placedObjOverride = contexts[0].GetOrAddAsOverride(mod4); placedObjOverride.EditorID.Should().Be(Mod1Name); var cellOverride = mod4.Worldspaces.First().SubCells.First().Items.First().Items.First(); cellOverride.EditorID.Should().Be(Mod2Name); var worldspaceOverride = mod4.Worldspaces.First(); worldspaceOverride.EditorID.Should().Be(Mod3Name); }
protected override (LinkCacheStyle Style, ILinkCache <ISkyrimMod, ISkyrimModGetter> Cache) GetLinkCache( LoadOrder <ISkyrimModGetter> loadOrder, LinkCachePreferences prefs) { return(LinkCacheStyle.HasCaching, loadOrder.ToImmutableLinkCache <ISkyrimMod, ISkyrimModGetter>(prefs)); }
protected override (LinkCacheStyle Style, ILinkCache <ISkyrimMod, ISkyrimModGetter> Cache) GetLinkCache(LoadOrder <ISkyrimModGetter> loadOrder, LinkCachePreferences prefs) { return(LinkCacheStyle.OnlyDirect, new MutableLoadOrderLinkCache <ISkyrimMod, ISkyrimModGetter>(loadOrder.ToImmutableLinkCache <ISkyrimMod, ISkyrimModGetter>())); }
/// <summary> /// Creates a new linking package relative to a load order.<br/> /// Will resolve links to the highest overriding mod containing the record being sought. <br/> /// Modification of the target LoadOrder, or Mods on the LoadOrder is not safe. Internal caches can become /// incorrect if modifications occur on content already cached. /// </summary> /// <param name="loadOrder">LoadOrder to construct the package relative to</param> /// <returns>LinkPackage attached to given LoadOrder</returns> public static ImmutableLoadOrderLinkCache <IOblivionMod, IOblivionModGetter> ToImmutableLinkCache(this LoadOrder <IModListing <IOblivionModGetter> > loadOrder) { return(loadOrder.ToImmutableLinkCache <IOblivionMod, IOblivionModGetter>()); }
/// <summary> /// Creates a new linking package relative to a load order.<br/> /// Will resolve links to the highest overriding mod containing the record being sought. <br/> /// Modification of the target LoadOrder, or Mods on the LoadOrder is not safe. Internal caches can become /// incorrect if modifications occur on content already cached. /// </summary> /// <param name="loadOrder">LoadOrder to construct the package relative to</param> /// <returns>LinkPackage attached to given LoadOrder</returns> public static ImmutableLoadOrderLinkCache <IFallout4Mod, IFallout4ModGetter> ToImmutableLinkCache(this LoadOrder <IFallout4ModGetter> loadOrder) { return(loadOrder.ToImmutableLinkCache <IFallout4Mod, IFallout4ModGetter>()); }