private static void SaveWorldMetaDataPrefix(World __instance)
            {
                Log($"Saving settings for {__instance.m_name}");

                BetterContinentsSettings settingsToSave = default;

                // Vanilla metadata is always saved when a world is created for the first time, before it is actually loaded or generated.
                // So if that metadata doesn't exist it means the world is being created now.
                if (!File.Exists(__instance.GetMetaPath()))
                {
                    // World is being created, so bake our settings from the preset
                    Log($"First time save of {__instance.m_name}, applying selected preset {ConfigSelectedPreset.Value}");
                    settingsToSave = Presets.LoadActivePreset(__instance.m_uid);
                }
                else
                {
                    settingsToSave = Settings;
                }
                settingsToSave.Dump();

                // Duplicating the careful behaviour of the metadata save function
                string ourMetaPath = __instance.GetMetaPath() + ".BetterContinents";
                string newName     = ourMetaPath + ".new";
                string oldName     = ourMetaPath + ".old";

                settingsToSave.Save(newName);
                if (File.Exists(ourMetaPath))
                {
                    if (File.Exists(oldName))
                    {
                        File.Delete(oldName);
                    }
                    File.Move(ourMetaPath, oldName);
                }
                File.Move(newName, ourMetaPath);
            }
Beispiel #2
0
        static DebugUtils()
        {
            AddCommand("info", "print current settings to console", _ =>
            {
                BetterContinents.Settings.Dump(str => Console.instance.Print($"<size=15><color=silver>{str}</color></size>"));
                Console.instance.Print($"<color=orange>NOTE: these settings don't map exactly to console param function or the config file, as some of them are derived.</color>");
            });

            AddCommand("reload", "reload and reapply one or more of the image maps (e.g. 'bc reload hm rm' to reload height map and roughmap)", "hm/rm/fm/bm/sm/fom/all", args =>
            {
                string[] maps = args.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                bool all      = maps.Contains("all");

                GameUtils.BeginTerrainChanges();

                if (maps.Contains("hm") || all)
                {
                    BetterContinents.Settings.ReloadHeightmap();
                }
                if (maps.Contains("rm") || all)
                {
                    BetterContinents.Settings.ReloadRoughmap();
                }
                if (maps.Contains("fm") || all)
                {
                    BetterContinents.Settings.ReloadFlatmap();
                }
                if (maps.Contains("bm") || all)
                {
                    BetterContinents.Settings.ReloadBiomemap();
                }
                if (maps.Contains("sm") || all)
                {
                    BetterContinents.Settings.ReloadSpawnmap();
                }
                if (maps.Contains("fom") || all)
                {
                    BetterContinents.Settings.ReloadForestmap();
                }

                GameUtils.EndTerrainChanges();
            });

            AddCommand("locs", "print all location spawn instance counts to the console", _ =>
            {
                var locationInstances = GameUtils.GetLocationInstances();

                var locationTypes = locationInstances.Values
                                    .GroupBy(l => l.m_location.m_prefabName)
                                    .ToDictionary(g => g.Key, g => g.ToList());
                foreach (var lg in locationTypes)
                {
                    Console.instance.Print($"Placed {lg.Value.Count} {lg.Key} locations");
                }

                foreach (var boss in Bosses)
                {
                    if (!locationTypes.ContainsKey(boss))
                    {
                        Console.instance.Print($"<color=orange>WARNING: No {boss} generated</color>");
                    }
                }
            });
            AddCommand("bosses", "show pins for bosses, start temple and trader", _ =>
            {
                GameUtils.ShowOnMap(Bosses);
            });
            // AddCommand("show", "pin all locations on the map", _ =>
            // {
            //     GameUtils.ShowOnMap();
            // });
            AddCommand("show", "pin locations matching optional filter on the map", "(optional filter)", args =>
            {
                GameUtils.ShowOnMap(args
                                    .Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
                                    .Select(f => f.Trim())
                                    .ToArray());
            });
            // AddCommand("hide", "remove all pins from the map",  _ =>
            // {
            //     GameUtils.HideOnMap();
            // });
            AddCommand("hide", "remove pins matching optional filter from the map", "(optional filter)", args =>
            {
                GameUtils.HideOnMap(args
                                    .Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
                                    .Select(f => f.Trim())
                                    .ToArray());
            });
            AddCommand("clouds", "toggle the map clouds", _ =>
            {
                var mat = Minimap.instance.m_mapImageLarge.material;
                if (mat.GetTexture("_CloudTex") == TransparentTexture)
                {
                    mat.SetTexture("_CloudTex", CloudTexture);
                }
                else
                {
                    CloudTexture = mat.GetTexture("_CloudTex");
                    if (TransparentTexture == null)
                    {
                        TransparentTexture = UI.CreateFillTexture(new Color32(0, 0, 0, 0));
                    }

                    mat.SetTexture("_CloudTex", TransparentTexture);
                }
            });
            AddCommand("mapds", "set minimap downscaling factor (for faster updates)", "(0 = vanilla quality, 1 = 1/2 res, 2 = 1/4 res, 3 = 1/8 res, 2 is default)", args =>
            {
                GameUtils.SetMinimapDownscalingPower(int.Parse(args));
                GameUtils.FastMinimapRegen();
            });

            AddCommand("refresh", "resets all vegetation and locations (done automatically on every change)", _ => {
                GameUtils.Refresh();
            });
            AddCommand("despawnall", "despawn everything", _ => {
                GameUtils.DespawnAll();
            });
            AddCommand("resetall", "reset everything (WARNING: this deletes everything that has been build in the map!)", _ => {
                GameUtils.ResetAll();
                Console.instance.Print($"<color=orange>All constructions removed!</color>");
            });
            AddCommand("regenloc", "regenerate all locations", _ =>
            {
                bool prevLocSetting = BetterContinents.ConfigDebugSkipDefaultLocationPlacement.Value;
                BetterContinents.ConfigDebugSkipDefaultLocationPlacement.Value = false;
                GameUtils.RegenerateLocations();
                BetterContinents.ConfigDebugSkipDefaultLocationPlacement.Value = prevLocSetting;
                Console.instance.Print($"<color=orange>All locations regenerated!</color>");
            });
            AddCommand("scr", "save the minimap to a png", "(optional resolution, default is 2048)", arg => {
                GameUtils.SaveMinimap(string.IsNullOrEmpty(arg) ? 2048 : int.Parse(arg));
            });
            AddCommand("savepreset", "save the minimap to a png", "(name)", arg =>
            {
                Presets.Save(BetterContinents.Settings, arg);
            });

            void AddHeightmapSubcommand(Command command, string cmd, string desc, string args, Action <string> action)
            {
                command.AddSubcommand(cmd, desc, args, args2 =>
                {
                    GameUtils.BeginTerrainChanges();
                    action(args2);
                    GameUtils.EndTerrainChanges();
                });
            }

            AddCommand("param", "set parameters directly", configCmd: command =>
            {
                command.AddSubcommand("g", "global settings, get more info with 'bc param g help'", subcmdConfig: subcmd => {
                    AddHeightmapSubcommand(subcmd, "cs", "continent size", "(between 0 and 1)", args => BetterContinents.Settings.SetContinentSize(float.Parse(args)));
                    AddHeightmapSubcommand(subcmd, "ma", "mountains amount", "(between 0 and 1)", args => BetterContinents.Settings.SetMountainsAmount(float.Parse(args)));
                    AddHeightmapSubcommand(subcmd, "sl", "sea level adjustment", "(between 0 and 1)", args => BetterContinents.Settings.SetSeaLevelAdjustment(float.Parse(args)));
                    AddHeightmapSubcommand(subcmd, "oc", "ocean channels", "(0 to disable, 1 to enable)", args => BetterContinents.Settings.SetOceanChannelsEnabled(int.Parse(args) != 0));
                    AddHeightmapSubcommand(subcmd, "r", "rivers", "(0 to disable, 1 to enable)", args => BetterContinents.Settings.SetRiversEnabled(int.Parse(args) != 0));
                    AddHeightmapSubcommand(subcmd, "me", "map edge drop off", "(0 to disable, 1 to enable)", args => BetterContinents.Settings.SetMapEdgeDropoff(int.Parse(args) != 0));
                    AddHeightmapSubcommand(subcmd, "mc", "mountains allowed at center", "(0 to disable, 1 to enable)", args => BetterContinents.Settings.SetMountainsAllowedAtCenter(int.Parse(args) != 0));
                });
                command.AddSubcommand("h", "heightmap settings, get more info with 'bc param h help'", subcmdConfig: subcmd =>
                {
                    AddHeightmapSubcommand(subcmd, "fn", "set heightmap filename", "(full path including filename, or nothing to disable)", args =>
                    {
                        if (string.IsNullOrEmpty(args))
                        {
                            BetterContinents.Settings.DisableHeightmap();
                            Console.instance.Print($"<color=orange>Heightmap disabled!</color>");
                        }
                        else if (!File.Exists(BetterContinents.CleanPath(args)))
                        {
                            Console.instance.Print($"<color=red>ERROR: {args} doesn't exist</color>");
                        }
                        else
                        {
                            BetterContinents.Settings.SetHeightmapPath(args);
                        }
                    });
                    AddHeightmapSubcommand(subcmd, "ov", "heightmap override all", "(0 to disable, 1 to enable)", args => BetterContinents.Settings.SetHeightmapOverrideAll(int.Parse(args) != 0));
                    AddHeightmapSubcommand(subcmd, "am", "heightmap amount", "(between 0 and 5)", args => BetterContinents.Settings.SetHeightmapAmount(float.Parse(args)));
                    AddHeightmapSubcommand(subcmd, "bl", "heightmap blend", "(between 0 and 1)", args => BetterContinents.Settings.SetHeightmapBlend(float.Parse(args)));
                    AddHeightmapSubcommand(subcmd, "ad", "heightmap add", "(between -1 and 1)", args => BetterContinents.Settings.SetHeightmapAdd(float.Parse(args)));
                    AddHeightmapSubcommand(subcmd, "ma", "heightmap mask", "(between 0 and 1)", args => BetterContinents.Settings.SetHeightmapMask(float.Parse(args)));
                });
                command.AddSubcommand("r", "roughmap settings, get more info with 'bc param r help'", subcmdConfig: subcmd =>
                {
                    AddHeightmapSubcommand(subcmd, "fn", "set roughmap filename", "(full path including filename, or nothing to disable)", args =>
                    {
                        if (string.IsNullOrEmpty(args))
                        {
                            BetterContinents.Settings.DisableRoughmap();
                            Console.instance.Print($"<color=orange>Roughmap disabled!</color>");
                        }
                        else if (!File.Exists(BetterContinents.CleanPath(args)))
                        {
                            Console.instance.Print($"<color=red>ERROR: {args} doesn't exist</color>");
                        }
                        else
                        {
                            BetterContinents.Settings.SetRoughmapPath(args);
                        }
                    });
                    AddHeightmapSubcommand(subcmd, "bl", "roughmap blend", "(between 0 and 1)", args => BetterContinents.Settings.SetRoughmapBlend(float.Parse(args)));
                });
                command.AddSubcommand("f", "flatmap settings, get more info with 'bc param f help'", subcmdConfig: subcmd =>
                {
                    AddHeightmapSubcommand(subcmd, "fn", "set flatmap filename", "(full path including filename, or nothing to disable)", args =>
                    {
                        if (string.IsNullOrEmpty(args))
                        {
                            BetterContinents.Settings.DisableFlatmap();
                            Console.instance.Print($"<color=orange>Flatmap disabled!</color>");
                        }
                        else if (!File.Exists(BetterContinents.CleanPath(args)))
                        {
                            Console.instance.Print($"<color=red>ERROR: {args} doesn't exist</color>");
                        }
                        else
                        {
                            BetterContinents.Settings.SetFlatmapPath(args);
                            if (BetterContinents.Settings.UseRoughInvertedAsFlat)
                            {
                                Console.instance.Print(
                                    $"<color=orange>WARNING: 'Use Rough Inverted as Flat' is enabled so flatmap has no effect. Use 'bc urm 0' to disable it.</color>");
                            }
                        }
                    });

                    AddHeightmapSubcommand(subcmd, "u", "use roughmap inverted for flat", "(0 to disable, 1 to enable)", args => BetterContinents.Settings.SetUseRoughInvertedForFlat(int.Parse(args) != 0));
                    AddHeightmapSubcommand(subcmd, "bl", "flatmap blend", "(between 0 and 1)", args => BetterContinents.Settings.SetFlatmapBlend(float.Parse(args)));
                });
                command.AddSubcommand("b", "biomemap settings, get more info with 'bc param b help'", subcmdConfig: subcmd =>
                {
                    AddHeightmapSubcommand(subcmd, "fn", "set biomemap filename", "(full path including filename, or nothing to disable)", args =>
                    {
                        if (string.IsNullOrEmpty(args))
                        {
                            BetterContinents.Settings.DisableBiomemap();
                            Console.instance.Print($"<color=orange>Biomemap disabled!</color>");
                        }
                        else if (!File.Exists(BetterContinents.CleanPath(args)))
                        {
                            Console.instance.Print($"<color=red>ERROR: {args} doesn't exist</color>");
                        }
                        else
                        {
                            BetterContinents.Settings.SetBiomemapPath(args);
                        }
                    });
                });
                command.AddSubcommand("s", "spawnmap settings, get more info with 'bc param s help'", subcmdConfig: subcmd =>
                {
                    AddHeightmapSubcommand(subcmd, "fn", "set spawnmap filename", "(full path including filename, or nothing to disable)", args =>
                    {
                        if (string.IsNullOrEmpty(args))
                        {
                            BetterContinents.Settings.DisableSpawnmap();
                            Console.instance.Print($"<color=orange>Spawnmap disabled!</color>");
                            Console.instance.Print($"<color=orange>INFO: Use 'bc regenloc' to update the location spawns in the world</color>");
                        }
                        else if (!File.Exists(BetterContinents.CleanPath(args)))
                        {
                            Console.instance.Print($"<color=red>ERROR: {args} doesn't exist</color>");
                        }
                        else
                        {
                            BetterContinents.Settings.SetSpawnmapPath(args);
                            Console.instance.Print($"<color=orange>INFO: Use 'bc regenloc' to update the location spawns in the world</color>");
                        }
                    });
                });
                command.AddSubcommand("fo", "forest settings, get more info with 'bc param fo help'", subcmdConfig: subcmd =>
                {
                    AddHeightmapSubcommand(subcmd, "sc", "forest scale", "(between 0 and 1)", args => BetterContinents.Settings.SetForestScale(float.Parse(args)));
                    AddHeightmapSubcommand(subcmd, "am", "forest amount", "(between 0 and 1)", args => BetterContinents.Settings.SetForestAmount(float.Parse(args)));
                    AddHeightmapSubcommand(subcmd, "ffo", "forest factor override all trees", "(0 to disable, 1 to enable)", args =>
                    {
                        BetterContinents.Settings.SetForestFactorOverrideAllTrees(int.Parse(args) != 0);
                        Console.instance.Print("<color=orange>NOTE: You need to reload the world to apply this change to the forest factor override!</color>");
                    });
                    AddHeightmapSubcommand(subcmd, "fn", "set forestmap filename", "(full path including filename, or nothing to disable)", args =>
                    {
                        if (string.IsNullOrEmpty(args))
                        {
                            BetterContinents.Settings.DisableForestmap();
                            Console.instance.Print($"<color=orange>Forestmap disabled!</color>");
                        }
                        else if (!File.Exists(BetterContinents.CleanPath(args)))
                        {
                            Console.instance.Print($"<color=red>ERROR: {args} doesn't exist</color>");
                        }
                        else
                        {
                            BetterContinents.Settings.SetForestmapPath(args);
                        }
                    });
                    AddHeightmapSubcommand(subcmd, "mu", "forestmap multiply", "(between 0 and 1)", args => BetterContinents.Settings.SetForestmapMultiply(float.Parse(args)));
                    AddHeightmapSubcommand(subcmd, "ad", "forestmap add", "(between 0 and 1)", args => BetterContinents.Settings.SetForestmapAdd(float.Parse(args)));
                });
                command.AddSubcommand("ri", "ridge settings, get more info with 'bc param ri help'", subcmdConfig: subcmd =>
                {
                    AddHeightmapSubcommand(subcmd, "mh", "ridges max height", "(between 0 and 1)", args => BetterContinents.Settings.SetMaxRidgeHeight(float.Parse(args)));
                    AddHeightmapSubcommand(subcmd, "si", "ridge size", "(between 0 and 1)", args => BetterContinents.Settings.SetRidgeSize(float.Parse(args)));
                    AddHeightmapSubcommand(subcmd, "bl", "ridge blend", "(between 0 and 1)", args => BetterContinents.Settings.SetRidgeBlend(float.Parse(args)));
                    AddHeightmapSubcommand(subcmd, "am", "ridge amount", "(between 0 and 1)", args => BetterContinents.Settings.SetRidgeAmount(float.Parse(args)));
                });
                command.AddSubcommand("st", "start position settings, get more info with 'bc param st help'", subcmdConfig: subcmd =>
                {
                    subcmd.AddSubcommand("os", "override start position", "(0 to disable, 1 to enable)", args =>
                    {
                        BetterContinents.Settings.SetOverrideStartPosition(int.Parse(args) != 0);
                        Console.instance.Print($"<color=orange>INFO: Use 'bc regenloc' to update the location spawns in the world (including the start location)</color>");
                    });
                    subcmd.AddSubcommand("x", "start position x", "(between -10500 and 10500)", args =>
                    {
                        BetterContinents.Settings.SetStartPositionX(float.Parse(args));
                        Console.instance.Print($"<color=orange>INFO: Use 'bc regenloc' to update the location spawns in the world (including the start location)</color>");
                    });
                    subcmd.AddSubcommand("y", "start position y", "(between -10500 and 10500)", args =>
                    {
                        BetterContinents.Settings.SetStartPositionY(float.Parse(args));
                        Console.instance.Print($"<color=orange>INFO: Use 'bc regenloc' to update the location spawns in the world (including the start location)</color>");
                    });
                });
            });
        }