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); }
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>(); }
/// <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()); }
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))); }