Example #1
0
 void SetupConnections(BackrollConnection[] connections)
 {
     for (var i = 0; i < connections.Length; i++)
     {
         ref BackrollConnection connection = ref connections[i];
         SetupConnection(connection);
         connection.SetDisconnectTimeout((uint)DEFAULT_DISCONNECT_TIMEOUT);
         connection.SetDisconnectNotifyStart((uint)DEFAULT_DISCONNECT_NOTIFY_START);
         connection.Synchronize();
         connections[i] = connection;
     }
Example #2
0
        BackrollConnection[] InitializeConnections(LobbyMember[] members)
        {
            Assert.IsNotNull(members);
            var connections = new BackrollConnection[members.Length];

            for (var i = 0; i < connections.Length; i++)
            {
                var connection = new BackrollConnection(members[i], i, _localConnectStatus);
                connections[i] = connection;
            }
            return(connections);
        }
Example #3
0
        BackrollConnection[] InitializeConnections(LobbyMember[] members)
        {
            Assert.IsNotNull(members);
            var connections = new BackrollConnection[members.Length];

            for (var i = 0; i < connections.Length; i++)
            {
                var connection = new BackrollConnection(members[i], i, _localConnectStatus);
                SetupConnection(connection);
                connection.SetDisconnectTimeout((uint)DEFAULT_DISCONNECT_TIMEOUT);
                connection.SetDisconnectNotifyStart((uint)DEFAULT_DISCONNECT_NOTIFY_START);
                connection.Synchronize();
                connections[i] = connection;
            }
            return(connections);
        }
Example #4
0
        void SetupConnection(BackrollConnection connection)
        {
            var member = connection.LobbyMember;
            var queue  = GetIndex(connection.LobbyMember, _players);

            member.OnDisconnected += () => {
                if (queue >= 0)
                {
                    DisconnectPlayer(QueueToPlayerHandle(queue));
                }
                var spectator = GetIndex(member, _spectators);
                if (spectator >= 0)
                {
                    _spectators[spectator].Disconnect();
                }
            };
            if (queue < 0)
            {
                return;
            }
            var handle = QueueToPlayerHandle(queue);

            connection.OnInput += (input) => {
                if (_localConnectStatus[queue].Disconnected)
                {
                    return;
                }
                int current_remote_frame = _localConnectStatus[queue].LastFrame;
                int new_remote_frame     = input.Frame;
                Assert.IsTrue(current_remote_frame == -1 || new_remote_frame == (current_remote_frame + 1));

                _sync.AddRemoteInput(queue, ref input);
                // Notify the other endpoints which frame we received from a peer
                Debug.LogFormat("setting remote connect status for queue {} to {}",
                                queue, new_remote_frame);
                _localConnectStatus[queue].LastFrame = new_remote_frame;
            };

            connection.OnSynchronizing += (total, count) => {
                _callbacks.OnPlayerSynchronizing?.Invoke(new PlayerSynchronizingEvent {
                    Player = handle,
                    Total  = total,
                    Count  = count
                });
            };

            connection.OnSynchronized += () => {
                _callbacks.OnPlayerSynchronized?.Invoke(new PlayerSynchronizedEvent {
                    Player = handle,
                });
            };

            connection.OnNetworkInterrupted += (timeout) => {
                _callbacks.OnConnectionInterrupted?.Invoke(new ConnectionInterruptedEvent {
                    Player            = handle,
                    DisconnectTimeout = timeout,
                });
            };

            connection.OnNetworkResumed += () => {
                _callbacks.OnConnectionResumed?.Invoke(new ConnectionResumedEvent {
                    Player = handle
                });
            };
        }
        public SpectatorBackrollSession(BackrollSessionConfig config)
        {
            _callbacks          = config.Callbacks;
            _num_players        = config.Players.Length;
            _next_input_to_send = 0;
            _synchronizing      = true;

            _inputs = new GameInput[kFrameBufferSize];
            for (var i = 0; i < _inputs.Length; i++)
            {
                _inputs[i].Frame = -1;
            }

            _host = new BackrollConnection(config.Players[0], 0, null);
            _host.Synchronize();

            _host.OnConnected += () => {
                _callbacks.OnConnected?.Invoke(new ConnectedEvent {
                    Player = new BackrollPlayerHandle {
                        Id = 0
                    }
                });
            };

            _host.OnSynchronizing += (count, total) => {
                _callbacks.OnPlayerSynchronizing?.Invoke(new PlayerSynchronizingEvent {
                    Player = new BackrollPlayerHandle {
                        Id = 0
                    },
                    Count = count,
                    Total = total
                });
            };

            _host.OnSynchronized += () => {
                if (!_synchronizing)
                {
                    return;
                }
                _callbacks.OnPlayerSynchronized?.Invoke(new PlayerSynchronizedEvent {
                    Player = new BackrollPlayerHandle {
                        Id = 0
                    },
                });
                _callbacks.OnReady?.Invoke();
                _synchronizing = false;
            };

            _host.OnNetworkInterrupted += (disconnectTimeout) => {
                _callbacks.OnConnectionInterrupted?.Invoke(new ConnectionInterruptedEvent {
                    Player = new BackrollPlayerHandle {
                        Id = 0
                    },
                    DisconnectTimeout = disconnectTimeout
                });
            };

            _host.OnNetworkResumed += () => {
                _callbacks.OnConnectionResumed?.Invoke(new ConnectionResumedEvent {
                    Player = new BackrollPlayerHandle {
                        Id = 0
                    },
                });
            };

            _host.OnDisconnected += () => {
                _callbacks.OnDisconnected?.Invoke(new DisconnectedEvent {
                    Player = new BackrollPlayerHandle {
                        Id = 0
                    },
                });
            };

            _host.OnInput += (input) => {
                _host.SetLocalFrameNumber(input.Frame);
                _host.SendInputAck();
                _inputs[input.Frame % _inputs.Length] = input;
            };
        }