コード例 #1
0
        public void WriteTo(NetworkMessageWriter message)
        {
            message.Write(ServerMessageType.DespawnRemotePlayer);

            message.Write(PlayerId);
            message.Write(SimulationTickNumber);
        }
コード例 #2
0
        private void handleVoiceMessage(VoiceMessage voiceMessage, TcpClient sender, NetworkMessageReader networkMessageReader)
        {
            if (voiceMessage.Sender.Id.HasValue && existsClientInClientListByTcpClientAndId(sender, voiceMessage.Sender.Id.Value))
            {
                Logger.log.Info($"Voicemessage received from {getServerBroadcastClientByTcpClient(sender)}");

                var clientsToRemove = new List <TcpClient>();

                foreach (ServerBroadcastClient client in clients.Where(client => !client.Client.Id.Value.Equals(voiceMessage.Sender.Id.Value)).ToList())
                {
                    // sendBroadcast
                    try
                    {
                        NetworkMessageWriter messageWriter = new NetworkMessageWriter(client.TcpClient);
                        messageWriter.WriteError += (_ob, _e) => { Logger.log.Error(_e); };
                        messageWriter.WriteAsync(voiceMessage);
                    }
                    catch (Exception ex)
                    {
                        // connection error? client is offline?
                        Logger.log.Error(ex);
                        clientsToRemove.Add(client.TcpClient);
                    }
                }

                removeClientsFromListByTcpClients(clientsToRemove);
            }
        }
コード例 #3
0
        private void sendMessage(NetworkMessage message)
        {
            NetworkMessageWriter networkWriter = new NetworkMessageWriter(tcpClient);

            networkWriter.WriteError += (_ob, _e) => { Logger.log.Error(_e); };
            networkWriter.WriteAsync(message);
        }
コード例 #4
0
 private void NetMessageReader_CatanClientAuth_Request_ReadCompleted(object obj, NetworkMessageReaderReadCompletedEventArgs e)
 {
     lock (catanClients)
     {
         try
         {
             CatanClientAuthenticationRequestMessage authMessage = e.NetworkMessage as CatanClientAuthenticationRequestMessage;
             // Checking auth
             if (iLogicLayer.IsAuthenticationRequestMessageOk(authMessage))
             {
                 NetworkMessageWriter netMessageWriter = new NetworkMessageWriter(e.TcpClient);
                 netMessageWriter.WriteError     += (o, ee) => { ee.TcpClient.Close(); };
                 netMessageWriter.WriteCompleted += NetMessageWriter_CatanClientAuth_Response_WriteCompleted;
                 netMessageWriter.WriteAsync(new CatanClientAuthenticationResponseMessage(authMessage));
             }
             else
             {
                 e.TcpClient.Close(); // Client wird rausgeworfen, wenn Pass falsch ist !!
             }
         }
         catch (Exception ex)
         {
             e.TcpClient.Close();
             iLogicLayer.ThrowException(ex);
         }
     }
 }
コード例 #5
0
        public void WriteTo(NetworkMessageWriter message)
        {
            message.Write(ServerMessageType.SnaphotUpdates);

            message.Write(AcknowledgedLastReceivedPlayerInputSequenceNumber);
            message.Write(LastAppliedServerPlayerInputSequenceNumber);
            message.Write(ServerSimulationTickNumber);
        }
コード例 #6
0
 public ServerNetworkHandler(NetworkSystem networkSystem)
 {
     _networkSystem = networkSystem;
     _netManager    = new NetManager(this)
     {
         AutoRecycle       = true,
         DisconnectTimeout = ConnectionTimeoutInMilliseconds,
     };
     _networkMessageWriter = new NetworkMessageWriter(new NetDataWriter());
 }
コード例 #7
0
        public NetworkEntityProcessor()
        {
            _networkMessageWriter = new NetworkMessageWriter(new LiteNetLib.Utils.NetDataWriter());
            _serverPlayerManager  = new ServerPlayerManager(4, this);
            _clientPlayerManager  = new ClientPlayerManager(this);

            Order = -20000;         // Ensure this occurs before other processors
            // Not using Enabled property, because that completely disables the processor, where it doesn't even pick up newly added entities
            IsEnabled = true;
        }
