Пример #1
0
        /// <inheritdoc/>
        public async Task <string> PublishAsync(MatchMessage message, Region region, CancellationToken cancellationToken = default)
        {
            // Validate inputs
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }
            if (region == null)
            {
                throw new ArgumentNullException(nameof(region));
            }

            RequestValidationResult validationResult = message.Validate();

            validationResult.Combine(region.Validate());

            if (validationResult.Passed)
            {
                // Push to upstream data repository
                return(await this._messageRepo.InsertAsync(message, region, cancellationToken));
            }
            else
            {
                throw new RequestValidationFailedException(validationResult);
            }
        }
Пример #2
0
        /// <inheritdoc/>
        public async Task <string> PublishAsync(SelfReportRequest request, long timeAtRequest, CancellationToken cancellationToken = default)
        {
            // Validate inputs
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            RequestValidationResult validationResult = request.Validate();

            validationResult.Combine(Validator.ValidateTimestamp(timeAtRequest));

            if (validationResult.Passed)
            {
                // Build MatchMessage from submitted content
                MatchMessage   message = new MatchMessage();
                BluetoothMatch matches = new BluetoothMatch();
                matches.Seeds.AddRange(request.Seeds);

                // Store in data repository
                message.BluetoothMatches.Add(matches);
                return(await this._messageRepo.InsertAsync(message, request.Region, cancellationToken));
            }
            else
            {
                throw new RequestValidationFailedException(validationResult);
            }
        }
Пример #3
0
    public void Update(float deltaTime, byte playerIndex)
    {
        MessageQueue.Clear();

        var direction = m_input.GetDirection();

        if (direction != PlayerDirection.None)
        {
            // MessageQueue.AddMessage(PlayerMove.Create(deltaTime, m_team, playerIndex, direction));
        }

        if (m_prevActionState != m_input.GetAction())
        {
            if (m_input.GetAction())
            {
                m_actionStartTime = Time.time;
            }
            else
            {
                var actionMsg = new Action();
                actionMsg.m_duration = Time.time - m_actionStartTime;

                var msg = new MatchMessage();
                msg.m_messageType = MessageType.PlayerAction;
                msg.m_message     = actionMsg;

                MessageQueue.AddMessage(msg);
            }

            m_prevActionState = m_input.GetAction();
        }
    }
        /// <inheritdoc/>
        public async Task <string> InsertAsync(MatchMessage message, Region region, CancellationToken cancellationToken = default)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }
            if (region == null)
            {
                throw new ArgumentNullException(nameof(region));
            }

            region = RegionHelper.AdjustToPrecision(region);

            // Get allowed region boundary
            RegionBoundary boundary = RegionHelper.GetRegionBoundary(region);

            var record = new MatchMessageRecord(message)
            {
                RegionBoundary = new RegionBoundaryProperty(boundary),
                Region         = new RegionProperty(region),
                PartitionKey   = MatchMessageRecord.GetPartitionKey(region)
            };

            ItemResponse <MatchMessageRecord> response = await this.Container
                                                         .CreateItemAsync <MatchMessageRecord>(
                record,
                new PartitionKey(record.PartitionKey),
                cancellationToken : cancellationToken
                );

            return(response.Resource.Id);
        }
Пример #5
0
        /// <inheritdoc/>
        public async Task PublishAreaAsync(AreaMatch areaMatch, CancellationToken cancellationToken = default)
        {
            // Validate inputs
            if (areaMatch == null)
            {
                throw new ArgumentNullException(nameof(areaMatch));
            }

            RequestValidationResult validationResult = areaMatch.Validate();

            if (validationResult.Passed)
            {
                // Build a MatchMessage containing the submitted areas
                MatchMessage message = new MatchMessage();
                message.AreaMatches.Add(areaMatch);

                // Define a regions for the published message
                IEnumerable <Region> messageRegions = RegionHelper.GetRegionsCoverage(areaMatch.Areas, this.RegionPrecision);

                // Publish
                await this._messageRepo.InsertAsync(message, messageRegions, cancellationToken);
            }
            else
            {
                throw new RequestValidationFailedException(validationResult);
            }
        }
