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}"); } }
public void SendPacketQueue() { while (_packetQueue.Count > 0) { PacketProtocol.SendPacket(ClientSocket, _packetQueue.Dequeue()); } }
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); } }
internal void SendPacketByGuid(Packet packet, Guid guid) { var client = clients.Where(x => x.Value.Player.Guid == guid).FirstOrDefault(); PacketProtocol.SendPacket(client.Key, packet); }
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; } } } }