Example #1
0
        private static void OnServerCrashed(CrashedEventArgs e)
        {
            if (World.Loading || World.Saving)
            {
                return;
            }

            PokerGame.EventSink_Crashed(e);

            _Event = e;
            _Stamp = DateTime.Now;

            Core.CrashedHandler = null;

            VitaNexCore.TryCatch(
                () =>
            {
                if (CSOptions.Report)
                {
                    CSOptions.ToConsole("Writing Crash Report...");
                    CSOptions.ToConsole(Report() ? "Done" : "Failed");
                }

                //World.WaitForWriteCompletion();

                if (CSOptions.Backup)
                {
                    CSOptions.ToConsole("Backing Up Saves...");
                    CSOptions.ToConsole(Backup(false) ? "Done" : "Failed");
                }

                if (CSOptions.Restore)
                {
                    CSOptions.ToConsole("Creating Restore Saves...");
                    CSOptions.ToConsole(Backup(true) ? "Done" : "Failed");
                }

                Delta();

                if (!CSOptions.Restart)
                {
                    return;
                }

                if (CSOptions.RestartDelay > TimeSpan.Zero)
                {
                    CSOptions.ToConsole("Press 'ESC' to cancel or 'Enter' to skip the restart delay...");
                    CSOptions.ToConsole("{0} will restart in: ", ServerList.ServerName);

                    _RestartTime = (int)Math.Ceiling(CSOptions.RestartDelay.TotalSeconds);

                    int cX = Console.CursorLeft;
                    int cY = Console.CursorTop;

                    var wait = new EventWaitHandle(false, EventResetMode.ManualReset);

                    ThreadPool.QueueUserWorkItem(
                        cb =>
                    {
                        bool exit = false;

                        do
                        {
                            lock (VitaNexCore.ConsoleLock)
                            {
                                Console.CursorLeft = cX;
                                Console.CursorTop  = cY;
                                Console.Write(new String(' ', 40));
                                Console.CursorLeft = cX;
                                Console.CursorTop  = cY;
                                Console.Write("{0} second{1}", _RestartTime, _RestartTime != 1 ? "s" : String.Empty);
                            }

                            if (_RestartIntercept || _RestartForce)
                            {
                                exit = true;
                            }

                            if (_RestartTime-- < 0)
                            {
                                exit = _RestartForce = true;
                            }

                            if (!exit)
                            {
                                Thread.Sleep(1000);
                            }

                            wait.Set();
                        }while (!exit);
                    });

                    ThreadPool.QueueUserWorkItem(
                        cb =>
                    {
                        bool escape = false;

                        do
                        {
                            if (_RestartForce || _RestartIntercept || _RestartTime <= 0)
                            {
                                escape = true;
                            }

                            if (!escape && !Console.KeyAvailable)
                            {
                                switch (Console.ReadKey(true).Key)
                                {
                                case ConsoleKey.Escape:
                                    escape = _RestartForce = _RestartIntercept = true;
                                    break;

                                case ConsoleKey.Enter:
                                    escape = _RestartForce = true;
                                    break;
                                }
                            }

                            if (!escape)
                            {
                                wait.WaitOne();
                            }
                        }while (!escape);
                    });

                    while (!_RestartForce && !_RestartIntercept && _RestartTime > 0)
                    {
                        Thread.Sleep(10);
                    }

                    lock (VitaNexCore.ConsoleLock)
                    {
                        Console.WriteLine();
                    }
                }

                DeltaRestart();
            },
                CSOptions.ToConsole);
        }