Пример #6
0
        public async Task PublishAsync_SucceedsOnValidMessage()
        {
            // Arrange
            string repoResponse = "00000000-0000-0000-0000-000000000001";
            Region region       = new Region
            {
                LatitudePrefix  = 10.1234,
                LongitudePrefix = -10.1234,
                Precision       = 4
            };
            MatchMessage request   = new MatchMessage();
            AreaMatch    areaMatch = new AreaMatch
            {
                UserMessage = "Test user message"
            };

            areaMatch.Areas.Add(new Area
            {
                BeginTime = 0,
                EndTime   = 1,
                Location  = new Location
                {
                    Latitude  = 10.1234,
                    Longitude = -10.1234
                },
                RadiusMeters = 100
            });
            request.AreaMatches.Add(areaMatch);
            BluetoothMatch btMatch = new BluetoothMatch
            {
                UserMessage = "Test BL message"
            };

            btMatch.Seeds.Add(new BlueToothSeed
            {
                Seed              = "00000000-0000-0000-0000-000000000000",
                SequenceEndTime   = 1,
                SequenceStartTime = 0
            });
            request.BluetoothMatches.Add(btMatch);

            this._repo
            .Setup(r => r.InsertAsync(It.IsAny <MatchMessage>(), It.IsAny <Region>(), CancellationToken.None))
            .Returns(Task.FromResult(repoResponse));

            // Act
            string result = await this._service
                            .PublishAsync(request, region, CancellationToken.None);

            // Assert
            Assert.IsNotNull(result);
            Assert.AreEqual(repoResponse, result);
        }
Пример #7
0
    private void OnMessageReceived(BestHTTP.WebSocket.WebSocket ws, string message)
    {
        try
        {
            MatchMessage message2 = JsonConvert.DeserializeObject <MatchMessage>(message);
            if (!string.IsNullOrEmpty(message2.userid))
            {
                if (string.IsNullOrEmpty(this.otheruserid))
                {
                    this.otheruserid = message2.userid;
                }
                else if (this.otheruserid != message2.userid)
                {
                    return;
                }
            }
            switch (((MatchMessageType)message2.msgtype))
            {
            case MatchMessageType.eLearnSkill:
                GameLogic.Hold.BattleData.Challenge_SendEvent("MatchDefenceTime_other_learn_skill", message2.argint);
                return;

            case MatchMessageType.eDead:
                GameLogic.Hold.BattleData.Challenge_SendEvent("MatchDefenceTime_other_dead", null);
                return;

            case MatchMessageType.eReborn:
                GameLogic.Hold.BattleData.Challenge_SendEvent("MatchDefenceTime_other_reborn", null);
                return;

            case MatchMessageType.eScoreUpdate:
                GameLogic.Hold.BattleData.Challenge_SendEvent("MatchDefenceTime_other_updatescore", message2.argint);
                return;

            case MatchMessageType.eGameStart:
            {
                long argint = message2.argint;
                GameLogic.Hold.BattleData.Challenge_UpdateMode(0x332d, BattleSource.eMatch);
                GameLogic.Hold.BattleData.Challenge_SendEvent("MatchDefenceTime_set_random_seed", argint);
                WindowUI.ShowWindow(WindowID.WindowID_Battle);
                GameLogic.Hold.BattleData.Challenge_SendEvent("MatchDefenceTime_me_updatename", this.myname);
                GameLogic.Hold.BattleData.Challenge_SendEvent("MatchDefenceTime_other_updatename", message2.nickname);
                return;
            }

            case MatchMessageType.eGameEnd:
                return;
            }
        }
        catch
        {
        }
    }
Пример #8
0
 public ActionResult writeMessage(int playerid_, int matchid_, string text)
 {
     if (Session["id"] == null || Session["role"].ToString() != "user")
     {
         return(RedirectToRoute("login"));
     }
     if (playerid_ != Int32.Parse(Session["id"].ToString()))
     {
         return(RedirectToRoute("login"));
     }
     matchmessage = new MatchMessage();
     matchmessage.addMessage(playerid_, matchid_, text);
     return(Json("1"));
 }
Пример #9
0
    private void Update()
    {
        GameClient.Update();

        if (!MatchSceneLoaded())
        {
            return;
        }

        if (m_matchStarted)
        {
            UpdateInput(Time.deltaTime);

            while (true)
            {
                var msg = GameClient.GetMatchMessage();
                if (msg == null)
                {
                    break;
                }

                m_match.ProcessMessage(msg);

                if (msg.m_messageType == MessageType.BallPosition)
                {
                    var ballPosMsg = (BallPosition)msg.m_message;
                    m_msgSync.DiscardProcessedMssages(ballPosMsg.m_clientMsgNum);
                }

                if (msg.m_messageType == MessageType.PlayerPosition)
                {
                    var playerPosMsg = (PlayerPosition)msg.m_message;
                    m_msgSync.DiscardProcessedMssages(playerPosMsg.m_clientMsgNum);

                    for (int i = 0; i < m_msgSync.Messages.Count; i++)
                    {
                        if (playerPosMsg.m_index == m_msgSync.Messages[i].m_playerIndex &&
                            playerPosMsg.m_team == m_msgSync.Messages[i].m_team)
                        {
                            var matchMessage = new MatchMessage();
                            matchMessage.m_messageType = MessageType.PlayerMove;
                            matchMessage.m_message     = m_msgSync.Messages[i];

                            m_match.ProcessMessage(matchMessage);
                        }
                    }
                }
            }
        }
    }
