Beispiel #1
0
        public void SendGameOver(GameOverMessage message)
        {
            // Disable async receive
            StopDataReceiveLoop();

            while (!_receivingDataEnd)
            {
                Thread.Sleep(0);
            }

            byte[] gameoverData = Util.SerializeUpdate(message);
            _socket.Send(gameoverData);

            IClientUpdate response = null;

            while (!(response is ClientStatusUpdate && (response as ClientStatusUpdate).Update == ClientUpdate.GameOverOk))
            {
                byte[] buffer = new byte[512];

                try
                {
                    _socket.Receive(buffer);
                }
                catch (SocketException e)
                {
                    break;
                }

                response = GetUpdate(buffer, 0, buffer.Length);
            }

            Console.WriteLine("Game over received OK");
        }
Beispiel #2
0
        /// <summary>
        /// Socket receive callback
        /// </summary>
        /// <param name="ar"></param>
        private void SocketReceive(IAsyncResult ar)
        {
            if (!_receivingData)
            {
                _socket.EndReceive(ar);

                Console.WriteLine("Unhooked async receive");
                _receivingDataEnd = true;

                return;
            }

            AsyncReceive recObject = (AsyncReceive)ar.AsyncState;

            try
            {
                int bytesRead = _socket.EndReceive(ar);

                // There's more data in the socket
                if (bytesRead > 0)
                {
                    IClientUpdate update = GetUpdate(recObject.Buffer, 0, recObject.Buffer.Length);
                    _dataReceived(this, update);

                    // Get rest of the data
                    _socket.BeginReceive(recObject.Buffer, 0, AsyncReceive.BufferSize, SocketFlags.None, new AsyncCallback(SocketReceive), recObject);
                }
                else
                {
                    // Prepare for new receive
                    recObject = new AsyncReceive();
                    _socket.BeginReceive(recObject.Buffer, 0, AsyncReceive.BufferSize, SocketFlags.None, new AsyncCallback(SocketReceive), recObject);
                }
            }
            catch (SocketException ex)
            {
                Console.WriteLine("Receive error: " + ex.Message);
                return;
            }
            catch (ObjectDisposedException ex)
            {
                Console.WriteLine("Receive error: " + ex.Message);
                return;
            }
        }
Beispiel #3
0
        public void CheckReady()
        {
            try
            {
                _socket.Blocking = false;
                _socket.Send(new byte[1], 0, 0);
                _socket.Blocking = true;

                if (!_socket.Connected)
                {
                    State = ClientState.Defunct;
                    return;
                }
            }
            catch (SocketException e)
            {
                if (!e.NativeErrorCode.Equals(10035))
                {
                    State = ClientState.Defunct;
                    return;
                }
            }

            if (State != ClientState.WaitingForReady)
            {
                return;
            }


            if (_socket.Available > 0)
            {
                byte[] buffer = new byte[512];
                _socket.Receive(buffer);

                IClientUpdate update = GetUpdate(buffer, 0, buffer.Length);

                if (update is ClientStatusUpdate && ((ClientStatusUpdate)update).Update == ClientUpdate.Ready)
                {
                    State            = ClientState.WaitingForStart;
                    _socket.Blocking = true;

                    Console.WriteLine("Received ready from " + LocalPlayer.Color);
                }
            }
        }
Beispiel #4
0
        private void ClientDataReceived(Client client, IClientUpdate update)
        {
            // Don't process input from dead players
            if (client.LocalPlayer.Dead)
            {
                return;
            }

            if (update is ClientPositionUpdate)
            {
                ClientPositionUpdate posUpdate = (ClientPositionUpdate)update;

                client.LocalPlayer.X         = posUpdate.X;
                client.LocalPlayer.Y         = posUpdate.Y;
                client.LocalPlayer.Direction = posUpdate.Direction;
                client.LocalPlayer.Moving    = posUpdate.Moving;
            }
            else if (update is ClientBombSet)
            {
                SetBomb(client, (ClientBombSet)update);
            }
            else if (update is ClientStatusUpdate)
            {
                ClientStatusUpdate statusUpdate = (ClientStatusUpdate)update;

                if (statusUpdate.Update == ClientUpdate.BombTrigger && client.LocalPlayer.ManualTrigger)
                {
                    lock (_bombs)
                    {
                        _bombs.ForEach(bomb =>
                        {
                            if (bomb.OwnerColor == client.LocalPlayer.Color)
                            {
                                bomb.Trigger();
                            }
                        });
                    }
                }
            }
        }
Beispiel #5
0
        /// <summary>
        /// Sends level data to the client with local player type
        /// </summary>
        /// <param name="map"></param>
        public void SendMap(Map map)
        {
            Console.WriteLine("Sending map data...");
            // Serialize the map
            byte[] mapData = Util.SerializeUpdate(map);
            byte[] buffer  = new byte[512];

            try
            {
                _socket.Send(mapData);
                // Wait for confirmation
                _socket.Receive(buffer);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);

                State = ClientState.Defunct;
                return;
            }

            IClientUpdate response = GetUpdate(buffer, 0, 512);

            if (response is ClientStatusUpdate && ((ClientStatusUpdate)response).Update == ClientUpdate.MapOk)
            {
                // Send player information
                SendPlayerInfo(_player);

                // Map was sent, change state
                State = ClientState.WaitingForReady;
            }
            else
            {
                Console.WriteLine("Invalid map response from client!");
                State = ClientState.Defunct;
            }
        }
Beispiel #6
0
        /// <summary>
        /// Send information about a player to the client
        /// </summary>
        /// <param name="player"></param>
        public void SendPlayerInfo(Player player)
        {
            byte[] buffer = new byte[512];

            try
            {
                byte[] playerData = Util.SerializeUpdate(player);
                _socket.Send(playerData);

                // Wait for confirmation
                _socket.Receive(buffer);
            }
            catch (SocketException ex)
            {
                Console.WriteLine("Error while sending player info: " + ex.Message);
            }

            IClientUpdate response = GetUpdate(buffer, 0, buffer.Length);

            if (response is ClientStatusUpdate && ((ClientStatusUpdate)response).Update == ClientUpdate.PlayerInfoOk)
            {
                Console.WriteLine("Player info sent OK");
            }
        }