Exemple #1
0
        private void Players_PlayerLagUpdated(object sender, ServerPlayer e)
        {
            LatencyInfo info = e.GetTag <LatencyInfo>(LatencyInfo.Name);

            bool didWarn = false;

            if (WarnLag > 0)
            {
                if (e.Lag.InstantLagTime > WarnLag && e.Lag.AverageLag > WarnLag)
                {
                    info.Warnings++;
                    didWarn = false;
                }
            }

            if (WarningPacketLoss > 0)
            {
                if (e.Lag.TotalPacketLoss > WarningPacketLoss)
                {
                    if (e.Lag.TotalPacketLoss > info.LastPacketLoss)
                    {
                        info.Warnings++;
                        didWarn = false;
                    }
                    info.LastPacketLoss = e.Lag.TotalPacketLoss;
                }
            }

            if (info.Warnings >= MaxWarnings)
            {
                State.Chat.SendChatToUser(null, e, Resources.KickMessage, false);
                e.FlushTCP();
                e.Disconnect();
            }
            else if (didWarn)
            {
                State.Chat.SendChatToUser(null, e, Resources.WarnMessage, false);
            }
        }
    public void StartMachine(ICoroutineScheduler scheduler, DependencyContainer globalDependencies)
    {
        #region Networking

        var gameSettings = _gameSettingsProvider.ActiveSettings;

        var networking           = GameObject.Find("Networking");
        var lidgrenTransporter   = networking.GetComponentInChildren <LidgrenNetworkTransporter>();
        var networkMessageSender = networking.GetComponentInChildren <QueueingMessageSender>();
        networkMessageSender.Transporter = lidgrenTransporter;

        var connectionIdPool = new ConnectionIdPool(maxConnectionIds: 64);
        //var connectionManager = new DefaultConnectionManager(lidgrenTransporter, connectionIdPool);
        var natFacilitatorEndpoint    = Ipv4Endpoint.Parse(gameSettings.Other.NatFacilitatorEndpoint).ToIpEndPoint();
        var natFacilitatorConnection  = new LidgrenNatFacilitatorConnection(natFacilitatorEndpoint, lidgrenTransporter);
        var natPunchClient            = new LidgrenNatPunchClient(scheduler, natFacilitatorConnection);
        var connectionAttemptTimeout  = gameSettings.Other.ConnectionAttemptTimeout;
        var natPunchConnectionManager = new LidgrenPunchThroughFacilitator(lidgrenTransporter, scheduler, natPunchClient,
                                                                           connectionAttemptTimeout, connectionIdPool);

        lidgrenTransporter.ConnectionIdPool = connectionIdPool;
        var latencyInfo = new LatencyInfo(connectionIdPool.MaxConnectionIds);

        var groupRouterConfig = ConnectionGroups.RouterConfig;
        var networkSystems    = NetworkSystem.Create(
            lidgrenTransporter,
            lidgrenTransporter,
            groupRouterConfig,
            ConnectionGroups.Default,
            ReplicationObjects.Factories,
            networkMessageSender,
            natPunchConnectionManager,
            latencyInfo,
            globalDependencies);
        var voloServer = networking.GetComponentInChildren <VoloNetworkServer>();
        voloServer.NetworkSystems           = networkSystems;
        voloServer.NatFacilitatorConnection = natFacilitatorConnection;
        var voloClient = networking.GetComponentInChildren <VoloNetworkClient>();
        voloClient.NetworkSystems = networkSystems;
        voloClient.LatencyInfo    = latencyInfo;

        var activeNetwork = new ActiveNetwork(networkSystems, voloServer, voloClient, scheduler);
        _playingData.ActiveNetwork       = activeNetwork;
        _mainMenuData.ActiveNetwork      = activeNetwork;
        _serverBrowserData.ActiveNetwork = activeNetwork;

        /*
         * Create lean and mean main menu system that allows a player to choose between single and multiplayer
         *
         * Notes:
         *   - Keep as much logic that is generic to both single and multiplayer generic. Don't make a special code path
         *     for singleplayer unless it is a feature that is only available in singleplayer.
         *   - Options menu should be as game independent as possible, not relying on a specific singleplayer state for example.
         *   - State machine transitions should also become separate states such that we can handle them in a better, cleaner way
         *
         *
         * Case 1: Single player game
         * - Boot game, start singleplayer, fly for one round, quit game
         *   - On boot: create instance of a network system
         *   - Pass network system into the state machine
         *   - When going into the playing state, spawn/despawn/respawn pilot through replicator
         *
         * Case 2: Multiplayer game - server
         * - Boot game, main screen: choose to create multiplayer server,
         *   - on boot create instance of network system
         *   - when in starting multiplayer server state open transporter
         *   - when a spawnpoint is selected replicate the player
         * - separate state machine for multiplayer logic
         *
         * Case 3: Multiplayer game - client
         * - Boot game, main screen: choose to join a multiplayer server
         *   - server list: allow client to join a game, show if join/connect is in progress, allow for cancellation
         *   - when a spawnpoint is selected request a spawn to the server
         */


        #endregion

        _machine = new StateMachine <VoloStateMachine>(this, scheduler);

        _machine.AddState(States.NewsFlash, new NewsFlash(_machine, _newsFlashData))
        .Permit(States.TitleScreen);

        _machine.AddState(States.TitleScreen, new TitleScreen(_machine, _titleScreenData))
        .PermitChild(States.Frozen)
        .Permit(States.MainMenu);

        _machine.AddState(States.MainMenu, new MainMenu(_machine, _mainMenuData))
        .PermitChild(States.Frozen)
        .Permit(States.TitleScreen)
        .Permit(States.ServerBrowser)
        .Permit(States.SpawnScreen);

        _machine.AddState(States.ServerBrowser, new ServerBrowser(_machine, _serverBrowserData))
        .PermitChild(States.Frozen)
        .Permit(States.MainMenu)
        .Permit(States.SpawnScreen);

        _machine.AddState(States.SpawnScreen, new SpawnScreen(_machine, _spawnScreenData))
        .PermitChild(States.Frozen)
        .PermitChild(States.OptionsMenu)
        .Permit(States.MainMenu)
        .Permit(States.Playing);

        _machine.AddState(States.Playing, new Playing(_machine, _playingData, _flyWingsuitData, _flyParachuteData, _spectatorModeData))
        .PermitChild(States.Frozen)
        .PermitChild(States.OptionsMenu)
        .Permit(States.SpawnScreen);

        _machine.AddState(States.OptionsMenu, new OptionsMenuState(_machine, _optionsMenuData))
        .PermitChild(States.Frozen)
        .Permit(States.SpawnScreen)
        .Permit(States.MainMenu);

        _machine.AddState(States.Frozen, new Frozen(_machine, _frozenData));

        _machine.Transition(States.NewsFlash);
    }
 public PublicFolderActivityPerformanceTracker(SyncActivity trackedActivity, FolderOperationCounter folderOperationCounter, SyncStateCounter syncStateCounter, LatencyInfo mrsProxyLatencyInfo, PerformanceDataProvider transientRetryDelayTracker)
 {
     ArgumentValidator.ThrowIfNull("folderOperationCounter", folderOperationCounter);
     ArgumentValidator.ThrowIfNull("syncStateCounter", syncStateCounter);
     ArgumentValidator.ThrowIfNull("mrsProxyLatencyInfo", mrsProxyLatencyInfo);
     ArgumentValidator.ThrowIfNull("transientRetryDelayTracker", transientRetryDelayTracker);
     this.folderOperationCounter     = folderOperationCounter;
     this.syncStateCounter           = syncStateCounter;
     this.transientRetryDelayTracker = transientRetryDelayTracker;
     this.trackedActivity            = trackedActivity;
     this.mrsProxyLatencyInfo        = mrsProxyLatencyInfo;
 }