Ejemplo n.º 1
0
        /// <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();
        }
Ejemplo n.º 2
0
 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); }
 }
Ejemplo n.º 3
0
        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();
        }