예제 #1
0
        public void Write(Client client, Message message, params object[] arguments)
        {
            message.WriteVarInt(0x00);

            ServerListping serverlistping = new ServerListping()
            {
                Version = new ServerpingVersion()
                {
                    Name     = "MinecartSharp 1.13.2",
                    Protocol = 404
                },
                Players = new ServerpingPlayers()
                {
                    Max    = MinecartSharp.GetConfig().MaxPlayers,
                    Online = MinecartSharp.GetServer().GetPlayers().Count,
                    // TODO: fix corrupt packet if one or more players connected
                    //Players = MinecartSharp.GetServer().GetPlayers().Select(x => new ServerpingPlayer(){ Name = x.Client.Username }).ToList()
                },
                Description = new ServerpingDescription()
                {
                    Motd = MinecartSharp.GetConfig().Motd
                },
                // TODO: make favicon work
                Favicon = ""//MinecartSharp.GetConfig().Favicon
            };

            message.WriteString(JsonConvert.SerializeObject(serverlistping));
            message.FlushData();
        }
예제 #2
0
        private void HandleClient(TcpClient tcpClient, NetworkStream stream)
        {
            Client client = new Client(tcpClient);

            MinecartSharp.GetServer().AddClient(client);

            // Main client connection loop
            while (client.TcpClient.Connected)
            {
                var message      = new Message(stream);
                var receivedData = stream.Read(message.Data, 0, message.Data.Length);

                if (receivedData > 0)
                {
                    // Length    | Int        | Length of packet data + length of the packet ID
                    // Packet Id | Int        | Id of the packet send
                    // Data      | Byte Array | Data of the packet
                    var length   = message.ReadVarInt();
                    var packetId = message.ReadVarInt();

                    Logger.Log(LogType.Debug, "Received packet 0x" + packetId.ToString("X2"));

                    if (PacketHandler.Exists(packetId, client.State))
                    {
                        PacketHandler.GetPacket(packetId, client.State).Read(client, message);
                    }

                    message.Dispose();
                }
                else
                {
                    // client disconnected
                    break;
                }
            }

            // Close connection with client
            client.StopKeepAlive();

            MinecartSharp.GetServer().RemoveClient(client);

            if (client.State == ConnectionState.Play)
            {
                MinecartSharp.GetServer().BroadcastMessage(client.Username + " left the game");
                Logger.Log(LogType.Info, client.Username + " left the game");
            }

            tcpClient.Close();
            tcpClient.Dispose();
        }
예제 #3
0
        public void Read(Client client, Message message)
        {
            var msg = message.ReadString();

            if (msg.StartsWith("/"))
            {
                // handle command

                return;
            }

            // if not command broadcast message
            MinecartSharp.GetServer().BroadcastMessage($"{client.Username}: {msg}");
            Logger.Log(LogType.Info, $"{client.Username}: {msg}");
        }
예제 #4
0
        public void Write(Client client, Message message, params object[] arguments)
        {
            message.WriteVarInt(0x02);
            message.WriteString(Guid.NewGuid().ToString("").ToUpper());
            message.WriteString(client.Username);
            message.FlushData();

            // set state to play
            client.State = ConnectionState.Play;
            client.StartKeepAlive();

            MinecartSharp.GetServer().BroadcastMessage(client.Username + " joined the game");

            // also write join game packet
            PacketHandler.GetPacket(0x25, client.State).Write(client, message);

            // write mc:brand plugin packet
            new PluginMessage().Write(client, message, "minecraft:brand", "MinecartSharp");
        }