コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
        }