Exemple #1
0
 public UDPPacket(PonykartPacket contents, ReliableUDPConnection sender)
 {
     Protocol = NetworkManager.Protocol;
     CID = (UInt32)sender.ConnectionID;
     SequenceNo = sender.NextSequenceNumber;
     Ack = sender.RemoteSeqNo;
     AckField = sender.AckField;
     Contents = contents;
     Responded = contents.Volatile;
 }
Exemple #2
0
 public UDPPacket(byte[] creator)
 {
     Protocol = GetProtocol(creator);
     CID = GetCID(creator);
     SequenceNo = GetSequenceNo(creator);
     Ack = GetAck(creator);
     AckField = GetAckField(creator);
     Contents = new PonykartPacket(GetContents(creator));
     Responded = false;
 }
        /// <summary>
        /// Handle the information in a packet received via this connection.
        /// </summary>
        public void PacketHandler(PonykartPacket packet)
        {
            LastRecvTime = System.DateTime.Now;
            string contents = packet.StringContents;
            byte[] contentsArr = packet.ToBytes();
            //Launch.Log(string.Format("Received packet type {1}: {0}", contents, packet.Type));
            NetworkManager nm = LKernel.Get<NetworkManager>();
            if (!Enum.IsDefined(typeof(Commands), (Commands) packet.Type)) {
                // Unrecognized packet type!
                Launch.Log(string.Format("Error: Malformed packet type: {0}", packet.Type));
                return;
            }
            switch ((Commands) packet.Type) {
            #region Connection Negotiation
                case Commands.Connect:
                    if (nm.NetworkType == NetworkTypes.Client) {
                        return;
                    } else {
                        if (nm.Password.SequenceEqual(contents)) {
                            Launch.Log(string.Format("Client provided correct password ({0})", contents));
                            validated = true;
                            ReadyToSend = true;
                            SendPacket(Commands.ConnectAccept, contents);
                            foreach(NetworkEntity ne in nm.Players) {
                                SendPacket(Commands.NewPlayer, ne.Serialize());
                            }
                            LobbyLabel.Text += String.Format("Player {0} joined.\n", nm.Players.Count);
                        } else {
                            Launch.Log(string.Format("Client gave bad password: {0} instead of {1}", contents, nm.Password));
                            SendPacket((Int16) Commands.ConnectReject, (string) null);
                            CloseConnection();
                        }
                    }
                    break;
                case Commands.ConnectAccept:
                    Launch.Log("Server accepted our password.");
                    LobbyLabel.Text += "Connected.\n";
                    ReadyToSend = true;
                    break;
                case Commands.ConnectReject:
                    Launch.Log("Server rejected our password.");
                    break;
            #endregion
            #region Player Management
                case Commands.RequestPlayer :
                    if (nm.NetworkType == NetworkTypes.Host) {
                        if (nm.Players.Count < Settings.Default.NumberOfPlayers) {
                            var NPlayer = new NetworkEntity(this);
                            nm.Players.Add(NPlayer);
                            nm.ForEachConnection((c) => c.SendPacket((c == this)?Commands.NewLocalPlayer:Commands.NewPlayer, NPlayer.Serialize()));
                        } else {
                            SendPacket(Commands.RejectPlayer, "Full");
                        }
                    }
                    break;

                case Commands.NewPlayer :
                    if (nm.NetworkType == NetworkTypes.Client) {
                        nm.Players.Add(NetworkEntity.Deserialize(packet.StringContents,this, false));
                    }
                    break;

                case Commands.NewLocalPlayer:
                    if (nm.NetworkType == NetworkTypes.Client) {
                        nm.Players.Add(NetworkEntity.Deserialize(packet.StringContents, null, true));
                    }
                    break;

                case Commands.RejectPlayer :
                    // TODO: move forward in menus only when applicable
                    break;

                case Commands.RequestPlayerChange :
                    if (nm.NetworkType == NetworkTypes.Host) {
                        if (NetworkEntity.PerformChange(packet.StringContents, this)) {
                            nm.ForEachConnection((c) => c.SendPacket(Commands.PlayerChange, packet.StringContents));
                        } else {
                            this.SendPacket(Commands.RejectChange,packet.StringContents); // TODO: include reason?
                        }
                    }
                    break;
                case Commands.PlayerChange :
                    if (nm.NetworkType == NetworkTypes.Client) {
                        if (!NetworkEntity.PerformChange(packet.StringContents, this)) {
                            // TODO: Request new player list.
                        }
                    }
                    break;

                case Commands.LeaveGame:
                    if (nm.NetworkType == NetworkTypes.Host) {
                        if (!NetworkEntity.PerformChange(packet.StringContents, this)) {
                            // TODO: Request new player list.
                        }
                    }
                    break;

                case Commands.RemovePlayer:
                    Launch.Log(string.Format("Got unimplemented packet type: {0}", packet.Type));

                    break;

            #endregion
            #region Pre-game Setup
                case Commands.SelectLevel:
                    if (nm.NetworkType == NetworkTypes.Client) {
                        LKernel.Get<MainMenuMultiplayerHandler>().LevelSelection = packet.StringContents;
                        SendPacket(Commands.LevelAccept, "");
                    }
                    break;
                case Commands.StartGame:
                    if (nm.NetworkType == NetworkTypes.Client) {
                        LKernel.Get<MainMenuMultiplayerHandler>().LevelSelection = packet.StringContents;
                        LKernel.Get<MainMenuMultiplayerHandler>().Start_Game();
                    }
                    break;
            #endregion
            #region Game
                case Commands.ReadyToRumble :
                    if (nm.NetworkType == NetworkTypes.Host) {
                        nm.ReadyConnections.Add(this);
                        if (nm.AllConnectionsReady) {
                            LKernel.Get<RaceCountdown>().Start();
                            nm.ForEachConnection((c) => c.SendPacket(Commands.BeginRumbling));
                        }

                    }
                    break;
                case Commands.BeginRumbling :
                    if (nm.NetworkType == NetworkTypes.Client) {
                        nm.AllConnectionsReady = true;
                        LKernel.Get<RaceCountdown>().Start();
                    }
                    break;
                case Commands.SendPositions:
                    if (nm.NetworkType == NetworkTypes.Client) {
                        NetworkEntity.DeserializeLocations(packet.StringContents, this);
                    } else {
                        NetworkEntity.DeserializeLocations(packet.StringContents, this);
                    }
                    break;
            #endregion
                case Commands.ServerMessage:
                    Launch.Log(string.Format("Server message: '{0}'", contents));
                    break;
                case Commands.NoMessage: // Do nothing.
                    break;
                default: // Unimplemented packet type
                    Launch.Log(string.Format("Got unimplemented packet type: {0}", packet.Type));
                    break;
            }
        }