Пример #10
0
 /// <summary>
 /// Calculates the size (in bytes) of a <see cref="MatchMessage"/>
 /// </summary>
 /// <param name="message">Source <see cref="MatchMessage"/></param>
 /// <returns><see cref="MatchMessage"/> size, in bytes</returns>
 public static long GetSize(MatchMessage message)
 {
     if (message != null)
     {
         // Serialize object into a byte array and return its size
         MemoryStream stream = new MemoryStream();
         Serializer.Serialize(stream, message);
         return(stream.ToArray().Length);
     }
     else
     {
         throw new ArgumentNullException(nameof(message));
     }
 }
Пример #11
0
    private void ProcessMessage(NetworkMessage msg)
    {
        switch (msg.m_type)
        {
        case NetworkMessageType.JoinAccept:
        {
            Debug.Log("Join Accept");

            Team = ((JoinAccept)msg.m_msg).m_team;

            break;
        }

        case NetworkMessageType.OpponentFound:
            Debug.LogFormat("Opponent found: {0}", ((OpponentFound)msg.m_msg).m_playerName);
            if (OpponentFound != null)
            {
                OpponentFound();
            }
            break;

        case NetworkMessageType.StartMatch:
            Debug.LogFormat("StartMatch");
            if (MatchStarted != null)
            {
                MatchStarted();
            }
            break;

        case NetworkMessageType.PlayerPosition:
        {
            var matchMsg = new MatchMessage();
            matchMsg.m_messageType = MessageType.PlayerPosition;
            matchMsg.m_message     = msg.m_msg;
            m_msgQueue.AddMessage(matchMsg);
            break;
        }

        case NetworkMessageType.BallPosition:
        {
            var matchMsg = new MatchMessage();
            matchMsg.m_messageType = MessageType.BallPosition;
            matchMsg.m_message     = msg.m_msg;
            m_msgQueue.AddMessage(matchMsg);
            break;
        }
        }
    }
Пример #12
0
    // team is ignored when sending from the client to the server.
    public static MatchMessage Create(int messageNumber, byte team, byte playerIndex, float duration)
    {
        var payload = new Action();

        payload.m_messageNumber = messageNumber;
        payload.m_team          = team;
        payload.m_playerIndex   = playerIndex;
        payload.m_duration      = duration;

        var msg = new MatchMessage();

        msg.m_messageType = MessageType.PlayerAction;
        msg.m_message     = payload;

        return(msg);
    }
Пример #13
0
    public static MatchMessage Create(int messageNumber, float dt, byte team, byte playerIndex, PlayerDirection direction)
    {
        var payload = new PlayerMove();

        payload.m_messageNumber   = messageNumber;
        payload.m_dt              = dt;
        payload.m_team            = team;
        payload.m_playerIndex     = playerIndex;
        payload.m_playerDirection = direction;

        var msg = new MatchMessage();

        msg.m_messageType = MessageType.PlayerMove;
        msg.m_message     = payload;

        return(msg);
    }
Пример #14
0
 string GetMatchOrJoinMessage()
 {
     if (room != null)
     {
         var msg = new JoinMessage {
             user_id = Player.id, room = room, last_id = receivedMessages[receivedMessages.Count - 1].id
         };
         return(JsonUtility.ToJson(msg));
     }
     else
     {
         var msg = new MatchMessage {
             user_id = Player.id
         };
         return(JsonUtility.ToJson(msg));
     }
 }
        /// <summary>
        /// This method sends match state message to other players through Nakama server.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="opCode"></param>
        /// <param name="message"></param>
        public void SendMatchStateMessage <T>(MatchMessageType opCode, T message)
            where T : MatchMessage <T>
        {
            try
            {
                //Packing MatchMessage object to json
                string json = MatchMessage <T> .ToJson(message);

                //Sending match state json along with opCode needed for unpacking message to server.
                //Then server sends it to other players
                _socket.SendMatchStateAsync(MatchId, (long)opCode, json);
            }
            catch (Exception e)
            {
                Debug.LogError("Error while sending match state: " + e.Message);
            }
        }
