コード例 #1
0
 /// <summary>
 /// Locates link winning target record in given Link Cache.
 /// </summary>
 /// <param name="link">Link to resolve</param>
 /// <param name="cache">Link Cache to resolve against</param>
 /// <returns>Located Major Record, or null if not located</returns>
 /// <typeparam name="TMajor">Major Record type of the FormLink</typeparam>
 public static TMajor?TryResolve <TMajor>(this IFormLinkGetter link, ILinkCache cache)
     where TMajor : class, IMajorRecordCommonGetter
 {
     if (link.TryResolve <TMajor>(cache, out var majorRecord))
     {
         return(majorRecord);
     }
     return(null);
 }
コード例 #2
0
 /// <summary>
 /// Locates link winning target record in given Link Cache.
 /// </summary>
 /// <param name="link">Link to resolve</param>
 /// <param name="cache">Link Cache to resolve against</param>
 /// <returns>Located Major Record, or null if not located</returns>
 /// <typeparam name="TMajor">Major Record type of the FormLink</typeparam>
 /// <typeparam name="TScopedMajor">Major Record type to resolve to</typeparam>
 public static TScopedMajor?TryResolve <TMajor, TScopedMajor>(this IFormLinkGetter <TMajor> link, ILinkCache cache)
     where TMajor : class, IMajorRecordGetter
     where TScopedMajor : class, TMajor
 {
     if (link.TryResolve <TMajor, TScopedMajor>(cache, out var majorRecord))
     {
         return(majorRecord);
     }
     return(null);
 }
コード例 #3
0
 /// <summary>
 /// Locates link winning target record in given Link Cache.
 /// </summary>
 /// <param name="link">Link to resolve</param>
 /// <param name="cache">Link Cache to resolve against</param>
 /// <returns>Located Major Record</returns>
 /// <exception cref="RecordException">If link was not succesful</exception>
 /// <typeparam name="TMajor">Major Record type of the FormLink</typeparam>
 public static TMajor Resolve <TMajor>(this IFormLinkGetter link, ILinkCache cache)
     where TMajor : class, IMajorRecordCommonGetter
 {
     if (link.TryResolve <TMajor>(cache, out var majorRecord))
     {
         return(majorRecord);
     }
     throw RecordException.Create <TMajor>(
               message: "Could not resolve record",
               formKey: link.FormKeyNullable,
               modKey: link.FormKeyNullable?.ModKey,
               edid: null);
 }
コード例 #4
0
 /// <summary>
 /// Locates link winning target record in given Link Cache.
 /// </summary>
 /// <param name="link">Link to resolve</param>
 /// <param name="cache">Link Cache to resolve against</param>
 /// <returns>Located Major Record</returns>
 /// <exception cref="NullReferenceException">If link was not succesful</exception>
 /// <typeparam name="TMajor">Major Record type to resolve to</typeparam>
 public static TMajor?TryResolve <TMajor>(this IFormLinkGetter <TMajor> link, ILinkCache cache)
     where TMajor : class, IMajorRecordGetter
 {
     if (link.FormKeyNullable == null)
     {
         return(null);
     }
     if (link.TryResolve <TMajor>(cache, out var majorRecord))
     {
         return(majorRecord);
     }
     return(null);
 }
コード例 #5
0
ファイル: IKeyworded.cs プロジェクト: CharmedBaryon/Mutagen
 /// <summary>
 /// Checks if a Keyworded record contains a specific Keyword, by FormKey.
 /// Also looks up that keyword in the given cache. <br />
 /// <br />
 /// Note that this function only succeeds if the record contains the keyword,
 /// and the cache found it as well. <br />
 /// <br />
 /// It is possible that the record contains the keyword, but it could not be found
 /// by the cache.
 /// <br />
 /// Aspects: IKeywordedGetter&lt;IKeywordCommonGetter&gt;
 /// </summary>
 /// <param name="keyworded">Keyworded record to check</param>
 /// <param name="keywordLink">FormLink of the Keyword record to look for</param>
 /// <param name="cache">LinkCache to resolve against</param>
 /// <param name="keyword">Keyword record retrieved, if keyworded record does contain</param>
 /// <returns>True if the Keyworded record contains a Keyword link /w the given FormKey</returns>
 public static bool TryResolveKeyword <TKeyword>(
     this IKeywordedGetter <TKeyword> keyworded,
     IFormLinkGetter <TKeyword> keywordLink,
     ILinkCache cache,
     [MaybeNullWhen(false)] out TKeyword keyword)
     where TKeyword : class, IKeywordCommonGetter
 {
     if (!keyworded.Keywords?.Any(x => x.FormKey == keywordLink.FormKey) ?? true)
     {
         keyword = default;
         return(false);
     }
     return(keywordLink.TryResolve <TKeyword>(cache, out keyword));
 }