コード例 #8
0
        public void WriteTo(NetworkMessageWriter message)
        {
            message.Write(ServerMessageType.SpawnLocalPlayer);

            message.Write(PlayerId);
            message.Write(SimulationTickNumber);
            message.Write(PlayerName);
            message.Write(Position);
            message.Write(Rotation);
        }
コード例 #9
0
 public void WriteNextArrayItem(NetworkMessageWriter message)
 {
     message.Write(NetworkEntityId);
     message.Write(Position);
     message.Write(YawOrientation);
     message.Write(MoveSpeedDecimalPercentage);
     message.Write(CurrentMoveInputVelocity);
     message.Write(PhysicsEngineLinearVelocity);
     message.Write(IsGrounded);
 }
コード例 #10
0
        public void WriteTo(NetworkMessageWriter message)
        {
            message.Write(ServerMessageType.ClientJoinGameResponse);

            message.Write(CanJoinGame);
            if (CanJoinGame)
            {
                message.Write(InGameSceneAssetId);
            }
            else
            {
                message.Write(ErrorMessage);
            }
        }
コード例 #11
0
        private void handleConnectMessage(ConnectMessage connectMessage, TcpClient sender, NetworkMessageReader messageReader)
        {
            try
            {
                if (connectMessage.BroadCastClient == null)
                {
                    // close
                    sender.Close();
                    return;
                }

                if (connectMessage.BroadCastClient.Name != null && connectMessage.BroadCastClient.Name.Length > 2)
                {
                    var newClient = new BroadcastClient(connectMessage.BroadCastClient.Name, ++lastClientID);
                    lock (clients)
                    {
                        clients.Add(new ServerBroadcastClient(newClient, sender));
                    }

                    NetworkMessageWriter messageWriter = new NetworkMessageWriter(sender);
                    messageWriter.OnErrorStopWritingAndCloseClient = true;
                    messageWriter.WriteError += MessageWriter_WriteError;

                    // send client ConnectMessage Message
                    connectMessage.Connected       = true;
                    connectMessage.BroadCastClient = newClient; // modified ..
                    messageWriter.WriteAsync(connectMessage);

                    Logger.log.Info($"client connected {connectMessage.BroadCastClient}");
                }
                else
                {
                    Logger.log.Warn("BroadCastClient name not ok");
                    // close
                    sender.Close();
                }
            }
            catch (Exception ex)
            {
                Logger.log.Error(ex);
            }
        }
コード例 #12
0
 public void SendBroadcastMessage(NetworkMessage networkMessage)
 {
     try
     {
         //getDisconnectedClientConnections();
         foreach (CatanClient catanClient in catanClients)
         {
             NetworkMessageWriter netMessageWriter = new NetworkMessageWriter(catanClient.TcpClient);
             netMessageWriter.WriteCompleted += NetMessageWriter_BroadcastMessage_WriteCompleted;
             netMessageWriter.WriteError     += NetMessageWriter_BroadcastMessage_WriteError;
             netMessageWriter.WriteAsync(networkMessage);
         }
     }
     catch (CatanClientDisconnectedException ex)
     {
     }
     catch (Exception ex)
     {
     }
 }
