using System.Collections.Concurrent; using System.Collections.Generic; namespace WingsEmu.Game.Configurations; public interface IMonsterTalkingConfig { bool HasPossibleMessages(int monsterVnum); IReadOnlyList PossibleMessage(int monsterVnum); } public class MonsterTalkingConfig : IMonsterTalkingConfig { private readonly ConcurrentDictionary> _monsterMessage = new(); private readonly HashSet _monstersWithMessage = new(); public MonsterTalkingConfig(IEnumerable configurations) { foreach (MonsterTalkingConfiguration config in configurations) { if (config?.PossibleMessages == null || config.MobVnums == null) { continue; } foreach (int mobVnum in config.MobVnums) { _monstersWithMessage.Add(mobVnum); _monsterMessage.TryAdd(mobVnum, config.PossibleMessages); } } } public bool HasPossibleMessages(int monsterVnum) => _monstersWithMessage.Contains(monsterVnum); public IReadOnlyList PossibleMessage(int monsterVnum) => _monsterMessage.TryGetValue(monsterVnum, out List list) ? list : null; } public class MonsterTalkingConfiguration { public List PossibleMessages { get; set; } public List MobVnums { get; set; } }