Esempio n. 1
0
    private void FireGun(float angleToMouse)
    {
        int seed = Random.Range(0, 300);

        if (ServerSettings.instance.playerId != 0)
        {
            var packet = new DataPacket.FromClient();
            packet = DataPacket.GetFromClientHealthPacket(angleToMouse, seed, bulletSpawnPoint.position,
                                                          ServerSettings.instance.playerId);
            StartCoroutine(ClientTCP.instance.SendData(packet));
        }
        else
        {
            var packet = new DataPacket.FromServer();
            packet = DataPacket.GetFromServerPositionPacket(angleToMouse, seed, bulletSpawnPoint.position,
                                                            ServerSettings.instance.playerId);
            StartCoroutine(ServerTCP.instance.Broadcast(packet));
        }

        isShooting = true;
        KnockBack();
        SpawnAndFireBullets(angleToMouse, seed, bulletSpawnPoint.position, ServerSettings.instance.playerId, true);
        cameraController.MoveBasedOnAngle(angleToMouse);
        nextFire  = fireDelay;
        storeTime = 0.0f;
    }
Esempio n. 2
0
    public IEnumerator SendData(DataPacket.FromClient packet)
    {
        bool ready = false;

        //Check if the socket is ready, if not wait a frame then check again
        //Consider reducing socket wait time to help frame rate on higher ping
        while (!ready)
        {
            ArrayList listenList = new ArrayList();
            listenList.Add(client.Client);
            //Second conversion to microseconds
            int waitTime = (int)ServerSettings.instance.TimeBetweenUpdatesClient * 1000000;
            Socket.Select(null, listenList, null, waitTime);

            if (!listenList.Contains(client.Client))
            {
                yield return(new WaitForEndOfFrame());
            }
            else
            {
                ready = true;
            }
        }
        StreamWriter  writer    = null;
        NetworkStream tcpStream = client.GetStream();

        while (!tcpStream.CanWrite)
        {
            yield return(new WaitForEndOfFrame());
        }
        try
        {
            if (tcpStream.CanWrite)
            {
                //Convert the object to binary data
                Byte[] msg = Serializer.BinarySerialize(packet);
                //Write the binary to the network stream, then dispose of unnecessary data
                tcpStream.Write(msg, 0, msg.Length);
                tcpStream.Flush();
            }
        }
        catch (Exception e)
        {
            Debug.LogError(e);
            throw;
        }
        finally
        {
            if (writer != null)
            {
                writer.Close();
            }
        }
    }
    //Sends data every tick to the server letting it know it's transform
    private IEnumerator ReportPosition(float timeBetweenUpdates)
    {
        while (true)
        {
            yield return(new WaitForSeconds(timeBetweenUpdates));

            DataPacket.FromClient packet = new DataPacket.FromClient();
            SerializableVector    pos    = transform.position;
            packet = DataPacket.GetFromClientPositionPacket(pos, ServerSettings.instance.playerId);
            ClientTCP.instance.SendDataWithLoss(packet);
        }
    }
Esempio n. 4
0
    //Used for movement, we don't particularly care if a movememt packet is lost
    //Doesn't wait for the socket to be writeable, just checks once
    public void SendDataWithLoss(DataPacket.FromClient packet)
    {
        ArrayList listenList = new ArrayList();

        listenList.Add(client.Client);
        //Second conversion to microseconds
        int waitTime = (int)ServerSettings.instance.TimeBetweenUpdatesClient * 1000000;

        Socket.Select(null, listenList, null, waitTime);

        //If that socket isn't writeable, return
        if (!listenList.Contains(client.Client))
        {
            return;
        }

        StreamWriter writer = null;

        try
        {
            NetworkStream tcpStream = client.GetStream();
            if (tcpStream.CanWrite)
            {
                Byte[] msg = Serializer.BinarySerialize(packet);
                tcpStream.Write(msg, 0, msg.Length);
                tcpStream.Flush();
            }
        }
        catch (Exception e)
        {
            Debug.LogError(e);
            throw;
        }
        finally
        {
            if (writer != null)
            {
                writer.Close();
            }
        }
    }
