public void OpenBattleRoom(string modname, string mapname, bool now = true)
        {
            if (!now && spring.IsRunning)
            {
                spring.WaitForExit();
            }
            Stop();

            bossName      = "";
            lastMapChange = DateTime.Now;

            if (String.IsNullOrEmpty(modname))
            {
                modname = config.Mod;
            }
            if (String.IsNullOrEmpty(mapname))
            {
                mapname = config.Map;
            }

            string title = config.Title.Replace("%1", MainConfig.SpringieVersion);

            string password = null;

            if (!string.IsNullOrEmpty(config.BattlePassword))
            {
                password = config.BattlePassword;
            }

            int    maxPlayers = config.MaxPlayers;
            string engine     = springPaths.SpringVersion;

            if (SpawnConfig != null)
            {
                modname = SpawnConfig.Mod;
                if (SpawnConfig.MaxPlayers > 0)
                {
                    maxPlayers = SpawnConfig.MaxPlayers;
                }
                if (!String.IsNullOrEmpty(SpawnConfig.Map))
                {
                    mapname = SpawnConfig.Map;
                }
                title = SpawnConfig.Title;
                if (!String.IsNullOrEmpty(SpawnConfig.Password))
                {
                    password = SpawnConfig.Password;
                }
                if (!String.IsNullOrEmpty(SpawnConfig.Engine))
                {
                    engine = SpawnConfig.Engine;
                }
                {
                    //Something needs to go here to properly tell Springie to use a specific engine version,
                    //attempted code below may or may not be responsible for recent springie drops, so commenting.

                    //the below may be causing a rehost
                    //requestedEngineChange = SpawnConfig.Engine;

                    //alternate attempt

                    /*
                     * Program.main.Downloader.GetAndSwitchEngine(SpawnConfig.Engine);
                     * config.SpringVersion = SpawnConfig.Engine;
                     * springPaths.SetEnginePath(Program.main.paths.GetEngineFolderByVersion(SpawnConfig.Engine));
                     */
                }
            }

            //title = title + string.Format(" [engine{0}]", springPaths.SpringVersion);

            // no mod was provided, auto update is on, check if newer version exists, if it does use that instead of config one
            if (string.IsNullOrEmpty(modname) && !String.IsNullOrEmpty(config.AutoUpdateRapidTag))
            {
                var ver = Program.main.Downloader.PackageDownloader.GetByTag(config.AutoUpdateRapidTag);

                if (ver != null && cache.GetResourceDataByInternalName(ver.InternalName) != null)
                {
                    modname = config.AutoUpdateRapidTag;
                }
            }

            PackageDownloader.Version version = Program.main.Downloader.PackageDownloader.GetByTag(modname);
            if (version != null && version.InternalName != null)
            {
                modname = version.InternalName;
            }

            hostedMod = new Mod()
            {
                Name = modname
            };
            cache.GetMod(modname, (m) => { hostedMod = m; }, (m) => {});
            if (hostedMod.IsMission && !String.IsNullOrEmpty(hostedMod.MissionMap))
            {
                mapname = hostedMod.MissionMap;
            }

            //Map mapi = null;
            //cache.GetMap(mapname, (m, x, y, z) => { mapi = m; }, (e) => { }, springPaths.SpringVersion);
            //int mint, maxt;
            if (!springPaths.HasEngineVersion(engine))
            {
                Program.main.Downloader.GetAndSwitchEngine(engine, springPaths);
            }
            else
            {
                springPaths.SetEnginePath(springPaths.GetEngineFolderByVersion(engine));
            }

            var b = new Battle(engine, password, hostingPort, maxPlayers, mapname, title, modname);

            b.Ip = Program.main.Config.IpOverride;
            tas.OpenBattle(b);
        }
        public void Start(string modname, string mapname, bool now = true)
        {
            if (!now && spring.IsRunning)
            {
                spring.WaitForExit();
            }
            Stop();

            lastMapChange = DateTime.Now;

            if (String.IsNullOrEmpty(modname))
            {
                modname = config.Mod;
            }
            if (String.IsNullOrEmpty(mapname))
            {
                mapname = config.Map;
            }

            string title    = config.Title.Replace("%1", MainConfig.SpringieVersion);
            string password = "******";

            if (!string.IsNullOrEmpty(config.BattlePassword))
            {
                password = config.BattlePassword;
            }

            if (SpawnConfig != null)
            {
                modname = SpawnConfig.Mod;
                mapname = SpawnConfig.Map;
                title   = SpawnConfig.Title;
                if (!String.IsNullOrEmpty(SpawnConfig.Password))
                {
                    password = SpawnConfig.Password;
                }
                if (!String.IsNullOrEmpty(SpawnConfig.Engine))
                {
                    //Something needs to go here to properly tell Springie to use a specific engine version,
                    //attempted code below may or may not be responsible for recent springie drops, so commenting.

                    //the below may be causing a rehost
                    //requestedEngineChange = SpawnConfig.Engine;

                    //alternate attempt

                    /*
                     * Program.main.Downloader.GetAndSwitchEngine(SpawnConfig.Engine);
                     * config.SpringVersion = SpawnConfig.Engine;
                     * springPaths.SetEnginePath(Program.main.paths.GetEngineFolderByVersion(SpawnConfig.Engine));
                     */
                }
            }

            //title = title + string.Format(" [engine{0}]", springPaths.SpringVersion);

            // no mod was provided, auto update is on, check if newer version exists, if it does use that instead of config one
            if (string.IsNullOrEmpty(modname) && !String.IsNullOrEmpty(config.AutoUpdateRapidTag))
            {
                var ver = Program.main.Downloader.PackageDownloader.GetByTag(config.AutoUpdateRapidTag);

                if (ver != null && cache.GetResourceDataByInternalName(ver.InternalName) != null)
                {
                    modname = config.AutoUpdateRapidTag;
                }
            }

            PackageDownloader.Version version = Program.main.Downloader.PackageDownloader.GetByTag(modname);
            if (version != null && cache.GetResourceDataByInternalName(version.InternalName) != null)
            {
                modname = version.InternalName;
            }

            hostedMod = new Mod();
            cache.GetMod(modname, (m) => { hostedMod = m; }, (m) => { }, springPaths.SpringVersion);
            if (hostedMod.IsMission && !String.IsNullOrEmpty(hostedMod.MissionMap))
            {
                mapname = hostedMod.MissionMap;
            }

            Map mapi = null;

            cache.GetMap(mapname, (m, x, y, z) => { mapi = m; }, (e) => { }, springPaths.SpringVersion);
            //int mint, maxt;
            var b = new Battle(springPaths.SpringVersion, password, hostingPort, config.MaxPlayers, 0, mapi, title, hostedMod, new BattleDetails());

            // if hole punching enabled then we use it
            if (Program.main.Config.UseHolePunching)
            {
                b.Nat = Battle.NatMode.HolePunching;
            }
            else if (Program.main.Config.GargamelMode)
            {
                b.Nat = Battle.NatMode.FixedPorts;
            }
            else
            {
                b.Nat = Battle.NatMode.None;  // else either no nat or fixed ports (for gargamel fake - to get client IPs)
            }
            tas.OpenBattle(b);
            tas.SetScriptTag("GAME/hosttype=SPRINGIE");
        }