ClassiCube / MCGalaxy

A Minecraft Classic / ClassiCube server software
GNU General Public License v3.0
162 stars 76 forks source link

fCraft mapgen options extension #735

Open rdebath opened 1 year ago

rdebath commented 1 year ago

This patch no longer applies; maybe you'd like to include it as you're changing that area. (I'm not using it myself at the moment)

Extend seed for fcraft generator

Comma separated options, the first is the biome as before.
Any values comes after an '='.

seed=123        Random integer seed (s)
water           Bool/disable water (w)
watercoverage   Set the water coverage 0.00-1.00 (wc)
tree            Enable/disable trees (t)
snow            Bool to enable/disable snow (sn)
snowlevel       Enable snow and set it's starting level (sl,snowaltitude)

treespacingmin
treespacingmax  How often are trees
treeheightmin
treeheightmax   How big are trees.
diff --git a/MCGalaxy/Generator/fCraft/MapGen.cs b/MCGalaxy/Generator/fCraft/MapGen.cs
index d68aee365..0e9ec207b 100644
--- a/MCGalaxy/Generator/fCraft/MapGen.cs
+++ b/MCGalaxy/Generator/fCraft/MapGen.cs
@@ -418,22 +418,100 @@ namespace MCGalaxy.Generator.fCraft {

         static bool Gen(Player p, Level lvl, string seed, MapGenTheme theme) {
             MapGenBiome biome = MapGenBiome.Forest;
-            if (seed.Length > 0 && !CommandParser.GetEnum(p, seed, "Seed", ref biome)) return false;
             fCraftMapGenArgs args = fCraftMapGenArgs.MakeTemplate(theme);

             float ratio = lvl.Height / 96.0f;
             args.MaxHeight    = (int)Math.Round(args.MaxHeight    * ratio);
             args.MaxDepth     = (int)Math.Round(args.MaxDepth     * ratio);
             args.SnowAltitude = (int)Math.Round(args.SnowAltitude * ratio);
-
+            args.WaterLevel = (lvl.Height - 1) / 2;
+
+            string[] seedparts = seed.Split(',');
+            if (seedparts.Length>1)
+                seed = seedparts[0];
+            if (seed.Length > 0 && !CommandParser.GetEnum(p, seed, "Biome", ref biome)) return false;
+
             args.Biome      = biome;
             args.AddTrees   = biome == MapGenBiome.Forest;
             args.AddWater   = biome != MapGenBiome.Desert;
-            args.WaterLevel = (lvl.Height - 1) / 2;
+
+            int ar;
+            char[] equals_chararray = new char[] {'='};
+            for(ar=1; ar<seedparts.Length; ar++)
+            {
+                string[] arg = (seedparts[ar]).Split(equals_chararray,2);
+                if (arg.Length != 2) arg = new string[2]{arg[0], "1"};
+                switch(arg[0].ToLower()) {
+                case "s":
+                case "seed":
+                    if (!Int32.TryParse(arg[1], out args.Seed)) {
+                        p.Message("&W\"{0}\" is not a valid integer Seed.", arg[1]);
+                        return false;
+                    }
+                    break;
+                case "w":
+                case "water":
+                    if (!CommandParser.GetBool(p, arg[1], ref args.AddWater))
+                        return false;
+                    break;
+                case "wc":
+                case "watercoverage":
+                    if (!CommandParser.GetReal(p, arg[1], "WaterCoverage", ref args.WaterCoverage, 0.0f, 1.0f))
+                    args.AddWater = true;
+                    args.MatchWaterCoverage = true;
+                    break;
+                case "t":
+                case "tree": case "trees":
+                    if (!CommandParser.GetBool(p, arg[1], ref args.AddTrees))
+                        return false;
+                    break;
+                case "sn":
+                case "snow":
+                    if (!CommandParser.GetBool(p, arg[1], ref args.AddSnow))
+                        return false;
+                    break;
+                case "sl":
+                case "snowlevel":
+                case "snowaltitude":
+                    if (!CommandParser.GetInt(p, arg[1], "SnowAltitude", ref args.SnowAltitude, 0, lvl.Height - 1))
+                        return false;
+                    args.AddSnow = true;
+                    break;
+
+                case "tsl":
+                case "treespacingmin":
+                    if (!CommandParser.GetInt(p, arg[1], "TreeSpacingMin", ref args.TreeSpacingMin, 0))
+                        return false;
+                    args.AddTrees = true;
+                    break;
+                case "tsh":
+                case "treespacingmax":
+                    if (!CommandParser.GetInt(p, arg[1], "TreeSpacingMax", ref args.TreeSpacingMax, 0))
+                        return false;
+                    args.AddTrees = true;
+                    break;
+                case "thl":
+                case "treeheightmin":
+                    if (!CommandParser.GetInt(p, arg[1], "TreeHeightMin", ref args.TreeHeightMin, 0))
+                        return false;
+                    args.AddTrees = true;
+                    break;
+                case "thh":
+                case "treeheightmax":
+                    if (!CommandParser.GetInt(p, arg[1], "TreeHeightMax", ref args.TreeHeightMax, 0))
+                        return false;
+                    args.AddTrees = true;
+                    break;
+
+                default:
+                    p.Message("&WSeed option\"{0}\" is unknown.", arg[0]);
+                    return false;
+                }
+            }

             new fCraftMapGen(args).Generate(lvl);
             args.ApplyEnv(lvl.Config);
             return true;
         }
     }
-}
\ No newline at end of file
+}