Exemplo n.º 1
0
        /// <summary>
        /// Do the Minecraft login.
        /// </summary>
        /// <returns>True if login successful</returns>
        public bool Login()
        {
            byte[] protocol_version = dataTypes.GetVarInt(protocolversion);
            string server_address   = pForge.GetServerAddress(handler.GetServerHost());

            byte[] server_port      = BitConverter.GetBytes((ushort)handler.GetServerPort()); Array.Reverse(server_port);
            byte[] next_state       = dataTypes.GetVarInt(2);
            byte[] handshake_packet = dataTypes.ConcatBytes(protocol_version, dataTypes.GetString(server_address), server_port, next_state);

            packetReadWriter.WritePacket(0x00, handshake_packet);

            byte[] login_packet = dataTypes.GetString(player.GetUsername());

            packetReadWriter.WritePacket(0x00, login_packet);

            while (true)
            {
                Packet packet = packetReadWriter.ReadNext();
                if (packet.id == 0x00) //Login rejected
                {
                    handler.OnConnectionLost(DisconnectReason.LoginRejected, ChatParser.ParseText(dataTypes.ReadNextString(packet.data)));
                    return(false);
                }
                else if (packet.id == 0x01) //Encryption request
                {
                    string serverID  = dataTypes.ReadNextString(packet.data);
                    byte[] Serverkey = dataTypes.ReadNextByteArray(packet.data);
                    byte[] token     = dataTypes.ReadNextByteArray(packet.data);
                    return(StartEncryption(player.GetUserUUID(), handler.GetSessionID(), token, serverID, Serverkey));
                }
                else if (packet.id == 0x02) //Login successful
                {
                    ConsoleIO.WriteLineFormatted("§8Server is in offline mode.");
                    login_phase = false;

                    if (!pForge.CompleteForgeHandshake())
                    {
                        return(false);
                    }

                    readNet = true;
                    //StartUpdating();
                    return(true); //No need to check session or start encryption
                }
                else
                {
                    HandlePacket(packet);
                }
            }
        }
        public bool HandlePacket(PacketIncomingType packetType, List <byte> packetData)
        {
            string url  = dataTypes.ReadNextString(packetData);
            string hash = dataTypes.ReadNextString(packetData);

            //Send back "accepted" and "successfully loaded" responses for plugins making use of resource pack mandatory
            byte[] responseHeader = new byte[0];
            if (protocolversion < (int)McVersion.V110) //MC 1.10 does not include resource pack hash in responses
            {
                responseHeader = dataTypes.ConcatBytes(dataTypes.GetVarInt(hash.Length), Encoding.UTF8.GetBytes(hash));
            }
            packetSender.WritePacket(PacketOutgoingType.ResourcePackStatus, dataTypes.ConcatBytes(responseHeader, dataTypes.GetVarInt(3))); //Accepted pack
            packetSender.WritePacket(PacketOutgoingType.ResourcePackStatus, dataTypes.ConcatBytes(responseHeader, dataTypes.GetVarInt(0))); //Successfully loaded
            return(true);
        }
        public bool HandlePacket(PacketIncomingType packetType, List <byte> data)
        {
            double x       = dataTypes.ReadNextDouble(data);
            double y       = dataTypes.ReadNextDouble(data);
            double z       = dataTypes.ReadNextDouble(data);
            float  yaw     = dataTypes.ReadNextFloat(data);
            float  pitch   = dataTypes.ReadNextFloat(data);
            byte   locMask = dataTypes.ReadNextByte(data);

            if (protocolversion >= (int)McVersion.V18)
            {
                Location location = player.GetCurrentLocation();
                location.X = (locMask & 1 << 0) != 0 ? location.X + x : x;
                location.Y = (locMask & 1 << 1) != 0 ? location.Y + y : y;
                location.Z = (locMask & 1 << 2) != 0 ? location.Z + z : z;
                player.UpdateLocation(location, yaw, pitch);
            }
            else
            {
                player.UpdateLocation(new Location(x, y, z), yaw, pitch);
            }


            if (protocolversion >= (int)McVersion.V19)
            {
                int teleportID = dataTypes.ReadNextVarInt(data);
                // Teleport confirm packet
                packetSender.WritePacket(PacketOutgoingType.TeleportConfirm, dataTypes.GetVarInt(teleportID));
            }
            return(true);
        }
Exemplo n.º 4
0
 public bool HandlePacket(PacketIncomingType packetType, List <byte> data)
 {
     packetSender.WritePacket(PacketOutgoingType.KeepAlive, data);
     return(true);
 }