コード例 #1
0
ファイル: Program.cs プロジェクト: Metapyziks/Sphaira
        public static int Main(String[] args)
        {
            Console.Write("Sky seed [default random]: ");

            var seedStr = Console.ReadLine();

            if (seedStr.Length == 0)
            {
                seedStr = "0";
            }

            int seed;

            if (!int.TryParse(seedStr, out seed))
            {
                seed = seedStr.GetHashCode();
            }

            if (seed == 0)
            {
                seed = new Random().Next(1, int.MaxValue);
            }

            float radius  = 0f;
            float density = 0f;

            do
            {
                Console.Write("World radius <0.5 - 1024> [default 8]: ");
                var str = Console.ReadLine();

                if (str.Length == 0)
                {
                    radius = 8f;
                }
                else
                {
                    float.TryParse(str, out radius);
                }
            } while (radius < 0.5f || radius > 1024f);

            do
            {
                Console.Write("World density <1 - 65536> [default 1024]: ");
                var str = Console.ReadLine();

                if (str.Length == 0)
                {
                    density = 1024f;
                }
                else
                {
                    float.TryParse(str, out density);
                }
            } while (density < 1f || density > 65536f);

            _skySeed = seed;
            _players = new Dictionary <NetConnection, PlayerInfo>();

            var timer = new Stopwatch();

            timer.Start();

            NetWrapper.RegisterIdentifier("PlayerInfo");

            NetWrapper.RegisterMessageHandler("WorldInfo", msg => {
                var player = GetPlayer(msg.SenderConnection);
                NetWrapper.SendMessage("WorldInfo", reply => {
                    reply.Write(_skySeed);
                    reply.Write(radius);
                    reply.Write(density);
                    reply.Write(timer.Elapsed.TotalSeconds);
                    reply.Write(player.ID);
                }, msg.SenderConnection, NetDeliveryMethod.ReliableOrdered, 0);
            });

            NetWrapper.RegisterMessageHandler("PlayerPos", msg => {
                var player      = GetPlayer(msg.SenderConnection);
                player.Position = new Vector3(msg.ReadFloat(), msg.ReadFloat(), msg.ReadFloat());

                var others = NetWrapper.Connections;
                others.Remove(msg.SenderConnection);

                NetWrapper.SendMessage("PlayerPos", reply => {
                    reply.Write(player.ID);
                    reply.Write(player.Position.X);
                    reply.Write(player.Position.Y);
                    reply.Write(player.Position.Z);
                }, others, NetDeliveryMethod.ReliableSequenced, 1);
            });

            NetWrapper.StartListening(14242, 128);

            while (NetWrapper.Status != NetPeerStatus.NotRunning)
            {
                if (!NetWrapper.CheckForMessages())
                {
                    Thread.Sleep(16);
                }

                var connected    = NetWrapper.Connections;
                var disconnected = _players.Values.Where(x => !connected.Contains(x.Connection)).ToArray();

                if (disconnected.Length > 0)
                {
                    foreach (var player in disconnected)
                    {
                        _players.Remove(player.Connection);
                    }

                    UpdatePlayers(connected);
                }
            }

            return(0);
        }