/// <summary> /// Get the type of soul in a soul gem. Will return <see cref="SoulLevels.None"/> /// if there is no soul in the soul gem. /// </summary> /// <param name="itemEntry">The soul gem</param> /// <returns>The soul in the given soul gem</returns> public static SoulLevels GetSoulType([NotNull] this ExtraContainerChanges.ItemEntry itemEntry) { SoulLevels result = 0; var item = itemEntry.Template; if (item == null) { return(result); } var formPtr = item.Cast <TESForm>(); if (formPtr == IntPtr.Zero) { return(result); } if (item.FormType != FormTypes.SoulGem) { return(result); } var baseSoul = Memory.ReadUInt8(formPtr + 0x108); BSSimpleList <BSExtraDataList> extraData = itemEntry.ExtraData; if (extraData == null) { return((SoulLevels)baseSoul); } extraData.Where(x => x != null).Do(x => { var ptr = x.Cast <BSExtraDataList>(); if (ptr == IntPtr.Zero) { return; } var soul = Memory.InvokeCdecl(AddressLibrary.GetSoulTypeFunc, ptr).ToUInt8(); if (soul == 0) { soul = baseSoul; } result = (SoulLevels)soul; }); return(result); }
/// <summary> /// Tries to get the extra enchantment of an item. The extra enchantment is different /// from a base enchantment in the way that the extra enchantment is what you apply /// when enchanting the item using the enchantment table and the base enchantment being /// the enchantment set in the actual form. /// </summary> /// <param name="itemEntry">The item</param> /// <param name="enchantment">The <see cref="ExtraEnchantment"/> of an item if return true</param> /// <returns>True if getting the extra enchantment as successful, false if not</returns> public static bool TryGetExtraEnchantment([NotNull] this ExtraContainerChanges.ItemEntry itemEntry, out ExtraEnchantment enchantment) { enchantment = null; var item = itemEntry.Template; if (item == null) { return(false); } BSSimpleList <BSExtraDataList> extraData = itemEntry.ExtraData; if (extraData == null) { return(false); } ExtraEnchantment extraEnchantment = null; extraData.Where(x => x != null).Do(x => { var n = x.First; while (n != null) { if (n is ExtraEnchantment nEnchantment) { extraEnchantment = nEnchantment; break; } n = n.Next; } }); enchantment = extraEnchantment; return(extraEnchantment != null); }