private void NET_ProcessMessage(NET_Messages.IMessage message) { //---------------------------------------------------------------------------------------------// //Message handling: //---------------------------------------------------------------------------------------------// if (message != null) { //Host message handling if (isHost == true) { //Update message if (message as NET_Messages.NET_Message_Update != null) { object objectBuffer = 0; byte[] byteBuffer = new byte[1]; message.GetData(ref byteBuffer, ref objectBuffer, false); NET_DataPack pack = new NET_DataPack(byteBuffer); //Set update data to internal slots int messagePID = (int)pack.GetData("PlayerID"); playersGameData[messagePID - 1] = pack; } //Event call message else if (message as NET_Messages.NET_Message_EventCall != null) { object objectBuffer = 0; byte[] byteBuffer = new byte[1]; message.GetData(ref byteBuffer, ref objectBuffer, false); NET_DataPack pack = new NET_DataPack(byteBuffer); //Add event to list NET_EventCall call = new NET_EventCall(pack); eventCalls.Add(call); } //Disconnect message else if (message as NET_Messages.NET_Message_Disconnect != null) { object objectBuffer = 0; byte[] byteBuffer = new byte[1]; message.GetData(ref byteBuffer, ref objectBuffer, false); NET_DataPack pack = new NET_DataPack(byteBuffer); int messagePID = (int)pack.GetData("PlayerID"); tcpServer.TCP_Server_ClientDisconnected(messagePID); } } //Client message handling else { //Server broadcast if (message as NET_Messages.NET_Message_ServerBroadcast != null) { object objectBuffer = 0; byte[] byteBuffer = new byte[1]; message.GetData(ref byteBuffer, ref objectBuffer, false); NET_DataPack pack = new NET_DataPack(byteBuffer); string ipAddress = (string)pack.GetData("ServerIPAddress"); int playerC = (int)pack.GetData("PlayerSlotsUsed"); string serName = (string)pack.GetData("ServerName"); GAME_State state = (GAME_State)pack.GetData("GameState"); if (serverInfos.ContainsKey(ipAddress) == false) { NET_ServerInfo info = new NET_ServerInfo(ipAddress, playerC, gameState, serName); serverInfos.Add(ipAddress, info); } else { NET_ServerInfo info = serverInfos[ipAddress]; info.INFO_SetPlayerCount(playerC); info.INFO_SetState(gameState); serverInfos[ipAddress] = info; } //If server broadcast is from connected server --> set player count if (ipAddress == this.serverIP.ToString()) { this.playerCount = playerC; } } //Update message else if (message as NET_Messages.NET_Message_Update != null) { object objectBuffer = 0; byte[] byteBuffer = new byte[1]; message.GetData(ref byteBuffer, ref objectBuffer, false); NET_UberPack uberPack = new NET_UberPack(byteBuffer); //Unpack uber pack NET_DataPack packP1 = uberPack.GetPack(1); NET_DataPack packP2 = uberPack.GetPack(2); NET_DataPack packP3 = uberPack.GetPack(3); NET_DataPack packP4 = uberPack.GetPack(4); //Set update data to internal slots if (packP1 != null && playerID != 1) { playersGameData[0] = packP1; } if (packP2 != null && playerID != 2) { playersGameData[1] = packP2; } if (packP3 != null && playerID != 3) { playersGameData[2] = packP3; } if (packP4 != null && playerID != 4) { playersGameData[3] = packP4; } } //Event call message else if (message as NET_Messages.NET_Message_EventCall != null) { object objectBuffer = 0; byte[] byteBuffer = new byte[1]; message.GetData(ref byteBuffer, ref objectBuffer, false); NET_DataPack pack = new NET_DataPack(byteBuffer); NET_EventCall call = new NET_EventCall(pack); eventCalls.Add(call); } //Welcome message --> Set playerID for clients else if (message as NET_Messages.NET_Message_Welcome != null) { object objectBuffer = 0; byte[] byteBuffer = new byte[1]; message.GetData(ref byteBuffer, ref objectBuffer, false); NET_DataPack pack = new NET_DataPack(byteBuffer); this.playerID = (int)pack.GetData("YourPlayerID"); } //Disconnect message else if (message as NET_Messages.NET_Message_Disconnect != null) { object objectBuffer = 0; byte[] byteBuffer = new byte[1]; message.GetData(ref byteBuffer, ref objectBuffer, false); NET_DataPack pack = new NET_DataPack(byteBuffer); int messagePID = (int)pack.GetData("PlayerID"); if (messagePID == playerID) { tcpClient.TCP_Disconnected(); playerID = 0; } } } } }
/// <summary> /// Function to call on every update cycle /// </summary> public void NET_Update() { //Record current time thisTime = DateTime.Now; //Process all enqueued udp messages NET_Messages.IMessage[] udpMessages = udpSystem.UDP_DequeueMessages(); if (udpMessages != null) { foreach (NET_Messages.IMessage MS in udpMessages) { NET_ProcessMessage(MS); } } //Process all enqueued tcp messages if (isHost == true) { this.playerCount = tcpServer.TCP_Server_GetPlayerCount(); NET_Messages.IMessage[] playerSlot2Messages = tcpServer.TCP_DequeueMessages(2); if (playerSlot2Messages != null) { foreach (NET_Messages.IMessage MS in playerSlot2Messages) { NET_ProcessMessage(MS); } } NET_Messages.IMessage[] playerSlot3Messages = tcpServer.TCP_DequeueMessages(3); if (playerSlot3Messages != null) { foreach (NET_Messages.IMessage MS in playerSlot3Messages) { NET_ProcessMessage(MS); } } NET_Messages.IMessage[] playerSlot4Messages = tcpServer.TCP_DequeueMessages(4); if (playerSlot4Messages != null) { foreach (NET_Messages.IMessage MS in playerSlot4Messages) { NET_ProcessMessage(MS); } } } else { NET_Messages.IMessage[] playersMessages = tcpClient.TCP_DequeueMessages(); if (playersMessages != null) { foreach (NET_Messages.IMessage MS in playersMessages) { NET_ProcessMessage(MS); } } } //TimeStepping V1 float delta = thisTime.Subtract(lastTime).Milliseconds; if ((float)Math.Abs(delta) > timeStep) { this.lastTime = DateTime.Now; //Create update message V2 //Old system: //3 messages in / 12 messages out //New system: //3 messages in / 3 messages out if (playerID != 0 && playerCount > 1) { NET_Messages.NET_Message_Update update = new NET_Messages.NET_Message_Update(DateTime.Now); if (isHost == true) { NET_DataPack packP1 = null; NET_DataPack packP2 = null; NET_DataPack packP3 = null; NET_DataPack packP4 = null; if (playersGameData[0] != null) { packP1 = playersGameData[0]; packP1.SetData("PlayerID", 1); } if (playersGameData[1] != null) { packP2 = playersGameData[1]; packP2.SetData("PlayerID", 2); } if (playersGameData[2] != null) { packP3 = playersGameData[2]; packP3.SetData("PlayerID", 3); } if (playersGameData[3] != null) { packP4 = playersGameData[3]; packP4.SetData("PlayerID", 4); } //Create uber-pack containing packs from all players (System 1 to reduce message count by factor 3 --> but rise message size by 4) NET_UberPack uberPack = new NET_UberPack(packP1, packP2, packP3, packP4); update.SetData(uberPack.SerializePacks()); //Enqueue update message tcpServer.TCP_EnqueueMessage(update, 2); tcpServer.TCP_EnqueueMessage(update, 3); tcpServer.TCP_EnqueueMessage(update, 4); } else { if (playersGameData[playerID - 1] != null) { NET_DataPack pack = playersGameData[playerID - 1]; pack.SetData("PlayerID", playerID); update.SetData(pack.SerializeData()); tcpClient.TCP_EnqueueMessage(update); } } } } }