Esempio n. 1
0
        private void InitializeStepTimer()
        {
            Heartbeat = new Timer((state) =>
            {
                if (Processing)
                {
                    return;
                }

                Step();
                ConnectionHeartbeat.Step();
            }, null, 0, ReportingTimerDelay);
            Disposables.Add(Heartbeat);
        }
Esempio n. 2
0
        public async Task ConnectAsync(HttpContext httpContext, WebSocket socket, CancellationToken cancellationToken = default(CancellationToken))
        {
            Socket = socket;

            var worldRequest = httpContext.Request.Query["world"].FirstOrDefault();

            this.Logger.LogInformation($"New Connection: {worldRequest}");

            world = Worlds.Find(worldRequest);

            var builder = new FlatBufferBuilder(1);

            await SendPingAsync();

            ConnectionHeartbeat.Register(this);

            try
            {
                lock (world.Bodies)
                {
                    player = new Player
                    {
                        IP         = httpContext.Connection.RemoteIpAddress.ToString(),
                        Connection = this
                    };
                    player.Init(world);
                }

                var updateTask = StartSynchronizing(cancellationToken);
                var readTask   = StartReadAsync(this.HandleIncomingMessage, cancellationToken);

                await Task.WhenAny(updateTask, readTask);
            }
            finally
            {
                ConnectionHeartbeat.Unregister(this);

                if (player != null)
                {
                    player.PendingDestruction = true;
                    player.Connection         = null;
                }
            }
        }