public static void RealmCreate(Player player, Command cmd, string themeName, string templateName) { MapGenTemplate template; MapGenTheme theme; int wx, wy, height = 128; if (!(cmd.NextInt(out wx) && cmd.NextInt(out wy) && cmd.NextInt(out height))) { if (player.World != null) { wx = 128; wy = 128; height = 128; } else { player.Message("When used from console, /gen requires map dimensions."); return; } cmd.Rewind(); cmd.Next(); cmd.Next(); } if (!Map.IsValidDimension(wx)) { player.Message("Cannot make map with width {0}: dimensions must be multiples of 16.", wx); return; } else if (!Map.IsValidDimension(wy)) { player.Message("Cannot make map with length {0}: dimensions must be multiples of 16.", wy); return; } else if (!Map.IsValidDimension(height)) { player.Message("Cannot make map with height {0}: dimensions must be multiples of 16.", height); return; } string fileName = player.Name; string fullFileName = null; if (fileName == null) { if (player.World == null) { player.Message("When used from console, /gen requires FileName."); return; } if (!cmd.IsConfirmed) { player.Confirm(cmd, "Replace this realm's map with a generated one?"); return; } } else { fileName = fileName.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar); if (!fileName.EndsWith(".fcm", StringComparison.OrdinalIgnoreCase)) { fileName += ".fcm"; } fullFileName = Path.Combine(Paths.MapPath, fileName); if (!Paths.IsValidPath(fullFileName)) { player.Message("Invalid filename."); return; } if (!Paths.Contains(Paths.MapPath, fullFileName)) { player.MessageUnsafePath(); return; } string dirName = fullFileName.Substring(0, fullFileName.LastIndexOf(Path.DirectorySeparatorChar)); if (!Directory.Exists(dirName)) { Directory.CreateDirectory(dirName); } if (!cmd.IsConfirmed && File.Exists(fullFileName)) { player.Confirm(cmd, "The mapfile \"{0}\" already exists. Overwrite?", fileName); return; } } bool noTrees; if (themeName.Equals("grass", StringComparison.OrdinalIgnoreCase)) { theme = MapGenTheme.Forest; noTrees = true; } else { try { theme = (MapGenTheme)Enum.Parse(typeof(MapGenTheme), themeName, true); noTrees = (theme != MapGenTheme.Forest); } catch (Exception) { player.MessageNow("Unrecognized theme \"{0}\". Available themes are: Grass, {1}", themeName, String.Join(", ", Enum.GetNames(typeof(MapGenTheme)))); return; } } try { template = (MapGenTemplate)Enum.Parse(typeof(MapGenTemplate), templateName, true); } catch (Exception) { player.Message("Unrecognized template \"{0}\". Available templates are: {1}", templateName, String.Join(", ", Enum.GetNames(typeof(MapGenTemplate)))); return; } if (!Enum.IsDefined(typeof(MapGenTheme), theme) || !Enum.IsDefined(typeof(MapGenTemplate), template)) { return; } MapGeneratorArgs args = MapGenerator.MakeTemplate(template); args.MapWidth = wx; args.MapLength = wy; args.MapHeight = height; args.MaxHeight = (int)(args.MaxHeight / 80d * height); args.MaxDepth = (int)(args.MaxDepth / 80d * height); args.Theme = theme; args.AddTrees = !noTrees; Map map; try { if (theme == MapGenTheme.Forest && noTrees) { player.MessageNow("Generating Grass {0}...", template); } else { player.MessageNow("Generating {0} {1}...", theme, template); } if (theme == MapGenTheme.Forest && noTrees && template == MapGenTemplate.Flat) { map = MapGenerator.GenerateFlatgrass(args.MapWidth, args.MapLength, args.MapHeight); } else { MapGenerator generator = new MapGenerator(args); map = generator.Generate(); } } catch (Exception ex) { Logger.Log(LogType.Error, "MapGenerator: Generation failed: {0}", ex); player.MessageNow("&WAn error occured while generating the map."); return; } if (fileName != null) { if (map.Save(fullFileName)) { player.MessageNow("Generation done. Saved to {0}", fileName); } else { player.Message("&WAn error occured while saving generated map to {0}", fileName); } } else { player.MessageNow("Generation done. Changing map..."); player.World.ChangeMap(map); } }
/// <summary> Checks constraints on all the parameters' values, throws ArgumentException if there are any violations. </summary> public void Validate() { if (!Map.IsValidDimension(MapWidth) || !Map.IsValidDimension(MapLength) || !Map.IsValidDimension(MapHeight)) { throw new ArgumentException("One or more of the map dimensions is not valid."); } if (AddWater) { if (CustomWaterLevel && (WaterLevel < 0 || WaterLevel > MapHeight)) { throw new ArgumentException("WaterLevel must be between 0 and MapHeight (inclusive)."); } if (WaterCoverage < 0 || WaterCoverage > 1) { throw new ArgumentException("WaterCoverage must be between 0 and 1 (inclusive)."); } } if (UseBias && (RaisedCorners < 0 || RaisedCorners > 4 || LoweredCorners < 0 || RaisedCorners > 4 || RaisedCorners + LoweredCorners > 4)) { throw new ArgumentException( "The sum of RaisedCorners and LoweredCorners must be between 0 and 4 (inclusive)."); } if (DetailScale < 0 || FeatureScale < 0) { throw new ArgumentException("DetailScale and FeatureScale must be greater than 0."); } if (DetailScale < FeatureScale) { throw new ArgumentException("DetailScale must be equal to or greater than FeatureScale."); } if (AddTrees) { if (TreeSpacingMax < 1) { throw new ArgumentException("TreeSpacingMax must be greater than 0."); } if (TreeSpacingMin < 1 || TreeSpacingMin > TreeSpacingMax) { throw new ArgumentException( "TreeSpacingMin must be greater than 0, and no greater than TreeSpacingMax."); } if (TreeHeightMax < 1) { throw new ArgumentException("TreeHeightMax must be greater than 0."); } if (TreeHeightMin < 1 || TreeHeightMin > TreeHeightMax) { throw new ArgumentException( "TreeHeightMin must be greater than 0, and no greater than TreeHeightMax."); } } if (AddCaves && (CaveDensity < 0 || CaveSize < 0)) { throw new ArgumentException("CaveDensity and CaveSize must not be negative."); } if (AddSnow && (SnowAltitude < 0 || SnowAltitude > MapHeight)) { throw new ArgumentException("SnowAltitude must be between 0 and MapHeight (inclusive)."); } if (AddCliffs && (CliffThreshold < 0 || CliffThreshold > 1)) { throw new ArgumentException("CliffThreshold must be between 0 and 1 (inclusive)."); } if (AddBeaches && (BeachExtent < 0 || BeachHeight < 0)) { throw new ArgumentException("BeachExtent and BeachHeight must not be negative."); } }