public void ReadMessages() { int numData = 0; for (int i = 0; i < 250; i++) // Up to 250 messages read per tick // Receive messages: { int recHostId; int recConnectionId; int recChannelId; byte[] recBuffer = new byte[1500]; // Prepare for 1500. Warning on server is made at 1000 currently. Probably will have to adjust this one day. int bufferSize = 1500; int dataSize; byte error; NetworkEventType networkEvent = NetworkTransport.Receive(out recHostId, out recConnectionId, out recChannelId, recBuffer, bufferSize, out dataSize, out error); NetworkError networkError = (NetworkError)error; if (networkError != NetworkError.Ok) { Debug.LogError(string.Format("Error recieving event: {0} with recHostId: {1}, recConnectionId: {2}, recChannelId: {3}", networkError, recHostId, recConnectionId, recChannelId)); } switch (networkEvent) { case NetworkEventType.Nothing: return; case NetworkEventType.ConnectEvent: OperationNetwork.connected = true; Debug.LogError("We have connected! "); GameManager.InitialConnect(); break; case NetworkEventType.DataEvent: numData++; dataInRate += dataSize; Interp.shiftBuffer(previousDataInRate); Interp.shiftBuffer(previousDataInTimes); previousDataInRate [0] = dataSize; previousDataInTimes [0] = Time.time; if (OperationNetwork.initialConnected == 0) { if (recChannelId == reliableSequencedChannelId) { Player.myID = BitConverter.ToInt16(recBuffer, 0); OperationNetwork.initialConnected = 1; } else { // We send a RPC looking for a full game resend, if this is not a full game state: if (BitConverter.ToInt32(recBuffer, 2) >= 0) { OperationView.RPC(null, "ResendTicks", OperationNetwork.ToServer); } } } else { OperationNetwork.clientReceivedData(recBuffer); // Note that dataSize could be used as a way of trimming this. } break; case NetworkEventType.DisconnectEvent: Debug.LogError("Server Shut Down"); break; } } Debug.LogError("Missing Messages! Num Data Messages (/250): " + numData); }
void Update() { if ((RunGame.myClient != null && !OperationNetwork.isServer) || OperationNetwork.isDemo) { if (RunGame.myClient != null) { RunGame.myClient.ReadMessages(); } GetComponent <Interp>().InterpUpdate(); } if (Input.GetKeyDown(KeyCode.G)) { Time.timeScale = 0.02f; } else if (Input.GetKeyDown(KeyCode.H)) { Time.timeScale = 1; } if (OperationNetwork.isDemo) { if (Input.GetKeyDown(KeyCode.Alpha1)) { Time.timeScale *= 0.5f; } else if (Input.GetKeyDown(KeyCode.Alpha2)) { Time.timeScale *= 2; } else if (Input.GetKeyDown(KeyCode.Alpha3)) { Time.timeScale = 1; } // Read.. execute.. This will disconnect the client on the last ~10 seconds. try { byte[] readInData = new byte[OperationNetwork.maxDemoData]; // Just in case: int x = 0; while (OperationNetwork.lastTickLoaded < Interp.getTickNumber() + 5) // Only laods in 5 ticks ahead { OperationNetwork.timeReceivedForDemo = false; Buffer.BlockCopy(OperationNetwork.dataToReadIn, OperationNetwork.currentByte, readInData, 0, Math.Min(OperationNetwork.maxDemoData, OperationNetwork.dataToReadIn.Length - OperationNetwork.currentByte)); int oldByte = OperationNetwork.currentByte; OperationNetwork.clientReceivedData(readInData); // Any amount is fine, but more will generally be better x++; if (x > 100) { Debug.LogError("MAJOR DEMO FAILURE"); break; } } } catch (Exception e) { Debug.LogError(e); OperationNetwork.isDemo = false; // This is not necessarily stable: RunGame.Disconnect(); OptionsMenu.ResetStaticVariables(); SceneManager.LoadScene(0); // Reloads map. } } }