public NPC(ShineNPC spoint) { IsAttackable = false; point = spoint; LinkTable lt = null; if (point.Role == "Gate" && !DataProvider.Instance.NpcLinkTable.TryGetValue(spoint.RoleArg0, out lt)) { Log.WriteLine(LogLevel.Warn, "Could not load LinkTable for NPC {0} LT {1}", point.MobName, point.RoleArg0); } Gate = lt; this.ID = DataProvider.Instance.GetMobIDFromName(point.MobName); this.Position = new Vector2(spoint.Coord_X, spoint.Coord_Y); if (spoint.Direct < 0) { this.Rotation = (byte)((360 + spoint.Direct) / 2); } else { this.Rotation = (byte)(spoint.Direct / 2); } }
public void LoadMaps(List <ushort> toload = null) { MapsByID = new Dictionary <ushort, MapInfo>(); MapsByName = new Dictionary <string, MapInfo>(); using (var file = new SHNFile(folder + @"\MapInfo.shn")) { using (DataTableReaderEx reader = new DataTableReaderEx(file)) { while (reader.Read()) { MapInfo info = MapInfo.Load(reader); info.NPCs = new List <ShineNPC>(); if (MapsByID.ContainsKey(info.ID)) { Log.WriteLine(LogLevel.Debug, "Duplicate map ID {0} ({1})", info.ID, info.FullName); MapsByID.Remove(info.ID); MapsByName.Remove(info.ShortName); } if (toload == null || toload.Contains(info.ID)) { MapsByID.Add(info.ID, info); MapsByName.Add(info.ShortName, info); } } } } Blocks = new Dictionary <ushort, BlockInfo>(); foreach (var map in MapsByID.Values) { string renderpath = folder + @"\BlockInfo\" + map.ShortName + ".shbd"; if (File.Exists(renderpath)) { BlockInfo info = new BlockInfo(renderpath, map.ID); Blocks.Add(map.ID, info); } } using (var tables = new ShineReader(folder + @"\NPC.txt")) { NpcLinkTable = new Dictionary <string, LinkTable>(); using (DataTableReaderEx reader = new DataTableReaderEx(tables["LinkTable"])) { while (reader.Read()) { LinkTable link = LinkTable.Load(reader); if (Program.IsLoaded(GetMapidFromMapShortName(link.MapClient))) { NpcLinkTable.Add(link.argument, link); } } } using (DataTableReaderEx reader = new DataTableReaderEx(tables["ShineNPC"])) { while (reader.Read()) { ShineNPC npc = ShineNPC.Load(reader); MapInfo mi = null; if (Program.IsLoaded(GetMapidFromMapShortName(npc.Map)) && MapsByName.TryGetValue(npc.Map, out mi)) { mi.NPCs.Add(npc); } } } } Log.WriteLine(LogLevel.Info, "Loaded {0} maps.", MapsByID.Count); }