예제 #1
0
 /// <summary>
 /// </summary>
 /// <param name="network">Networking implementation.</param>
 /// <param name="persistence">Implementation to relay Persistance packets to.</param>
 protected ConnectionBase(
     [NotNull] INetworkConnection network,
     [NotNull] IGameStatePersistence persistence)
 {
     Dispatcher           = new PacketDispatcher();
     Network              = network ?? throw new ArgumentNullException(nameof(network));
     GameStatePersistence =
         persistence ?? throw new ArgumentNullException(nameof(persistence));
 }
예제 #2
0
        public ConnectionClient(
            INetworkConnection network,
            IGameStatePersistence persistence,
            ISaveData worldData) : base(network, persistence)
        {
            m_WorldData = worldData;

            m_StateMachine =
                new StateMachine <EConnectionState, ETrigger>(EConnectionState.Disconnected);

            m_StateMachine.Configure(EConnectionState.Disconnected)
            .Permit(ETrigger.TryJoinServer, EConnectionState.ClientJoinRequesting);

            StateMachine <EConnectionState, ETrigger> .TriggerWithParameters <EDisconnectReason>
            disconnectTrigger =
                m_StateMachine.SetTriggerParameters <EDisconnectReason>(ETrigger.Disconnect);
            m_StateMachine.Configure(EConnectionState.Disconnecting)
            .OnEntryFrom(disconnectTrigger, closeConnection)
            .Permit(ETrigger.Disconnected, EConnectionState.Disconnected);

            m_StateMachine.Configure(EConnectionState.ClientJoinRequesting)
            .OnEntry(sendClientHello)
            .Permit(ETrigger.Disconnect, EConnectionState.Disconnecting)
            .PermitIf(
                ETrigger.ServerAcceptedJoinRequest,
                EConnectionState.ClientAwaitingWorldData,
                () => m_WorldData.RequiresInitialWorldData)
            .PermitIf(
                ETrigger.ServerAcceptedJoinRequest,
                EConnectionState.ClientPlaying,
                () => !m_WorldData.RequiresInitialWorldData);

            m_StateMachine.Configure(EConnectionState.ClientAwaitingWorldData)
            .OnEntry(sendClientRequestInitialWorldData)
            .Permit(ETrigger.Disconnect, EConnectionState.Disconnecting)
            .Permit(
                ETrigger.InitialWorldDataReceived,
                EConnectionState.ClientPlaying);

            m_StateMachine.Configure(EConnectionState.ClientPlaying)
            .OnEntry(onConnected)
            .Permit(ETrigger.Disconnect, EConnectionState.Disconnecting);

            Dispatcher.RegisterPacketHandlers(this);
        }
예제 #3
0
        public ConnectionServer(
            INetworkConnection network,
            IGameStatePersistence persistence,
            ISaveData worldData) : base(network, persistence)
        {
            m_WorldData    = worldData;
            m_StateMachine =
                new StateMachine <EConnectionState, ETrigger>(EConnectionState.Disconnected);

            m_StateMachine.Configure(EConnectionState.Disconnected)
            .Permit(ETrigger.WaitForClient, EConnectionState.ServerAwaitingClient);

            StateMachine <EConnectionState, ETrigger> .TriggerWithParameters <EDisconnectReason>
            disconnectTrigger =
                m_StateMachine.SetTriggerParameters <EDisconnectReason>(ETrigger.Disconnect);

            m_StateMachine.Configure(EConnectionState.Disconnecting)
            .OnEntryFrom(disconnectTrigger, closeConnection)
            .Permit(ETrigger.Disconnected, EConnectionState.Disconnected);

            m_StateMachine.Configure(EConnectionState.ServerAwaitingClient)
            .Permit(ETrigger.Disconnect, EConnectionState.Disconnecting)
            .Permit(ETrigger.ClientInfoVerified, EConnectionState.ServerJoining);

            m_StateMachine.Configure(EConnectionState.ServerJoining)
            .OnEntry(SendJoinRequestAccepted)
            .Permit(ETrigger.Disconnect, EConnectionState.Disconnecting)
            .Permit(
                ETrigger.ClientRequestedWorldData,
                EConnectionState.ServerSendingWorldData)
            .Permit(ETrigger.ClientJoined, EConnectionState.ServerPlaying);

            m_StateMachine.Configure(EConnectionState.ServerSendingWorldData)
            .OnEntry(SendInitialWorldData)
            .Permit(ETrigger.Disconnect, EConnectionState.Disconnecting)
            .Permit(ETrigger.ClientJoined, EConnectionState.ServerPlaying);

            m_StateMachine.Configure(EConnectionState.ServerPlaying)
            .OnEntry(onConnected)
            .Permit(ETrigger.Disconnect, EConnectionState.Disconnecting);

            Dispatcher.RegisterPacketHandlers(this);
        }