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; }
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; } }