Example #1
0
 public CGiveItem(IStringLocalizer stringLocalizer, IServiceProvider serviceProvider,
                  IConfiguration configuration, IItemDirectory itemDirectory) : base(serviceProvider)
 {
     m_StringLocalizer = stringLocalizer;
     m_Configuration   = configuration;
     m_ItemDirectory   = itemDirectory;
 }
        public static async UniTask <UnturnedItemAsset?> FindByNameOrIdAsync(this IItemDirectory directory, string input)
        {
            var assets = (await directory.GetItemAssetsAsync())
                         .OfType <UnturnedItemAsset>();

            await UniTask.SwitchToThreadPool();

            if (!assets.Any())
            {
                return(null);
            }

            var itemAsset = assets.FirstOrDefault(x => x.ItemAssetId.Equals(input, StringComparison.OrdinalIgnoreCase));

            if (itemAsset != null)
            {
                return(itemAsset);
            }

            itemAsset = assets
                        .Where(z => input.Split(' ')
                               .All(x => z.ItemName.Trim().Split(' ')
                                    .Any(y => y.IndexOf(x, StringComparison.OrdinalIgnoreCase) >= 0)))
                        .OrderBy(x => x.ItemAsset.id)
                        .FirstOrDefault();

            if (itemAsset != null)
            {
                return(itemAsset);
            }

            // https://github.com/openmod/openmod/blob/main/extensions/OpenMod.Extensions.Games.Abstractions/Items/ItemDirectoryExtensions.cs#L29
            var maxDistance = int.MaxValue;

            assets = assets
                     .Where(z => input.Split(' ')
                            .Any(x => z.ItemName.Trim().Split(' ')
                                 .Any(y => y.IndexOf(x, StringComparison.OrdinalIgnoreCase) >= 0)));

            foreach (var(asset, distance) in from asset in assets
                     let trimName = asset.ItemName.Trim()
                                    let distance = StringHelper.LevenshteinDistance(trimName, input)
                                                   select(asset, distance))
            {
                if (distance == 0)
                {
                    itemAsset = asset;
                    break;
                }

                if (distance < maxDistance)
                {
                    itemAsset   = asset;
                    maxDistance = distance;
                }
            }

            return(itemAsset);
        }
Example #3
0
 protected ShopCommand(
     IServiceProvider serviceProvider) : base(serviceProvider)
 {
     Configuration    = serviceProvider.GetRequiredService <IConfiguration>();
     StringLocalizer  = serviceProvider.GetRequiredService <IStringLocalizer>();
     ItemDirectory    = serviceProvider.GetRequiredService <IItemDirectory>();
     VehicleDirectory = serviceProvider.GetRequiredService <IVehicleDirectory>();
     ShopManager      = serviceProvider.GetRequiredService <IShopManager>();
     EconomyProvider  = serviceProvider.GetRequiredService <IEconomyProvider>();
 }
Example #4
0
        /// <summary>
        /// Searches for items by the item asset name.
        /// </summary>
        /// <param name="directory">The item directory service.</param>
        /// <param name="itemName">The name of the item asset.</param>
        /// <param name="exact">If true, only exact name matches will be used.</param>
        /// <returns><b>The <see cref="IItemAsset"/></b> if found; otherwise, <b>null</b>.</returns>
        public static async Task <IItemAsset?> FindByNameAsync(this IItemDirectory directory, string itemName, bool exact = true)
        {
            if (exact)
            {
                return((await directory.GetItemAssetsAsync()).FirstOrDefault(d =>
                                                                             d.ItemName.Equals(itemName, StringComparison.OrdinalIgnoreCase)));
            }

            return((await directory.GetItemAssetsAsync())
                   .Where(x => x.ItemName.IndexOf(itemName, StringComparison.OrdinalIgnoreCase) >= 0)
                   .MinBy(asset => StringHelper.LevenshteinDistance(itemName, asset.ItemName))
                   .FirstOrDefault());
        }
Example #5
0
        public ItemShop(
            IEconomyProvider economyProvider,
            IItemDirectory itemDirectory,
            IItemSpawner itemSpawner,
            IStringLocalizer stringLocalizer,
            ItemShopModel itemShopModel)
        {
            _economyProvider = economyProvider;
            _itemDirectory   = itemDirectory;
            _itemSpawner     = itemSpawner;
            _stringLocalizer = stringLocalizer;

            ShopData = itemShopModel;
        }
 /// <summary>
 /// Searches for items by the item asset id.
 /// </summary>
 /// <param name="directory">The item directory service.</param>
 /// <param name="itemAssetId">The item asset id to search for.</param>
 /// <returns><b>The <see cref="IItemAsset"/></b> if found; otherwise, <b>null</b>.</returns>
 public static async Task <IItemAsset?> FindByIdAsync(this IItemDirectory directory, string itemAssetId)
 {
     return((await directory.GetItemAssetsAsync())
            .FirstOrDefault(d => d.ItemAssetId.Equals(itemAssetId, StringComparison.OrdinalIgnoreCase)));
 }