public void Process(RegionChunkManager Chunks, WorldMetrics Metrics, String Filename) { // *** Accumulate list of sign types _SignMap = CreateSignMap(); int NumLen = Metrics.NumberOfChunks.ToString().Length; int NumCount = Metrics.NumberOfChunks; string NumFormat = "D" + NumLen; int ProcessedChunks = 0; Console.Write("Scanned " + 0.ToString(NumFormat) + " of " + Metrics.NumberOfChunks.ToString() + " chunks (0%)"); Point ProcessedCountPoint = new Point(8, Console.CursorTop); Point PercentageUpdatePoint = new Point(Console.CursorLeft - 3, Console.CursorTop); // *** Find all signs in the world and scan foreach (ChunkRef Chunk in Chunks) { ProcessedChunks++; Console.SetCursorPosition(ProcessedCountPoint.X, ProcessedCountPoint.Y); Console.Write(ProcessedChunks.ToString(NumFormat)); Console.SetCursorPosition(PercentageUpdatePoint.X, PercentageUpdatePoint.Y); Console.Write(((100 * ProcessedChunks) / NumCount).ToString() + "%)"); ProcessChunk(Chunk); } Console.WriteLine(""); Console.WriteLine("Scan completed. Saving sign data..."); XmlWriter Writer = XmlWriter.Create(Filename); Writer.WriteStartElement("Signs"); // *** Curly braces used to ensure that start and end element counts are matched. foreach (SignBase Sign in _ExportableSigns) { Writer.WriteStartElement("Sign"); { Writer.WriteAttributeString("Type", Sign.SignType()); Writer.WriteStartElement("Location"); { Writer.WriteElementString("X", Sign.Location.X.ToString()); Writer.WriteElementString("Y", Sign.Location.Y.ToString()); } Writer.WriteEndElement(); List <KeyValuePair <String, String> > Params = new List <KeyValuePair <string, string> >(); Sign.ExportParameters(Params); foreach (KeyValuePair <String, String> Param in Params) { Writer.WriteStartElement(Param.Key); { Writer.WriteString(Param.Value); } Writer.WriteEndElement(); } } Writer.WriteEndElement(); } Writer.WriteEndElement(); Writer.Flush(); Writer.Close(); Console.WriteLine("Wrote sign data to file " + Path.GetFileName(Filename)); }