Esempio n. 1
0
    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.
            }
        }
    }