void SpawnPlayers()
 {
     lock (lockSpawn)
     {
         while (spawnMessages.Count > 0)
         {
             var spawnMessage = spawnMessages.Dequeue();
             for (int i = 0; i < spawnMessage.players.Length; i++)
             {
                 int        playerCount = networkedPlayers.Count + 1;
                 GameObject newCube     = Instantiate(
                     Cube,
                     new Vector3(
                         spawnMessage.players[i].position.x,
                         spawnMessage.players[i].position.y,
                         spawnMessage.players[i].position.z
                         ),
                     Quaternion.Euler(0, 0, 0)) as GameObject;
                 NetworkCube new2Cube = newCube.GetComponent <NetworkCube>();
                 new2Cube.id = spawnMessage.players[i].id;
                 if ((i == spawnMessage.players.Length - 1) && newPlayer)
                 {
                     newPlayer         = false;
                     new2Cube.mainCube = true;
                     mainId            = new2Cube.id;
                 }
                 new2Cube.ChangeColor(spawnMessage.players[i].color.R, spawnMessage.players[i].color.G, spawnMessage.players[i].color.B);
                 networkedPlayers.Add(spawnMessage.players[i].id, newCube);
             }
         }
     }
 }
Beispiel #2
0
 void SpawnPlayers()
 {
     while (spawnMessages.Count > 0)
     {
         var spawnMessage = spawnMessages.Dequeue();
         for (int playerCount = 0; playerCount < spawnMessage.players.Length; playerCount++)
         {
             GameObject newCube = Instantiate(myCube,
                                              new Vector3(
                                                  spawnMessage.players[playerCount].position.x,
                                                  spawnMessage.players[playerCount].position.y,
                                                  spawnMessage.players[playerCount].position.z
                                                  ),
                                              Quaternion.Euler(0, 0, 0)) as GameObject;
             NetworkCube spawnCube = newCube.GetComponent <NetworkCube>();
             if ((playerCount == spawnMessage.players.Length - 1) && newPlayer)
             {
                 newPlayer        = false;
                 spawnCube.myCube = true;
                 myCubeID         = spawnMessage.players[playerCount].id;
             }
             spawnCube.ChangeColor(spawnMessage.players[playerCount].color.R, spawnMessage.players[playerCount].color.G, spawnMessage.players[playerCount].color.B);
             networkPlayers.Add(spawnMessage.players[playerCount].id, newCube);
         }
     }
 }
Beispiel #3
0
    public static void ApplyCubeState(Rigidbody body, NetworkCube cube, ref CubeState s, ref Vector3 origin, bool isSmooth = false)
    {
        cube.Release();

        if (s.isActive && body.IsSleeping())
        {
            body.WakeUp();
        }

        if (!s.isActive && !body.IsSleeping())
        {
            body.Sleep();
        }

        cube.authorityId       = s.authorityId;
        cube.authorityPacketId = s.authorityPacketId;
        cube.ownershipId       = s.ownershipId;

        var position = new Vector3(s.positionX, s.positionY, s.positionZ) * 1.0f / UnitsPerMeter + origin;
        var rotation = SmallestThreeToQuaternion(s.rotationLargest, s.rotationX, s.rotationY, s.rotationZ);

        if (isSmooth)
        {
            cube.SmoothMove(position, rotation);
        }
        else
        {
            body.position = position;
            body.rotation = rotation;
        }

        body.velocity        = new Vector3(s.linearVelocityX, s.linearVelocityY, s.linearVelocityZ) * 1.0f / UnitsPerMeter;
        body.angularVelocity = new Vector3(s.angularVelocityX, s.angularVelocityY, s.angularVelocityZ) * 1.0f / UnitsPerMeter;
    }
