Message ReadClientMessage(BitBuffer bitBuffer, IPEndPoint clientEndPoint) { MessageType messageType = bitBuffer.GetEnum <MessageType> ((int)MessageType.TOTAL); Message clientMessage = null; switch (messageType) { case MessageType.CONNECT_PLAYER: clientMessage = ConnectPlayerMessage.CreateConnectPlayerMessageToReceive(clientEndPoint); break; case MessageType.DISCONNECT_PLAYER: clientMessage = new DisconnectPlayerMessage(); break; case MessageType.PLAYER_INPUT: clientMessage = new PlayerInputMessage(); break; case MessageType.ACK_RELIABLE_MAX_WAIT_TIME: clientMessage = AckReliableMessage.CreateAckReliableMessageToReceive(); break; case MessageType.ACK_RELIABLE_SEND_EVERY_PACKET: clientMessage = AckReliableSendEveryFrameMessage.CreateAckReliableSEFMToReceive(); break; default: Debug.LogError("Unknown client message received."); return(null); } clientMessage.From = clientEndPoint; clientMessage.Load(bitBuffer); return(clientMessage); }
void ProcessDisconnectPlayer(DisconnectPlayerMessage disconnectPlayerMessage) { Player player = GetPlayerWithEndPoint(disconnectPlayerMessage.From); if (player != null) { DisconnectPlayer(player); for (int i = 0; i < players.Count; i++) { Player playerToSendTo = players [i]; PlayerDisconnectedMessage playerDisconnectedMessage = PlayerDisconnectedMessage.CreatePlayerDisconnectedMessageToSend(playerToSendTo, player.Id); playerToSendTo.CommunicationManager.SendMessage(playerDisconnectedMessage); } } }
void Update() { if (Input.GetKeyDown(KeyCode.C)) { //send player connect message outMessages.Add(ConnectPlayerMessage.CreateConnectPlayerMessageToSend(playerId)); } if (Input.GetKeyDown(KeyCode.V)) { //send player disconnect message Packet p = new Packet(); DisconnectPlayerMessage disconnectPlayerMessage = new DisconnectPlayerMessage(GetNewReliableMessageId(), playerId); p.buffer.PutInt(1); disconnectPlayerMessage.Save(p.buffer); p.buffer.Flush(); channel.Send(p); } Packet inPacket = channel.GetPacket(); if (inPacket != null) { //read it! BitBuffer bitBuffer = inPacket.buffer; int messageCount = bitBuffer.GetInt(); List <Message> serverMessages = new List <Message> (); for (int i = 0; i < messageCount; i++) { //parse message Message serverMessage = ReadServerMessage(bitBuffer); if (serverMessage != null) { serverMessages.Add(serverMessage); } } for (int i = 0; i < serverMessages.Count; i++) { ProcessServerMessage(serverMessages[i]); } } if (localPlayerController != null) { PlayerInputMessage playerInputMessage = new PlayerInputMessage(-1, localPlayerController.Input); outMessages.Add(playerInputMessage); outMessages.Add(AckReliableSendEveryFrameMessage.CreateAckReliableSendEveryFrameMessageMessageToSend(lastReceivedSendInEveryFramePacketMessageId)); } int messagesReadyToSend = 0; for (int i = 0; i < outMessages.Count; i++) { Message clientMessage = outMessages [i]; clientMessage.Update(Time.deltaTime); if (clientMessage.NeedsToBeSent) { messagesReadyToSend++; } } if (messagesReadyToSend > 0) { Packet outPacket = new Packet(); outPacket.buffer.PutInt(outMessages.Count); for (int i = 0; i < outMessages.Count; i++) { Message clientMessage = outMessages [i]; clientMessage.Save(outPacket.buffer); if (clientMessage.Reliability == ReliabilityType.UNRELIABLE) { outMessages.RemoveAt(i); i--; } else if (clientMessage.Reliability == ReliabilityType.RELIABLE_SEND_EVERY_PACKET) { clientMessage.TimeToSend = 0; } else { clientMessage.TimeToSend = clientMessage.ReliableMaxTime; } } outPacket.buffer.Flush(); channel.Send(outPacket); } }