/// <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); }
public bool HandlePacket(PacketIncomingType packetType, List <byte> data) { packetSender.WritePacket(PacketOutgoingType.KeepAlive, data); return(true); }