コード例 #6
0
        public void ClassifyIngredient(IFormLinkGetter <IItemGetter> itemLink)
        {
            if (DoNotUnburdenFormKeys.Contains(itemLink))
            {
                return;
            }
            if (!itemLink.TryResolve(LinkCache, out var record))
            {
                return;
            }

            if (record is IIngredientGetter || record is IIngestibleGetter)
            {
                IngredientSet.Add(itemLink);
            }

            if (ShouldUnburden(record))
            {
                AllSet.Add(itemLink);
                SpecificSet.Add(itemLink);
            }
        }
コード例 #7
0
 /// <summary>
 /// Takes in a FormLink, and either returns the existing override definition
 /// from the Group, or attempts to link and copy the given record, inserting it, and then returning it as an override.
 /// </summary>
 /// <param name="group">Group to retrieve and/or insert from</param>
 /// <param name="link">Link to query and add</param>
 /// <param name="cache">Cache to query link against</param>
 /// <param name="rec">Retrieved record if successful</param>
 /// <returns>True if a record was retrieved</returns>
 public static bool TryGetOrAddAsOverride <TMajor, TMajorGetter>(this IGroup <TMajor> group, IFormLinkGetter <TMajorGetter> link, ILinkCache cache, [MaybeNullWhen(false)] out TMajor rec)
     where TMajor : class, IMajorRecordInternal, TMajorGetter
     where TMajorGetter : class, IMajorRecordGetter
 {
     try
     {
         if (group.RecordCache.TryGetValue(link.FormKey, out rec))
         {
             return(true);
         }
         if (!link.TryResolve <TMajorGetter>(cache, out var getter))
         {
             rec = default;
             return(false);
         }
         rec = GetOrAddAsOverride(group, getter);
         return(true);
     }
     catch (Exception ex)
     {
         throw RecordException.Enrich <TMajor>(ex, link.FormKey, edid: null);
     }
 }
