/// <summary>
 ///
 /// </summary>
 /// <param name="playerinfo"></param>
 public vxNetmsgUpdateSessionStatus(vxEnumSessionStatus status)
 {
     SessionStatus = status;
 }
Пример #2
0
        /// <summary>
        /// Constructor.
        /// </summary>
        public vxNetClientEventSessionStatusUpdated(vxEnumSessionStatus oldStatus, vxEnumSessionStatus newStatus)
        {
            NewSessionStatus = newStatus;

            PreviousSessionStatus = oldStatus;
        }
        /// <summary>
        /// Method for Receiving Messages kept in a Global Scope for the Engine.
        /// </summary>
        /// <param name="peer">Peer.</param>
        public void ClientMsgCallback(object peer)
        {
            NetIncomingMessage im;

            while ((im = this.Client.ReadMessage()) != null)
            {
                switch (im.MessageType)
                {
                case NetIncomingMessageType.VerboseDebugMessage:
                case NetIncomingMessageType.DebugMessage:
                case NetIncomingMessageType.WarningMessage:
                case NetIncomingMessageType.ErrorMessage:
                    //LogClient("DEBUG: " + im.ReadString());
                    break;

                /**************************************************************/
                //DiscoveryResponse
                /**************************************************************/
                case NetIncomingMessageType.DiscoveryResponse:

                    LogClient("     ------- Server found at: " + im.SenderEndPoint);

                    //Fire the RecieveDiscoverySignalResponse Event by passing down the decoded Network Message
                    if (DiscoverySignalResponseRecieved != null)
                    {
                        DiscoverySignalResponseRecieved(this, new vxNetClientEventDiscoverySignalResponse(new vxNetmsgServerInfo(im)));
                    }

                    break;

                case NetIncomingMessageType.StatusChanged:
                    switch ((NetConnectionStatus)im.ReadByte())
                    {
                    case NetConnectionStatus.Connected:
                    {
                        LogClient(string.Format("{0} Connected", im.SenderEndPoint));

                        //Fire the Connected Event
                        if (Connected != null)
                        {
                            Connected(this, new vxNetClientEventConnected());
                        }
                    }
                    break;

                    case NetConnectionStatus.Disconnected:
                    {
                        LogClient(string.Format("{0} Disconnected", im.SenderEndPoint));

                        //Fire the Connected Event
                        if (Disconnected != null)
                        {
                            Disconnected(this, new vxNetClientEventDisconnected());
                        }
                    }
                    break;

                    default:
                        LogClient(im.ReadString());
                        break;
                    }
                    break;

                case NetIncomingMessageType.Data:
                    var gameMessageType = (vxNetworkMessageTypes)im.ReadByte();
                    switch (gameMessageType)
                    {
                    case vxNetworkMessageTypes.UpdatePlayersList:

                        //Get the Message Containing the Updated Player List
                        var updatedPlayerList = new vxNetmsgUpdatePlayerList(im);

                        //Now Loop through each player in the list
                        foreach (vxNetPlayerInfo serverPlayer in updatedPlayerList.Players)
                        {
                            //First Check if the Server Player is in the clients list. If not, then add the server player to the clients list.
                            if (PlayerManager.Contains(serverPlayer))
                            {
                                PlayerManager.Players[serverPlayer.ID] = serverPlayer;
                            }
                            else
                            {
                                //Add Player to Player manager
                                PlayerManager.Add(serverPlayer);

                                //Now Fire the Event Handler
                                if (OtherPlayerConnected != null)
                                {
                                    OtherPlayerConnected(this, new vxNetClientEventPlayerConnected(serverPlayer));
                                }
                            }
                        }
                        break;

                    case vxNetworkMessageTypes.PlayerDisconnected:

                        //For what ever reason, a player has disconnected, so we need to remove it from the player list

                        //Send a message to all clients to remove this client from their list.
                        var rmvMsg = new vxNetmsgRemovePlayer(im);

                        //Fire the Connected Event
                        if (OtherPlayerDisconnected != null)
                        {
                            OtherPlayerDisconnected(this, new vxNetClientEventPlayerDisconnected(rmvMsg.PlayerInfo));
                        }

                        //Finally remove the player from the server's list
                        if (PlayerManager.Players.ContainsKey(rmvMsg.PlayerInfo.ID))
                        {
                            PlayerManager.Players.Remove(rmvMsg.PlayerInfo.ID);
                        }

                        break;

                    case vxNetworkMessageTypes.UpdatePlayerLobbyStatus:

                        //Decode the list
                        var updatePlayerState = new vxNetmsgUpdatePlayerLobbyStatus(im);

                        //Update the internal server list
                        PlayerManager.Players[updatePlayerState.PlayerInfo.ID] = updatePlayerState.PlayerInfo;

                        if (UpdatedPlayerInfoRecieved != null)
                        {
                            UpdatedPlayerInfoRecieved(this, new vxNetClientEventPlayerStatusUpdate(updatePlayerState.PlayerInfo));
                        }


                        break;

                    case vxNetworkMessageTypes.SessionStatus:

                        //Get Old Status for information
                        vxEnumSessionStatus oldStatus = this.SessionStatus;
                        var newSessionStatus          = new vxNetmsgUpdateSessionStatus(im);

                        //Set the new Session Status
                        this.SessionStatus = newSessionStatus.SessionStatus;

                        //Fire any connected events
                        if (UpdateSessionStatus != null)
                        {
                            UpdateSessionStatus(this, new vxNetClientEventSessionStatusUpdated(oldStatus, this.SessionStatus));
                        }

                        break;


                    case vxNetworkMessageTypes.UpdatePlayerEntityState:

                        //First decode the message
                        var updatePlayerEntityState = new vxNetmsgUpdatePlayerEntityState(im);

                        var timeDelay = (float)(NetTime.Now - im.SenderConnection.GetLocalTime(updatePlayerEntityState.MessageTime));

                        //Console.WriteLine("Client:" + timeDelay);

                        //Only set the information if it isn't our own info
                        if (this.PlayerInfo.ID != updatePlayerEntityState.PlayerInfo.ID)
                        {
                            //Then Update the Player in the client List
                            PlayerManager.Players[updatePlayerEntityState.PlayerInfo.ID] = updatePlayerEntityState.PlayerInfo;

                            //Then fire any connected events
                            if (UpdatePlayerEntityState != null)
                            {
                                UpdatePlayerEntityState(this, new vxNetClientEventPlayerStateUpdate(updatePlayerEntityState, timeDelay));
                            }
                        }
                        break;

                    case vxNetworkMessageTypes.RemoveItem:

                        break;

                    case vxNetworkMessageTypes.Other:

                        break;
                    }
                    break;
                }
                Recycle(im);
            }
        }