コード例 #13
0
            internal void UpdatePendingPlayerStates(NetworkMessageWriter networkMessageWriter)
            {
                var networkAssetDatabase = _networkEntityProcessor._networkAssetDatabase;
                var assetDefinitions     = GetNetworkAssetDefinitions();

                //lock (PendingPlayers)
                for (int i = 0; i < PendingRemotePlayers.Count; i++)
                {
                    ref var pendingPlayer = ref PendingRemotePlayers.Items[i];
                    switch (pendingPlayer.PendingPlayerState)
                    {
                    case PendingPlayerState.JustConnected:
                    {
                        pendingPlayer.PendingPlayerState = PendingPlayerState.LoadingScene;

                        networkMessageWriter.Reset();
                        var joinGameResponseMsg = new ClientJoinGameResponseMessage
                        {
                            CanJoinGame        = true,
                            InGameSceneAssetId = networkAssetDatabase.GetAssetIdFromUrlReference(assetDefinitions.InGameScene),
                        };
                        joinGameResponseMsg.WriteTo(networkMessageWriter);
                        pendingPlayer.Connection.Send(networkMessageWriter, SendNetworkMessageType.ReliableOrdered);
                    }
                    break;

                    case PendingPlayerState.LoadingScene:
                        // Keep waiting for the player to load the scene
                        // TODO: maybe do a timeout and/or ping check?
                        break;

                    case PendingPlayerState.Ready:
                        OnNewRemotePlayerReady(pendingPlayer.PlayerId, pendingPlayer.PlayerName, pendingPlayer.Connection, networkMessageWriter);
                        break;

                    default:
                        break;
                    }
                }
コード例 #14
0
        // TODO Threadsicher???!!!!
        public void Connect()
        {
            tcpClient     = new TcpClient();
            messageReader = new NetworkMessageReader(tcpClient);
            messageWriter = new NetworkMessageWriter(tcpClient);

            messageReader.OnErrorStopReadingAndCloseClient = true;
            messageWriter.OnErrorStopWritingAndCloseClient = true;

            messageReader.ReadCompleted += MessageReader_ReadCompleted;
            messageReader.ReadError     += MessageReader_ReadError;
            messageWriter.WriteError    += MessageWriter_WriteError;

            IsConnected  = false;
            IsConnecting = true;

            var config = AppConfiguration.ReadConfig();

            try
            {
                tcpClient.BeginConnect(config.ServerIP, config.ServerPort, tcpClientConnectCallback, config);
            }
            catch (Exception ex)
            {
                IsConnected  = false;
                IsConnecting = false;
                throw ex;
            }
            finally
            {
                if (autoReconnectTimer == null)
                {
                    autoReconnectTimer = new System.Threading.Timer(autoReconnectTimerCallback, null, autoReconnectTimerIntervalInMs, autoReconnectTimerIntervalInMs);
                }
            }
        }
コード例 #15
0
 public void WriteNextArrayItem(NetworkMessageWriter message)
 {
     message.Write(SimulationTickNumber);
     message.Write(NetworkEntityId);
     message.Write((byte)InputActionType);
 }
コード例 #16
0
 public void WriteHeader(NetworkMessageWriter message, ushort arraySize)
 {
     //message.Write((byte)EntityUpdateType.InputAction);
     message.Write(arraySize);
 }
コード例 #17
0
 public void WriteHeader(NetworkMessageWriter message, ushort arraySize)
 {
     message.Write(arraySize);
 }
コード例 #18
0
            internal void SendClientInputPredictionsToServer(SimulationTickNumber currentSimTickNumber, NetworkMessageWriter networkMessageWriter)
            {
                for (int playerIdx = 0; playerIdx < _localPlayers.Count; playerIdx++)
                {
                    ref var player             = ref _localPlayers.Items[playerIdx];
                    var     inputSnapshotsComp = player.InputSnapshotsComponent;

                    PlayerUpdateMessage playerUpdateMsg = default;

                    var pendingInputs = inputSnapshotsComp.PendingInputs;
                    // Need to limit the number of input, eg. if there's a large delay in server ack response,
                    // then most likely it has lost some of our older input. Probably should be a config setting?
                    const int MaxPendingPlayerInputs = GameConfig.PhysicsSimulationRate * 20; // 20s worth of input
                    const int MaxSendPlayerInputs    = 10;                                    // We will only send 10 inputs max in a single packet, and accept the fact that older inputs may be lost
                    if (pendingInputs.Count >= MaxPendingPlayerInputs)
                    {
                        pendingInputs.RemoveRange(0, pendingInputs.Count - MaxPendingPlayerInputs + 1);
                    }
                    // Append the latest input
                    var findSnapshotResult = inputSnapshotsComp.SnapshotStore.TryFindSnapshot(currentSimTickNumber);
                    Debug.Assert(findSnapshotResult.IsFound);
                    pendingInputs.Add(findSnapshotResult.Result);

                    int sendInputCount = Math.Min(pendingInputs.Count, MaxSendPlayerInputs);
                    // At most, only send the last 10 inputs (ie. the current inputs) to not blow out the packet size.
                    int inputIndexOffset = pendingInputs.Count - sendInputCount;
                    for (int i = 0; i < sendInputCount; i++)
                    {
                        int inputIndex = i + inputIndexOffset;
                        if (pendingInputs[inputIndex].PlayerInputSequenceNumber > inputSnapshotsComp.ServerLastAcknowledgedPlayerInputSequenceNumber)
                        {
                            inputIndexOffset += i;
                            sendInputCount   -= i;
                            break;
                        }
                    }

                    networkMessageWriter.Reset();
                    playerUpdateMsg.AcknowledgedServerSimulationTickNumber = player.NetworkEntityComponent.LastAcknowledgedServerSimulationTickNumber;
                    playerUpdateMsg.WriteTo(networkMessageWriter);
                    PlayerUpdateInputMessage playerUpdateInputsMsg = default;
                    playerUpdateInputsMsg.WriteHeader(networkMessageWriter, (ushort)sendInputCount);

                    for (int i = 0; i < sendInputCount; i++)
                    {
                        int     inputIndex   = i + inputIndexOffset;
                        ref var curInputData = ref pendingInputs.Items[inputIndex];
                        playerUpdateInputsMsg.PlayerInputSequenceNumber = curInputData.PlayerInputSequenceNumber;
                        playerUpdateInputsMsg.MoveInput          = curInputData.MoveInput;
                        playerUpdateInputsMsg.JumpRequestedInput = curInputData.IsJumpButtonDown;

                        playerUpdateInputsMsg.WriteNextArrayItem(networkMessageWriter);
#if DEBUG
                        //if (curInputData.MoveInput.LengthSquared() > 0)
                        //{
                        //    _networkEntityProcessor.DebugWriteLine($"Cln SendInput Move: {curInputData.MoveInput} - PISeqNo: {curInputData.PlayerInputSequenceNumber}");
                        //}
#endif
                    }
コード例 #19
0
 public void WriteNextArrayItem(NetworkMessageWriter message)
 {
     message.Write(PlayerInputSequenceNumber);
     message.Write(MoveInput);
     message.Write(JumpRequestedInput);
 }
コード例 #20
0
 public void WriteHeader(NetworkMessageWriter message, ushort arraySize)
 {
     //message.Write((byte)EntityUpdateType.Transform);
     message.Write(arraySize);
     message.Write(SimulationTickNumber);
 }
コード例 #21
0
 public void WriteTo(NetworkMessageWriter message)
 {
     message.Write(ClientMessageType.ClientJoinGame);
     message.Write(PlayerName);
 }
コード例 #22
0
 public void WriteTo(NetworkMessageWriter message)
 {
     message.Write(ClientMessageType.SynchronizeClockRequest);
     message.Write(ClientOSTimestamp);
 }
コード例 #23
0
 public void WriteTo(NetworkMessageWriter message)
 {
     message.Write(ClientMessageType.ClientInGameReady);
 }
コード例 #24
0
 internal void SendToAll(NetworkMessageWriter message, SendNetworkMessageType sendType)
 {
     _netManager.SendToAll(message, sendType.ToDeliveryMethod());
 }
コード例 #25
0
 public void WriteTo(NetworkMessageWriter message)
 {
     message.Write(ClientMessageType.PlayerUpdate);
     message.Write(AcknowledgedServerSimulationTickNumber);
 }
コード例 #26
0
 void IGameNetworkServerHandler.SendMessageToAllPlayers(NetworkMessageWriter message, SendNetworkMessageType sendType)
 {
     _serverNetworkHandler.SendToAll(message, sendType);
 }
コード例 #27
0
            private void OnNewRemotePlayerReady(
                SerializableGuid playerId, string playerName, NetworkConnection playerConnection,
                NetworkMessageWriter networkMessageWriter)
            {
                var assetDefinitions = GetNetworkAssetDefinitions();
                var assetDatabase    = _networkEntityProcessor._networkAssetDatabase;
                var networkService   = _networkEntityProcessor._networkService;
                var content          = _networkEntityProcessor._content;
                var gameClockManager = _networkEntityProcessor._gameClockManager;

                var entityExistenceStates = _networkEntityProcessor._entityExistenceStates;

                var gameplayScene = GetGameplayScene();

                var simTickNumber = gameClockManager.SimulationClock.SimulationTickNumber;
                // Can add to the scene now
                Entity playerEntity;

                if (networkService.NetworkGameMode == NetworkGameMode.DedicatedServer)
                {
                    var playerPrefabUrl = assetDefinitions.PlayerAssets.ServerRemotePlayer;
                    var playerPrefab    = content.Load(playerPrefabUrl);
                    playerEntity = playerPrefab.InstantiateSingle();

                    var networkEntityComp = playerEntity.Get <NetworkEntityComponent>();
                    networkEntityComp.NetworkEntityId = playerId;       // Can just use the same ID
                    networkEntityComp.OwnerClientId   = playerId;
                    networkEntityComp.AssetId         = assetDatabase.GetAssetIdFromUrlReference(playerPrefabUrl);

                    var networkPlayerComp = playerEntity.Get <NetworkPlayerComponent>();
                    networkPlayerComp.PlayerName = playerName;

                    GetPlayerSpawnLocation(gameplayScene, out var spawnPosition, out var spawnRotation);
                    playerEntity.Transform.Position = spawnPosition;
                    playerEntity.Transform.Rotation = spawnRotation;
                    _networkEntityProcessor.AddAndRegisterEntity(playerEntity, gameplayScene, simTickNumber);
                }
                else
                {
                    // Client game, so has the prefab also player view entity
                    GetPlayerSpawnLocation(gameplayScene, out var spawnPosition, out var spawnRotation);
                    playerEntity = _networkEntityProcessor.CreateAndAddClientPlayerEntity(simTickNumber, playerId, playerName, ref spawnPosition, ref spawnRotation, isLocalEntity: false);
                }

                // Note this must be set AFTER being added to the scene due to snapshot buffer needing to be instantiated by the processor
                var movementSnapshotComp = playerEntity.Get <MovementSnapshotsComponent>();

                MovementSnapshotsProcessor.CreateNewSnapshotData(simTickNumber, movementSnapshotComp, playerEntity.Transform);

                var newPlayer = new ServerActiveRemotePlayer(playerId, playerName, playerEntity, playerConnection);

                ActiveRemotePlayers.Add(newPlayer);

                var gameManager = GetGameManager();

                gameManager.RaisePlayerAddedEvent(playerEntity);

                // Notify the new player of all existing players
                for (int i = 0; i < ActiveRemotePlayers.Count - 1; i++)       // Exclude the last because that's the new player
                {
                    ref var existingPlayer = ref ActiveRemotePlayers.Items[i];
                    Debug.Assert(existingPlayer.PlayerId != playerId);

                    var existingPlayerDetails = entityExistenceStates[existingPlayer.PlayerEntity];
                    var spawnPlayer           = new SpawnRemotePlayerMessage
                    {
                        PlayerId             = existingPlayer.PlayerId,
                        SimulationTickNumber = existingPlayerDetails.SimulationTickNumberCreated,
                        PlayerName           = existingPlayer.PlayerName,
                        Position             = existingPlayer.PlayerEntity.Transform.Position,
                        Rotation             = existingPlayer.PlayerEntity.Transform.Rotation
                    };
                    networkMessageWriter.Reset();
                    spawnPlayer.WriteTo(networkMessageWriter);
                    playerConnection.Send(networkMessageWriter, SendNetworkMessageType.ReliableOrdered);   // Use Ordered to ensure a player's joined & dropped events are in sequence
                }
コード例 #28
0
 public void WriteTo(NetworkMessageWriter message)
 {
     message.Write(ServerMessageType.SynchronizeClockResponse);
     message.Write(ClientOSTimeStamp);
     message.Write(ServerWorldTimeInTicks);
 }