Esempio n. 5
0
    //If we get hit by a shotgun blast, wait a bit and see how many bullets hit us before reporting it
    private IEnumerator WaitForDamagePacket()
    {
        yield return(new WaitForSeconds(ServerSettings.instance.TimeBetweenUpdatesClient));

        //If this is on a client, let the server know this enemy has been hit
        if (ServerSettings.instance.playerId != 0)
        {
            //Update the enemy's hp on this client
            ReceivePacketDamage(damageOverTime, characterNumber, -1);
            var packet = new DataPacket.FromClient();
            packet = DataPacket.GetFromClientHealthPacket(damageOverTime, characterNumber, ServerSettings.instance.playerId);
            StartCoroutine(ClientTCP.instance.SendData(packet));
        }
        else
        {
            //Update the enemy's hp on this client
            ReceivePacketDamage(damageOverTime, characterNumber, -1);
            var packet = new DataPacket.FromServer();
            packet = DataPacket.GetFromServerHealthPacket(damageOverTime, characterNumber, 0);
            //Let the clients know the host has hit someone
            StartCoroutine(ServerTCP.instance.Broadcast(packet));
        }
        damaged = false;
    }
Esempio n. 6
0
    private IEnumerator OnIncomingData(ServerClient client)
    {
        bool ready = false;

        //Check if the socket's open for reading
        while (!ready)
        {
            ArrayList listenList = new ArrayList();
            listenList.Add(client.tcp.Client);
            //Second conversion to microseconds
            int waitTime = (int)ServerSettings.instance.TimeBetweenUpdatesClient * 1000000;
            Socket.Select(listenList, null, null, waitTime);
            if (!listenList.Contains(client.tcp.Client))
            {
                yield return(new WaitForEndOfFrame());
            }
            else
            {
                ready = true;
            }
        }

        //Get the binary data from the stream
        var stream = client.tcp.GetStream();

        while (!stream.CanRead)
        {
            yield return(new WaitForEndOfFrame());
        }
        byte[]       data = new byte[DataPacket.byteSize];
        BinaryReader br   = new BinaryReader(stream);

        br.Read(data, 0, DataPacket.byteSize);

        try
        {
            DataPacket.FromClient packet = (DataPacket.FromClient)Serializer.BinaryDeserialize(data);

            var serverPacket = new DataPacket.FromServer();
            switch (packet.packetType)
            {
            case ServerMessages.POSITION:
                //Don't rebroadcast the position instantly, it can wait since we might get other client updates inbetween
                DataPacket.RaiseUpdateClientPosition(packet.positionVector, true, packet.playerId);
                foreach (var serverClient in clients)
                {
                    if (serverClient.clientId == packet.playerId)
                    {
                        serverClient.position        = packet.positionVector;
                        serverClient.positionUpdated = true;
                    }
                }
                break;

            case ServerMessages.FIREGUN:
                DataPacket.RaiseClientFiredGun(packet.angle, packet.seed, packet.gunPosition, packet.playerId);
                //Instantly send this packet out as it's important
                serverPacket =
                    DataPacket.GetFromServerPositionPacket(packet.angle, packet.seed, packet.gunPosition,
                                                           packet.playerId);
                StartCoroutine(Broadcast(serverPacket));
                break;

            case ServerMessages.HEALTH:
                DataPacket.RaiseClientHit(packet.damage, packet.damageId, packet.shooterId);
                //Instantly send this packet out as it's important
                serverPacket = DataPacket.GetFromServerHealthPacket(packet.damage, packet.damageId, packet.shooterId);
                StartCoroutine(Broadcast(serverPacket));
                break;

            default:
                break;
            }
        }
        catch (Exception e)
        {
            Debug.LogWarning(e);
        }
    }