Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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);
        }