示例#1
0
        internal static void Main()
        {
            NativeMethods.SetConsoleCtrlHandler(ConsoleCtrlOperationHandler, true);

            Game.Initialize();
            Tools.Initialize();
            OutputMessagePool.Initialize();
            NetworkMessagePool.Initialize();

            Console.Title = Constants.ServerName;
            Console.Clear();
            Console.WriteLine("Welcome to {0} - Version {1}", Constants.ServerName, Constants.ServerVersion);
            Console.WriteLine("Developed by {0}", Constants.ServerDevelopers);
            Console.WriteLine();

            // Start Threads
            DispatcherManager.Start();

            // Loading config.lua
            if (!ConfigManager.Load("config.lua"))
            {
                ExitApplication();
            }

            if (!Enum.TryParse(ConfigManager.Instance[ConfigStr.MinConsoleLogLevel], true, out Logger.MinConsoleLogLevel))
            {
                Console.WriteLine("LOGGER LOG LEVEL COULD NOT BE PARSED! PLEASE FIX!");
                ExitApplication();
            }

            // Setting up process priority
            switch (ConfigManager.Instance[ConfigStr.DefaultPriority])
            {
            case "realtime":
                Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime;
                break;

            case "high":
                Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
                break;

            case "higher":
                Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.AboveNormal;
                break;
            }

            // Setting up RSA cyrpto
            if (!Rsa.SetKey(RsaP, RsaQ))
            {
                ExitApplication();
            }

            // Initializing Database connection
            if (!Database.Initialize())
            {
                ExitApplication();
            }
            //DATABASE MANAGER UPDATE DATABASE
            //DATABASE TASKS START

            // Loading vocations
            if (!Vocation.LoadVocations())
            {
                ExitApplication();
            }

            // Loading items
            if (!ItemManager.Load())
            {
                ExitApplication();
            }

            // Loading Chat Channels
            if (!Chat.Load())
            {
                ExitApplication();
            }

            // Loading scripts
            if (!ScriptManager.LoadCsScripts() || !ScriptManager.LoadLuaScripts())
            {
                ExitApplication();
            }

            // Loading Command Line Operations
            if (!ScriptManager.LoadCommandLineOperations())
            {
                ExitApplication();
            }

            // LOAD CREATURES HERE

            // Loading outfits
            if (!OutfitManager.Load())
            {
                ExitApplication();
            }

            // Loading map
            if (!Map.Load())
            {
                ExitApplication();
            }

            // Setting game world type
            switch (ConfigManager.Instance[ConfigStr.WorldType])
            {
            case "pvp":
                Game.WorldType = GameWorldTypes.Pvp;
                break;

            case "no-pvp":
                Game.WorldType = GameWorldTypes.NoPvp;
                break;

            case "pvp-enforced":
                Game.WorldType = GameWorldTypes.PvpEnforced;
                break;

            default:
                Logger.Log(LogLevels.Error, "Invalid game world type: " + ConfigManager.Instance[ConfigStr.WorldType]);
                ExitApplication();
                break;
            }
            Logger.Log(LogLevels.Operation, "Setting Game World Type: " + Game.WorldType);

            // Initialize Game State
            Game.GameState = GameStates.Init;

            //TODO: HOUSE RENTS
            //TODO: MARKET CHECK OFFERS
            //TODO: MARKET STATISTICS

            if (ConfigManager.Instance[ConfigBool.UseExternalLoginServer])
            {
                //Create secret communication channel with login server if login server is external
                if (!SecretServerConnection.Initialize())
                {
                    ExitApplication();
                }

                // Create signal waiting system to get authentication response from external login server
            }
            else
            {
                _loginServer = new LoginServer.LoginServer();
                _loginServer.Start();
            }

            GameServer.Start();
            Game.GameState = GameStates.Normal;
            Game.StartJobs();
            //TODO: FIRE SERVER RUNNING EVENT

            while (true)
            {
                string input = Console.ReadLine();

                if (input == null)
                {
                    continue;
                }

                string[]      firstPass  = input.Split('"');
                List <string> secondPass = firstPass[0].Trim().Split(' ').ToList();

                if (firstPass.Length > 1)
                {
                    for (int i = 1; i < firstPass.Length; i++)
                    {
                        if (i % 2 == 1)
                        {
                            secondPass.Add(firstPass[i]);
                        }
                        else
                        {
                            secondPass.AddRange(firstPass[i].Trim().Split(' '));
                        }
                    }
                }
                string[] command = secondPass.ToArray();

                if (ScriptManager.CommandLineOperations.ContainsKey(command[0]))
                {
                    try
                    {
                        ScriptManager.CommandLineOperations[command[0]].Invoke(command);
                    }
                    catch (Exception)
                    {
                        Logger.Log(LogLevels.Warning, "Command '" + command[0] + "' could not be executed in this environment!");
                    }
                }
                else
                {
                    Logger.Log(LogLevels.Warning, "Command is unknown!");
                }
            }
            // ReSharper disable FunctionNeverReturns
        }