Ejemplo n.º 1
0
        public void UpdateNetworkEvents()
        {
            void handleReceivedData(IRemote source, INetworkData data, ResponseHandler responseHandler)
            {
                if (!(source is IRemoteServer server))
                {
                    Log.Error.Write(ErrorSystemType.Network, "Client received data from a non-server.");
                    responseHandler?.Invoke(ResponseType.BadDestination);
                    return;
                }

                ProcessData(server, data, responseHandler);
            }

            NetworkDataReceiver?.ProcessReceivedData(handleReceivedData);

            if (Game != null && client != null && client.Connected)
            {
                lock (Game)
                {
                    var gameTime = Game.GameTime;

                    // Save game state from time to time to avoid huge syncs.
                    if (gameTime - lastSavedGameStateGameTime >= SavedGameState.SyncDelay && SavedGameState.TimeToSync(Game))
                    {
                        Log.Verbose.Write(ErrorSystemType.Network, $"Saving game state with game time {Misc.SecondsToTime(gameTime)}.");

                        lastSavedGameStateGameTime = gameTime;
                        lastSavedGameStates.Add(gameTime, SavedGameState.FromGame(Game));

                        Log.Verbose.Write(ErrorSystemType.Network, $"Finished saving game state with game time {Misc.SecondsToTime(gameTime)}.");
                    }
                }
            }
        }
Ejemplo n.º 2
0
        void Server_DataReceived(IRemoteServer server, byte[] data)
        {
            Log.Verbose.Write(ErrorSystemType.Network, $"Received {data.Length} byte(s) of data from server '{server.Ip}'.");

            lastServerHeartbeat = DateTime.UtcNow;

            if (NetworkDataReceiver == null)
            {
                Log.Error.Write(ErrorSystemType.Application, "Network data receiver is not set up.");
                Disconnect();
                return;
            }

            if (serverState == ServerState.Offline)
            {
                serverState = ServerState.Lobby;
            }

            try
            {
                foreach (var parsedData in NetworkDataParser.Parse(data))
                {
                    Log.Verbose.Write(ErrorSystemType.Network, $"Received {parsedData.LogName} (message index {parsedData.MessageIndex}).");

                    switch (parsedData.Type)
                    {
                    case NetworkDataType.Heartbeat:
                        // Last heartbeat time was set above.
                        if (parsedData.MessageIndex != Global.SpontaneousMessage)
                        {
                            // If it has a message index, it is an answer to a heartbeat request.
                            NetworkDataReceiver.Receive(server, parsedData, null);
                        }
                        break;

                    case NetworkDataType.Request:
                    case NetworkDataType.LobbyData:
                    case NetworkDataType.SyncData:
                        NetworkDataReceiver.Receive(server, parsedData, (ResponseType responseType) => SendResponse(parsedData.MessageIndex, responseType));
                        break;

                    case NetworkDataType.Response:
                    case NetworkDataType.InSync:
                        NetworkDataReceiver.Receive(server, parsedData, null);
                        break;

                    case NetworkDataType.UserActionData:
                        Log.Error.Write(ErrorSystemType.Network, "User actions can't be send to a client.");
                        SendResponse(parsedData.MessageIndex, ResponseType.BadDestination);
                        break;

                    default:
                        Log.Error.Write(ErrorSystemType.Network, "Received unknown server data.");
                        SendResponse(parsedData.MessageIndex, ResponseType.BadRequest);
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Log.Error.Write(ErrorSystemType.Network, "Error in receiving server data: " + ex.Message);
            }
        }