Пример #16
0
 public void Send(MatchMessageType msgtype, int arg = 0)
 {
     if ((this.webSocket != null) && this.webSocket.IsOpen)
     {
         MatchMessage message = new MatchMessage();
         this.myname    = LocalSave.Instance.GetUserName();
         message.userid = LocalSave.Instance.GetServerUserID().ToString();
         if (this.myname == string.Empty)
         {
             this.myname = message.userid;
         }
         message.nickname = this.myname;
         message.msgtype  = (short)msgtype;
         message.argint   = arg;
         this.Send(JsonConvert.SerializeObject(message));
     }
 }
Пример #17
0
        public async Task PostAsync_OkWithMatchedParameters()
        {
            // Arrange
            IEnumerable<string> ids = new string[]
            {
                "00000000-0000-0000-0000-000000000000",
                "00000000-0000-0000-0000-000000000001"
            };
            MatchMessage result1 = new MatchMessage();
            MatchMessage result2 = new MatchMessage();
            IEnumerable<MatchMessage> toReturn = new List<MatchMessage>
            {
                result1,
                result2
            };

            this._repo
                .Setup(s => s.GetRangeAsync(ids, CancellationToken.None))
                .Returns(Task.FromResult(toReturn));

            MessageRequest request = new MessageRequest();
            request.RequestedQueries.Add(new MessageInfo
            {
                MessageId = ids.ElementAt(0),
                MessageTimestamp = 0
            });
            request.RequestedQueries.Add(new MessageInfo
            {
                MessageId = ids.ElementAt(1),
                MessageTimestamp = 0
            });

            // Act
            ActionResult<IEnumerable<MatchMessage>> controllerResponse = await this._controller
                .PostAsync(request, CancellationToken.None);

            // Assert
            Assert.IsNotNull(controllerResponse);
            Assert.IsInstanceOfType(controllerResponse.Result, typeof(OkObjectResult));
            OkObjectResult castedResult = controllerResponse.Result as OkObjectResult;
            Assert.IsInstanceOfType(castedResult.Value, typeof(List<MatchMessage>));
            List<MatchMessage> listResult = castedResult.Value as List<MatchMessage>;
            Assert.AreEqual(toReturn.Count(), listResult.Count());
        }
Пример #18
0
    public static MatchMessage Create(
        int clientMsgNumber, byte team, byte index, Vector2 position, PlayerDirection direction)
    {
        var payload = new Slide()
        {
            m_clientMsgNum = clientMsgNumber,
            m_team         = team,
            m_index        = index,
            m_position     = position,
            m_direction    = direction,
        };

        var msg = new MatchMessage();

        msg.m_messageType = MessageType.Slide;
        msg.m_message     = payload;

        return(msg);
    }
Пример #19
0
        public ActionResult getMessagesString(int id)
        {
            matchmessage = new MatchMessage();
            string[] text        = matchmessage.getMessages(id);
            string   allMessages = "";

            for (int i = 0; i < text.Length; i++)
            {
                if (i != text.Length - 1)
                {
                    allMessages += text[i] + "\n";
                }
                else
                {
                    allMessages += text[i];
                }
            }
            return(Json(allMessages));
        }
        public async Task InsertAsync(MatchMessage message, IEnumerable <Region> regions, CancellationToken cancellationToken = default)
        {
            // Validate inputs
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            // Prepare records to insert (grouped by partition key)
            var recordGroups = regions.Select(
                r => new MatchMessageRecord(message)
            {
                RegionBoundary = new RegionBoundaryProperty(
                    RegionHelper.GetRegionBoundary(r)),
                Region       = new RegionProperty(r),
                PartitionKey = MatchMessageRecord.GetPartitionKey(r)
            }).GroupBy(r => r.PartitionKey);

            // Begin batch operation
            // All MatchMessageRecords will have same PartitionID in this batch
            var batches = recordGroups.Select(g => g.Aggregate(
                                                  this.Container.CreateTransactionalBatch(new PartitionKey(g.Key)),
                                                  (result, item) => result.CreateItem <MatchMessageRecord>(item)));

            // Execute transactions
            // TODO: make a single transaction.
            var responses = await Task.WhenAll(batches.Select(b => b.ExecuteAsync(cancellationToken)));

            var failed = responses.Where(r => !r.IsSuccessStatusCode);

            if (failed.Any())
            {
                throw new Exception(
                          String.Format(
                              "{0} out of {1} insertions failed. Cosmos bulk insert failed with HTTP Status Code {2}.",
                              responses.Count(),
                              failed.Count(),
                              failed.First().StatusCode.ToString()
                              )
                          );
            }
        }
