public static void AddSpawnTypesToDefinition(string[] data, SpawnDefinition def) { if (!string.IsNullOrEmpty(data[1])) { if (data[1].Contains(":")) { Helpers.AddSubTypes(data[1], def); } else { def.Mobiles.Add(data[1]); } } if (!string.IsNullOrEmpty(data[2])) { if (data[2].Contains(":")) { Helpers.AddSubTypes(data[2], def); } else { def.Mobiles.Add(data[2]); } } if (!string.IsNullOrEmpty(data[3])) { if (data[3].Contains(":")) { Helpers.AddSubTypes(data[3], def); } else { def.Mobiles.Add(data[3]); } } if (!string.IsNullOrEmpty(data[4])) { if (data[4].Contains(":")) { Helpers.AddSubTypes(data[4], def); } else { def.Mobiles.Add(data[4]); } } if (!string.IsNullOrEmpty(data[5])) { if (data[5].Contains(":")) { Helpers.AddSubTypes(data[5], def); } else { def.Mobiles.Add(data[5]); } } if (!string.IsNullOrEmpty(data[6])) { if (data[6].Contains(":")) { Helpers.AddSubTypes(data[6], def); } else { def.Mobiles.Add(data[6]); } } }
/// <summary> /// The actual file conversion method. /// </summary> /// <param name="premiumPath"></param> static void ConvertSingleFile(string premiumPath) { if (File.Exists(premiumPath)) { Console.WriteLine("Now reading from '{0}'...", premiumPath); Console.WriteLine(); using (var streamReader = new StreamReader(premiumPath)) { var line = string.Empty; var mapFileInfo = new FileInfo(premiumPath); var spawnDefs = new List <SpawnDefinition>(); while ((line = streamReader.ReadLine()) != null) { if (Helpers.IgnoreLine(line)) { continue; } Console.WriteLine("Converting '{0}'", line); var splitData = line.Split('|'); if (!Helpers.HasObjectsToSpawn(splitData)) { Console.WriteLine("WARNING: Line '{0}' has no spawn data, skipping...", line); } else { /* * Here's the rough format of the various .map files across distros, with a couple of sample entries to better visualize. * Array indexes are above the colum names * * 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 *|typename |s1 |s2 |s3 |s4 |s5 | x | y | z | map | mindelay maxdelay homerange spawnrange spawnid maxcount | maxcount1 | maxcount2 | maxcount3 | maxcount4 | maxcount5 *|Herbalist| | | | | |1685|2985|0 |1 |5 |10 |20 |10 |1 |2 |0 |0 |0 |0 |0 *|Ratmanmage||||| |5850|219 |-3 |2 |5 |10 |20 |10 |1 |1 |0 |0 |0 |0 |0 * */ var spawnDef = new SpawnDefinition(); Helpers.AddSpawnTypesToDefinition(splitData, spawnDef); if (spawnDef.Mobiles.Count > 6) { Console.WriteLine("WARNING: '{0}' currently defines more than 6 mobiles!", line); } spawnDef.SpawnerName = mapFileInfo.Name + "_" + splitData[1]; spawnDef.X = splitData[7]; spawnDef.Y = splitData[8]; spawnDef.MapId = splitData[10]; spawnDef.MinTime = splitData[11]; spawnDef.MaxTime = splitData[12]; spawnDef.Team = "0"; // Hardcoded for now, not sure what this does spawnDef.NPCCount = splitData[16]; spawnDef.HomeRange = splitData[13]; spawnDef.BringToHome = false; // This is a field for Spawn. spawnDefs.Add(spawnDef); } } Console.WriteLine(""); Console.WriteLine("Done parsing '{0}', {1} spawners converted.", mapFileInfo.Name, spawnDefs.Count); var convertedMapFile = "converted_" + mapFileInfo.Name; Console.WriteLine("Now generating '{0}'...", convertedMapFile); var spawnWriter = new SpawnWriter(); Helpers.Write(spawnDefs, convertedMapFile); Console.WriteLine("'{0}' created successfully!", convertedMapFile); } } else { Console.WriteLine("Error: file doesn't exist!"); } }
private static void ParseXmlSpawn(Stream reader, string baseFileName) { List <SpawnDefinition> spawnDefinitions = new List <SpawnDefinition>(); DataSet ds = new DataSet("Spawns"); ds.ReadXml(reader); if (ds.Tables.Count == 0) { return; } foreach (DataRow row in ds.Tables["Points"].Rows) { SpawnDefinition spawn = new SpawnDefinition { Entries = new List <SpawnEntry>() }; string mapString = (string)row["Map"]; Map map = Enum.Parse <Map>(mapString); spawn.Map = (int)map; string objects2; if ((objects2 = (string)row["Objects2"]) != null) { string[] objectList = SplitString(objects2, ":OBJ="); foreach (string s in objectList) { SpawnEntry spawnEntry = new SpawnEntry(); string[] objectDetails = SplitString(s, ":MX="); if (string.IsNullOrEmpty(objectDetails[0])) { continue; } string name = ParseName(objectDetails[0]); // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator foreach (KeyValuePair <string, string> kvp in _replaceRegex) { Match match = Regex.Match(name.ToLower(), kvp.Key); if (match.Length <= 0) { continue; } name = Regex.Replace(name.ToLower(), kvp.Key, kvp.Value); break; } Type typeName = ResolveType(name); if (typeName == null) { Console.WriteLine($"Cannot find type {name}..."); continue; } spawnEntry.Name = typeName.Name; spawnEntry.MaxCount = int.Parse(GetParm(s, ":MX=")); spawnEntry.Probability = 100; spawn.Entries.Add(spawnEntry); } } if (spawn.Entries.Count == 0) { continue; } spawn.X = int.Parse((string)row["CentreX"]); spawn.Y = int.Parse((string)row["CentreY"]); spawn.Z = int.Parse((string)row["CentreZ"]); spawn.Count = int.Parse((string)row["MaxCount"]); spawn.WalkingRange = int.Parse((string)row["Range"]); // Because ModernUO does not support SpawnArea (Rectangle2D), we must calculate a radius for a spawn range spawn.HomeRange = CalculateHomeRange(spawn.X, spawn.Y, int.Parse((string)row["X"]), int.Parse((string)row["Y"]), int.Parse((string)row["Width"]), int.Parse((string)row["Height"])); try { int minDelay = int.Parse((string)row["MinDelay"]); int maxDelay = int.Parse((string)row["MaxDelay"]); bool isSeconds = bool.Parse((string)row["DelayInSec"]); spawn.MinDelay = isSeconds ? TimeSpan.FromSeconds(minDelay) : TimeSpan.FromMinutes(minDelay); spawn.MaxDelay = isSeconds ? TimeSpan.FromSeconds(maxDelay) : TimeSpan.FromMinutes(maxDelay); } catch (ArgumentException) { spawn.MinDelay = TimeSpan.FromMinutes(5); spawn.MaxDelay = TimeSpan.FromMinutes(10); } spawnDefinitions.Add(spawn); } if (spawnDefinitions.Count <= 0) { return; } if (!Directory.Exists(OUTPUT_DIRECTORY)) { Directory.CreateDirectory(OUTPUT_DIRECTORY); } using JsonTextWriter jtw = new JsonTextWriter( new StreamWriter(Path.Combine(OUTPUT_DIRECTORY, $"{baseFileName.ToLower()}.json"))); JsonSerializer serializer = JsonSerializer.Create(new JsonSerializerSettings { Formatting = Formatting.Indented }); serializer.Serialize(jtw, spawnDefinitions); }