mirror of
https://github.com/PrismarineJS/node-minecraft-protocol.git
synced 2024-11-14 19:04:59 -05:00
Fallback version for dynamic versions (#983)
* added fallbackVersion to dynamic version support * mark fallbackVersion as optional in docs * added fallbackVersion to ping responses * don't enable dynamic cross version support if version is undefined
This commit is contained in:
parent
a9cc6cee85
commit
7a1d857602
4 changed files with 33 additions and 11 deletions
|
@ -22,6 +22,7 @@ automatically logged in and validated against mojang's auth.
|
||||||
* maxPlayers : default to 20
|
* maxPlayers : default to 20
|
||||||
* keepAlive : send keep alive packets : default to true
|
* keepAlive : send keep alive packets : default to true
|
||||||
* version : the version of the server, defaults to the latest version. Set version to `false` to enable dynamic cross version support.
|
* version : the version of the server, defaults to the latest version. Set version to `false` to enable dynamic cross version support.
|
||||||
|
* fallbackVersion (optional) : the version that should be used as a fallback, if the client version isn't supported, only works with dynamic cross version support.
|
||||||
* favicon (optional) : the favicon to set, base64 encoded
|
* favicon (optional) : the favicon to set, base64 encoded
|
||||||
* customPackets (optional) : an object index by version/state/direction/name, see client_custom_packet for an example
|
* customPackets (optional) : an object index by version/state/direction/name, see client_custom_packet for an example
|
||||||
* errorHandler : A way to override the default error handler for client errors. A function that takes a Client and an error.
|
* errorHandler : A way to override the default error handler for client errors. A function that takes a Client and an error.
|
||||||
|
|
1
src/index.d.ts
vendored
1
src/index.d.ts
vendored
|
@ -166,6 +166,7 @@ declare module 'minecraft-protocol' {
|
||||||
maxPlayers?: number
|
maxPlayers?: number
|
||||||
keepAlive?: boolean
|
keepAlive?: boolean
|
||||||
version?: string | false
|
version?: string | false
|
||||||
|
fallbackVersion?: string
|
||||||
favicon?: string
|
favicon?: string
|
||||||
customPackets?: any
|
customPackets?: any
|
||||||
errorHandler?: (client: Client, error: Error) => void
|
errorHandler?: (client: Client, error: Error) => void
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
const states = require('../states')
|
const states = require('../states')
|
||||||
|
|
||||||
module.exports = function (client, server, { version }) {
|
module.exports = function (client, server, { version, fallbackVersion }) {
|
||||||
client.once('set_protocol', onHandshake)
|
client.once('set_protocol', onHandshake)
|
||||||
|
|
||||||
function onHandshake (packet) {
|
function onHandshake (packet) {
|
||||||
|
@ -8,12 +8,20 @@ module.exports = function (client, server, { version }) {
|
||||||
client.serverPort = packet.serverPort
|
client.serverPort = packet.serverPort
|
||||||
client.protocolVersion = packet.protocolVersion
|
client.protocolVersion = packet.protocolVersion
|
||||||
|
|
||||||
if (version === false || version === undefined) {
|
if (version === false) {
|
||||||
if (require('minecraft-data')(client.protocolVersion)) {
|
if (require('minecraft-data')(client.protocolVersion)) {
|
||||||
client.version = client.protocolVersion
|
client.version = client.protocolVersion
|
||||||
|
} else {
|
||||||
|
let fallback
|
||||||
|
if (fallbackVersion !== undefined) {
|
||||||
|
fallback = require('minecraft-data')(fallbackVersion)
|
||||||
|
}
|
||||||
|
if (fallback) {
|
||||||
|
client.version = fallback.version.version
|
||||||
} else {
|
} else {
|
||||||
client.end('Protocol version ' + client.protocolVersion + ' is not supported')
|
client.end('Protocol version ' + client.protocolVersion + ' is not supported')
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else if (client.protocolVersion !== server.mcversion.version && packet.nextState !== 1) {
|
} else if (client.protocolVersion !== server.mcversion.version && packet.nextState !== 1) {
|
||||||
client.end('Wrong protocol version, expected: ' + server.mcversion.version + ' and you are using: ' + client.protocolVersion)
|
client.end('Wrong protocol version, expected: ' + server.mcversion.version + ' and you are using: ' + client.protocolVersion)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,19 +1,31 @@
|
||||||
const endianToggle = require('endian-toggle')
|
const endianToggle = require('endian-toggle')
|
||||||
|
|
||||||
module.exports = function (client, server, { beforePing = null, version }) {
|
module.exports = function (client, server, { beforePing = null, version, fallbackVersion }) {
|
||||||
client.once('ping_start', onPing)
|
client.once('ping_start', onPing)
|
||||||
client.once('legacy_server_list_ping', onLegacyPing)
|
client.once('legacy_server_list_ping', onLegacyPing)
|
||||||
|
|
||||||
function onPing () {
|
function onPing () {
|
||||||
// Use client version if dynamic cross version support is enabled.
|
let responseVersion = {
|
||||||
const responseVersion = (version === false)
|
name: server.mcversion.minecraftVersion,
|
||||||
? {
|
protocol: server.mcversion.version
|
||||||
|
}
|
||||||
|
|
||||||
|
if (version === false) {
|
||||||
|
let minecraftData = require('minecraft-data')(client.protocolVersion)
|
||||||
|
if (!minecraftData && fallbackVersion !== undefined) {
|
||||||
|
minecraftData = require('minecraft-data')(fallbackVersion)
|
||||||
|
}
|
||||||
|
if (minecraftData) {
|
||||||
|
responseVersion = {
|
||||||
|
name: minecraftData.version.minecraftVersion,
|
||||||
|
protocol: minecraftData.version.version
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
responseVersion = {
|
||||||
name: client.version,
|
name: client.version,
|
||||||
protocol: client.protocolVersion
|
protocol: client.protocolVersion
|
||||||
}
|
}
|
||||||
: {
|
}
|
||||||
name: server.mcversion.minecraftVersion,
|
|
||||||
protocol: server.mcversion.version
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const response = {
|
const response = {
|
||||||
|
|
Loading…
Reference in a new issue