Exemple #1
0
        private static void Main(string[] args)
        {
            if (args.Length > 0 && args[0].ToLower() == "setup")
            {
                InitiateGameServerSetup();
            }

            if (args.Length > 0 && args[0].ToLower() != "setup")
            {
                Log.Warn("Arguments found yet none were recognized! Arguments: " + args);

                HaltOnFatalError();
            }

            if (!File.Exists(Application.ExecutablePath + "WvsGame.ini"))
            {
                Log.Warn("Could not find file WvsGame.ini at path: {0}", Application.ExecutablePath);

                if (Log.YesNo("Would you like to initiate setup process for Destiny game server? ", true))
                {
                    InitiateGameServerSetup();
                }
                else
                {
                    Log.Warn("\n Argument setup was not found!" +
                             "\n Neither was found WvsGame.ini!" +
                             "\n And finally you chose not to setup game server!" +
                             "\n What shall i do then? Make a prophecy about your intent?");

                    HaltOnFatalError();
                }
            }

start:
            Clients = new GameClients();

            Log.Entitle("WvsGame v.{0}.{1}", Application.MapleVersion, Application.PatchVersion);

            try
            {
                // Read game-server settings from ini
                Settings.Initialize(Application.ExecutablePath + "WvsGame.ini");
                // Test connection to database
                Database.Test();
                // Parse thru MaplestoryDB
                Database.Analyze(true);
                // Create key shortcuts
                Shortcuts.Apply();
                // Set auto-reset
                AutoRestartTime = Settings.GetInt("Server/AutoRestartTime");
                Log.Inform("Automatic restart time set to {0} seconds.", AutoRestartTime);
                // Initiate data handler
                DataProvider.Initialize();
                // Success game-server is alive!
                IsAlive = true;
            }
            catch (Exception ex)
            {
                Log.SkipLine();
                Tracer.TraceErrorMessage(ex, "Exception occurred during game-server initialization!");
            }

            if (IsAlive)
            {
                CenterConnectionDone.Reset();

                new Thread(new ThreadStart(GameToCenterServer.Main)).Start();

                CenterConnectionDone.WaitOne();
#if DEBUG
                string linkPath = Path.Combine(Application.ExecutablePath, "LaunchClient.lnk");

                if (File.Exists(linkPath) && WorldID == 0 && ChannelID == 0) //Only for the first WvsGame instance, and only if shortcut exists
                {
                    System.Diagnostics.Process proc = new System.Diagnostics.Process {
                        StartInfo = { FileName = linkPath }
                    };
                    proc.Start();
                }
#endif
            }
            else
            {
                HaltOnFatalError();
            }

            while (IsAlive)
            {
                AcceptDone.Reset();

                try
                {
                    Listener.BeginAcceptSocket(new AsyncCallback(OnAcceptSocket), null);
                }

                catch (Exception ex)
                {
                    Log.SkipLine();
                    Tracer.TraceErrorMessage(ex, "Ex occured in game server!");
                    throw;
                }

                AcceptDone.WaitOne();
            }

            CloseGameServer();

            if (AutoRestartTime > 0) // TODO: fugly rework
            {
                Log.Inform("Attempting auto-restart in {0} seconds.", AutoRestartTime);
                Thread.Sleep(AutoRestartTime * 1000);
                goto start;
            }

            Console.Read();
        }
