Exemplo n.º 1
0
        private void ParseMessage(UdpReceiveResult result, SpideyTcpServer tcpServer, IProgress <ConnectedPlayerInformation> onLocationUpdate, IProgress <ConnectedPlayerUdpEndPoint> onReceiveUdpInfo)
        {
            if (result.Buffer.Length < SpideyUdpMessage.MESSAGE_HEADER_SIZE)
            {
                return;
            }

            var  message     = result.Buffer;
            var  messageType = message[0];
            byte playerNumber;

            switch (messageType)
            {
            case SpideyUdpMessage.SPIN_A_WEB:
                if (!SpideyUdpMessage.ParseSpinAWebMessage(message, out playerNumber))
                {
                    break;
                }

                var added = tcpServer.AddUdpClientInformation(playerNumber, result.RemoteEndPoint);
                if (added)
                {
                    ++_playerCount;
                    onReceiveUdpInfo.Report(new ConnectedPlayerUdpEndPoint(playerNumber, new IPEndPoint(result.RemoteEndPoint.Address, result.RemoteEndPoint.Port)));
                }
                break;

            case SpideyUdpMessage.SPIDERMAN:
                if (!SpideyUdpMessage.ParseSpidermanMessage(message, out playerNumber, out byte[] spideyData, out byte levelData))
Exemplo n.º 2
0
        private void ReadFromMemory(object state)
        {
            lock (_memoryTimerLock)
            {
                var timer = state as Timer;
                if (timer != _memoryTimer || _memoryTimer == null)
                {
                    return;
                }

                var spideyData = MemoryScanner.ReadSpideyData();
                var levelData  = MemoryScanner.ReadLevelData();

                var message = SpideyUdpMessage.CreateSpidermanMessage(_myInfo.Number, spideyData, levelData);

                foreach (var udpClient in udpWebSwing)
                {
                    udpClient.Send(message, message.Length);
                }

                var spideyLevel = SpideyLevels.GetSpideyLevel(levelData);
                var location    = spideyLevel.Name.TrimEnd();
                _onLocationUpdate.Report(new ConnectedPlayerInformation(_myInfo.Number, location));

                _udpBase.MyLastLocation = location;
            }
        }
Exemplo n.º 3
0
        public async Task StartListening(IProgress <bool> onConnected, IProgress <ConnectedPlayerInformation> onLocationUpdate)
        {
            await _tcpConnected.WaitAsync();

            var myPlayerNumber = _myPlayerNumber;
            var udpClient      = new UdpClient();
            var serverEndPoint = new IPEndPoint(_serverIp, _port);

            try
            {
                var gameStarted = false;
                while (!gameStarted && !_udpTaskCancellationToken.IsCancellationRequested)
                {
                    try
                    {
                        // Do not call connect otherwise hole punching will not work
                        //udpClient.Connect(_serverIp, _port);
                        onConnected.Report(true);

                        var message = SpideyUdpMessage.CreateSpinAWebMessage(myPlayerNumber);
                        while (!gameStarted)
                        {
                            udpClient.Send(message, message.Length, serverEndPoint);
                            gameStarted = await _gameStarted.WaitAsync(GAME_STARTED_TIMEOUT_MS);
                        }
                    }
                    catch (SocketException)
                    {
                        onConnected.Report(false);
                        await Task.Delay(100);
                    }
                }

                while (!_udpTaskCancellationToken.IsCancellationRequested)
                {
                    var result = await udpClient.ReceiveAsync().WithWaitCancellation(_udpTaskCancellationToken.Token);

                    ParseMessage(result, onLocationUpdate);
                }
            }
            catch (OperationCanceledException)
            {
            }
            finally
            {
                if (udpClient.Client.Connected)
                {
                    udpClient.Close();
                }
            }
        }
Exemplo n.º 4
0
        private void ParseMessage(UdpReceiveResult result, IProgress <ConnectedPlayerInformation> onLocationUpdate)
        {
            if (result.Buffer.Length < SpideyUdpMessage.MESSAGE_HEADER_SIZE)
            {
                return;
            }

            var  message     = result.Buffer;
            var  messageType = message[0];
            byte playerNumber;

            switch (messageType)
            {
            case SpideyUdpMessage.SPIN_A_WEB:
                // Not supported
                break;

            case SpideyUdpMessage.SPIDERMAN:
                if (!SpideyUdpMessage.ParseSpidermanMessage(message, out playerNumber, out byte[] spideyData, out byte levelData))