/// <summary> /// Starts the client specialized for the game. /// </summary> /// <param name="ConnectTo"></param> public void StartGameClient(IPAddress ConnectTo) { Connect: Server.WriteLine("Trying connection", true); try { context.Client = new TcpClient(); context.Client.Connect(new IPEndPoint(ConnectTo, 37563)); } catch (SocketException e) { Server.WriteLine(e.Message + Environment.NewLine + "Verify the IP: " + ConnectTo + " and make sure the host has portforwarded port 37563"); DisconnectedFromGame?.Invoke(context.ID, e.Message); } if (context.Client.Connected) { Server.WriteLine("Connected to: " + ConnectTo.ToString(), true); } else { return; } try { PrepareForNextMessage(); } catch (Exception e) { Server.WriteLine(e.Message, true); #if DEBUG throw e; #endif } Console.ReadLine(); }
void OnMessageRecieved(IAsyncResult ar) { try { int read = context.Stream.EndRead(ar); context.Message.Write(context.Buffer, 0, read); ProcessMessage(read); } catch (IOException e) { DisconnectedFromGame?.Invoke(context.ID, e.Message); } }
void ProcessMessage(int MessageBufferSize) { byte[] buffer = new byte[MessageBufferSize]; context.Message.Position = 0; context.Message.Read(buffer, 0, MessageBufferSize); string message = "NO MESSAGE FORMATTED"; var packets = DSPacket.Unfold(buffer); if (packets is null) { return; } var completed = new List <DSPacket>(); foreach (var packet in packets) { if (!packet.HasEnd && !_waitingForCompletePacket) { BasePacket = packet; _waitingForCompletePacket = true; continue; } if (!packet.HasBegin && _waitingForCompletePacket) { var Packet = DSPacket.Merge(packet, BasePacket); if (Packet.HasEnd) { _waitingForCompletePacket = false; Server.WriteLine("[Client] Completed Packet Receieved: " + packet.data.Length); completed.Add(Packet); } else { BasePacket = Packet; } } else { completed.Add(packet); } } foreach (var Packet in completed) { switch ((Command)Packet.ServerCommand) { case Command.SERVER_SHUTDOWN: //Server shutting down { var r = Encoding.ASCII.GetString(Packet.data); int.TryParse(r.Substring(0, r.IndexOf('|')), out int id); r = r.Remove(0, r.IndexOf('|') + 1); Server.WriteLine($"{id} disconnected from the server because: {r}"); DisconnectedFromGame?.Invoke(id, r); } break; case Command.CLIENT_KICK: //Someone Kicked { var r = Encoding.ASCII.GetString(Packet.data); int.TryParse(r.Substring(0, r.IndexOf('|')), out int id); r = r.Remove(0, r.IndexOf('|') + 1); Server.WriteLine($"{id} has been kicked from the server because: {r}"); RemovedFromMatch?.Invoke(id, r); } break; case Command.LEVEL_LEVELCHANGED: //Switch Level Server.WriteLine("Server forcing level change. Size: " + Packet.data.Length); ReceiveLevel(Packet.data); break; case Command.CLIENT_IDCHANGE: //ID changed if (Packet.data.Length > 1) { Server.WriteLine("Command Formatting is incorrect: No <byte> in byte array."); return; } context.ID = Packet.data[0]; break; case Command.CLIENT_CREATEPLAYER: //Create player for ClientContext CreatePlayer(Packet.data); break; case Command.PLAYER_NAVIGATE: //Player navigates to a position PlayerNavigate(Packet.data); break; case Command.CLIENT_MESSAGE_ALL: //Textmessage message = Encoding.ASCII.GetString(Packet.data); string sender = message.Substring(0, message.IndexOf('|')); message = message.Substring(message.IndexOf('|') + 1); OnMessageReceived?.Invoke(sender, message); Server.WriteLine($"{sender}: {message}"); break; case Command.PLAYER_INTERACT: //Player interacts with an object PlayerInteract(Packet.data); break; case Command.PERSON_SEAT: PersonSeated(Packet.data); break; case Command.HOST_STARTGAME: //Host start game HostStartedGame?.Invoke(context.ID); break; } } PrepareForNextMessage(); }