Beispiel #4
0
    public static void GetState(Rigidbody body, NetworkCube cube, ref CubeState s, ref Vector3 origin)
    {
        s.isActive          = !body.IsSleeping();
        s.authorityId       = cube.authorityId;
        s.authorityPacketId = cube.authorityPacketId;
        s.ownershipId       = cube.ownershipId;

        var position = body.position - origin;

        s.positionX = (int)Math.Floor(position.x * UnitsPerMeter + 0.5f);
        s.positionY = (int)Math.Floor(position.y * UnitsPerMeter + 0.5f);
        s.positionZ = (int)Math.Floor(position.z * UnitsPerMeter + 0.5f);
        QuaternionToSmallestThree(body.rotation, out s.rotationLargest, out s.rotationX, out s.rotationY, out s.rotationZ);

        s.linearVelocityX  = (int)Math.Floor(body.velocity.x * UnitsPerMeter + 0.5f);
        s.linearVelocityY  = (int)Math.Floor(body.velocity.y * UnitsPerMeter + 0.5f);
        s.linearVelocityZ  = (int)Math.Floor(body.velocity.z * UnitsPerMeter + 0.5f);
        s.angularVelocityX = (int)Math.Floor(body.angularVelocity.x * UnitsPerMeter + 0.5f);
        s.angularVelocityY = (int)Math.Floor(body.angularVelocity.y * UnitsPerMeter + 0.5f);
        s.angularVelocityZ = (int)Math.Floor(body.angularVelocity.z * UnitsPerMeter + 0.5f);

        ClampPosition(ref s.positionX, ref s.positionY, ref s.positionZ);
        ClampLinearVelocity(ref s.linearVelocityX, ref s.linearVelocityY, ref s.linearVelocityZ);
        ClampAngularVelocity(ref s.angularVelocityX, ref s.angularVelocityY, ref s.angularVelocityZ);
    }
    void CreateCube(NetworkObjects.NetworkPlayer npClient)
    {
        NetworkCube nCube = new NetworkCube(npClient.id);

        nCube.cube = GameObject.Instantiate(cubePrefab, npClient.cubePos, Quaternion.identity);
        nCube.cube.GetComponent <CubeController>().id           = int.Parse(npClient.id);
        nCube.cube.GetComponent <MeshRenderer>().material.color = npClient.cubeColor;
        nCube.cube.GetComponent <CubeController>().netClient    = this;
        cubeList.Add(nCube);
    }
Beispiel #6
0
    void UpdatePendingCommit(NetworkCube cube, int authorityId, int fromClientId, int toClientId)
    {
        if (cube.isPendingCommit && authorityId != toClientId + 1)
        {
#if DEBUG_AUTHORITY
            Debug.Log("client " + toClientId + " sees update for cube " + n.GetCubeId() + " from client " + fromClientId + " with authority index (" + authorityId + ") and clears pending commit flag");
#endif // #if DEBUG_AUTHORITY
            cube.isPendingCommit = false;
        }
    }
Beispiel #7
0
    public void TakeAuthority(NetworkCube cube)
    {
        IsTrue(cube.authorityId == 0);
#if DEBUG_AUTHORITY
        Debug.Log("client " + clientIndex + " took authority over cube " + n.GetCubeId());
#endif // #if DEBUG_AUTHORITY
        cube.authorityId = authorityId;
        cube.authorityPacketId++;
        cube.isConfirmed = IsServer();
    }
