private void ParseFileForCells(BinaryReader br, string PluginName, Dictionary<string, bool> IgnoreList, Dictionary<string, bool> CellList) { List<string> Masters = new List<string>() { PluginName.ToLower(Statics.Culture) }; if (DEBUG) allWarnings.Add("PLUGIN=" + Masters[0]); int DEBUG_cells = 0; int DEBUG_refs = 0; int DEBUG_added = 0; int DEBUG_moved = 0; int DEBUG_deleted = 0; while (br.BaseStream.Position < br.BaseStream.Length) { string s = ReadString(br); int size = br.ReadInt32(); br.BaseStream.Position += 8; switch (s) { case "TES3": int read = 0; while (read < size) { s = ReadString(br); int size2 = br.ReadInt32(); read += size2 + 8; long pos = br.BaseStream.Position; switch (s) { case "MAST": Masters.Add(ReadCString(br, size2).ToLower(Statics.Culture)); if (DEBUG) allWarnings.Add("MASTER[" + (Masters.Count - 1) + "]=" + Masters[Masters.Count-1]); break; } br.BaseStream.Position = pos + size2; } break; case "CELL": if (DEBUG) DEBUG_cells++; string CellName = ""; bool IsValidCell = false; bool InReference = false; bool ReferenceHasScale = false; bool ReferenceDeleted = false; bool ReadData = false; bool Interior = false; uint RefID = 0; int MastID = 0; int CellX = 0; int CellY = 0; StaticReference sr = new StaticReference(); read = 0; while (read < size) { s = ReadString(br); int size2 = br.ReadInt32(); read += size2 + 8; long pos = br.BaseStream.Position; switch (s) { case "DATA": if (!InReference) { if (ReadData) break; uint flags = br.ReadUInt32(); if ((flags & 0x01) == 0 || (cbStatIntExt.Checked && (flags & 0x81) == 0x81) || (cbStatIntWater.Checked && (flags & 0x83) == 0x03)) IsValidCell = true; if ((flags & 0x01) != 0) { Interior = true; if (CellList.ContainsKey(CellName.ToLower(Statics.Culture))) IsValidCell = CellList[CellName.ToLower(Statics.Culture)]; } else Interior = false; CellX = br.ReadInt32(); CellY = br.ReadInt32(); ReadData = true; } else { sr.x = br.ReadSingle(); sr.y = br.ReadSingle(); sr.z = br.ReadSingle(); sr.yaw = br.ReadSingle(); sr.pitch = br.ReadSingle(); sr.roll = br.ReadSingle(); } break; case "FRMR": if (DEBUG) DEBUG_refs++; if (!IsValidCell) break; if (InReference) { if (!ReferenceHasScale) sr.scale = 1; if (StaticsList.ContainsKey(sr.name) && (!IgnoreList.ContainsKey(sr.name) || !IgnoreList[sr.name])) { sr.SetID(StaticsList, StaticMap); string Worldspace = Interior ? CellName : ""; string Reference = Masters[MastID] + "\u0001" + (Interior ? "" : CellX + "\u0002" + CellY + "\u0001") + RefID; if (ReferenceDeleted) { if (UsedStaticsList.ContainsKey(Worldspace) && UsedStaticsList[Worldspace].ContainsKey(Reference)) UsedStaticsList[Worldspace].Remove(Reference); } else { if (!UsedStaticsList.ContainsKey(Worldspace)) UsedStaticsList.Add(Worldspace, new Dictionary<string, StaticReference>()); UsedStaticsList[Worldspace][Reference] = sr; } if (DEBUG) { if (ReferenceDeleted) ++DEBUG_deleted; else if (MastID > 0) ++DEBUG_moved; else ++DEBUG_added; } } } RefID = br.ReadUInt32(); MastID = (int)(RefID >> 24); RefID &= 0x00FFFFFF; sr = new StaticReference(); InReference = true; ReferenceHasScale = false; ReferenceDeleted = false; break; case "DELE": ReferenceDeleted = true; break; case "NAME": if (InReference) sr.name = ReadCString(br, size2).ToLower(Statics.Culture); else CellName = ReadCString(br, size2); break; case "XSCL": if (!InReference) break; sr.scale = br.ReadSingle(); ReferenceHasScale = true; break; } br.BaseStream.Position = pos + size2; } if (InReference) { if (!ReferenceHasScale) sr.scale = 1; if (StaticsList.ContainsKey(sr.name) && (!IgnoreList.ContainsKey(sr.name) || !IgnoreList[sr.name])) { sr.SetID(StaticsList, StaticMap); string Worldspace = Interior ? CellName : ""; string Reference = Masters[MastID] + "\u0001" + (Interior ? "" : CellX + "\u0002" + CellY + "\u0001") + RefID; if (ReferenceDeleted) { if (UsedStaticsList.ContainsKey(Worldspace) && UsedStaticsList[Worldspace].ContainsKey(Reference)) UsedStaticsList[Worldspace].Remove(Reference); } else { if (!UsedStaticsList.ContainsKey(Worldspace)) UsedStaticsList.Add(Worldspace, new Dictionary<string, StaticReference>()); UsedStaticsList[Worldspace][Reference] = sr; } if (DEBUG) { if (ReferenceDeleted) ++DEBUG_deleted; else if (MastID > 0) ++DEBUG_moved; else ++DEBUG_added; } } } break; default: br.BaseStream.Position += size; break; } } if (DEBUG) allWarnings.Add("Scanning summary for: " + PluginName + " : " + DEBUG_cells + " cells : " + DEBUG_refs + " refs : " + DEBUG_added + " added : " + DEBUG_moved + " moved : " + DEBUG_deleted + " deleted"); }