public sealed override MountResult Mount(Accessory accessory, MountPointType locationType,
                                                 bool ignoreRestrictions, IAccessoryMounter priorityMounter, BodyCoverage additionalCoverage)
        {
            // Error checks are optimized with the assumption that the mount will succeed. Remounts to the same
            // location are allowed.  (Mounter may have changed or may have special remount behavior.)

            var location = GetMountPoint(locationType);

            if (!location)
            {
                Release(accessory);
                return(MountResult.NoMountPoint);
            }
            else if (location.IsBlocked)
            {
                Release(accessory);
                return(MountResult.LocationBlocked);
            }

            if (!ignoreRestrictions)
            {
                if (AccessoriesLimited && !accessory.IgnoreLimited)
                {
                    Release(accessory);
                    return(MountResult.OutfitIsLimited);
                }

                var currentCoverage = CurrentCoverage;
                if (m_Accessories.Contains(accessory))
                {
                    currentCoverage &= ~accessory.CurrentCoverage;
                }

                if (((accessory.GetCoverageFor(location) | additionalCoverage) & currentCoverage) != 0)
                {
                    Release(accessory);
                    return(MountResult.CoverageBlocked);
                }
            }

            if (priorityMounter != null && LizUtil.IsUnityDestroyed(priorityMounter))
            {
                Debug.LogError("The priority mounter is a reference to a destroyed object.", this);
                Release(accessory);
                return(MountResult.FailedOnError);
            }

            if (!accessory.Mount(location, gameObject, priorityMounter, additionalCoverage))
            {
                Release(accessory);
                return(MountResult.RejectedByAccessory);
            }

            LinkAccessory(accessory);

            Observers.SendAccessoryMount(this, accessory);

            return(MountResult.Success);
        }
        public sealed override MountResult Mount(Accessory accessory, MountPointType locationType,
                                                 bool ignoreRestrictions, IAccessoryMounter priorityMounter, BodyCoverage additionalCoverage)
        {
            // Error checks are optimized with the assumption that the mount will succeed.

            if (m_Accessories.Contains(accessory))
            {
                Debug.LogWarning("Attempted to attach same accessory more than once.  Attempt ignored: "
                                 + accessory.name);

                // It is a success since the accessory is mounted. But no event.
                return(MountResult.Success);
            }

            if (!ignoreRestrictions)
            {
                if (AccessoriesLimited && !accessory.IgnoreLimited)
                {
                    return(MountResult.OutfitIsLimited);
                }

                if (((accessory.GetCoverageFor(locationType) | additionalCoverage) & CurrentCoverage) != 0)
                {
                    return(MountResult.CoverageBlocked);
                }
            }

            var location = GetMountPoint(locationType);

            if (!location)
            {
                return(MountResult.NoMountPoint);
            }
            else if (location.IsBlocked)
            {
                return(MountResult.LocationBlocked);
            }

            if (priorityMounter != null && LizittUtil.IsUnityDestroyed(priorityMounter))
            {
                Debug.LogError("The priority mounter is a reference to a destroyed object.", this);
                return(MountResult.FailedOnError);
            }

            if (!accessory.Mount(location, gameObject, priorityMounter, additionalCoverage))
            {
                return(MountResult.RejectedByAccessory);
            }

            LinkAccessory(accessory);

            Observers.SendMount(this, accessory);

            return(MountResult.Success);
        }