using System.Collections.Generic; using System.Linq; using PhoenixLib.Caching; using PhoenixLib.Logging; using WingsAPI.Data.GameData; using WingsEmu.Core.Extensions; using WingsEmu.DTOs.Items; using WingsEmu.Game.Items; using WingsEmu.Game.Managers.StaticData; using WingsEmu.Packets.Enums; namespace WingsEmu.Plugins.BasicImplementations.Managers.StaticData; public class ItemsManager : IItemsManager { private readonly ILongKeyCachedRepository _cachedItems; private readonly ILongKeyCachedRepository> _cachedItemsByType; private readonly IResourceLoader _itemResourceLoader; private readonly IKeyValueCache> _itemsByName; private readonly Dictionary _titleIdByItemVnum = new(); public ItemsManager(ILongKeyCachedRepository cachedItems, ILongKeyCachedRepository> cachedItemsByType, IKeyValueCache> itemsByName, IResourceLoader itemResourceLoader) { _cachedItems = cachedItems; _cachedItemsByType = cachedItemsByType; _itemsByName = itemsByName; _itemResourceLoader = itemResourceLoader; } public void Initialize() { IEnumerable items = _itemResourceLoader.LoadAsync().ConfigureAwait(false).GetAwaiter().GetResult(); var item = new Dictionary(); foreach (ItemDTO itemDto in items) { var newGameItem = new GameItem(itemDto); _itemsByName.GetOrSet(itemDto.Name, () => new List()).Add(newGameItem); _cachedItems.Set(itemDto.Id, newGameItem); item[itemDto.Id] = newGameItem; } foreach (IGrouping group in item.Values.GroupBy(x => x.ItemType)) { _cachedItemsByType.Set((int)group.Key, group.ToList()); } var titles = GetItemsByType(ItemType.Title).Select(x => x.Id).ToList(); for (int i = 0; i < titles.Count; i++) { _titleIdByItemVnum[titles[i]] = i; } Log.Info($"[DATABASE] Loaded {item.Count} items."); } public IGameItem GetItem(int vnum) => _cachedItems.Get(vnum); public IEnumerable GetItemsByType(ItemType type) => _cachedItemsByType.Get((int)type); public int GetTitleId(int itemVnum) => _titleIdByItemVnum.GetOrDefault(itemVnum); public List GetItem(string name) => _itemsByName.Get(name); }