コード例 #8
0
        public static void FormLink()
        {
            var mod   = new SkyrimMod(Utility.LightMasterModKey, SkyrimRelease.SkyrimLE);
            var light = mod.Lights.AddNew();
            var cache = mod.ToImmutableLinkCache();

            var link         = new FormLink <ISkyrimMajorRecordGetter>(light.FormKey);
            var nullableLink = new FormLinkNullable <ISkyrimMajorRecordGetter>(light.FormKey);
            IFormLinkGetter <ISkyrimMajorRecordGetter> iLink = link;

            // Normal resolution
            link.TryResolve(cache, out var _);
            link.TryResolve <ISkyrimMajorRecordGetter>(cache, out var _);
            link.Resolve(cache);
            link.TryResolve <ILightGetter>(cache, out var _);
            link.TryResolve(cache, out ILightGetter _);
            link.Resolve <ILightGetter>(cache);

            nullableLink.TryResolve(cache, out var _);
            nullableLink.TryResolve <ISkyrimMajorRecordGetter>(cache, out var _);
            nullableLink.Resolve(cache);
            nullableLink.TryResolve <ILightGetter>(cache, out var _);
            nullableLink.TryResolve(cache, out ILightGetter _);
            nullableLink.Resolve <ILightGetter>(cache);

            iLink.TryResolve(cache, out var _);
            iLink.Resolve(cache);
            iLink.TryResolve <ISkyrimMajorRecordGetter, ILightGetter>(cache, out var _);
            iLink.TryResolve(cache, out ILightGetter _);
            iLink.Resolve <ISkyrimMajorRecordGetter, ILightGetter>(cache);

            // Context resolution
            link.TryResolveContext <ISkyrimMod, ISkyrimModGetter, ISkyrimMajorRecord, ISkyrimMajorRecordGetter>(cache, out var _);
            link.TryResolveContext <ISkyrimMod, ISkyrimModGetter, ISkyrimMajorRecord, ISkyrimMajorRecordGetter>(cache, out IModContext <ISkyrimMod, ISkyrimModGetter, ISkyrimMajorRecord, ISkyrimMajorRecordGetter> _);
            link.ResolveContext <ISkyrimMod, ISkyrimModGetter, ISkyrimMajorRecord, ISkyrimMajorRecordGetter>(cache);
            link.TryResolveContext <ISkyrimMod, ISkyrimModGetter, ISkyrimMajorRecordGetter, ILight, ILightGetter>(cache, out var _);
            link.TryResolveContext(cache, out IModContext <ISkyrimMod, ISkyrimModGetter, ILight, ILightGetter> _);
            link.ResolveContext <ISkyrimMod, ISkyrimModGetter, ISkyrimMajorRecordGetter, ILight, ILightGetter>(cache);

            nullableLink.TryResolveContext <ISkyrimMod, ISkyrimModGetter, ISkyrimMajorRecord, ISkyrimMajorRecordGetter>(cache, out var _);
            nullableLink.TryResolveContext <ISkyrimMod, ISkyrimModGetter, ISkyrimMajorRecord, ISkyrimMajorRecordGetter>(cache, out IModContext <ISkyrimMod, ISkyrimModGetter, ISkyrimMajorRecord, ISkyrimMajorRecordGetter> _);
            nullableLink.ResolveContext <ISkyrimMod, ISkyrimModGetter, ISkyrimMajorRecord, ISkyrimMajorRecordGetter>(cache);
            nullableLink.TryResolveContext <ISkyrimMod, ISkyrimModGetter, ISkyrimMajorRecordGetter, ILight, ILightGetter>(cache, out var _);
            nullableLink.TryResolveContext(cache, out IModContext <ISkyrimMod, ISkyrimModGetter, ILight, ILightGetter> _);
            nullableLink.ResolveContext <ISkyrimMod, ISkyrimModGetter, ISkyrimMajorRecordGetter, ILight, ILightGetter>(cache);

            iLink.TryResolveContext <ISkyrimMod, ISkyrimModGetter, ISkyrimMajorRecord, ISkyrimMajorRecordGetter>(cache, out var _);
            iLink.ResolveContext <ISkyrimMod, ISkyrimModGetter, ISkyrimMajorRecord, ISkyrimMajorRecordGetter>(cache);
            iLink.TryResolveContext <ISkyrimMod, ISkyrimModGetter, ISkyrimMajorRecordGetter, ILight, ILightGetter>(cache, out var _);
            iLink.TryResolveContext(cache, out IModContext <ISkyrimMod, ISkyrimModGetter, ILight, ILightGetter> _);
            iLink.ResolveContext <ISkyrimMod, ISkyrimModGetter, ISkyrimMajorRecordGetter, ILight, ILightGetter>(cache);

            // Getter interface conversion
            IPerkGetter             getter   = new Perk(Utility.Form1, SkyrimRelease.SkyrimLE);
            Perk                    direct   = new Perk(Utility.Form2, SkyrimRelease.SkyrimLE);
            IPerk                   setter   = new Perk(Utility.Form2, SkyrimRelease.SkyrimLE);
            IFormLink <IPerkGetter> formLink = new FormLink <IPerkGetter>();

            formLink = getter.AsLink();
            formLink = direct.AsLink();
            formLink = setter.AsLink();
            formLink.SetTo(direct);
            formLink.SetTo(getter);
            formLink.SetTo(setter);
            formLink.SetTo(formLink);

            IObjectEffectGetter             objGetter = null !;
            IFormLink <IEffectRecordGetter> aLink     = new FormLink <IEffectRecordGetter>();

            aLink.SetTo(objGetter);

            IFormLink <ISkyrimMajorRecordGetter> majRecordLink = new FormLink <ISkyrimMajorRecordGetter>();
            IFormLink <IKeywordGetter>           keywordLink   = new FormLink <IKeywordGetter>();

            majRecordLink.SetTo(keywordLink);
            majRecordLink.TryResolve <IKeywordGetter>(cache, out var keyw);
        }