Пример #21
0
        public async Task <ActionResult <IEnumerable <MatchMessage> > > PostAsync([FromBody] MessageRequest request, CancellationToken cancellationToken = default)
        {
            try
            {
                // Submit request
                IEnumerable <MessageContainer> reports = await this._reportService
                                                         .GetByIdsAsync(
                    request.RequestedQueries.Select(r => r.MessageId),
                    cancellationToken
                    );

                // Map MatchMessage types
                List <MatchMessage> messages = new List <MatchMessage>();

                foreach (MessageContainer report in reports)
                {
                    MatchMessage result = this._map.Map <MatchMessage>(report);
                    // Get BLEs
                    BluetoothMatch match = new BluetoothMatch();
                    match.Seeds.AddRange(
                        report.BluetoothSeeds.Select(s => this._map.Map <BlueToothSeed>(s))
                        );
                    // Add converted BLE match
                    result.BluetoothMatches.Add(match);
                    // Add converted MatchMessage
                    messages.Add(result);
                }

                // Return as expected proto type
                return(Ok(messages));
            }
            catch (RequestValidationFailedException ex)
            {
                // Only return validation results
                return(BadRequest(ex.ValidationResult));
            }
            catch (ArgumentNullException)
            {
                return(BadRequest());
            }
        }
Пример #22
0
        public async Task PublishAsync_ArgumentNullOnNullRegion()
        {
            // Arrange
            MatchMessage request   = new MatchMessage();
            AreaMatch    areaMatch = new AreaMatch
            {
                UserMessage = "Test user message"
            };

            areaMatch.Areas.Add(new Area
            {
                BeginTime = 0,
                EndTime   = 1,
                Location  = new Location
                {
                    Latitude  = 10.1234,
                    Longitude = -10.1234
                },
                RadiusMeters = 100
            });
            request.AreaMatches.Add(areaMatch);
            BluetoothMatch btMatch = new BluetoothMatch
            {
                UserMessage = "Test BL message"
            };

            btMatch.Seeds.Add(new BlueToothSeed
            {
                Seed              = "00000000-0000-0000-0000-000000000000",
                SequenceEndTime   = 1,
                SequenceStartTime = 0
            });
            request.BluetoothMatches.Add(btMatch);

            // Act
            string result = await this._service
                            .PublishAsync(request, null, CancellationToken.None);

            // Assert
            // Exception caught by decorator
        }
Пример #23
0
    public void ProcessMessage(GameServer gameServer, NetworkMessage netMsg, INetworkAddress address)
    {
        if (!gameServer.IsClientConnected(address))
        {
            Debug.LogFormat("Received the message {0} from not connected client {1}", netMsg.m_type, address.ToString());
            return;
        }

        var clientInfo = gameServer.GetClientInfoByAddress(address);

        switch (netMsg.m_type)
        {
        case NetworkMessageType.PlayerMove:
        {
            var playerMove = netMsg.m_msg as PlayerMove;
            playerMove.m_team = clientInfo.Team;
            MatchMessage matchMsg = new MatchMessage();
            matchMsg.m_message     = playerMove;
            matchMsg.m_messageType = MessageType.PlayerMove;
            gameServer.AddMatchMessage(matchMsg);

            // Not sure it it supposed to be here.
            clientInfo.LastMsgNum = Mathf.Max(clientInfo.LastMsgNum, playerMove.m_messageNumber);
            break;
        }

        case NetworkMessageType.PlayerAction:
        {
            var msg = netMsg.m_msg as Action;
            msg.m_team = clientInfo.Team;
            MatchMessage matchMsg = new MatchMessage();
            matchMsg.m_message     = msg;
            matchMsg.m_messageType = MessageType.PlayerAction;
            gameServer.AddMatchMessage(matchMsg);

            // Not sure it it supposed to be here.
            clientInfo.LastMsgNum = Mathf.Max(clientInfo.LastMsgNum, msg.m_messageNumber);
            break;
        }
        }
    }
