// WingsEmu // // Developed by NosWings Team using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Mapster; using PhoenixLib.Caching; using PhoenixLib.Logging; using WingsAPI.Data.Drops; using WingsAPI.Data.GameData; using WingsEmu.DTOs.BCards; using WingsEmu.DTOs.NpcMonster; using WingsEmu.Game.Buffs; using WingsEmu.Game.Entities; using WingsEmu.Game.Managers.ServerData; using WingsEmu.Game.Managers.StaticData; using WingsEmu.Game.Npcs; using WingsEmu.Game.Skills; using WingsEmu.Packets.Enums; namespace WingsEmu.Plugins.BasicImplementations.Managers.StaticData; public class NpcMonsterManager : INpcMonsterManager { private readonly IDropManager _dropManager; private readonly IEntitySkillFactory _entitySkillFactory; private readonly IKeyValueCache> _npcMonsterByName; private readonly ILongKeyCachedRepository _npcMonsterCache; private readonly IResourceLoader _npcMonsterLoader; private readonly ISkillsManager _skillsManager; public NpcMonsterManager(ILongKeyCachedRepository npcMonsterCache, IKeyValueCache> npcMonsterByName, ISkillsManager skillsManager, IDropManager dropManager, IResourceLoader npcMonsterLoader, IEntitySkillFactory entitySkillFactory) { _npcMonsterCache = npcMonsterCache; _npcMonsterByName = npcMonsterByName; _skillsManager = skillsManager; _dropManager = dropManager; _npcMonsterLoader = npcMonsterLoader; _entitySkillFactory = entitySkillFactory; } public async Task InitializeAsync() { int npcMonstersAdded = 0; foreach (NpcMonsterDto npcMonster in await _npcMonsterLoader.LoadAsync()) { if (npcMonster.Adapt() is not { } monster) { continue; } var drop = new List(); if (npcMonster.BCards.Any()) { foreach (BCardDTO s in npcMonster.BCards) { if (s.Type == (short)BCardType.SpecialActions && s.SubType == (byte)AdditionalTypes.SpecialActions.SeeHiddenThings) { monster.CanSeeInvisible = true; } } } if (npcMonster.Drops != null) { drop.AddRange(npcMonster.Drops); } drop.AddRange(_dropManager.GetDropsByMonsterVnum(monster.MonsterVNum)); monster.Drops = drop; _npcMonsterByName.GetOrSet(monster.Name, () => new List()).Add(monster); _npcMonsterCache.Set(monster.Id, monster); npcMonstersAdded++; } Log.Info($"[DATABASE] Loaded {npcMonstersAdded} monsters."); } public IMonsterData GetNpc(int vnum) => _npcMonsterCache.Get(vnum); public List GetNpc(string name) => _npcMonsterByName.Get(name); }