public static void SyncUpdate(NetUpdateType updatetype, object data) { if (ConnectedMatch == null || !SendUpdate) { return; } try { BinaryWriter bw; foreach (Player player in ConnectedMatch.Players) { if (player.Name == Game.Player.Name) { continue; //Don't send to ourselves } bool isserver = ConnectedMatch.OwnerName == Game.Player.Name; if (!isserver) { //bw = new BinaryWriter(ConnectedMatch.GetPlayerByName(ConnectedMatch.OwnerName).Client.GetStream().ToSafeNetStream()); //If not server, send only to server var c = ConnectedMatch.GetPlayerByName(ConnectedMatch.OwnerName).Client; //If not server, send only to server bw = new BinaryWriter(c.GetStream().ToSafeNetStream(c, null)); } else { //bw = new BinaryWriter(player.Client.GetStream().ToSafeNetStream()); var c = player.Client; bw = new BinaryWriter(c.GetStream().ToSafeNetStream(c, null)); bw.Write(Game.Player.Name); //Otherwise write playername as listener expects } bw.Write((int)updatetype); switch (updatetype) { case NetUpdateType.Name: string newname = (string)data; bw.Write(newname); break; case NetUpdateType.Color: int color = ((Color)data).ToArgb(); bw.Write(color); break; case NetUpdateType.Move: int direction = (int)data; //Converting to enum and back to int is unnecessary bw.Write(direction); break; case NetUpdateType.Leave: break; case NetUpdateType.Teleport: Point point = (Point)data; bw.Write(point.X); bw.Write(point.Y); break; case NetUpdateType.Score: int score = (int)data; bw.Write(score); break; case NetUpdateType.Lives: int lives = (int)data; bw.Write(lives); break; case NetUpdateType.Pause: bool pause = (bool)data; bw.Write(pause); break; } if (!isserver) { break; //If not server, only send to the server } } } catch (IOException) { } catch (Exception e) { Program.HandleException(e); } }
private static bool ReceiveAndProcessData(Player player, BinaryReader br) { string playername = player.Name; try { NetUpdateType updatetype = (NetUpdateType)br.ReadInt32(); switch (updatetype) { case NetUpdateType.Name: string newname = br.ReadString(); player.Name = newname; foreach (BinaryWriter bw in ForwardMessage(player, playername, (int)updatetype)) { //ForwardMessage prepares each send and then here the only thing to do is to send the extra data bw.Write(newname); } break; case NetUpdateType.Color: Color color = Color.FromArgb(br.ReadInt32()); player.Color = color; foreach (BinaryWriter bw in ForwardMessage(player, playername, (int)updatetype)) { bw.Write(color.ToArgb()); } break; case NetUpdateType.Move: Direction direction = (Direction)br.ReadInt32(); Game.MovePlayerPost(player, Game.MovePlayerPre(player, direction)); foreach (BinaryWriter bw in ForwardMessage(player, playername, (int)updatetype)) { bw.Write((int)direction); } break; /*case NetUpdateType.Login: * ConnectedMatch.Players.Add(new Player(playername, ConnectedMatch.NextID)); * break;*/ case NetUpdateType.Leave: foreach (BinaryWriter bw in ForwardMessage(player, playername, (int)updatetype)) { } Network.ConnectedMatch.Players.RemoveAll(entry => entry.Name == playername); player.Client.Close(); break; case NetUpdateType.Teleport: player.Position = new Point(br.ReadInt32(), br.ReadInt32()); Console.WriteLine("Teleporting player " + player.Name + " to point " + player.Position); Game.MovePlayerPost(player, player.Position); foreach (BinaryWriter bw in ForwardMessage(player, playername, (int)updatetype)) { bw.Write(player.Position.X); bw.Write(player.Position.Y); } break; case NetUpdateType.Score: player.Score = br.ReadInt32(); foreach (BinaryWriter bw in ForwardMessage(player, playername, (int)updatetype)) { bw.Write(player.Score); } break; case NetUpdateType.Lives: player.Lives = br.ReadInt32(); foreach (BinaryWriter bw in ForwardMessage(player, playername, (int)updatetype)) { bw.Write(player.Lives); } break; case NetUpdateType.Pause: Form1.SetTimerWithoutSend(!br.ReadBoolean()); foreach (BinaryWriter bw in ForwardMessage(player, playername, (int)updatetype)) { bw.Write(Game.Paused); } break; } } catch (IOException) { return(false); } catch (ObjectDisposedException) { return(false); } catch (Exception e) { Program.HandleException(e); } return(true); }