Пример #24
0
    public void ProcessMessage(Match match, MatchMessage message)
    {
        switch (message.m_messageType)
        {
        case MessageType.PlayerMove:
            var playerMoveMsg = message.m_message as PlayerMove;
            var moveVector    = PlayerDirectionVector.GetVector(playerMoveMsg.m_playerDirection) * GameSettings.PlayerSpeed;
            match.SetPlayerPosition(
                playerMoveMsg.m_team,
                0,
                match.GetPlayerPosition(playerMoveMsg.m_team, 0) + moveVector * playerMoveMsg.m_dt,
                playerMoveMsg.m_playerDirection);
            break;

        case MessageType.PlayerAction:
            var playerActionMsg = message.m_message as Action;
            match.PlayerAction(playerActionMsg.m_team, playerActionMsg.m_duration);
            break;

        case MessageType.Slide:
            var slide = message.m_message as Slide;
            match.SetPlayerPosition(slide.m_team, slide.m_index, new Vector3(slide.m_position.x, 0.0f, slide.m_position.y), slide.m_direction);
            match.Slide(slide.m_team, slide.m_index);
            break;

        case MessageType.PlayerPosition:
            var playerPositionMsg = message.m_message as PlayerPosition;
            match.SetPlayerPosition(playerPositionMsg.m_team, playerPositionMsg.m_index, playerPositionMsg.m_position, playerPositionMsg.m_direction);
            break;

        case MessageType.BallPosition:
            var ballPositionMsg = message.m_message as BallPosition;
            match.SetBallPosition(ballPositionMsg.m_position, ballPositionMsg.m_velocity);
            break;
        }
    }
Пример #25
0
 public void AddMatchMessage(MatchMessage msg)
 {
     m_gameMsgQueue.AddMessage(msg);
 }
Пример #26
0
 public void SendMessage(MatchMessage message)
 {
     // m_netCom.SendMessage(message);
 }
Пример #27
0
 public void ProcessMessage(MatchMessage message)
 {
     m_messageInterpreter.ProcessMessage(this, message);
 }
Пример #28
0
 public abstract byte[] Serialize(MatchMessage message);
Пример #29
0
        public override void UpdateListeners()
        {
            NetIncomingMessage msg;

            while ((msg = client.ReadMessage()) != null)
            {
                switch (msg.MessageType)
                {
                case NetIncomingMessageType.DebugMessage:
                case NetIncomingMessageType.VerboseDebugMessage:
                    Debug.Log(msg.ReadString());
                    break;

                case NetIncomingMessageType.WarningMessage:
                    Debug.LogWarning(msg.ReadString());
                    break;

                case NetIncomingMessageType.ErrorMessage:
                    Debug.LogError(msg.ReadString());
                    break;

                case NetIncomingMessageType.StatusChanged:
                    NetConnectionStatus status = (NetConnectionStatus)msg.ReadByte();
                    string statusMsg           = msg.ReadString();

                    switch (status)
                    {
                    case NetConnectionStatus.Disconnected:
                        if (Disconnected != null)
                        {
                            Disconnected(this, new DisconnectArgs(statusMsg));
                        }
                        break;

                    default:
                        Debug.Log("Status change received: " + status + " - Message: " + statusMsg);
                        break;
                    }
                    break;

                case NetIncomingMessageType.Data:

                    switch (msg.ReadByte())
                    {
                    case MessageType.MatchMessage:
                        double       timestamp = msg.ReadTime(false);
                        MatchMessage message   = Newtonsoft.Json.JsonConvert.DeserializeObject <MatchMessage>(msg.ReadString(), serializerSettings);

                        //Use reflection to call ReceiveMessage with the proper type parameter
                        MethodInfo methodToCall   = typeof(OnlineMatchMessenger).GetMethod("ReceiveMessage", BindingFlags.NonPublic | BindingFlags.Instance);
                        MethodInfo genericVersion = methodToCall.MakeGenericMethod(message.GetType());
                        genericVersion.Invoke(this, new object[] { message, timestamp });

                        break;

                    case MessageType.PlayerMovementMessage:
                        double         time     = msg.ReadTime(false);
                        PlayerMovement movement = PlayerMovement.ReadFromMessage(msg);
                        if (OnPlayerMovement != null)
                        {
                            OnPlayerMovement(this, new PlayerMovementArgs(time, movement));
                        }
                        break;
                    }
                    break;

                default:
                    Debug.Log("Received unhandled message of type " + msg.MessageType);
                    break;
                }
            }
        }
Пример #30
0
 public void AddMessage(MatchMessage message)
 {
     m_messages.Enqueue(message);
 }