Пример #1
0
        private void ClientSocket_ConnectCompleted(object sender, TcpCompletedEventArgs e)
        {
            if (!e.Error)
            {
                Console.WriteLine($"Connected to {(IPEndPoint)e.Data}");
                PacketProtocol = new PacketProtocol(ClientSocket);
                PacketProtocol.PacketArrived += PacketProtocol_PacketArrived;
                PacketProtocol.Start();

                Console.WriteLine("Sending client info...");

                PacketProtocol.SendPacket(ClientSocket, new Packet
                {
                    Content = World.LocalPlayer,
                    Type    = PacketType.PLAYER_INFO
                });

                World.AddPlayer(World.LocalPlayer);

                ConnectedToServer?.Invoke(ClientSocket.RemoteEndPoint.ToString(), World.LocalPlayer.Name);

                _connected = true;
            }
            else
            {
                CriticalErrorOccured($"Произошла критическая ошибка!\n{((Exception)e.Data).Message}");
            }
        }
Пример #2
0
 public void SendPacketQueue()
 {
     while (_packetQueue.Count > 0)
     {
         PacketProtocol.SendPacket(ClientSocket, _packetQueue.Dequeue());
     }
 }
Пример #3
0
        internal void BroadcastPacket(Packet packet, Guid excludeGuid)
        {
            foreach (KeyValuePair <GameTcpServerConnection, ClientContext> client in clients)
            {
                if (client.Value.Player.Guid == excludeGuid)
                {
                    continue;
                }

                PacketProtocol.SendPacket(client.Key, packet);
            }
        }
Пример #4
0
        internal void SendPacketByGuid(Packet packet, Guid guid)
        {
            var client = clients.Where(x => x.Value.Player.Guid == guid).FirstOrDefault();

            PacketProtocol.SendPacket(client.Key, packet);
        }
Пример #5
0
        private void Protocol_PacketArrived(object sender, TcpCompletedEventArgs e)
        {
            var clientSocket = (GameTcpServerConnection)sender;

            if (e.Error)
            {
                Console.WriteLine($"Server closed connection with client during error: {e.Data}");
                CloseConnectionWithClient(clientSocket);
            }
            else if (e.Data == null)
            {
                Console.WriteLine($"Client {clientSocket.RemoteEndPoint} disconnected.");
                CloseConnectionWithClient(clientSocket);
            }
            else
            {
                var    bytePacket = Packet.Deserialize((byte[])e.Data);
                Packet packet     = bytePacket as Packet;

                if (packet != null)
                {
                    var context = clients.Where(x => x.Key == clientSocket).FirstOrDefault().Value;
                    switch (packet.Type)
                    {
                    case PacketType.PLAYER_INFO:
                        context.Player = new PlayerMp((PlayerShared)packet.Content);
                        PacketProtocol.SendPacket(clientSocket, new Packet
                        {
                            Content = context.Player,
                            Type    = PacketType.PLAYER_INFO
                        });

                        BroadcastPacket(new Packet
                        {
                            Type    = PacketType.MESSAGE_SYSTEM,
                            Content = $"connected>{context.Player.Name}"
                        }, context.Player.Guid);

                        _tickingEntities.Add(context.Player);

                        break;

                    case PacketType.MESSAGE_CHAT:
                        BroadcastPacket(packet, Guid.Empty);
                        break;

                    case PacketType.PLAYER_MOVE:
                        context.Player.AddPos((Vector2)packet.Content);
                        break;

                    case PacketType.BULLET_SHOOT:
                        var bullet = new BulletMp((Vector2)packet.Content, context.Player.Position, context.Player.Guid);
                        _tickingEntities.Add(bullet);
                        break;

                    case PacketType.PLAYER_REVIVE:
                        context.Player.Spawn();
                        break;

                    default:
                        break;
                    }
                }
            }
        }