Exemple #2
0
        private static void Main(string[] args)
        {
            if (args.Length == 1 && args[0].ToLower() == "setup" || !File.Exists(Application.ExecutablePath + "WvsGame.ini"))
            {
                WvsGameSetup.Run();
            }

start:
            WvsGame.Clients = new GameClients();

            Log.Entitle("WvsGame v.{0}.{1}", Application.MapleVersion, Application.PatchVersion);

            try
            {
                Settings.Initialize(Application.ExecutablePath + "WvsGame.ini");

                Database.Test();
                Database.Analyze(true);

                Shortcuts.Apply();

                WvsGame.AutoRestartTime = Settings.GetInt("Server/AutoRestartTime");
                Log.Inform("Automatic restart time set to {0} seconds.", WvsGame.AutoRestartTime);

                DataProvider.Initialize();

                WvsGame.IsAlive = true;
            }
            catch (Exception ex)
            {
                Log.Error(ex);
            }

            if (WvsGame.IsAlive)
            {
                WvsGame.CenterConnectionDone.Reset();

                new Thread(new ThreadStart(CenterServer.Main)).Start();

                WvsGame.CenterConnectionDone.WaitOne();

#if DEBUG
                string linkPath = Path.Combine(Application.ExecutablePath, "LaunchClient.lnk");
                if (File.Exists(linkPath) && WvsGame.WorldID == 0 && WvsGame.ChannelID == 0) //Only for the first WvsGame instance, and only if shortcut exists
                {
                    System.Diagnostics.Process proc = new System.Diagnostics.Process();
                    proc.StartInfo.FileName = linkPath;
                    proc.Start();
                }
#endif
            }
            else
            {
                Log.Inform("Could not start server because of errors.");
            }

            while (WvsGame.IsAlive)
            {
                WvsGame.AcceptDone.Reset();

                WvsGame.Listener.BeginAcceptSocket(new AsyncCallback(WvsGame.OnAcceptSocket), null);

                WvsGame.AcceptDone.WaitOne();
            }

            foreach (GameClient client in WvsGame.Clients)
            {
                client.Stop();
            }

            WvsGame.Dispose();

            Log.Warn("Server stopped.");

            if (WvsGame.AutoRestartTime > 0)
            {
                Log.Inform("Attempting auto-restart in {0} seconds.", WvsGame.AutoRestartTime);

                Thread.Sleep(WvsGame.AutoRestartTime * 1000);

                goto start;
            }
            else
            {
                Console.Read();
            }
        }
        public static void Main(string[] args)
        {
            if (args.Length == 1 && args[0].ToLower() == "setup" || !File.Exists(Application.ExecutablePath + "Configuration.ini"))
            {
                ChannelServerSetup.Run();
            }

            int port = 0;

start:
            ChannelServer.Clients = new List <ChannelClientHandler>();

            Log.Entitle("Channel Server v.{0}.{1}", Application.MapleVersion, Application.PatchVersion);

            try
            {
                if (port == 0)
                {
                    try
                    {
                        port = int.Parse(args[0]);
                    }
                    catch
                    {
                        port = Log.Input("Port: ", 7575);
                    }
                }

                Settings.Initialize();
                Shortcuts.Apply();

                ChannelServer.AutoRestartTime = Settings.GetInt("Server/AutoRestartTime");
                Log.Inform("Automatic restart time set to {0} seconds.", ChannelServer.AutoRestartTime);

                Database.Test();
                Database.Analyze(true);

                ChannelServer.LoggedIn = new List <int>(Settings.GetInt("Server/MaxUsers"));
                Log.Inform("Maximum of {0} simultaneous online users.", ChannelServer.LoggedIn.Capacity);

                ChannelServer.RemoteEndPoint = new IPEndPoint(Settings.GetIPAddress("Server/ExternalIP"), port);

                ChannelData.Initialize();

                ChannelServer.Listener = new TcpListener(IPAddress.Any, ChannelServer.RemoteEndPoint.Port);
                ChannelServer.Listener.Start();
                Log.Inform("Initialized clients listener on {0}.", ChannelServer.Listener.LocalEndpoint);

                ChannelServer.IsAlive = true;
            }
            catch (Exception e)
            {
                Log.Error(e);
            }

            if (ChannelServer.IsAlive)
            {
                Log.Success("Channel server started.");

                new Thread(new ThreadStart(InteroperabilityClient.Main)).Start();
            }
            else
            {
                Log.Inform("Could not start server because of errors.");
            }

            while (ChannelServer.IsAlive)
            {
                ChannelServer.AcceptDone.Reset();

                ChannelServer.Listener.BeginAcceptSocket(new AsyncCallback(ChannelServer.OnAcceptSocket), null);

                ChannelServer.AcceptDone.WaitOne();
            }

            ChannelClientHandler[] remainingClients = ChannelServer.Clients.ToArray();

            foreach (ChannelClientHandler client in remainingClients)
            {
                client.Stop();
            }

            ChannelServer.Dispose();

            Log.Warn("Server stopped.");

            if (ChannelServer.AutoRestartTime > 0)
            {
                Log.Inform("Attempting auto-restart in {0} seconds.", ChannelServer.AutoRestartTime);
                Thread.Sleep(ChannelServer.AutoRestartTime * 1000);
                goto start;
            }
            else
            {
                Console.Read();
            }
        }