Beispiel #8
0
    void OnConnect(NetworkConnection c)
    {
        m_Connections.Add(c);
        Debug.Log("Accepted a connection");

        NetworkObjects.NetworkPlayer p = new NetworkObjects.NetworkPlayer();
        p.id = c.InternalId.ToString();
        clientList.Add(p);

        NetworkCube nCube = new NetworkCube(c.InternalId.ToString());

        nCube.cube = GameObject.Instantiate(cubePrefab, p.cubePos, Quaternion.identity);
        nCube.cube.GetComponent <CubeController>().id           = c.InternalId;
        nCube.cube.GetComponent <MeshRenderer>().material.color = p.cubeColor;
        cubeList.Add(nCube);

        InitializeConnectionMsg icMsg = new InitializeConnectionMsg();

        icMsg.connectionID = c.InternalId.ToString();
        SendToClient(JsonUtility.ToJson(icMsg), c);

        ServerUpdateMsg sMsg = new ServerUpdateMsg();

        foreach (NetworkObjects.NetworkPlayer np in clientList)
        {
            sMsg.players.Add(np);
        }

        for (int i = 0; i < m_Connections.Length; i++)
        {
            if (!m_Connections[i].IsCreated)
            {
                continue;
            }

            SendToClient(JsonUtility.ToJson(sMsg), m_Connections[i]);
        }
    }
    void Update()
    {
        m_Driver.ScheduleUpdate().Complete();

        if (!m_Connection.IsCreated)
        {
            if (!m_Done)
            {
                Debug.Log("[CLIENT] Something went wrong during connect");
            }
            return;
        }

        // Verifies movement
        bool sendMove = false;
        var  mov      = new Movement();

        if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow))
        {
            sendMove = true;
            mov.x   += -linearSpeed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow))
        {
            sendMove = true;
            mov.x   += linearSpeed * Time.deltaTime;
        }

        if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))
        {
            sendMove = true;
            mov.y    = linearSpeed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
        {
            sendMove = true;
            mov.y    = -linearSpeed * Time.deltaTime;
        }
        if (sendMove)
        {
            string message = Messager.UpdatePosition(mov);
            Sender.SendData(message, m_Driver, m_Connection);
        }

        DataStreamReader stream;

        NetworkEvent.Type cmd;

        while ((cmd = m_Connection.PopEvent(m_Driver, out stream)) !=
               NetworkEvent.Type.Empty)
        {
            if (cmd == NetworkEvent.Type.Data)
            {
                var readerCtx  = default(DataStreamReader.Context);
                var infoBuffer = new byte[stream.Length];
                stream.ReadBytesIntoArray(ref readerCtx, ref infoBuffer, stream.Length);
                var resultString = Encoding.ASCII.GetString(infoBuffer);
                Debug.Log("[CLIENT] Got " + resultString + " from the Server");
                var message = Decoder.Decode(resultString);
                Debug.Log("[CLIENT] After decoding the message");
                if (message.cmd == Commands.OTHERS)
                {
                    foreach (Player pl in message.players)
                    {
                        GameObject newCube = Instantiate(
                            m_RotatingCubePrefab,
                            new Vector3(
                                pl.position.x,
                                pl.position.y,
                                pl.position.z
                                ),
                            Quaternion.Euler(0, 0, 0)) as GameObject;
                        NetworkCube thisCubeHere = newCube.GetComponent <NetworkCube>();
                        thisCubeHere.id = pl.id;
                        thisCubeHere.ChangeColor(pl.color.R, pl.color.G, pl.color.B);
                        m_NetworkedCubes.Add(pl.id, newCube);
                    }
                }
                else if (message.cmd == Commands.NEW_CLIENT)
                {
                    foreach (Player pl in message.players)
                    {
                        GameObject newCube = Instantiate(
                            m_RotatingCubePrefab,
                            new Vector3(
                                pl.position.x,
                                pl.position.y,
                                pl.position.z
                                ),
                            Quaternion.Euler(0, 0, 0)) as GameObject;
                        NetworkCube thisCubeHere = newCube.GetComponent <NetworkCube>();
                        thisCubeHere.id = pl.id;
                        thisCubeHere.ChangeColor(pl.color.R, pl.color.G, pl.color.B);
                        m_NetworkedCubes.Add(pl.id, newCube);
                    }
                }
                else if (message.cmd == Commands.UPDATE)
                {
                    foreach (Player pl in message.players)
                    {
                        GameObject cube = m_NetworkedCubes[pl.id];
                        cube.transform.position =
                            new Vector3(
                                pl.position.x,
                                pl.position.y,
                                pl.position.z
                                );
                    }
                }
                else if (message.cmd == Commands.DELETE)
                {
                    foreach (Player pl in message.players)
                    {
                        if (m_NetworkedCubes.ContainsKey(pl.id))
                        {
                            GameObject cube = m_NetworkedCubes[pl.id];
                            Destroy(cube);
                            m_NetworkedCubes.Remove(pl.id);
                        }
                    }
                }
            }
            else if (cmd == NetworkEvent.Type.Disconnect)
            {
                Debug.Log("[CLIENT] Client got disconnected from server");
                m_Connection = default(NetworkConnection);
                m_Done       = true;
            }
        }

        // Verifies
        //Debug.Log("End of it all");
    }
    void Update()
    {
        networkDriver.ScheduleUpdate().Complete();

        if (!Connection.IsCreated)
        {
            if (!Finished)
            {
                Debug.Log("connection didn't work.");
            }
            return;
        }

        bool sendMove = false;
        var  loc      = new Movement();

        if (Input.GetKey(KeyCode.A))
        {
            sendMove = true;
            loc.x   += -moveSpeed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.D))
        {
            sendMove = true;
            loc.x   += moveSpeed * Time.deltaTime;
        }

        if (Input.GetKey(KeyCode.W))
        {
            sendMove = true;
            loc.y    = moveSpeed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.S))
        {
            sendMove = true;
            loc.y    = -moveSpeed * Time.deltaTime;
        }
        if (sendMove)
        {
            string message = Messages.UpdatePosition(loc);
            Sender.Send(message, networkDriver, Connection);
        }

        DataStreamReader stream;

        NetworkEvent.Type cmd;

        while ((cmd = Connection.PopEvent(networkDriver, out stream)) !=
               NetworkEvent.Type.Empty)
        {
            if (cmd == NetworkEvent.Type.Data)
            {
                var readerCtx  = default(DataStreamReader.Context);
                var infoBuffer = new byte[stream.Length];
                stream.ReadBytesIntoArray(ref readerCtx, ref infoBuffer, stream.Length);
                var resultString = Encoding.ASCII.GetString(infoBuffer);
                Debug.Log("Got " + resultString + " from the Server");
                var message = Decoder.Decode(resultString);
                if (message.cmd == Commands.OTHERS)
                {
                    foreach (Player pl in message.players)
                    {
                        GameObject newCube = Instantiate(
                            RotatingCubePrefab,
                            new Vector3(
                                pl.position.x,
                                pl.position.y,
                                pl.position.z
                                ),
                            Quaternion.Euler(0, 0, 0)) as GameObject;
                        NetworkCube currentCube = newCube.GetComponent <NetworkCube>();
                        currentCube.id = pl.id;
                        currentCube.ChangeColor(pl.color.R, pl.color.G, pl.color.B);
                        Cubes.Add(pl.id, newCube);
                    }
                }
                else if (message.cmd == Commands.NEW_CLIENT)
                {
                    foreach (Player pl in message.players)
                    {
                        GameObject newCube = Instantiate(
                            RotatingCubePrefab,
                            new Vector3(
                                pl.position.x,
                                pl.position.y,
                                pl.position.z
                                ),
                            Quaternion.Euler(0, 0, 0)) as GameObject;
                        NetworkCube currentCube = newCube.GetComponent <NetworkCube>();
                        currentCube.id = pl.id;
                        currentCube.ChangeColor(pl.color.R, pl.color.G, pl.color.B);
                        Cubes.Add(pl.id, newCube);
                    }
                }
                else if (message.cmd == Commands.UPDATE)
                {
                    foreach (Player pl in message.players)
                    {
                        GameObject cube = Cubes[pl.id];
                        cube.transform.position =
                            new Vector3(
                                pl.position.x,
                                pl.position.y,
                                pl.position.z
                                );
                    }
                }
                else if (message.cmd == Commands.DELETE)
                {
                    foreach (Player pl in message.players)
                    {
                        if (Cubes.ContainsKey(pl.id))
                        {
                            GameObject cube = Cubes[pl.id];
                            Destroy(cube);
                            Cubes.Remove(pl.id);
                        }
                    }
                }
            }
            else if (cmd == NetworkEvent.Type.Disconnect)
            {
                Debug.Log("Client has disconnected");
                Connection = default(NetworkConnection);
                Finished   = true;
            }
        }
    }