Beispiel #1
0
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main(string[] args)
        {
            // Create server
            CheckConfig(Server.CONFIG_NAME);
            NativeMethods.SetConsoleCtrlHandler(new NativeMethods.HandlerRoutine(Close), true);
            try
            {
                server = new Server();
                if (!server.Start(new AcceptAction(AcceptConnection)))
                {
                    Console.WriteLine("Error starting server!");
                    server.Close();
                    return;
                }
                else
                {
                    if (IPAddress.Parse(server.ListenIP).AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                    {
                        Console.WriteLine("Server started. Listening on: {0}:{1}\n", server.ListenIP, server.ListenPort);
                    }
                    else
                    {
                        Console.WriteLine("Server started. Listening on: [{0}]:{1}\n", server.ListenIP, server.ListenPort);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error starting server: " + ex.Message);

                if (server != null)
                {
                    server.Close();
                }

                return;
            }

            // Load map
            Map defaultMap = null;

            try
            {
                defaultMap = new Map(typeof(Map).Assembly.GetManifestResourceStream("GameClassLibrary.game.bmap"));

                World.CurrentMap = new Map(defaultMap);
            }
            catch
            {
            }

            // Initialize items
            World.PopulateBacteria();

            string[] input = { "" };

            // Input loop
            while (acceptServerConsoleInput(ref input))
            {
                List <KeyValuePair <IPEndPoint, string> > playerData = server.GetClientInfo();              //can't change ordering - otherwise we'll get bugs when kicking by index
                switch (input[0].ToLower())
                {
                case "help":
                    Console.WriteLine("Commands:");
                    Console.WriteLine("\t clear");
                    Console.WriteLine("\t cls");
                    Console.WriteLine("\t exit");
                    Console.WriteLine("\t help");
                    Console.WriteLine("\t kick [playername|index]");
                    Console.WriteLine("\t prompte [playername]");
                    Console.WriteLine("\t restart");
                    Console.WriteLine("\t say all [message]");
                    Console.WriteLine("\t status");
                    break;

                case "kick":
                    if (input.Length != 2)
                    {
                        Console.WriteLine(errorMessage);
                        break;
                    }

                    if (playerData.Count == 0)
                    {
                        Console.WriteLine(noPlayersMessage);
                        break;
                    }

                    // Figure out kick data
                    int      index = 0;
                    KickData kd    = int.TryParse(input[1], out index) ? new KickData(index) : new KickData(input[1]);

                    if (!server.SendToClient(ServerAction.ServerKick, kd))
                    {
                        Console.WriteLine("There was an error with your request.");
                    }
                    break;

                case "promote":
                    if (input.Length != 2)
                    {
                        Console.WriteLine(errorMessage);
                        break;
                    }

                    if (server.PromoteUser(input[1]))
                    {
                        Console.WriteLine("Promoted " + input[1] + " to admin!");
                        Console.WriteLine("You should probably kick them to force a re-log so everything works");
                    }
                    else
                    {
                        Console.WriteLine("Error promoting user " + input[1]);
                    }
                    break;

                case "say":
                    if (input.Length < 3 || input[1] != "all")
                    {
                        Console.WriteLine(errorMessage + " Try \"say all [message]\"");
                        break;
                    }

                    if (playerData.Count == 0)
                    {
                        Console.WriteLine(noPlayersMessage);
                        break;
                    }

                    // Send server message
                    string output = string.Join(" ", input.Skip(2));
                    if (!server.SendToClient(ServerAction.ServerMessage, new TalkData(output)))
                    {
                        Console.WriteLine("There was an error with your request.");
                    }
                    break;

                case "status":
                    if (input.Length != 1)
                    {
                        Console.WriteLine(errorMessage);
                        break;
                    }

                    if (playerData.Count == 0)
                    {
                        Console.WriteLine(noPlayersMessage);
                        break;
                    }

                    int i = 0;

                    foreach (KeyValuePair <IPEndPoint, string> info in playerData)
                    {
                        if (!string.IsNullOrEmpty(info.Value))
                        {
                            Console.WriteLine("  [{0}]: {1,-21} ({2})", i, info.Key.ToString(), info.Value);
                        }
                        else
                        {
                            Console.WriteLine("  [{0}]: {1,-21}", i, info.Key.ToString());
                        }
                        i++;
                    }
                    break;

                case "clear":
                case "cls":
                    if (input.Length != 1)
                    {
                        Console.WriteLine(errorMessage);
                        break;
                    }

                    Console.Clear();
                    break;

                case "restart":
                    try
                    {
                        server.Dispose();
                        Console.Write("Closed server. Restarting...");
                    }
                    catch
                    {
                        Console.Write("Error closing server! Restarting...");
                    }

                    try
                    {
                        server = new Server();
                        if (!server.Start(new AcceptAction(AcceptConnection)))
                        {
                            throw new ServerStartException("Error restarting server!");
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Error: " + ex.Message);
                    }

                    if (!server.Started)
                    {
                        break;
                    }
                    else
                    {
                        Console.WriteLine("Restarted.");
                    }
                    break;

                default:
                    Console.WriteLine(errorMessage);
                    break;
                }
            }

            Close(CtrlTypes.CTRL_CLOSE_EVENT);
            Console.WriteLine("Press any key to continue . . .");
            Console.ReadKey(true);
        }
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main(string[] args)
        {
            // Create server
            CheckConfig(Server.CONFIG_NAME);
            NativeMethods.SetConsoleCtrlHandler(new NativeMethods.HandlerRoutine(Close), true);
            try
            {
                server = new Server();
                if (!server.Start(new AcceptAction(AcceptConnection)))
                {
                    Console.WriteLine("Error starting server!");
                    server.Close();
                    return;
                }
                else
                {
                    if(IPAddress.Parse(server.ListenIP).AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                        Console.WriteLine("Server started. Listening on: {0}:{1}\n", server.ListenIP, server.ListenPort);
                    else
                        Console.WriteLine("Server started. Listening on: [{0}]:{1}\n", server.ListenIP, server.ListenPort);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error starting server: " + ex.Message);

                if (server != null)
                    server.Close();

                return;
            }

            // Load map
            Map defaultMap = null;
            try
            {
                defaultMap = new Map(typeof(GameServer).Assembly.GetManifestResourceStream("GameServer.game.bmap"));

                World.CurrentMap = new Map(defaultMap);
            }
            catch
            {
            }

            // Initialize items
            World.PopulateBacteria();

            string[] input = { "" };

            // Input loop
            while (acceptServerConsoleInput(ref input))
            {
                List<KeyValuePair<IPEndPoint, string>> playerData = server.GetClientInfo(); //can't change ordering - otherwise we'll get bugs when kicking by index
                switch (input[0].ToLower())
                {
                    case "help":
                        Console.WriteLine("Commands:");
                        Console.WriteLine("\t clear");
                        Console.WriteLine("\t cls");
                        Console.WriteLine("\t exit");
                        Console.WriteLine("\t help");
                        Console.WriteLine("\t kick [playername|index]");
                        Console.WriteLine("\t prompte [playername]");
                        Console.WriteLine("\t restart");
                        Console.WriteLine("\t say all [message]");
                        Console.WriteLine("\t status");
                        break;
                    case "kick":
                        if (input.Length != 2)
                        {
                            Console.WriteLine(errorMessage);
                            break;
                        }

                        if (playerData.Count == 0)
                        {
                            Console.WriteLine(noPlayersMessage);
                            break;
                        }

                        // Figure out kick data
                        int index = 0;
                        KickData kd = int.TryParse(input[1], out index) ? new KickData(index) : new KickData(input[1]);

                        if (!server.SendToClient(ServerAction.ServerKick, kd))
                            Console.WriteLine("There was an error with your request.");
                        break;
                    case "promote":
                        if(input.Length != 2)
                        {
                            Console.WriteLine(errorMessage);
                            break;
                        }

                        if (server.PromoteUser(input[1]))
                        {
                            Console.WriteLine("Promoted " + input[1] + " to admin!");
                            Console.WriteLine("You should probably kick them to force a re-log so everything works");
                        }
                        else
                            Console.WriteLine("Error promoting user " + input[1]);
                        break;
                    case "say":
                        if (input.Length < 3 || input[1] != "all")
                        {
                            Console.WriteLine(errorMessage + " Try \"say all [message]\"");
                            break;
                        }

                        if (playerData.Count == 0)
                        {
                            Console.WriteLine(noPlayersMessage);
                            break;
                        }

                        // Send server message
                        string output = string.Join(" ", input.Skip(2));
                        if (!server.SendToClient(ServerAction.ServerMessage, new TalkData(output)))
                            Console.WriteLine("There was an error with your request.");
                        break;
                    case "status":
                        if (input.Length != 1)
                        {
                            Console.WriteLine(errorMessage);
                            break;
                        }

                        if (playerData.Count == 0)
                        {
                            Console.WriteLine(noPlayersMessage);
                            break;
                        }

                        int i = 0;

                        foreach (KeyValuePair<IPEndPoint, string> info in playerData)
                        {
                            if (!string.IsNullOrEmpty(info.Value))
                                Console.WriteLine("  [{0}]: {1,-21} ({2})", i, info.Key.ToString(), info.Value);
                            else
                                Console.WriteLine("  [{0}]: {1,-21}", i, info.Key.ToString());
                            i++;
                        }
                        break;
                    case "clear":
                    case "cls":
                        if (input.Length != 1)
                        {
                            Console.WriteLine(errorMessage);
                            break;
                        }

                        Console.Clear();
                        break;
                    case "restart":
                        try
                        {
                            server.Dispose();
                            Console.Write("Closed server. Restarting...");
                        }
                        catch
                        {
                            Console.Write("Error closing server! Restarting...");
                        }

                        try
                        {
                            server = new Server();
                            if (!server.Start(new AcceptAction(AcceptConnection)))
                                throw new ServerStartException("Error restarting server!");
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("Error: " + ex.Message);
                        }

                        if (!server.Started)
                            break;
                        else
                            Console.WriteLine("Restarted.");
                        break;
                    default:
                        Console.WriteLine(errorMessage);
                        break;
                }
            }

            Close(CtrlTypes.CTRL_CLOSE_EVENT);
            Console.WriteLine("Press any key to continue . . .");
            Console.ReadKey(true);
        }