Compare commits

..

No commits in common. "master" and "3.45.0" have entirely different histories.

10 changed files with 21 additions and 54 deletions

View file

@ -1,19 +1,3 @@
## 3.49.0
* [1.21.111 (#649)](https://github.com/PrismarineJS/bedrock-protocol/commit/b48518a6e79e72101fe7136433cbd6277339fc5c) (thanks @Slauh)
* [Skin Data Changes (#647)](https://github.com/PrismarineJS/bedrock-protocol/commit/407756b93880cdda4fdbff194fc4163ceedf4e82) (thanks @thejfkvis)
## 3.48.1
* [Update login client skinData (#635)](https://github.com/PrismarineJS/bedrock-protocol/commit/6b1474d2c6f93b47dee9d4816de59579f82ed5a9) (thanks @TSL534)
## 3.48.0
* [1.21.100 (#632)](https://github.com/PrismarineJS/bedrock-protocol/commit/06fb3de3a0023d03201dbcee7e9178c269462766) (thanks @extremeheat)
## 3.47.0
* [1.21.93 support (#623)](https://github.com/PrismarineJS/bedrock-protocol/commit/14daa2d95aac90ffcc7b42d625e270020ec2f162) (thanks @CreeperG16)
## 3.46.0
* [1.21.90 support (#617)](https://github.com/PrismarineJS/bedrock-protocol/commit/c66cdd3d62d2fa9c581693d8c70d7b41f355b63e) (thanks @CreeperG16)
## 3.45.0 ## 3.45.0
* [1.21.80 (#602)](https://github.com/PrismarineJS/bedrock-protocol/commit/e71fd513ddbd432983f221980080b61e11576965) (thanks @extremeheat) * [1.21.80 (#602)](https://github.com/PrismarineJS/bedrock-protocol/commit/e71fd513ddbd432983f221980080b61e11576965) (thanks @extremeheat)

View file

@ -11,7 +11,7 @@ Minecraft Bedrock Edition (aka MCPE) protocol library, supporting authentication
## Features ## Features
- Supports Minecraft Bedrock version 1.16.201, 1.16.210, 1.16.220, 1.17.0, 1.17.10, 1.17.30, 1.17.40, 1.18.0, 1.18.11, 1.18.30, 1.19.1, 1.19.10, 1.19.20, 1.19.21, 1.19.30, 1.19.40, 1.19.41, 1.19.50, 1.19.60, 1.19.62, 1.19.63, 1.19.70, 1.19.80, 1.20.0, 1.20.10, 1.20.30, 1.20.40, 1.20.50, 1.20.61, 1.20.71, 1.20.80, 1.21.0, 1.21.2, 1.21.21, 1.21.30, 1.21.42, 1.21.50, 1.21.60, 1.21.70, 1.21.80, 1.21.90, 1.21.93, 1.21.100, 1.21.111 - Supports Minecraft Bedrock version 1.16.201, 1.16.210, 1.16.220, 1.17.0, 1.17.10, 1.17.30, 1.17.40, 1.18.0, 1.18.11, 1.18.30, 1.19.1, 1.19.10, 1.19.20, 1.19.21, 1.19.30, 1.19.40, 1.19.41, 1.19.50, 1.19.60, 1.19.62, 1.19.63, 1.19.70, 1.19.80, 1.20.0, 1.20.10, 1.20.30, 1.20.40, 1.20.50, 1.20.61, 1.20.71, 1.20.80, 1.21.0, 1.21.2, 1.21.21, 1.21.30, 1.21.42, 1.21.50, 1.21.60, 1.21.70, 1.21.80
- Parse and serialize packets as JavaScript objects - Parse and serialize packets as JavaScript objects
- Automatically respond to keep-alive packets - Automatically respond to keep-alive packets
- [Proxy and mitm connections](docs/API.md#proxy-docs) - [Proxy and mitm connections](docs/API.md#proxy-docs)

2
index.d.ts vendored
View file

@ -3,7 +3,7 @@ import { Realm } from 'prismarine-realms'
import { ServerDeviceCodeResponse } from 'prismarine-auth' import { ServerDeviceCodeResponse } from 'prismarine-auth'
declare module 'bedrock-protocol' { declare module 'bedrock-protocol' {
type Version = '1.21.93' | '1.21.90' | '1.21.80' | '1.21.70' | '1.21.60' | '1.21.50' | '1.21.42' | '1.21.30' | '1.21.2' | '1.21.0' | '1.20.80' | '1.20.71' | '1.20.61' | '1.20.50' | '1.20.40' | '1.20.30' | '1.20.10' | '1.20.0' | '1.19.80' | '1.19.70' | '1.19.63' | '1.19.62' | '1.19.60' | '1.19.51' | '1.19.50' | '1.19.41' | '1.19.40' | '1.19.31' | '1.19.30' | '1.19.22' | '1.19.21' | '1.19.20' | '1.19.11' | '1.19.10' | '1.19.2' | '1.19.1' | '1.18.31' | '1.18.30' | '1.18.12' | '1.18.11' | '1.18.10' | '1.18.2' | '1.18.1' | '1.18.0' | '1.17.41' | '1.17.40' | '1.17.34' | '1.17.30' | '1.17.11' | '1.17.10' | '1.17.0' | '1.16.220' | '1.16.210' | '1.16.201' type Version = '1.21.70' | '1.21.60' | '1.21.50' | '1.21.42' | '1.21.30' | '1.21.2' | '1.21.0' | '1.20.80' | '1.20.71' | '1.20.61' | '1.20.50' | '1.20.40' | '1.20.30' | '1.20.10' | '1.20.0' | '1.19.80' | '1.19.70' | '1.19.63' | '1.19.62' | '1.19.60' | '1.19.51' | '1.19.50' | '1.19.41' | '1.19.40' | '1.19.31' | '1.19.30' | '1.19.22' | '1.19.21' | '1.19.20' | '1.19.11' | '1.19.10' | '1.19.2' | '1.19.1' | '1.18.31' | '1.18.30' | '1.18.12' | '1.18.11' | '1.18.10' | '1.18.2' | '1.18.1' | '1.18.0' | '1.17.41' | '1.17.40' | '1.17.34' | '1.17.30' | '1.17.11' | '1.17.10' | '1.17.0' | '1.16.220' | '1.16.210' | '1.16.201'
export interface Options { export interface Options {
// The string version to start the client or server as // The string version to start the client or server as

View file

@ -1,6 +1,6 @@
{ {
"name": "bedrock-protocol", "name": "bedrock-protocol",
"version": "3.49.0", "version": "3.45.0",
"description": "Minecraft Bedrock Edition protocol library", "description": "Minecraft Bedrock Edition protocol library",
"main": "index.js", "main": "index.js",
"types": "index.d.ts", "types": "index.d.ts",

View file

@ -62,8 +62,7 @@ class Client extends Connection {
const mcData = require('minecraft-data')('bedrock_' + this.options.version) const mcData = require('minecraft-data')('bedrock_' + this.options.version)
this.features = { this.features = {
compressorInHeader: mcData.supportFeature('compressorInPacketHeader'), compressorInHeader: mcData.supportFeature('compressorInPacketHeader'),
itemRegistryPacket: mcData.supportFeature('itemRegistryPacket'), itemRegistryPacket: mcData.supportFeature('itemRegistryPacket')
newLoginIdentityFields: mcData.supportFeature('newLoginIdentityFields')
} }
} catch (e) { } catch (e) {
throw new Error(`Unsupported version: '${this.options.version}', no data available`) throw new Error(`Unsupported version: '${this.options.version}', no data available`)
@ -147,18 +146,9 @@ class Client extends Connection {
...this.accessToken // Mojang + Xbox JWT from auth ...this.accessToken // Mojang + Xbox JWT from auth
] ]
let encodedChain const encodedChain = JSON.stringify({ chain })
if (this.features.newLoginIdentityFields) { // 1.21.90+
encodedChain = JSON.stringify({ debug('Auth chain', chain)
Certificate: JSON.stringify({ chain }),
// 0 = normal, 1 = ss, 2 = offline
AuthenticationType: this.options.offline ? 2 : 0,
Token: ''
})
} else {
encodedChain = JSON.stringify({ chain })
}
debug('Auth chain', encodedChain)
this.write('login', { this.write('login', {
protocol_version: this.options.protocolVersion, protocol_version: this.options.protocolVersion,

View file

@ -36,6 +36,7 @@ module.exports = (client, server, options) => {
client.createClientUserChain = (privateKey) => { client.createClientUserChain = (privateKey) => {
let payload = { let payload = {
...skinData, ...skinData,
SkinGeometryDataEngineVersion: client.versionGreaterThanOrEqualTo('1.17.30') ? '' : undefined,
ClientRandomId: Date.now(), ClientRandomId: Date.now(),
CurrentInputMode: 1, CurrentInputMode: 1,
@ -46,20 +47,19 @@ module.exports = (client, server, options) => {
GameVersion: options.version || '1.16.201', GameVersion: options.version || '1.16.201',
GuiScale: -1, GuiScale: -1,
LanguageCode: 'en_GB', // TODO locale LanguageCode: 'en_GB', // TODO locale
GraphicsMode: 1, // 1:simple, 2:fancy, 3:advanced, 4:ray_traced
PlatformOfflineId: '', PlatformOfflineId: '',
PlatformOnlineId: '', // chat PlatformOnlineId: '', // chat
// PlayFabID is the PlayFab ID produced for the skin. PlayFab is the company that hosts the Marketplace, // PlayFabID is the PlayFab ID produced for the skin. PlayFab is the company that hosts the Marketplace,
// skins and other related features from the game. This ID is the ID of the skin used to store the skin // skins and other related features from the game. This ID is the ID of the skin used to store the skin
// inside of PlayFab.The playfab ID is always lowercased. // inside of PlayFab.
PlayFabId: nextUUID().replace(/-/g, '').slice(0, 16).toLowerCase(), // 1.16.210 PlayFabId: nextUUID().replace(/-/g, '').slice(0, 16), // 1.16.210
SelfSignedId: nextUUID(), SelfSignedId: nextUUID(),
ServerAddress: `${options.host}:${options.port}`, ServerAddress: `${options.host}:${options.port}`,
ThirdPartyName: client.profile.name, // Gamertag ThirdPartyName: client.profile.name,
ThirdPartyNameOnly: client.versionGreaterThanOrEqualTo('1.21.90') ? undefined : false, ThirdPartyNameOnly: false,
UIProfile: 0, UIProfile: 0,
IsEditorMode: false, IsEditorMode: false,

View file

@ -3,12 +3,12 @@ const mcData = require('minecraft-data')
// Minimum supported version (< will be kicked) // Minimum supported version (< will be kicked)
const MIN_VERSION = '1.16.201' const MIN_VERSION = '1.16.201'
// Currently supported verson. Note, clients with newer versions can still connect as long as data is in minecraft-data // Currently supported verson. Note, clients with newer versions can still connect as long as data is in minecraft-data
const CURRENT_VERSION = '1.21.111' const CURRENT_VERSION = '1.21.80'
const Versions = Object.fromEntries(mcData.versions.bedrock.filter(e => e.releaseType === 'release').map(e => [e.minecraftVersion, e.version])) const Versions = Object.fromEntries(mcData.versions.bedrock.filter(e => e.releaseType === 'release').map(e => [e.minecraftVersion, e.version]))
// Skip some low priority versions (middle major) on Github Actions to allow faster CI // Skip some low priority versions (middle major) on Github Actions to allow faster CI
const skippedVersionsOnGithubCI = ['1.16.210', '1.17.10', '1.17.30', '1.18.11', '1.19.10', '1.19.20', '1.19.30', '1.19.40', '1.19.50', '1.19.60', '1.19.63', '1.19.70', '1.20.10', '1.20.15', '1.20.30', '1.20.40', '1.20.50', '1.20.61', '1.20.71', '1.21.2', '1.21.20', '1.21.30', '1.21.42', '1.21.50', '1.21.60', '1.21.70', '1.21.80', '1.21.90'] const skippedVersionsOnGithubCI = ['1.16.210', '1.17.10', '1.17.30', '1.18.11', '1.19.10', '1.19.20', '1.19.30', '1.19.40', '1.19.50', '1.19.60', '1.19.63', '1.19.70', '1.20.10', '1.20.15', '1.20.30', '1.20.40', '1.20.50', '1.20.61', '1.20.71', '1.21.2', '1.21.20', '1.21.30', '1.21.42']
const testedVersions = process.env.CI ? Object.keys(Versions).filter(v => !skippedVersionsOnGithubCI.includes(v)) : Object.keys(Versions) const testedVersions = process.env.CI ? Object.keys(Versions).filter(v => !skippedVersionsOnGithubCI.includes(v)) : Object.keys(Versions)
const defaultOptions = { const defaultOptions = {

View file

@ -33,8 +33,7 @@ class Server extends EventEmitter {
try { try {
const mcData = require('minecraft-data')('bedrock_' + version) const mcData = require('minecraft-data')('bedrock_' + version)
this.features = { this.features = {
compressorInHeader: mcData.supportFeature('compressorInPacketHeader'), compressorInHeader: mcData.supportFeature('compressorInPacketHeader')
newLoginIdentityFields: mcData.supportFeature('newLoginIdentityFields')
} }
} catch (e) { } catch (e) {
throw new Error(`Unsupported version: '${version}', no data available`) throw new Error(`Unsupported version: '${version}', no data available`)

View file

@ -78,18 +78,11 @@ class Player extends Connection {
// Parse login data // Parse login data
const tokens = body.params.tokens const tokens = body.params.tokens
const authChain = JSON.parse(tokens.identity)
const skinChain = tokens.client
try { try {
const skinChain = tokens.client var { key, userData, skinData } = this.decodeLoginJWT(authChain.chain, skinChain) // eslint-disable-line
const authChain = JSON.parse(tokens.identity)
let chain
if (authChain.Certificate) { // 1.21.90+
chain = JSON.parse(authChain.Certificate).chain
} else if (authChain.chain) {
chain = authChain.chain
} else {
throw new Error('Invalid login packet: missing chain or Certificate')
}
var { key, userData, skinData } = this.decodeLoginJWT(chain, skinChain) // eslint-disable-line
} catch (e) { } catch (e) {
debug(this.address, e) debug(this.address, e)
this.disconnect('Server authentication error') this.disconnect('Server authentication error')

View file

@ -15,6 +15,7 @@ function createProtocol (version) {
const compiler = new ProtoDefCompiler() const compiler = new ProtoDefCompiler()
const protocol = mcData('bedrock_' + version).protocol.types const protocol = mcData('bedrock_' + version).protocol.types
compiler.addTypes(require('../src/datatypes/compiler-minecraft')) compiler.addTypes(require('../src/datatypes/compiler-minecraft'))
compiler.addTypes(require('prismarine-nbt/zigzag').compiler)
compiler.addTypesToCompile(protocol) compiler.addTypesToCompile(protocol)
fs.writeFileSync('./read.js', 'module.exports = ' + compiler.readCompiler.generate().replace('() =>', 'native =>')) fs.writeFileSync('./read.js', 'module.exports = ' + compiler.readCompiler.generate().replace('() =>', 'native =>'))
@ -38,7 +39,7 @@ require('minecraft-data/bin/generate_data')
// If no argument, build everything // If no argument, build everything
if (!process.argv[2]) { if (!process.argv[2]) {
convert('bedrock', 'latest') convert('latest')
for (const version of versions) { for (const version of versions) {
main(version) main(version)
} }